上次给大家讲了Struts2的环境搭配,那么今天呢就来给大家讲解Struts的数据封装与Struts的两大核心之一的值栈。
数据封装又分为:属性封装、模型驱动、表达式封装三种类型
在讲述数据封装之前要来有个jsp,这里呢我就只使用form表单
jsp代码如下:
1 <form action="loginadmin.action" method="post"> 2 用户名:<input name="name"> 密码:<input name="pwd" type="password"> 3 <input type="submit" value="提交"> 4 </form>
1:属性封装
2:模型驱动
01:创建实体类(属性名必须和表单的name属性值一模一样);
02:action实现ModelDriven接口;
03:实现ModelDriven接口的getModel方法
private 实体类 实体类对象名 = new 实体类();
public 实体类 getModel() {
return 实体类对象名;
}
04:使用实体类对象名即可
action代码如下:
1 package com.action; 2 3 import com.entity.Elogin; 4 import com.opensymphony.xwork2.ActionSupport; 5 import com.opensymphony.xwork2.ModelDriven; 6 7 public class LoginAction extends ActionSupport implements ModelDriven<Elogin> { 8 9 // @Override 10 // public String execute() throws Exception { 11 // System.out.println("AAAA"); 12 // return SUCCESS; 13 // } 14 // 15 16 // 返回空值 17 private Elogin elogin = new Elogin(); 18 19 public Elogin getElogin() { 20 return elogin; 21 } 22 23 public void setElogin(Elogin elogin) { 24 this.elogin = elogin; 25 } 26 27 public String admin() { 28 System.out.println(elogin.getName() + "----" + elogin.getPwd()); 29 return SUCCESS; 30 } 31 32 @Override 33 public Elogin getModel() { 34 return elogin; 35 } 36 37 }
3:表达式封装
01:在Action类中声明实体类:
private 实体类 实体类对象名;
02:生成实体类对象名的set和get的方法
03:修改表单那么属性值:
name="实体对象名.属性名"(users.username)
action代码如下:
1 package com.action; 2 3 import com.entity.Elogin; 4 import com.opensymphony.xwork2.ActionSupport; 5 import com.opensymphony.xwork2.ModelDriven; 6 7 public class LoginAction extends ActionSupport implements ModelDriven<Elogin> { 8 9 // @Override 10 // public String execute() throws Exception { 11 // System.out.println("AAAA"); 12 // return SUCCESS; 13 // } 14 // 15 16 private Elogin elogin; 17 18 public Elogin getElogin() { 19 return elogin; 20 } 21 22 public void setElogin(Elogin elogin) { 23 this.elogin = elogin; 24 } 25 26 /** 27 * 28 * @Title: admin @Description: 模型驱动 @return @return String @throws 29 */ 30 // // 返回空值 31 // private Elogin elogin = new Elogin(); 32 // 33 // public Elogin getElogin() { 34 // return elogin; 35 // } 36 // 37 // public void setElogin(Elogin elogin) { 38 // this.elogin = elogin; 39 // } 40 41 public String admin() { 42 System.out.println(elogin.getName() + "----" + elogin.getPwd()); 43 return SUCCESS; 44 } 45 46 @Override 47 public Elogin getModel() { 48 return elogin; 49 } 50 51 }
注意:action中这里的Elogin不需要实例化,因为这中间有牵扯出反射了,这里反射就不解释了,有兴趣的朋友可以去度娘看看,
action中改完之后还没完,因为你类里面改了那代表你的jsp页面里面也要做出相对应的处理,在属性之前需要用实体对象名.属性名不然他无法找到属性就会报错
下面是jsp代码:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 11 <form action="loginadmin.action" method="post"> 12 用户名:<input name="elogin.name"> 密码:<input name="elogin.pwd" 13 type="password"> <input type="submit" value="提交"> 14 </form> 15 16 </body> 17 </html>
数据封装到这里就结束了,但是一定要注意以下几点:
PS:在一个action中不能给对同一个表单使用属性封装和模型封装,如果使用只会执行模型驱动封装
表达式封装和模型封装的相同点以及不同点:
相同点:
都可以把数据封装到实体类中
不同点:
模型封装只能够把数据封装到一个实体类中,在一个action里面只能实现一次ModelDriven的接口所以模型封装只会封装一个到一个实体类中
表达式封装可以吧数据封装到多个对象中
值栈
朋友们因为因为值栈内容有点多,我就不一一列出了,我做了一张图片,个人觉得还是比较详细的,大家可以试着看一看,
今天的内容到此结束,谢谢大家观请关注喔!