Struts2学习笔记二:Struts2重定向和转发配置Struts2获取表单参数域对象
Posted java开发架构师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2学习笔记二:Struts2重定向和转发配置Struts2获取表单参数域对象相关的知识,希望对你有一定的参考价值。
1. Struts2学习笔记二:Struts2重定向和转发配置、Struts2获取表单参数、域对象
1.1. 转发和重定向
Struts2转发到jsp页面
1<action name="Demo1Action" class="cn.zhang.a_result.Demo1Action" method="execute" >
2 <result name="success" type="dispatcher" >/hello.jsp</result>
3</action>
type值为dispatcher
Struts2重定向到jsp
1<action name="Demo2Action" class="cn.zhang.a_result.Demo2Action" method="execute" >
2 <result name="success" type="redirect" >/hello.jsp</result>
3</action>
type值为redirect
Struts2转发到Action
1<action name="Demo3Action" class="cn.itheima.a_result.Demo3Action" method="execute" >
2 <result name="success" type="chain">
3 <!-- action的名字 -->
4 <param name="actionName">Demo1Action</param>
5 <!-- action所在的命名空间 -->
6 <param name="namespace">/</param>
7 </result>
8</action>
type值为chain,还要指定命名空间
Struts2重定向到Action
1<action name="Demo4Action" class="cn.itheima.a_result.Demo4Action" method="execute" >
2 <result name="success" type="redirectAction">
3 <!-- action的名字 -->
4 <param name="actionName">Demo1Action</param>
5 <!-- action所在的命名空间 -->
6 <param name="namespace">/</param>
7 </result>
8 </action>
type类型为redirectAction
1.2. Struts2获取ServletAPI
由于Struts2是对Servlet技术的封装,Servlet可以通过request直接获得前端传进域对象的参数。Struts2也有三种方式获取域对象,Struts2中有一个ActionContext域对象,里面包含着Servlet九大域对象,他们以键值对的方式存储。可以通过ActionContext获取里面的域对象。
第一种:通过ActionContext对象获取域对象(推荐)
1//request域=> map (struts2并不推荐使用原生request域)
2//不推荐
3Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");
4//推荐
5ActionContext.getContext().put("name", "requestTom");
6//session域 => map
7Map<String, Object> sessionScope = ActionContext.getContext().getSession();
8sessionScope.put("name", "sessionTom");
9//application域=>map
10Map<String, Object> applicationScope = ActionContext.getContext().getApplication();
11applicationScope.put("name", "applicationTom");
由于request生命周期和ActionContext的生命周期相同,故直接将Struts2设计者,直接将ActionContext作为了request域对象。
通过ServletActionContext对象获取ServletAPI(不推荐)
1//原生request
2HttpServletRequest request = ServletActionContext.getRequest();
3//原生session
4HttpSession session = request.getSession();
5//原生response
6HttpServletResponse response = ServletActionContext.getResponse();
7//原生servletContext
8ServletContext servletContext = ServletActionContext.getServletContext();
9return SUCCESS;
通过实现接口的方式获取(不推荐,太过诡异)
1public class Demo7Action extends ActionSupport implements ServletRequestAware {
2 private HttpServletRequest request;
3 public String execute() throws Exception {
4 System.out.println("原生request:"+request);
5 return SUCCESS;
6 }
1.3. Struts2获取表单参数的三种方式
1.3.1. 通过属性驱动获取表单参数
在Action中建立jsp表单中相同的name属性,就能直接获取form表单中的参数,这是struts2的机制。
在Servlet年代,Servlet技术是线程不安全的,为了解决线程不安全,他们采用了在方法中定义变量,这样就保证了每个对象获取的是自己的参数。而Struts2允许通过成员变量获取form表单的参数,是因为每次请求都会创建新的Action实例。这也保证了每个对象获取的是自己的参数。
1 //准备与参数键名称相同的属性
2 private String name;
3 //自动类型转换 只能转换8大基本数据类型以及对应包装类
4 private Integer age;
5 //支持特定类型字符串转换为Date ,例如 yyyy-MM-dd
6 private Date birthday;
7 public String execute() throws Exception {
8 System.out.println("name参数值:"+name+",age参数值:"+age+",生日:"+birthday);
9 return SUCCESS;
10 }
1.3.2. 对象驱动获取表单参数
创建一个实体类,并通过方法将获取的参数封装到该实体类中。在servlet技术中我们是通过BeanUtils工具类的populate将前端获取的参数封装到实体类中,Struts2有更好的方法进行封装。
1<form action="${pageContext.request.contextPath}/Demo9Action">
2 用户名:<input type="text" name="user.name" /><br>
3 年龄:<input type="text" name="user.age" /><br>
4 生日:<input type="text" name="user.birthday" /><br>
5 <input type="submit" value="提交" />
6</form>
注意name的值要加上实体类对象的名字还有.
1//在Action中要添加实体类对象
2private User user;
1.3.3. 对象模型驱动获取表单参数
这是对上一个的改造,因为name值总是要加一个user.这样就有点不习惯了,为了符合开发人员的习惯,就发明了对象模型驱动的方法。
1<form action="${pageContext.request.contextPath}/Demo9Action">
2 用户名:<input type="text" name="name" /><br>
3 年龄:<input type="text" name="age" /><br>
4 生日:<input type="text" name="birthday" /><br>
5 <input type="submit" value="提交" />
6</form>
jsp和之前一样,去掉了对象和点
Action需要实现一个ModelDriven<User\>接口
1public class Demo10Action extends ActionSupport implements ModelDriven<User> {
2 //准备user 成员变量
3 private User user =new User();
4 @Override
5 public User getModel() {
6 return user;
7 }
注意要创建一个实体类的成员变量,还要new出来,一个get方法
但是这种方法有一个缺点,只能封装一个对象。
1.4. 集合类型参数封装
list,map提交的jsp中name值要写成对应的值
1<form action="${pageContext.request.contextPath}/Demo11Action" method="post" >
2list:<input type="text" name="list" /><br>
3list:<input type="text" name="list[3]" /><br>
4map:<input type="text" name="map['haha']" /><br>
5<input type="submit" value="提交" />
6</form>
同理在Action中需要创建该集合的成员变量,并生成set(),get()方法
1//list
2private List<String> list;
3//Map
4private Map<String,String> map;
2. 小知识点
注意:struts和hibernate包在合并时.javassist-3.18.1-GA.jar包是重复的,删除版本低的.
以上是关于Struts2学习笔记二:Struts2重定向和转发配置Struts2获取表单参数域对象的主要内容,如果未能解决你的问题,请参考以下文章