Action直接访问Servlet API
ActionContext对Servlet API的访问不是直接获得Servlet API的实例。为了在Action中直接访问Servlet API,Struts2提供了以下几个接口:
(1)ServletContextAware:实现该接口的Action可以直接访问Web应用的ServletContext实例。
(2) ServletRequestAware:实现该接口的Action可以直接访问用户请求的HttpServletRequest实例。
(3)ServletResponseAware:实现该接口的Action可以直接访问服务器响应的HttpServletResponse实例。
1.实现ServletResponseAware接口:
public void setServletResponse(HttpServletResponse response):
通过该方法即可访问都Web应用的响应对象。
2.实现ServletRequestAware接口:
public void setServletRequest(HttpServletRequest request):通过该方法即可访问代表用户请求的HttpServletRequest对象。
3.实现ServletContextAware接口:
public void setServletContext(ServletContext context):通过该方法即可访问到代表Web应用的ServletContext对象。
例子:
(\Struts2_1002\src\csdn\slow\app\action\LoginAction.java)
package csdn.slow.app.action;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletResponseAware;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
public class LoginAction implements Action,ServletResponseAware{
private String username;
private String password;
private HttpServletResponse response;
//重写实现ServletResponseAware接口必须实现的方法
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute() throws Exception {
//获取ActionContext实例对象
ActionContext ctx = ActionContext.getContext();
//通过ActionContext访问application范围的属性值
Integer counter = (Integer)ctx.getApplication().get("counter");
if(counter == null) {
counter = 1;
} else {
counter = counter + 1;
}
//通过ActionContext设置application范围的属性
ctx.getApplication().put("counter", counter);
//通过ActionContext设置session范围的属性
ctx.getSession().put("user", getUsername());
if(getUsername().equals("slow") && getPassword().equals("slow")) {
//通过response添加Cookie
Cookie c = new Cookie("user", getUsername());
c.setMaxAge(60*60);
response.addCookie(c);
//通过ActionContext设置request范围的属性
ctx.put("tip", "服务器提示:您已经成功的登录");
return SUCCESS;
} else {
//通过ActionContext设置request范围的属性
ctx.put("tip", "服务器提示:登录失败");
return ERROR;
}
}
}
配置好的struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开发模式 -->
<constant name="conststruts.devMode" value="true"/>
<!-- 所有的Action定义都应该放在package下 -->
<package name="slow" extends="struts-default">
<!-- 定义名为login的Action,其实现类为LoginAction类 -->
<action name="login" class="csdn.slow.app.action.LoginAction">
<!-- 如果处理结果返回error, 对应/WebContent/error.jsp视图资源 -->
<result name="error">/WebContent/error.jsp</result>
<!-- 如果处理结果返回success, 对应/WebContent/welcome.jsp视图资源 -->
<result name="success">/WebContent/welcome.jsp</result>
</action>
</package>
</struts>
(\Struts2_1002\WebRoot\WebContent\welcome.jsp)
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<html>
<head>
<title>成功页面</title>
</head>
<body>
本站访问次数为: ${applicationScope.counter }<br/>
${sessionScope.user }, 您已经登录!<br/>
${requestScope.tip }
从系统读取Cookie值:${cookie.user.value }
</body>
</html>
测试: