Servlet API的直接与间接访问

  • 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方式,推荐使用,因为实现方式简单,代码量少并且能满足需要














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值