(八)Struts2中的参数封装
一、静态参数封装
什么是静态参数?
静态参数就是硬编码的,不可随意改变。
例子:
(1)我们首先创建一个Action类,里面有两个参数,用来封装请求参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public class User extends ActionSupport { 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 String adduser(){ System.out.println(username+ ":" +age); return null ; } } |
(2)我们在struts.xml中配置静态参数,我们访问action1动作时,会输出 张三:18
1 2 3 4 5 6 7 | < package name= "p1" extends = "struts-default" > <action name= "action1" class = "com.cad.struts2.User" method= "adduser" > <!--通过注入的方式封装静态参数--> <param name= "username" >张三</param> <param name= "age" > 18 </param> </action> </ package > |
(3)原理
1 2 3 4 5 | 我们在struts2的运行流程中提到过,我们动作类的动作方法执行之前,会有一系列的拦截器帮我们执行一些操作。 在struts- default .xml中,有很多拦截器,拦截器又分为很多拦截器栈,我们默认是使用defaultStack的拦截器栈。 这个拦截器栈中有一个叫做staticParams的拦截器帮我们完成静态参数的封装,将配置的静态方法通过action类中的set方法设置进去。 |
二、动态参数封装
什么是动态参数?
像我们用表单提交的数据,就是动态数据。数据是可变的
例子:
(1)第一步:我们先创建一个添加用户的表单
1 2 3 4 5 | <form action= "${pageContext.request.contextPath }/action1" method= "post" > 用户名:<input type= "text" name= "username" ><br> 年 龄:<input type= "text" name= "age" ><br> <input type= "submit" value= "提交" > </form> |
(2)第一种方式:数据参数和动作类写在一起 要求是表单中的name必须和我们类中的set方法后面的名称一致,例如表单中的username对应类中的setUsername,和参数并没有太大关系,和set方法有关系。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public class User extends ActionSupport { 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 String adduser(){ System.out.println(username+ ":" +age); return null ; } } |
(3)配置struts.xml文件
1 2 3 4 5 6 | < package name= "p1" extends = "struts-default" > <action name= "action1" class = "com.cad.struts2.User" method= "adduser" > </action> </ package > |
这一系列操作是由拦截器栈中的名为params的拦截器帮我们完成的
上面这种方式将参数和动作类写在一起,看起来太过混乱,我们能不能用一个JavaBean将参数给封装起来。 答案是能。
第二种方式,将参数数据和动作类分开写
(1)第一步,我们创建一个javaBean,User类,用来封装请求参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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; } } |
(2)第二步:创建一个添加用户的动作类,里面有一个user对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class AdduserAction extends ActionSupport { private User user; public User getUser() { return user; } public void setUser(User user) { this .user = user; } public String adduser(){ System.out.println(user.getUsername()+ ":" +user.getAge()); return null ; } } |
(3)第三步:我们得改变一些我们的jsp页面的写法,因为表单的name要和类中的数据相对应,但类中只有一个user ,username去找动作类中的setUsername,肯定找不到。 我们这样写,他就会先找类中的user对象,然后去找user对象的username和age
1 2 3 4 5 6 7 | <body> <form action= "${pageContext.request.contextPath }/action1" method= "post" > 用户名:<input type= "text" name= "user.username" ><br> 年 龄:<input type= "text" name= "user.age" ><br> <input type= "submit" value= "提交" > </form> </body> |
原理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 这一系列操作还是拦截器params帮我们完成。我们在getUser和setUser里打印两句话来看看他到底是怎么执行的 public User getUser() { System.out.println( "getuser" ); return user; } public void setUser(User user) { System.out.println( "setuser" ); this .user = user; } 输出 getuser :先判断对象是否存在 setuser :如果判断不存在,调用set方法,通过反射创建一个对象,并且设置给该类 getuser :然后再获取该对象,调用该对象的get和set方法对参数赋值 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步