1. Struts2学习笔记二:Struts2重定向和转发配置、Struts2获取表单参数、域对象
1.1. 转发和重定向
- Struts2转发到jsp页面
<action name="Demo1Action" class="cn.zhang.a_result.Demo1Action" method="execute" >
<result name="success" type="dispatcher" >/hello.jsp</result>
</action>
- Struts2重定向到jsp
<action name="Demo2Action" class="cn.zhang.a_result.Demo2Action" method="execute" >
<result name="success" type="redirect" >/hello.jsp</result>
</action>
- Struts2转发到Action
<action name="Demo3Action" class="cn.itheima.a_result.Demo3Action" method="execute" >
<result name="success" type="chain">
<param name="actionName">Demo1Action</param>
<param name="namespace">/</param>
</result>
</action>
- Struts2重定向到Action
<action name="Demo4Action" class="cn.itheima.a_result.Demo4Action" method="execute" >
<result name="success" type="redirectAction">
<param name="actionName">Demo1Action</param>
<param name="namespace">/</param>
</result>
</action>
1.2. Struts2获取ServletAPI
- 由于Struts2是对Servlet技术的封装,Servlet可以通过request直接获得前端传进域对象的参数。Struts2也有三种方式获取域对象,Struts2中有一个ActionContext域对象,里面包含着Servlet九大域对象,他们以键值对的方式存储。可以通过ActionContext获取里面的域对象。
- 第一种:通过ActionContext对象获取域对象(推荐)
Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");
ActionContext.getContext().put("name", "requestTom");
Map<String, Object> sessionScope = ActionContext.getContext().getSession();
sessionScope.put("name", "sessionTom");
Map<String, Object> applicationScope = ActionContext.getContext().getApplication();
applicationScope.put("name", "applicationTom");
- 由于request生命周期和ActionContext的生命周期相同,故直接将Struts2设计者,直接将ActionContext作为了request域对象。
- 通过ServletActionContext对象获取ServletAPI(不推荐)
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
HttpServletResponse response = ServletActionContext.getResponse();
ServletContext servletContext = ServletActionContext.getServletContext();
return SUCCESS;
- 通过实现接口的方式获取(不推荐,太过诡异)
public class Demo7Action extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
public String execute() throws Exception {
System.out.println("原生request:"+request);
return SUCCESS;
}
1.3. Struts2获取表单参数的三种方式
1.3.1. 通过属性驱动获取表单参数
- 在Action中建立jsp表单中相同的name属性,就能直接获取form表单中的参数,这是struts2的机制。
- 在Servlet年代,Servlet技术是线程不安全的,为了解决线程不安全,他们采用了在方法中定义变量,这样就保证了每个对象获取的是自己的参数。而Struts2允许通过成员变量获取form表单的参数,是因为每次请求都会创建新的Action实例。这也保证了每个对象获取的是自己的参数。
private String name;
private Integer age;
private Date birthday;
public String execute() throws Exception {
System.out.println("name参数值:"+name+",age参数值:"+age+",生日:"+birthday);
return SUCCESS;
}
1.3.2. 对象驱动获取表单参数
- 创建一个实体类,并通过方法将获取的参数封装到该实体类中。在servlet技术中我们是通过BeanUtils工具类的populate将前端获取的参数封装到实体类中,Struts2有更好的方法进行封装。
<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>
private User user;
1.3.3. 对象模型驱动获取表单参数
- 这是对上一个的改造,因为name值总是要加一个user.这样就有点不习惯了,为了符合开发人员的习惯,就发明了对象模型驱动的方法。
<form action="${pageContext.request.contextPath}/Demo9Action">
用户名:<input type="text" name="name" /><br>
年龄:<input type="text" name="age" /><br>
生日:<input type="text" name="birthday" /><br>
<input type="submit" value="提交" />
</form>
- Action需要实现一个ModelDriven<User>接口
public class Demo10Action extends ActionSupport implements ModelDriven<User> {
private User user =new User();
@Override
public User getModel() {
return user;
}
- 注意要创建一个实体类的成员变量,还要new出来,一个get方法
- 但是这种方法有一个缺点,只能封装一个对象。
1.4. 集合类型参数封装
- list,map提交的jsp中name值要写成对应的值
<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>
- 同理在Action中需要创建该集合的成员变量,并生成set(),get()方法
private List<String> list;
private Map<String,String> map;
2. 小知识点
- 注意:struts和hibernate包在合并时.javassist-3.18.1-GA.jar包是重复的,删除版本低的.