struts2中Action访问servlet的两种方式

一、IoC方式

在struts2框架中,可以通过IoC方式将servlet对象注入到Action中,通常需要Action实现以下接口:

a. ServletRequestAware:

实现该接口的Action可以直接访问Request对象,该接口中提供void
setServletRequest(HttpServletRequest request)

方法,实现此接口的Action控制类通过setServletRequestHttpServlet(HttpServlet request)方法将request对象注入到Action中。

b. ServletResponseAware:

Action类通过实现ServletResponseAware接口可以直接访问Response对象,与ServletRequestAware接口相似该接口通过提供void setServletResponse(HttpServlet resonse)将response对象注入到Action中,以便于可以直接使用。

c. SessionAware:

实现该接口的Action可以直接访问session对象,该接口中提供void setSession(Map map)方法,注入原理与request和response原理相同,都是通过实现对应接口的set方法将session对象注入到Action中。

实例:

/**
 *  @author zx
 */
package com.zhouxiang.action;

import javax.servlet.ServletRequestAttributeListener;
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.ActionSupport;

/**
 * @author zx
 *
 */
public class LoginAction1 extends ActionSupport implements ServletRequestAware{

	private String userName;
	private String password;
	private HttpServletRequest request;
	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 HttpServletRequest getRequest() {
		return request;
	}
	public void setRequest(HttpServletRequest request) {
		this.request = request;
	}
	@Override
	public void setServletRequest(HttpServletRequest arg0) {
		// TODO Auto-generated method stub
		this.request=arg0;
	}
	public  String validateUser()throws Exception
	{

		if(getUserName().endsWith("QQ")&&getPassword().equals("123"))
		{
			//调用ServletActionContext的getRequest()方法获取request对象
			HttpServletRequest request=ServletActionContext.getRequest();
			//调用request对象的getSession()方法获取session对象
			HttpSession session=request.getSession();
			//调用session对象的方法设置数据
			session.setAttribute("username",this.userName);
			return SUCCESS;

		}
		else
		{
			return INPUT;
		}
	}

}

二、非IoC方式

在非IoC方式中,Struts2提供ServletActionContext类帮助获得Servlet。

访问request对象

通过ServletActionContext中的静态方法 getRequest()获取web应用程序的request对象。

访问response对象

通过ServletActionContext中的静态方法getResponse()获取web应用程序中的response对象。

实例:

  /**
 *  @author zx
 */
package com.zhouxiang.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**
 * @author zx
 *
 */
public class LoginAction1 extends ActionSupport {
	private String userName;
	private String password;
	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 validateUser()throws Exception
	{

		if(getUserName().endsWith("QQ")&&getPassword().equals("123"))
		{
			//调用ServletActionContext的getRequest()方法获取request对象
			HttpServletRequest request=ServletActionContext.getRequest();
			//调用request对象的getSession()方法获取session对象
			HttpSession session=request.getSession();
			//调用session对象的方法设置数据
			session.setAttribute("username",this.userName);
			return SUCCESS;

		}
		else
		{
			return INPUT;
		}
	}

}

三、总结

struts2与struts1相比不能直接访问HttpServetRequest 和 HttpServletResponse,这是进步呢还是后退呢?答案是众所周知的。struts2与struts1相比一个明显的特点就是struts1中的Action严重依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。 (依赖性太强,耦合度太高)。而Struts 2中 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2
Action仍然可以访问初始的request和response。但是struts2消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。因此struts2在此方面相对于struts1来说就是一种进步。正因为struts2摆脱了对servlet的依赖,才造成了在struts2中操作servlet要比struts1中操作servlet困难些,然而这样做的好处确实很明显,解除了Action对servlet的依赖,降低了耦合。

时间: 2024-12-06 07:58:58

struts2中Action访问servlet的两种方式的相关文章

