夏夜
http://newleague.iteye.com/blog/1139100这里讲了四种方法
我把他的一部分转过来
Action访问ServletAPI的四种方式
- 通过ActionContext来访问request,session,application对象
- 通过实现RequestAware,SessionAware,ApplicationAware接口来访问request,session,application对象
- 通过ServletActionContext来访问request,session,application对象
- 通过实现ServletRequestAware接口来访问request,session,application对象
ServletRequestAware接口是RequestAware,SessionAware,ApplicationAware的子接口
方式一
/**
* 通过ActionContext来访问request,session,application对象
* @author 健
*/
public class UserAction1 extends ActionSupport{
/**
* 序列化
*/
private static final long serialVersionUID = 1L;
/**
* request
*/
private Map <String,Object>request;
/**
* session
*/
private Map <String,Object>session;
/**
* application
*/
private Map <String,Object>application;
/**
* 添加用户
* @return 用户是否添加成功
*/
@SuppressWarnings("unchecked")
@Override
public String execute(){
System.out.println("通过ActionContext来访问request,session,application对象");
// 初始化
request = (Map<String,Object>)ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
// 赋值
request.put("requestKey", "requestValue");
session.put("sessionKey", "sessionValue");
application.put("applicationKey", "applicationValue");
return "success";
}
}
ActionContext context = ActionContext.getContext();
context.put(key,value);//request可以快速的赋值
方式二
/**
* 通过实现RequestAware、SessionAware、ApplicationAware接口来访问request,session,application对象
* @author 健
*/
public class UserAction2 extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
/**
* 序列化
*/
private static final long serialVersionUID = 1L;
/**
* request
*/
private Map <String,Object>request;
/**
* response
*/
private Map <String,Object>session;
/**
* application
*/
private Map <String,Object>application;
/**
* 控制器
*/
@SuppressWarnings("unchecked")
@Override
public String execute(){
System.out.println("通过实现RequestAware、SessionAware、ApplicationAware接口来访问request,session,application对象");
// 赋值
request.put("requestKey", "requestValue");
session.put("sessionKey", "sessionValue");
application.put("applicationKey", "applicationValue");
return "success";
}
/*
* 实现RequestAware中的方法
*/
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
/*
* 实现ApplicationAware中的方法
*/
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
/*
* 实现SessionAware中的方法
*/
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
}
方式三
/**
* 通过ServletActionContext来访问request,session,application对象
* @author 健
*/
public class UserAction3 extends ActionSupport{
/**
* 序列化
*/
private static final long serialVersionUID = 1L;
/**
* request
*/
private HttpServletRequest request;
/**
* response
*/
private HttpSession session;
/**
* application
*/
private ServletContext application;
/**
* 控制器
*/
@SuppressWarnings("unchecked")
@Override
public String execute(){
System.out.println("通过ServletActionContext来访问request,session,application对象");
// 初始化
request = ServletActionContext.getRequest();
session = request.getSession();
application = session.getServletContext();
// 赋值
request.setAttribute("requestKey", "requestValue");
session.setAttribute("sessionKey", "sessionValue");
application.setAttribute("applicationKey", "applicationValue");
return "success";
}
}
方式四
/**
* 通过实现ServletRequestAware接口来访问request,session,application对象
* @author 健
*/
public class UserAction4 extends ActionSupport implements ServletRequestAware{
/**
* 序列化
*/
private static final long serialVersionUID = 1L;
/**
* request
*/
private HttpServletRequest request;
/**
* response
*/
private HttpSession session;
/**
* application
*/
private ServletContext application;
/**
* 控制器
*/
@SuppressWarnings("unchecked")
@Override
public String execute(){
System.out.println("通过实现ServletRequestAware接口来访问request,session,application对象");
// 赋值
request.setAttribute("requestKey", "requestValue");
session.setAttribute("sessionKey", "sessionValue");
application.setAttribute("applicationKey", "applicationValue");
return "success";
}
/*
* 实现ServletRequestAware接口中的方法
*/
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
this.session = request.getSession();
this.application = session.getServletContext();
}
}
我的测试
01 ActionContext
02实现requestAware sessionAware applicationAware
03 ServletActionContext
1.使用ActionContext在Action中传递数据
Action中发送数据到jsp页面
public class ActionandServletAPITest extends ActionSupport {
@Override
public String execute() throws Exception {
ActionContext context = ActionContext.getContext();
context.getApplication().put("application", "这是application的值");
context.getSession().put("sesion1", "这是session1的值");//application.setAttribute()
context.put("message", "耳机的线");//session.setAttribute()
/*context.put("message","message");//request.setAttribute()
Map<String, Object> session = context.getSession();
session.put("sesion1", "这是session1的值");//session.setAttribute()*/
return SUCCESS;
}
}
<action name="servlet" class="com.struts2.action.ActionandServletAPITest">
<result>/servlet.jsp</result>
</action>
servlet.jsp
<%
request.setCharacterEncoding("UTF-8");
String msg= request.getAttribute("message").toString();
%>
...
message的值为:<%=msg %>
message的值为:${message}
session1的值:${sesion1 }
执行结果:
message的值为:耳机的线 message的值为:耳机的线 session1的值:这是session1的值
Action中接收 jsp页面传递过来的数据,接收session的值,request的属性的值,测试为null,因为请求都会重新产生一个request对象,会丢失参数,即action里的request和jsp中request对象不相同
还有测试接收jsp页面的请求参数,就是form表单的
<form action="LoginAction.action?userid=失恋哲理" method="post">
的userid值
jsp页面
<%
request.setAttribute("loginmsg1", "这是login发送给的消息1");
session.setAttribute("loginmsg2", "这是login发送给的消息2");
%>
..
<form action="LoginAction.action?userid=失恋哲理" method="post">
<input type="submit" value="提交"/>
</form>
接收数据的Action,用到了多种方式,主要测试多种方式能不能得到request的属性值,因为request的对象不同,都是获取不到的
LoginAction.java
//package com.struts2.action;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
public String login(){
ActionContext context = ActionContext.getContext();
//获取jsp页面的request属性值 01
Object msg1 = context.get("loginmsg1");//null
//获取jsp页面设置的session的值
Map<String, Object> session = context.getSession();
Object msg2 = session.get("loginmsg2");
System.out.println("msg1的值"+msg1+"\n"+"msg2的值"+msg2);
//获取jsp页面from表单的请求参数userid 01
Map params = context.getParameters();
String[] usermsg = (String[]) params.get("userid");
System.out.println("userid值:"+usermsg[0]);
HttpServletRequest request =(HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST);
//获取jsp页面from表单的请求参数userid 02
String useridmsg = request.getParameter("userid");
System.out.println("useridmsg值:"+useridmsg);
//获取jsp页面的request属性值 02
String loginmsg1 = (String) request.getAttribute("loginmsg1");
System.out.println("loginmsg1的值"+loginmsg1);//null
//获取jsp页面的request属性值 03 这是ServletActionContext方式
HttpServletRequest request1 = ServletActionContext.getRequest();
String loginmsg11 = (String) request1.getAttribute("loginmsg1");
return SUCCESS;
}
}
执行结果:
十一月 13, 2016 5:54:53 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 1637 ms
msg1的值null
msg2的值这是login发送给的消息2
userid值:失恋哲理
useridmsg值:失恋哲理
loginmsg1的值null
loginmsg1的值null
2通过实现RequestAware,SessionAware,ApplicationAware接口
//package com.struts2.action;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class TestAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {
private Map<String, Object> request;
private Map<String, Object> application;
private Map<String, Object> session;
@Override
public String execute() throws Exception {
//赋值
request.put("requestmsg", "RequestAware的运用");
session.put("sessionmsg", "SessionAware的运用");
application.put("applicationmsg", "application的运用");
return SUCCESS;
}
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
@Override
public void setSession(Map<String, Object> session) {
this. session = session;
}
}
<action name="testaction" class="com.struts2.action.TestAction">
<result>/servlet.jsp</result>
</action>
servlet.jsp页面获取值
requestmsg的值:${requestmsg}
sessionmsg的值:${sessionmsg}
applicationmsg的值:${applicationmsg}
结果:
requestmsg的值:RequestAware的运用 sessionmsg的值:SessionAware的运用 applicationmsg的值:application的运用
3 使用ServletActionContext
//方式一
HttpServletRequest request2 = ServletActionContext.getRequest();
String loginmsg11 = (String) request2.getAttribute("loginmsg1");
HttpSession session2 = request2.getSession();
session2.getAttribute("..")
//方式二
ActionContext context = ActionContext.getContext();
HttpServletRequest request =(HttpServletRequest)context.get(ServletActionContext.HTTP_REQUEST);
//HTTP_RESPONSE 也可以是response
String useridmsg = request.getParameter("userid");