Struts2学习笔记二:Struts2重定向和转发配置Struts2获取表单参数域对象

Posted java开发架构师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2学习笔记二:Struts2重定向和转发配置Struts2获取表单参数域对象相关的知识,希望对你有一定的参考价值。

1. Struts2学习笔记二:Struts2重定向和转发配置、Struts2获取表单参数、域对象

1.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

  1. 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

  1. 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,还要指定命名空间

  1. 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

  1. 由于Struts2是对Servlet技术的封装,Servlet可以通过request直接获得前端传进域对象的参数。Struts2也有三种方式获取域对象,Struts2中有一个ActionContext域对象,里面包含着Servlet九大域对象,他们以键值对的方式存储。可以通过ActionContext获取里面的域对象。

ActionContext域
  1. 第一种:通过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域对象。

  1. 通过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;
  1. 通过实现接口的方式获取(不推荐,太过诡异)

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实例。这也保证了每个对象获取的是自己的参数。

form表单
 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. 对象驱动获取表单参数
  1. 创建一个实体类,并通过方法将获取的参数封装到该实体类中。在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. 对象模型驱动获取表单参数
  1. 这是对上一个的改造,因为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和之前一样,去掉了对象和点

  1. 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. 集合类型参数封装

  1. 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>
  1. 同理在Action中需要创建该集合的成员变量,并生成set(),get()方法

1//list
2private List<String> list;
3//Map
4private Map<String,String> map;

2. 小知识点

  1. 注意:struts和hibernate包在合并时.javassist-3.18.1-GA.jar包是重复的,删除版本低的.


以上是关于Struts2学习笔记二:Struts2重定向和转发配置Struts2获取表单参数域对象的主要内容,如果未能解决你的问题,请参考以下文章

Struts2学习笔记三 访问servlet

Struts2页面重定向

Struts2 JQuery:Ajax 提交表单、服务器表单验证和成功重定向

struts2学习1

Struts2学习笔记二 配置详解

struts2 type="redirectAction"重定向