从源代码剖析Struts2中用户自定义配置转换器的两种方式——基于字段的配置转换器和基于类型的配置转换器(解决了实际系统中,因没有区分这两种工作方式的生命周期而引起的异常错误问题)

自定义类型转换器必须实现ongl.TypeConverter接口或对这个接口的某种具体实现做扩展 <<interface>>com.opensymphony.xwork2.conversion.TypeConverter à com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter à org.apache.struts2.util.StrutsTypeConverter 接口及类进行解析 TypeConverter(

Struts2中Action接收参数的三种方式

Struts2中Action接收参数的方法主要有以下三种:1.使用Action的属性接收参数:    a.定义:在Action类中定义属性,创建get和set方法:    b.接收:通过属性接收参数,如:userName:    c.发送:使用属性名传递参数,如:user1!add?userName=zhangsan:2.使用DomainModel接收参数:    a.定义:定义Model类,在Action中定义Model类的对象(不需要new),创建该对象的get和set方法:    b.接收

struts2学习笔记之六:struts2的Action访问ServletAPI的几种方式

方法一:通过ActionContext访问SerlvetAPI,这种方式没有侵入性 Action类部分代码 import com.opensymphony.xwork2.ActionContext; public String execute() throws Exception { if("admin".equals(user.getUsername()) && "admin".equals(user.getPassword())){ //获取Ma

struts2的action访问servlet API的三种方法

学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object get(Object key);可以获取request属性 Map getSession():可以得到session属性 Map getAppliction():可以得到ServletContext实例 2.action类实现 ServletContextAware,ServletRequestAwa

action中请求参数获取的两种方式

action中请求参数获取的两种方式 1.属性驱动? a.直接在 action 类中提供与请求参数匹配属性,提供 get/set 方法? b.在 action 类中创始一个 javaBean,对其提供 get/set ,在请求时页面上要进行修改,? 例如 user.username user.password ,要使用 ognl 表达式? 以上两种方式的优缺点:? 第一种比较简单,在实际操作我们需要将 action 的属性在赋值给模型(javaBean)去操作? 第二种:不需要在直接将值给 ja

strus2中获取表单数据 两种方式 属性驱动 和模型驱动

strus2中获取表单数据 两种方式 属性驱动 和模型驱动 属性驱动 /** * 当前请求的action在栈顶,ss是栈顶的元素,所以可以利用setValue方法赋值* 如果一个属性在对象栈,在页面上可以根据name属性进行回显*/ /** * 属性驱动实现的条件:* 1.当前请求的action在栈顶,所以action中的属性就暴漏出来了* 2.获取页面上表单的元素,整合成一个map * 3.调用setValue方法赋值*/ 1 package cn.itcast.struts2.sh; 2 3

HTML中设置背景图的两种方式

HTML中设置背景图的两种方式 1.background    background:url(images/search.png) no-repeat top; 2.background-image    background-image:url(images/search.png):    background-repeat:no-repeat;

[Android] Android ViewPager 中加载 Fragment的两种方式 方式(二)

接上文: https://www.cnblogs.com/wukong1688/p/10693338.html Android ViewPager 中加载 Fragmenet的两种方式 方式(一) 二.使用Fragment来填充ViewPager Google 官方是建议我们使用Fragment来填充ViewPager的,这样可以更加方便的生成每个Page以及管理 每个Page的生命周期!当然它给我们提供了两个不同的Adapter,他们分别是: FragmentPageAdapter和Fragm

Action访问ServletAPI的三种方式

一.前言 Struts是一种基于MVC设计模式的web应用框架,主要担任C的角色,用于分离页面显示和业务逻辑处理,那其实在我们学习jsp的时候学过一个具有类似功能的东西--servlet.其实Struts本质上相当于servlet,可以理解Struts是对servlet的进一步封装和抽象.那么在servlet里面使用的对象,在Struts里面同样也是可以使用的,这也是这一章的主要内容. 二.传统的Web程序和Web容器传递数据的方法 HttpServletRequest的getParameter