Struts2中传统Servlet API类型被处理成Map类型
访问更方便
不依赖传统Servlet API类型——解耦合
关于ActionContext
所在包com.opensymphony.xwork2
ActionContext被称为Action上下文或Action环境
ActionContext提供每个Action运行时与之相关的所有信息
访问Servlet API
ActionContext类提供getContext()方法获得实例
通过ActionContext类的实例可获得Map类型的请求、会话 等
通过put()和get()方法在Map类型的对象中存取数据
示例:
package cn.web.action;
import java.util.Map;
import cn.web.entity.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginJavabeanAction extends ActionSupport {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
if(user==null){
return "login";
}
System.out.println(user.getLoginName());
if("admin".equals(user.getLoginName())){
//关于ActionContext
//获取session
Map<String,Object> session = ActionContext.getContext().getSession();
session.put("userSession", user);
//获取application,示例设置一个计数
Map<String,Object> application = ActionContext.getContext().getApplication();
if(application.get("num") == null){
application.put("num", 1);
}else{
Integer num = (Integer) application.get("num");
application.put("num", num+1);
}
//获取request,注意获取方式
Map<String,Object> request = (Map<String, Object>) ActionContext.getContext().get("request");
request.put("address", "中国");
//获取parameter,请求的参数只能获得,不能增加
Map<String,Object> parameters = ActionContext.getContext().getParameters();
//注意parameters.get()与 request.getParameterValues()类似
//获得如checkbox类(名字相同,但值有多个)的数据。
//接收 对象 的数组
String[] name = (String[]) parameters.get("user.loginName");
System.out.println("user.loginName为:"+name[0]);
//禁止这样操作,增加参数 parameters.put("access", "通过");
/* 在页面中获取保存数据提倡的方式 (#作用域)
<s:property value="#request.loginAccess"/>
*/
return "admin";
}else if("comm".equals(user.getLoginName())){
return "comm";
}else{
return "login";
}
}
}
------------------------------------------------------------------------------------
获得Servlet API对象的方式
一、通过ActionContext获得
如上面的示例就是这样
自己获得request: ac.get("request")
自己获得session: ac.getContext.getSession()
二、实现接口
让“别人(如struts容器)”为你提供Servlet API的对象
通过实现相应接口获得Servlet API对象
获得parameter需要实现ParameterAware接口
获得request需要实现RequestAware接口
获得session需要实现SessionAware接口
获得application需要实现ApplicationAware接口
( LoginAtion 是交给Struts容器管理的,
当LoginAtion实现了上面的接口,Struts容器会往这些接口预定义的方法里注入它需要的相应的值,
是由servletConfig拦截器,将源于Servlet API的各种对象注入到Action 的。
从而也就能使用 servletApi 的对象了
)
public class LoginAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {
Map<String,Object> request;
Map<String,Object> session;
Map<String,Object> application;
//这样就获得了request,session以及application(servletApi的对象),
//然后就可以在execute()方法里使用servletApi的对象了
/*
省略部分代码
*/
@Override
public void setApplication(Map<String, Object> request) {
this.request = request;
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public void setRequest(Map<String, Object> application) {
this.application = application;
}
/*
省略部分代码
*/
}