struts2访问servlet的API

1.struts作为控制器,正常很多时候要访问到servlet的API,常用功能:

(1).获取请求参数,控制界面跳转

(2).把共享数据存储于request,session,servletContext中,获取作用域中的数据

宏观的来说,应该有三种访问方式。

2.第一种:实现接口,访问Action时完成注入

ServletContextAware

void setServletContext(javax.servlet.ServletContext context)

ServletRequestAware

void setServletRequest(javax.servlet.http.HttpServletRequest request)

ServletResponseAware

void setServletResponse(javax.servlet.http.HttpServletResponse response)

上述方式:Action和ServletAPI耦合太深了.

简单的示例代码:

package cn.wwh.www.web.servletapi;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

/**
 *类的作用:
 *
 *
 *@author 一叶扁舟
 *@version 1.0
 *@创建时间: 2014-8-16 上午07:54:05
 */
public class ParamAction1 extends ActionSupport implements ServletRequestAware,
		ServletResponseAware {

	private static final long serialVersionUID = 1L;
	private HttpServletRequest request;
	private HttpServletResponse response;

	@Override
	public String execute() throws Exception {
		String name = request.getParameter("name");
		String age = request.getParameter("age");
		System.out.println("name:" + name);
		System.out.println("age:" + age);
		response.getWriter().write(name + "<br/>");
		response.getWriter().write(age);
		// 没有起到效果,很奇怪
		request.getRequestDispatcher("/views/servletapi/result.jsp").forward(
				request, response);
		return Action.NONE;
	}

	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	public void setServletResponse(HttpServletResponse response) {
		this.response = response;

	}

}

3.第二种:使用ServletActionContext(开发中使用的很多,因为简单,直观)ServletActionContext: 通过该类提供了ServletAPI的环境,可以获取到Servlet的API信息static PageContext getPageContext()static HttpServletRequest getRequest()static HttpServletResponse getResponse()static
ServletContext getServletContext()

该方案可避免Action类实现XxxAware接口,但Action依然与Servlet API直接耦合但是该方式和ServletApi也有耦合.

简单的实例代码:

package cn.wwh.www.web.servletapi;

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

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**
 *类的作用:
 *
 *
 *@author 一叶扁舟
 *@version 1.0
 *@创建时间: 2014-8-16 上午09:09:02
 */
public class ParamAction2 extends ActionSupport {

	private static final long serialVersionUID = 1L;
	public String execute() throws Exception {

		HttpServletRequest req = ServletActionContext.getRequest();
		String name = ServletActionContext.getRequest().getParameter("name");
		String age = ServletActionContext.getRequest().getParameter("age");
		HttpSession session = req.getSession();
		session.getServletContext();
		System.out.println(name);
		System.out.println(age);
		HttpServletResponse resp = ServletActionContext.getResponse();
		return NONE;
	}

}

4.第三种方式:使用ActionContext类(没有和ServletApi耦合,开发推荐使用方式)

Action的上下文,该类提供了Action存在的环境. 也就是说通过该类可以获取到Action相关的一切数据.

   ActionContext

getContext() 返回ActionContext实例对象

get(key) 相当于 HttpServletRequest的getAttribute(String name)方法

put(String,Object) 相当于HttpServletRequest的setAttribute方法

getApplication() 返回一个Map对象,存取ServletContext属性

getSession() 返回一个Map对象,存取HttpSession属性

getParameters() 类似调用HttpServletRequest的getParameterMap()方法

setApplication(Map) 将该Map实例里key-value保存为ServletContext的属性名、属性值

setSession(Map) 将该Map实例里key-value保持为HttpSession的属性名、属性值

获取ActionContext对象:  ActionContext context = ActionContext.getContext();

简单的示例代码:

package cn.wwh.www.web.servletapi;

import java.lang.reflect.Array;
import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
 *类的作用:
 *
 *
 *@author 一叶扁舟
 *@version 1.0
 *@创建时间: 2014-8-16   上午09:31:42
 */
public class ParamAction3 extends ActionSupport {

	private static final long serialVersionUID = 1L;

	public String execute() throws Exception {
		ActionContext ctx = ActionContext.getContext();
		Map<String,Object> paramMap = ctx.getParameters();
		System.out.println(paramMap);

		//去paramMap.get("name")数组中索引为0的元素值
		System.out.println(Array.get(paramMap.get("name"), 0));

		//往request设置共享数据
		ctx.put("name", "一叶扁舟");//request.setAttribute(key,Object)
		Object requestValue  = ctx.get("name");
		System.out.println(requestValue);

		//往Session设置共享数据
		//Map<String,Object> getSession()
		Map<String,Object> sessionMap = ctx.getSession();
		sessionMap.put("sessionKey", "sessionValue");

		//往ServletContext中设置共享数据
		//.Map<String,Object> getContextMap()
		Map<String,Object> contextMap= ctx.getContextMap();
		contextMap.put("appKey", "appValue");
		return SUCCESS;
	}

}

