为了直接访问ServletAPI,struts2提供了3个接口
1.ServletContextAware 实现该接口的Action可以直接访问Web应用的ServletContext实例。
2.ServletRequestAware 实现该接口的Action可以直接访问用户请求的HttpServletRequest实例。
3.ServletResponse 实现该接口可以直接访问服务器响应的HttpServletResponse实例。
注:虽然可以获取Response,但想生成服务器响应 是不可能的 , Action只是业务控制器 若添加response.getWrite().print("xx"); 在标准的Servlet中会对服务器生成响应 但在此处 毫无意义。
例: 添加Cookie
package snut;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ServletResponseAware;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
public class LoginAction implements Action, ServletResponseAware {
// 定义封装请求参数的username和password成员变量
private String username;
private String password;
private HttpServletResponse response;
//实现ServletResponseAware必须重写的方法
public void setServletResponse(HttpServletResponse httpServletResponse) {
this.response = httpServletResponse;
}
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;
}
// 定义处理用户请求的execute方法
public String execute() throws Exception {
ActionContext ctx = ActionContext.getContext();
//通过ActionContext访问application范围的属性值
Integer counter = (Integer) ctx.getApplication().get("counter");//类似Request中的getAttribute
if (counter == null) {
counter = 1;
} else {
counter += 1;
}
//通过Application设置application范围的属性
ctx.getApplication().put("counter", counter);
//通过ActionContext设置奇偶session范围的属性
ctx.getSession().put("user", getUsername());
// 当username为crazyit.org,password为leegang时即登录成功
if (getUsername().equals("zpf")
&& getPassword().equals("1234")) {
//通过response添加Cookie信息
Cookie cookie = new Cookie("user", getUsername());//实例化Cookie
//设置生命周期
cookie.setMaxAge(60 * 60);
//添加Cookie
this.response.addCookie(cookie);
//通过ActionContext 谁之request范围的属性
ctx.put("tip", "服务器提示:您已成功登陆");
return SUCCESS;
}
ctx.put("tip", "服务器提示:登录失败");
return ERROR;
}
}