- Action接口的5个常量
SUCCESS 表示动作成功,并应该把相应的结果视图显示给用户
NONE 表示动作执行,但不应该把任何结果视图显示给用户
ERROR 表示动作执行不成功,并应该把相应的报错视图显示给用户
INPUT 表示验证失败,并应该把用户输入的那个表单重新显示给用户
LOGIN 表示动作没有执行(因为用户没有登录),并应该把登录视图显示给用户。
- 间接访问Servlet API
Action是与Servlet API分离的。必须通过ActionContext类来获取Servlet API以便实现业务逻辑处理。如:使用Session或者application。
Action运行期间所用到的数据都保存在ActionContext中。例如session会话,以及哭护短提交的参数等信息。所以ActionContext是Action的一个上下文对象。
创建Actiion类对象的语法格式
ActionContext actionContext = ActionContext.getContext();
actionContext.getSession();调用getSession方法,可以获得HttpSession对象,从而实现对Servlet API的访问
ActionContext类的常用方法
1.Object get(object key)
通过参数Key来查找当前ActionContext中的值。类似于调用HttpServletRequest的fgetAttribute(String name)方法
2.Map getApplication()
返回一个Map类型的ServletContext对象
3.static ActionContxt getContext()
获得当前线程的ActionContext类对象
4.Map getParameters()
返回一个包含所有HttpServletRequest参数信息的Map对象。类似于调用HttpServletRequest的getParameterMap()方法
5.Map getSeeion()
返回一个Map类型的HttpSession对象
6.void put(Object key,Object value)
向当前的ActionContext对象中存入键值对信息
7.void setApplication(Map application)
设置一个Map类型的application值
8.void setSession(Map session)
设置一个Map类型的session值
- 直接访问Servlet API
直接访问的方式分为IoC和非IoC
1.Ioc访问
在java开发中,控制反转(IoC)意味着将设计好的类交给系统去控制,而不是自己的内部控制,这称为控制反转。
通过IoC方式访问Servlet API就必须在Action实现以下接口中的一个或者多个,具体看情况而定。
(1)org.apache.struts2.util.ServletContextAware
实现该接口的Action可以直接访问ServletContext对象。Action必须实现该接口的void serServletContext(java.servlet.ServletContext servletContext)方法
(2)org.apache.struts2.interceptor.ServletRequestAware
实现该接口的Action可以直接访问HttpServletRequest对象。Action必须实现该接口的void serServletRequest(java.servlet.HttpServletRequest request)方法
(3)org.apache.struts2.interceptor.ServletResponseAware
实现该接口的Action可以直接访问HttpServletResponset对象。Action必须实现该接口的void serServletResponse(java.servlet.HttpServletResponse response)方法
(4)org.apache.struts2.interceptor.SessionAware
实现该接口的Action可以直接访问HttpSession对象。Action必须实现该接口的void serSession(java.util.Map map)方法
参考代码如下
package action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class AddBook extends ActionSupport implements ServletRequestAware {
/**
*
*/
private static final long serialVersionUID = -2093499911008952202L;
private String bookName;
private double bookPrice;
private String bookPress;
private HttpServletRequest requset;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public double getBookPrice() {
return bookPrice;
}
public void setBookPrice(double bookPrice) {
this.bookPrice = bookPrice;
}
public String getBookPress() {
return bookPress;
}
public void setBookPress(String bookPress) {
this.bookPress = bookPress;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.requset = request;
}
@Override
public String execute() throws Exception {
HttpSession session = requset.getSession();
ActionContext actionContext = ActionContext.getContext();
session.setAttribute("bookName", this.bookName);
session.setAttribute("bookPress", this.bookPress);
session.setAttribute("bookPrice", this.bookPrice);
return SUCCESS;
}
}
2.非IoC方式
Struts2提供了ServletActionContext类获得Servlet API。在ServletActionContext类中有以下的静态方法:getPageContext()、getRequest()、getResponse()和getServletContext().
package action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class AddBook2 extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = -2093499911008952202L;
private String bookName;
private double bookPrice;
private String bookPress;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public double getBookPrice() {
return bookPrice;
}
public void setBookPrice(double bookPrice) {
this.bookPrice = bookPrice;
}
public String getBookPress() {
return bookPress;
}
public void setBookPress(String bookPress) {
this.bookPress = bookPress;
}
@Override
public String execute() throws Exception {
HttpServletRequest requset = ServletActionContext.getRequest();
HttpSession session = requset.getSession();
ActionContext actionContext = ActionContext.getContext();
session.setAttribute("bookName", this.bookName);
session.setAttribute("bookPress", this.bookPress);
session.setAttribute("bookPrice", this.bookPrice);
return SUCCESS;
}
}
总结: 间接访问的方式,只能获得request对象,而得不到response对象;对于IoC方式,不推荐使用,因为该方式实现起来比较麻烦,并且与Servlet API耦合大;对于非IOC方式,推荐使用,因为实现方式简单,代码量少并且能满足需要