注意在jsp中读取数据为:

${requestScope.name}<br />

${sessionScope.sessionKey}<br />

${appKey}

5.通过ActionContext获取request、session、application解耦Map

(1) 对request域的操作

actionContext.put("name", "一叶扁舟") --> 相等与request.setAttribute("name", "一叶扁舟");

Object o = actionContext.get("name"); --> 等同与Object o = request.getAttribute("name");

(2).对session域的操作

Map<String,Object> sessionMap = ActionContext.getContext().getSession();

sessionMap.put("name", "一叶扁舟") --> 等同与session.setAttribute("name", "一叶扁舟");

Object o = sessionMap.get("name") --> 等同与Object o = session.getAttribute("name");

(3).对application域的操作

Map<String,Object> appMap = ActionContext.getContext().getApplication();

appMap.put("name", "一叶扁舟") --> 等同与servletContext.setAttribute("name", "一叶扁舟");

Object o = appMap.get("name") --> 等同与Object o = servletContext.getAttribute("name");

(4). 对请求参数的操作

Map<String,Object> paramMap = ActionContext.getContext().getParameters();

Object o = paramMap.get("username");

String[] values = (String[])o;

String username = values[0];

struts2访问servlet的API

时间: 2024-10-07 21:04:56

struts2访问servlet的API的相关文章

Struts2(七) Struts2访问Servlet的API

当接受表单参数,向页面保持数据时.要用到Struts访问Servlet 的API .下面只做参考,有错误或不同意见可以发送邮箱[email protected]  .建议大家看struts文档,源代码 1.struts2通过ActionContext访问 com.opensymphony.xwork2.ActionContext;类有很多方法这里只列举几个常用的方法: 列举个小例子 Struts2的核心配置web.xml 就不做说明了  .前面已经操作过: Struts.xml <?xml ve

struts2学习笔记之六(Action访问servlet的API以及复制项目小技巧)

action和servlet分离使得action代码更加纯洁,与servlet的耦合性也降低了 但是有时候却不得不访问servlet API,比如把数据放到session,application里, 更甚至于添加cookie(response.addCookie()) strust2提供了两种方式访问servlet api 伪访问 借助于ActionContext类 Map<String ,Object > getApplication() 模拟访问http application Map&l

Struts2访问Servlet API的几种方式

struts2提供了三种方式访问servlet API:大致分为两类 1. ActionContext: public static ActionContext getContext() :获得当前Action的ActionContext实例. public Object get(Object key) :此方法类似于调用HttpServletRequest的getAttribute(String name)方法. public void put(Object key, Object value

Action访问Servlet的API

Action访问Servlet的API_,主要访问如下: 1.>获取request对象 2.>获取请求参数 3.>获取response对象,可用于传递cookie 3.>获取作用域对象,request,Session,application,并设置共享数据, 访问方式一: 通过实现感知接口中的setter方法,讲其setter方法中的request参数传递到本类中来: 即,在本类中定义一个成员变量,来接收setter方法中的request. 如果,还需要获取response,Ses

3.struts2访问Servlet API,并和mybaits实现全套增删改查

1.创建数据库脚本userinfo.sql 1 prompt PL/SQL Developer import file 2 prompt Created on 2016年5月19日 by pc 3 set feedback off 4 set define off 5 6 create table USERINFO 7 ( 8 id NUMBER not null, 9 uname VARCHAR2(20), 10 password VARCHAR2(20), 11 age NUMBER 12

Struts2访问servlet的三种方式

第一种方式:使用ActionContext类实现 //获取对象 ActionContext context = ActionContext.getContext(); //获取页面提交数据 Map<String, Object> parameters = context.getParameters(); //操作域对象相关的方法 context.put(String,Object);//相当于HttpServletRequest的setAttribute方法 context.getApplic

action访问servlet的API并且获取到MAP类型的application,session,request

public class testAction3 extends ActionSupport { private Map<String,Object> request; private Map<String,Object> session; private Map<String,Object> application; /** * 构造函数,没有返回值 */ public testAction3(){ this.request=(Map) ActionContext.g

struts2获取servlet的api

public class Demo1Action extends ActionSupport {public String execute(){ServletContext application = ServletActionContext.getServletContext();HttpServletRequest request = ServletActionContext.getRequest();HttpServletResponse response = ServletActionC

Struts2学习笔记三 访问servlet

结果跳转方式 转发 <!-- 转发 --> <action name="Demo1Action" class="cn.itheima.a_result.Demo1Action" method="execute" > <result name="success" type="dispatcher" >/hello.jsp</result> </action