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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33322074/article/details/89206902

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

1.1. 转发和重定向

  1. Struts2转发到jsp页面
<action name="Demo1Action" class="cn.zhang.a_result.Demo1Action" method="execute" >
    <result name="success" type="dispatcher" >/hello.jsp</result>
</action>
  • type值为dispatcher
  1. Struts2重定向到jsp
<action name="Demo2Action" class="cn.zhang.a_result.Demo2Action" method="execute" >
    <result name="success" type="redirect" >/hello.jsp</result>
</action>
  • type值为redirect
  1. Struts2转发到Action
<action name="Demo3Action" class="cn.itheima.a_result.Demo3Action" method="execute" >
    <result name="success" type="chain">
        <!-- action的名字 -->
        <param name="actionName">Demo1Action</param>
        <!-- action所在的命名空间 -->
        <param name="namespace">/</param>
    </result>
</action>
  • type值为chain,还要指定命名空间
  1. Struts2重定向到Action
<action name="Demo4Action" class="cn.itheima.a_result.Demo4Action" method="execute" >
			<result  name="success"  type="redirectAction">
				 <!-- action的名字 -->
	             <param name="actionName">Demo1Action</param>
	             <!-- action所在的命名空间 -->
	             <param name="namespace">/</param>
            </result>
		</action>
  • type类型为redirectAction

1.2. Struts2获取ServletAPI

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

ActionContext域

  1. 第一种:通过ActionContext对象获取域对象(推荐)
//request域=> map (struts2并不推荐使用原生request域)
//不推荐
Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");
//推荐
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");
  • 由于request生命周期和ActionContext的生命周期相同,故直接将Struts2设计者,直接将ActionContext作为了request域对象。
  1. 通过ServletActionContext对象获取ServletAPI(不推荐)
//原生request
HttpServletRequest request = ServletActionContext.getRequest();
//原生session
HttpSession session = request.getSession();
//原生response
HttpServletResponse response = ServletActionContext.getResponse();
//原生servletContext
ServletContext servletContext = ServletActionContext.getServletContext();
return SUCCESS;
  1. 通过实现接口的方式获取(不推荐,太过诡异)
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实例。这也保证了每个对象获取的是自己的参数。

form表单

	//准备与参数键名称相同的属性
	private String name;
	//自动类型转换 只能转换8大基本数据类型以及对应包装类
	private Integer age;
	//支持特定类型字符串转换为Date ,例如 yyyy-MM-dd
	private Date   birthday;
	public String execute() throws Exception { 
		System.out.println("name参数值:"+name+",age参数值:"+age+",生日:"+birthday);
		return SUCCESS;
	}
1.3.2. 对象驱动获取表单参数
  1. 创建一个实体类,并通过方法将获取的参数封装到该实体类中。在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>
  • 注意name的值要加上实体类对象的名字还有.
//在Action中要添加实体类对象
private User user;
1.3.3. 对象模型驱动获取表单参数
  1. 这是对上一个的改造,因为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>
  • jsp和之前一样,去掉了对象和点
  1. Action需要实现一个ModelDriven<User>接口
public class Demo10Action extends ActionSupport implements ModelDriven<User> {
	//准备user 成员变量
	private User user =new User();
	@Override
	public User getModel() {
		return user;
	}
  • 注意要创建一个实体类的成员变量,还要new出来,一个get方法
  • 但是这种方法有一个缺点,只能封装一个对象。

1.4. 集合类型参数封装

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

2. 小知识点

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

猜你喜欢

转载自blog.csdn.net/qq_33322074/article/details/89206902
今日推荐