Struts2——结果跳转方式配置(重定向,转发<默认>,重定向到方法,重定向到转发),获取servlet的内些API(request,servletcontext...),获取参数

一、结果跳转方式

1)转发(默认)

<!--  转发 -->
<action name="Demo1Action" class="cn.itheima.a_result.Demo1Action" method="execute" >
	<result name="success" type="dispatcher" >/hello.jsp</result>
</action>

2)重定向

<!-- 重定向 -->
<action name="Demo2Action" class="cn.itheima.a_result.Demo2Action" method="execute" >
	<result name="success" type="redirect" >/hello.jsp</result>
</action>

3)转发到Action

<!-- 转发到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>

4)重定向到Action

<!-- 重定向到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>

二、访问servlet的API

注:域对象实际上就是一个Map

获取这些对象的方法

方法一:通过ActionContext(建议,只有它是获取的域对象:字典形式)

//request域=> map (struts2并不推荐使用原生request域)
//不推荐
Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");
//推荐(因为ActionContext的生命周期和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");

获取方法

<body>
	request: ${requestScope.name}<br>
	session:${sessionScope.name}<br>
	application:${applicationScope.name}<br>
</body>

方法二:通过ServletActionContext

//原生request
HttpServletRequest request = ServletActionContext.getRequest();
//原生session
HttpSession session = request.getSession();
//原生response
HttpServletResponse response = ServletActionContext.getResponse();
//原生servletContext
ServletContext servletContext = ServletActionContext.getServletContext();

方法三:通过实现接口方式

public class Demo7Action extends ActionSupport implements ServletRequestAware {    // 如果想获得其他的,在实现其他接口
	
	
	private HttpServletRequest request;

	public String execute() throws Exception { 
		
		System.out.println("原生request:"+request);
		return SUCCESS;
	}

	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	
}

Struts与Struts2的生命周期的区别

Struts1的模式(servlet的生命周期)

默认在第一次访问的时候实例化(init方法)servlet类

然后每次请求来的时候执行service方法

这样大家都修改同一个类成员变量,就会有线程不安全的隐患

Struts2的模式

每来一个请求实例化一个Action对象,请求结束销毁

这样各自操作各自的,没有线程安全问题

Struts MVC

详情请看:这里

三、接收参数

方法一:属性驱动获得参数

注:要有get,set方法

方法二:对象驱动

public class Demo9Action extends ActionSupport  {
	//准备user对象
	private User user;

	public String execute() throws Exception { 
		
		System.out.println(user);
		
		return SUCCESS;
	}

	public User getUser() {  // 前两种方式都需要提供get,set方法
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	
}

方法三:模型驱动

 

public class Demo10Action extends ActionSupport implements ModelDriven<User> {	// 实现接口
	//准备user 成员变量
	private User user =new User();

	public String execute() throws Exception { 
		
		System.out.println(user);
		
		return SUCCESS;
	}

	@Override
	public User getModel() {
		return user;
	}
}

其他:获取list,map

list

Map

 

原文地址:https://www.cnblogs.com/x54256/p/8474410.html