版权声明: https://blog.csdn.net/hu18315778112/article/details/84794571
Struts2框架是web层的优秀框架,他的核心是采用Filter技术,并且使用Action类代替Servlet技术,当然如果特别想使用servlet技术,也可以通过一些方法获取Servlet中的所有对象(如:request、response、session、ServletContext……)
获取了这些对象后,你就可以做一些想做的事,比如……想干啥就干啥
一、从Action中获取ServletAPI
- 具体如何获取ServletAPI,有三种方式(底层都是相同的方法)
- 1. 通过ActionContext
例如:
//request域=> map (struts2并不推荐使用原生request域) Map<String, Object> requestScope = (Map<String, Object>)ActionContext.getContext().get("request"); //推荐,直接使用put方法将键值对存到Action对象中 ActionContext.getContext().put("name", "requestTom"); //session域 => map Map<String, Object> sessionScope = ActionContext.getContext().getSession(); sessionScope.put("name", "sessionTom"); //application域=>map Map<String, Object> applicationScope = ActionContext.getContext().getApplication(); applicationScope.put("name", "applicationTom");
- 2. 通过ServletActionContext
//原生request HttpServletRequest request = ServletActionContext.getRequest(); //原生session HttpSession session = request.getSession(); //原生response HttpServletResponse response = ServletActionContext.getResponse(); //原生servletContext ServletContext servletContext = ServletActionContext.getServletContext();
- 3. 通过实现接口方式
public class Demo7Action extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; public String execute() throws Exception { System.out.println("原生request:"+request); return SUCCESS; } @Override public void setServletRequest(HttpServletRequest request) { this.request = request; } }
二、获取参数
-
既然Struts2不推荐使用Servlet中的Api,那么如何从请求中获取参数,Action有自己的方式:
- 以表单提交的数据获取方式为例:(分为三种方式)
1. 属性注入方式:
- 方式1 表单:
<form action="${pageContext.request.contextPath}/xxxAction" method="post"> 用户名:<input type="text" name="name" /><br> 年龄:<input type="text" name="age" /><br> 生日:<input type="text" name="birthday" /><br> <input type="submit" value="提交" /> </form>
- 方式1 Action属性
//准备与参数键名称相同的属性 private String name; //自动类型转换 只能转换8大基本数据类型以及对应包装类 private Integer age; //支持特定类型字符串转换为Date ,例如 yyyy-MM-dd private Date birthday;
- 当表单提交到该Action时,封装数据属性名会对应input的name值自动
- (注意,有set/get方法的私有成员变量才能称之为属性,这里未写出set/get方法,但是实际开发种一定有)
2. 对象驱动方式:
- 方式2 表单:
<form action="${pageContext.request.contextPath}/Demo9Action"> 用户名:<input type="text" name="user.name" /><br> 年龄:<input type="text" name="user.age" /><br> 生日:<input type="text" name="user.birthday" /><br> <input type="submit" value="提交" /> </form>
//准备user对象 private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; }
- 对象的属性与表单的name值对应进行自动封装
- 这里将对象作为属性,同样生成set/get方法
3. 模型驱动方式:
- 表单与方式1 的表单相同
- 代码:
public class Demo10Action extends ActionSupport implements ModelDriven<User> { //准备user 成员变量 private User user =new User(); public String execute() throws Exception { System.out.println(user); return SUCCESS; } @Override public User getModel() { return user; } }
- 此种方式需要实现接口ModelDriven,泛型为想要封装的对象类。然后实现方法getModel()。
- 优点:前台页面无须任何改动(与方式1相同);
- 缺点:只能封装一个对象
拓展:当然其实还有第四种方式,作为拓展知识,集合形式:
- 页面:
<form action="${pageContext.request.contextPath}/Demo11Action" method="post" > list:<input type="text" name="list" /><br> list:<input type="text" name="list[3]" /><br> map:<input type="text" name="map['haha']" /><br> <input type="submit" value="提交" /> </form>
- 代码:
//list private List<String> list; //Map private Map<String,String> map;
- 注意:这里同样为集合类型的属性,需要有set/get方法
- List集合name值为属性名,角标为集合索引,
- Map集合,角标为key值