Struts2的参数封装分为:
静态参数封装和动态参数封装
假如我们有一个这样的动作类
public class Demo1Action extends ActionSupport { private String username; private int age; public String addUser(){ System.out.println(username+","+age); return null;//不返回任何结果视图 NONE常量 } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }struts.xml配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.devMode" value="true"/> <package name="p1" extends="struts-default"> <action name="action1" class="com.itheima.web.action.Demo1Action" method="addUser"> <!-- 当我们不写任何拦截器时,默认的拦截器栈defaultStack它来为我们工作。 但是,只要写了任何一个拦截器,默认的就全都不起作用了 --> <!-- 使用注入的方式,给动作类的中的参数赋值 --> <param name="username">张三</param> <param name="age">18</param> </action> </package> </struts>启动服务器,在浏览器访问就能获取到username和age,控制台输出:张三,18
这种赋值方式在配置文件中已经写死,想要更改就必须更改配置文件
那么这个值是怎么赋值给username和age的呢?
其实是struts-default.xml中的拦截器<interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>帮我们做的。
要求:表单中的name属性取值必须和动作类中数据模型set方法后面的名称一致
<form action="${pageContext.request.contextPath}/action2.action" method="post"> <%--表单中的name属性取值必须和动作类中数据模型的set方法后面的名称一致。 --%> 用户名:<input type="text" name="username" /><br/> 年龄:<input type="text" name="age"/><br/> <input type="submit" value="提交" /> </form>这种方式其实和上面的静态赋值类似,只不过我们在jsp页面中的表单中添加数据,提交表单后由struts-default.xml中的拦截器
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>帮我们赋值给username和age
注意:jsp页面写法和方式一不同,如果不加user就取不到值,因为表单中的name值和你动作类中的名称不匹配(动作类中是user)
<body> <form action="${pageContext.request.contextPath}/action3.action" method="post"> <%--表单中的name属性取值必须和动作类中数据模型的set方法后面的名称一致。 --%> 用户名:<input type="text" name="user.username" /><br/> 年龄:<input type="text" name="user.age"/><br/> <input type="submit" value="提交" /> </form> </body>动作类和数据模型写法
//User类 import java.io.Serializable; public class User implements Serializable { private String username; private int age; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } //动作类 public class Demo3Action extends ActionSupport { //定义数据模型对象 //第一种情况 private User user; //第二种情况 private User user = new User(); public String addUser(){System.out.println(user.getUsername()+","+user.getAge()); return null; //不返回任何结果视图 NONE常量 } public User getUser() { System.out.println("getUser");return user; } public void setUser(User user) { System.out.println("setUser"); this.user = user; } } 第一种情况,我们在动作类中不创建User对象,只创建变量,控制台输出结果: 第二种情况,我们在动作类中创建User对象,控制台输出结果: 分析:第二中情况下,我们已经创建了User对象,Struts2框架先调用getUser方法,一看User对象已经存在,就不再调用setUser方法创建对象,直接再次调用getUser方法取值 ,第一次调用get方法只判断对象存不存在,第二次调用get方法才是取值。