Struts框架(6)---action接收请求参数
action接收请求参数
在web开发中,去接收请求参数来获得表单信息非常的常见,自己也总结整理了有关Struts2通过action接收请求参数的几种方法。
Struts2 提供三种数据封装的方式:
(1) Action 本身作为model对象,通过成员setter封装
(2) 创建独立model对象,页面通过ognl表达式封装
(3) 使用ModelDriven接口,对请求数据进行封装(推荐)
下面我们来讲解第一种:
(1) Action类本身作为model对象通过成员的setter方法封装(属性驱动)
setXxx()的xxx必须与请求的参数名一样。就是指和form表单中的name对应的属性要一致
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 26 27 28 29 30 31 | import java.util.Arrays; import com.ssh.struts2.model.User; import com.opensymphony.xwork2.ActionSupport; /* * 通过这种方法最简单,但也有缺点如果要把数据封装到model对象中然后传递给业务层和数据层 * 还需要单独定义model对象进行传递数据 */ public class RegisterAction1 extends ActionSupport { private String username; private String [] hobby; @Override public String execute() throws Exception { //获取表单的数据 System.out.println( "用户名是:" +username); System.out.println( "兴趣爱好是:" +Arrays.toString(hobby)); return null ; } //这里必须提供set方法,get方法可有可无 public void setUsername(String username) { this .username = username; } public void setHobby(String[] hobby) { this .hobby = hobby; } } /*当你在界面中用户名输入:zhangsan,兴趣爱好选择:体育和读书那么运行结果如下: * 用户名是:zhangsan * 兴趣爱好是:[sport, read] */ |
struts.xml
1 2 3 4 5 6 7 8 9 10 | <? 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 > < package name="default" extends="struts-default"> < action name="register1" class="com.ssh.struts2.action.RegisterAction1"> </ action > </ package > </ struts > |
register.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> < html > < head > </ head > < body > < h4 >注册表单1 </ h4 > < form action="${pageContext.request.contextPath }/register1.action" method="post"> 用户名:< input type="text" name="username">< br /> 爱好:< input type="checkbox" name="hobby" value="sport">体育 < input type="checkbox" name="hobby" value="music">音乐 < input type="checkbox" name="hobby" value="read">读书 < br /> < input type="submit" value="注册"> </ form > </ body > </ html > |
网页:
(2) 创建独立model对象,页面通过ognl表达式封装
该方法首先要创建一个专门的领域对象进行封装
User领域对象
import java.util.Arrays; public class User { private String username; private String [] hobby; //为这两个常量提供set和get方法和toString方法
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 26 27 | import com.ssh.struts2.model.User; import com.opensymphony.xwork2.ActionSupport; public class RegisterAction2 extends ActionSupport{ //直接定义model对象 private User user; @Override public String execute() throws Exception { System.out.println( "user:" +user); return NONE; } /* * 必须提供get方法 * 封装第一个参数 创建一个新的User对象 然后把username属性封装到这个创建的user对象中 User user =new User();user.setUserName(""); * 封装第二个参数 已经存在user对象 User user =getUser(); user.setPassword("); */ public User getUser() { return user; } public void setUser(User user) { this .user = user; } } /* * 如果jsp界面输入:用户名:aa 兴趣爱好:体育读书 * 后台输出:user:User [username=aa, hobby=[sport, music]] */ |
register.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <html> 3 <head> 4 </head> 5 <body> 6 <!-- 用ognl表达式要注意的一点就是,标签的属性name在取名字的时候是:领域对象.属性 7 user.username这里user是具体的对象,username是领域对象的属性--> 8 <h4>注册表单1 </h4> 9 <form action="${pageContext.request.contextPath }/register2.action" method="post"> 10 用户名:<input type="text" name="user.username"><br/> 11 爱好:<input type="checkbox" name="user.hobby" value="sport">体育 12 <input type="checkbox" name="user.hobby" value="music">音乐 13 <input type="checkbox" name="user.hobby" value="read">读书 <br/> 14 <input type="submit" value="注册"> 15 </form> 16 </body> 17 </html>
说明:struts2首先通过反射技术调用User的默认构造器创建User对象,然后通过反射技术调用User中与请求参数同名的属性的setter方法来获取请求参数值。在这里需要注意的一点是:User对象一定要有默认的构造器。
采用复合类型接收请求参数的好处,可以减少action中的setter和getter方法,同时可以把相应的属性组合成一个类,这样使代码更好清晰,代码有更好的结构。
(3)使用ModelDriven接口,对请求数据进行封装
第三种方法比较方便,和方法(1)不同在于它也要先创建一个领域对象类进行对象的封装。其它和方法(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 | import com.ssh.struts2.model.User; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; //实现ModelDriven<User>接口 public class RegisterAction3 extends ActionSupport implements ModelDriven<User> { /** * 方式三 使用模型驱动 */ //这里需要注意,方法2中的user对象不需要自己创建,而这里必须手动初始化 private User user = new User(); public User getModel() { return user; } @Override public String execute() throws Exception { System.out.println( "user:" +user); return NONE; } } /* * 如果jsp界面输入:用户名:aa 兴趣爱好:体育读书 * 后台输出:user:User [username=aa, hobby=[sport, music]] */ |
最后我们来思考两个问题,也是常见的笔面试题:
问题一:Action封装数据会不会有线程问题?
问题二:在使用第一种方式进行封装的时候数据封装到Action 属性中不能把Action传递给业务层数据如何传递?
谢谢大家浏览,欢迎大家指点!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步