本期知识点
结果页面配置
action获取表单提交数据
Struts2 提供获取表单数据方式
Struts2 获取数据封装到集合中
一. 结果页面配置
1. 全局结果页面
i. result标签配置action方法的返回值到不同的路径里面
ii. 创建两个action,执行默认的方法execute方法,让两个action的方法都返回success,返回success之后,配置到同一个页面里面
1) 如果多个action,方法里面返回值相同,到页面也是相同,这时可以使用全局页面配置
<package name="demo01" extends="struts-default" namespace="/"> <action name="book" class="org.fan.demo.BookAction" > <result name="success">/hello.jsp</result> </action> <action name="order" class="org.fan.demo.OrderAction" > <result name="success">/hello.jsp</result> </action> </package>
2) 在package标签里进行配置
<!--全局结果页面的配置 --> <global-results> <result name="success">/hello.jsp</result> </global-results>
2. 局部结果页面
i. 配置全局页面,也配置了局部页面,最终以局部配置为准。
<package name="demo01" extends="struts-default" namespace="/"> <!--全局结果页面的配置 --> <global-results> <result name="success">/hello.jsp</result> </global-results> <action name="book" class="org.fan.demo.BookAction" > <result name="success">/world.jsp</result> </action> <action name="order" class="org.fan.demo.OrderAction" > <!-- <result name="success">/hello.jsp</result> --> </action> </package>
3. result标签 type属性
i. type属性:如何到路径里面(转发还是重定向)
ii. type属性值
1) 默认值,dispatch,转发操作,一次请求,地址栏不变<action name="book" class="org.fan.demo.BookAction" > <result name="success" type="dispatch" >/world.jsp</result> </action>
2) 重定向,redirect,两次请求,地址栏变化
<action name="book" class="org.fan.demo.BookAction" > <result name="success" type="redirect" >/world.jsp</result> </action>
3) 上面两个值一般针对到页面中的设置。也可以配置道其他action 里面
- redirectAction:重定向到 action
- chain:转发到action 一般不用,缓存有问题
<action name="book" class="org.fan.demo.BookAction" > <result name="success" type="redirectAction">order</result> </action> <action name="order" class="org.fan.demo.OrderAction" > <result name="success">/hello.jsp</result> </action>
二. action获取表单提交数据
在web阶段,提交表单到servlet里面,在servlet里面使用request对象里面的方法获取
现在提交表单到action ,action 中没有request对象。主要使用以下三种方式:
1. 使用 ActionContext 类获取
i. Map<String , Object> getParameters()
1) 返回一个包含所有HttpServletRequest参数信息的Map对象2) 这个方法不是静态方法,需要创建ActionContext类的对象3) 这个ActionContext类对象不是new出来的,利用下面的方法
ii. static ActionContext getContext()
1) 获取当前线程的ActionContext对象
iii. 步骤:
1) 创建表单,提交表单到action2) 在action使用AcionContext获取数据
2. 使用ServletActionContext类获取
i. 为了直接访问 Servlet api ,Struts2 框架还提供了ServletActionContext类,包含了以下几个静态方法:
- static HttpServletRequest():获取web应用的HttpServletRequest对象
- static HttpServletRequest():获取Web应用的HttpServletResponse对象
- static ServletContext getServletConext():获取Web应用的ServletConext对象
- static PageContext getPageContext():获取Web应用的PageContext对象
ii. 步骤import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class Form2Action extends ActionSupport { @Override public String execute() throws Exception { //1.使用ServletActionContext类获取 request HttpServletRequest request = ServletActionContext.getRequest(); //2.调用request 里面方法得到结果 String username = request.getParameter("username"); String password = request.getParameter("password"); String address = request.getParameter("address"); System.out.println(username+":"+password+":"+address); return NONE; } }
3. 使用接口注入方式(了解)
import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.ActionSupport; public class Form3Action extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; @Override public void setServletRequest(HttpServletRequest request) { this.request=request; } @Override public String execute() throws Exception { return NONE; } }
4. 在action操作域对象
i. request、session、servletContext域对象
ii. 使用ServletActionContext类操作//操作三个域对象 //1 request域 HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("req", "reqValue"); //2 session域 HttpSession session = request.getSession(); session.setAttribute("seess", "sessValue"); //3 ServletContex域 ServletContext servletContext = ServletActionContext.getServletContext(); servletContext.setAttribute("contextname", "contextValue");
5. Struts2 封装获取表单数据方式
i. 原始方式获取表单封装到实体对象
import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import org.apache.struts2.interceptor.ServletRequestAware; import org.fan.entiy.User; import com.opensymphony.xwork2.ActionSupport; //使用ServletActionContext获取表单数据封装到实体类对象里面 public class Form4Action extends ActionSupport{ @Override public String execute() throws Exception { //1.获取表单数据 HttpServletRequest request = ServletActionContext.getRequest(); String username = request.getParameter("username"); String password = request.getParameter("password"); String address = request.getParameter("address"); //2.封装到实体类对象里面 User u = new User(); u.setUsername(username); u.setPassword(password); u.setAddress(address); System.out.println(u); return NONE; } }
三. struts2 提供获取表单数据方式
1. 属性封装
i. 直接把表单提交属性封装到action的属性里面
ii. 步骤:
1) 在action成员变量位置定义变量
- 变量名称和表单输入项的name属性值一样
2) 生成变量的set方法(set和get方法)import com.opensymphony.xwork2.ActionSupport; /*使用属性封装获取表单数据 */ public class DataDemoAction extends ActionSupport { //1.定义变量 //- 变量名称和表单输入项的name属性值一样 private String username; private String password; private String address; //2.成变量的set方法(set和get方法) public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String execute() throws Exception { System.out.println(username+":"+password+":"+address); return NONE; } }
iii. 使用属性封装获取表单数据到属性里面,不能把数据直接封装到实体类对象里面
2. 模型驱动封装(重点)
i. 可以直接把表单数据封装到实体对象里面
ii. 步骤:
1) action 实现接口 ModelDriven2) 实现接口里面的方法 getModel方法
- 把创建对象返回
3) 在action里面创建实体类对象
import org.fan.entiy.User; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; /* * 1) action 实现接口 ModelDriven 2) 实现接口里面的方法 getModel方法 - 把创建对象返回 3) 在action里面创建实体类对象 */ public class DataDemo2Action extends ActionSupport implements ModelDriven<User>{ //创建对象 //前提要求:实体属性名称和表单输入项的name属性值一样 private User user = new User(); @Override public User getModel() { //返回user对象 return user; } @Override public String execute() throws Exception { System.out.println(user); return NONE; } }
iii. 使用模型驱动和属性封装注意问题:
1) 在一个action中,获取表单数据不能使用属性封装和模型驱动封装获取同一个表单数据。如果同时使用,执行模型驱动封装。
3. 表达式封装(会用)
i. 使用表达式封装可以把表单数据封装到实体对象里面
ii. 步骤:
1) 在action里面声明实体类2) 生成实体类变量的set和get方法3) 在表单输入项的name属性值里面写表达式形式
import org.fan.entiy.User; import com.opensymphony.xwork2.ActionSupport; /* 1) 在action里面声明实体类 2) 生成实体类变量的set和get方法 3) 在表单输入项的name属性值里面写表达式形式 */ public class DataDemo3Action extends ActionSupport { //1.在action里面声明实体类 private User user ; public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String execute() throws Exception { // TODO Auto-generated method stub return NONE; } }
<form action="${pageContext.request.contextPath}/data3.action" method="get"> username:<input type="text" name="user.username"/><br> password:<input type="text" name="user.password"/><br> address:<input type="text" name="user.address"/><br> <input type="submit" value="提交"/> </form>
4. 表达式封装和模型驱动比较
i. 相同点:
1) 使用表达式封装和模型驱动封装都可以把数据封装到实体类里面
ii. 不同点:
1) 使用模型驱动只能把数据封装到一个实体类对象里面
- 在一个action里面不能使用模型驱动把数据封装到不同的实体类对象里面
2) 使用表达式封装可以把数据封装到不同的实体类对象里面
四. Struts2 获取数据封装到集合中
1. 封装到 List 集合
i. 在action声明Listii. 生成list变量的 set和 get方法iii. 在表单输入项目里写表达式
list.jspimport java.util.List; import org.fan.entiy.User; import com.opensymphony.xwork2.ActionSupport; public class ListAction extends ActionSupport{ // 1. 在action声明List private List<User> list; // 2. 生成list变量的 set和 get方法 public List<User> getList() { return list; } public void setList(List<User> list) { this.list = list; } @Override public String execute() throws Exception { System.out.println(list); return NONE; } // 3.在表单输入项目里写表达式 }
<form action="${pageContext.request.contextPath}/list.action" method="get"> username:<input type="text" name="list[0].username"/><br> password:<input type="text" name="list[0].password"/><br> address:<input type="text" name="list[0].address"/><br> <br> username:<input type="text" name="list[1].username"/><br> password:<input type="text" name="list[1].password"/><br> address:<input type="text" name="list[1].address"/><br> <input type="submit" value="提交"/> </form>
struts.xml
<!-- 封装到List集合 --> <action name="list" class="org.fan.List_Map.ListAction"></action>
2. 封装到 Map 集合
Javapackage org.fan.List_Map; import java.util.Map; import org.fan.entiy.User; import com.opensymphony.xwork2.ActionSupport; public class MapAction extends ActionSupport { //1.声明map集合 private Map<String,User> map; //2.生成get set方法 public Map<String, User> getMap() { return map; } public void setMap(Map<String, User> map) { this.map = map; } @Override public String execute() throws Exception { System.out.println(map); return NONE; } }
map.jsp<form action="${pageContext.request.contextPath}/map.action" method="get"> <!--设置key值 map['key值'] 设置value值 --> username:<input type="text" name="map['one'].username"/><br> password:<input type="text" name="map['one'].password"/><br> address:<input type="text" name="map['one'].address"/><br> <br> username:<input type="text" name="map['two'].username"/><br> password:<input type="text" name="map['two'].password"/><br> address:<input type="text" name="map['two'].address"/><br> <input type="submit" value="提交"/> </form>
struts.xml<!-- 封装到Map集合 --> <action name="map" class="org.fan.List_Map.MapAction"></action>