(八)Struts2中的参数封装
- 作者: 五速梦信息网
- 时间: 2026年03月05日 13:17
一、静态参数封装
什么是静态参数?
静态参数就是硬编码的,不可随意改变。
例子:
(1)我们首先创建一个Action类,里面有两个参数,用来封装请求参数
public class User extends ActionSupport {
private String username; //用户名<br/>
private int age; //年龄
public String getUsername() {
return username;<br/>
}
public void setUsername(String username) {
this.username = username;<br/>
}
public int getAge() {
return age;<br/>
}
public void setAge(int age) {
this.age = age;<br/>
}
public String adduser(){
System.out.println(username+":"+age);<br/>
return null;<br/>
}<br/>
}
(2)我们在struts.xml中配置静态参数,我们访问action1动作时,会输出 张三:18
<package name=“p1” extends=“struts-default”>
<action name="action1" class="com.cad.struts2.User" method="adduser"><br/> <!--通过注入的方式封装静态参数--><br/> <param name="username">张三</param><br/> <param name="age">18</param><br/> </action><br/> </package>
(3)原理
我们在struts2的运行流程中提到过,我们动作类的动作方法执行之前,会有一系列的拦截器帮我们执行一些操作。 在struts-default.xml中,有很多拦截器,拦截器又分为很多拦截器栈,我们默认是使用defaultStack的拦截器栈。二、动态参数封装
这个拦截器栈中有一个叫做staticParams的拦截器帮我们完成静态参数的封装,将配置的静态方法通过action类中的set方法设置进去。
什么是动态参数?
像我们用表单提交的数据,就是动态数据。数据是可变的
例子:
(1)第一步:我们先创建一个添加用户的表单
<form action=“${pageContext.request.contextPath }/action1” method=“post”>
用户名:<input type="text" name="username"><br><br/>
年 龄:<input type="text" name="age"><br><br/>
<input type="submit" value="提交"><br/>
</form> </pre>
(2)第一种方式:数据参数和动作类写在一起 要求是表单中的name必须和我们类中的set方法后面的名称一致,例如表单中的username对应类中的setUsername,和参数并没有太大关系,和set方法有关系。
public class User extends ActionSupport {
private String username;<br/>
private int age;
public String getUsername() {
return username;<br/>
}
public void setUsername(String username) {
this.username = username;<br/>
}
public int getAge() {
return age;<br/>
}
public void setAge(int age) {
this.age = age;<br/>
}
public String adduser(){
System.out.println(username+":"+age);<br/>
return null;<br/>
}<br/>
}
(3)配置struts.xml文件
<package name=“p1” extends=“struts-default”>
<action name=“action1” class=“com.cad.struts2.User” method=“adduser”>
</action>
</package>
这一系列操作是由拦截器栈中的名为params的拦截器帮我们完成的
上面这种方式将参数和动作类写在一起,看起来太过混乱,我们能不能用一个JavaBean将参数给封装起来。 答案是能。
第二种方式,将参数数据和动作类分开写
(1)第一步,我们创建一个javaBean,User类,用来封装请求参数
public class User implements Serializable{
private String username;<br/>
private int age;
public String getUsername() {
return username;<br/>
}
public void setUsername(String username) {
this.username = username;<br/>
}
public int getAge() {
return age;<br/>
}
public void setAge(int age) {
this.age = age;<br/>
}<br/>
}
(2)第二步:创建一个添加用户的动作类,里面有一个user对象
public class AdduserAction extends ActionSupport {
private User user;
public User getUser() {
return user;<br/>
}
public void setUser(User user) {
this.user = user;<br/>
}<br/>
public String adduser(){<br/>
System.out.println(user.getUsername()+":"+user.getAge());<br/>
return null;<br/>
}
}
(3)第三步:我们得改变一些我们的jsp页面的写法,因为表单的name要和类中的数据相对应,但类中只有一个user ,username去找动作类中的setUsername,肯定找不到。 我们这样写,他就会先找类中的user对象,然后去找user对象的username和age
<body>
<form action="${pageContext.request.contextPath }/action1" method="post"><br/>
用户名:<input type="text" name="user.username"><br><br/>
年 龄:<input type="text" name="user.age"><br><br/>
<input type="submit" value="提交"><br/>
</form><br/>
</body>
原理:
这一系列操作还是拦截器params帮我们完成。我们在getUser和setUser里打印两句话来看看他到底是怎么执行的
public User getUser() {<br/>
System.out.println("getuser");<br/>
return user;<br/>
}
public void setUser(User user) {
System.out.println("setuser");<br/>
this.user = user;<br/>
}
输出
getuser :先判断对象是否存在<br/>
setuser :如果判断不存在,调用set方法,通过反射创建一个对象,并且设置给该类<br/>
getuser :然后再获取该对象,调用该对象的get和set方法对参数赋值
相关文章
-
(翻译)FIFO In Hardware
(翻译)FIFO In Hardware
- 互联网
- 2026年03月05日
-
(几乎)完美实现 el
(几乎)完美实现 el
- 互联网
- 2026年03月05日
-
(委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。
(委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。
- 互联网
- 2026年03月05日
-
(ssh整合web导出excel)在ssh框架中使用poi正确导出具有比较高级固定格式的excel 整体过程,查询导出前后台下载
(ssh整合web导出excel)在ssh框架中使用poi正确导出具有比较高级固定格式的excel 整体过程,查询导出前后台下载
- 互联网
- 2026年03月05日
-
(python)学习ing丨丨类学习,@property装饰器
(python)学习ing丨丨类学习,@property装饰器
- 互联网
- 2026年03月05日
-
(C语言)格式输出,右对齐
(C语言)格式输出,右对齐
- 互联网
- 2026年03月05日


