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的更多相关文章

  1. struts2中Action訪问servlet的两种方式

    一.IoC方式                在struts2框架中,能够通过IoC方式将servlet对象注入到Action中.通常须要Action实现下面接口: a. ServletRequest ...

  2. Struts07---访问servlet的API

    01.创建登录界面 <%@ page language="java" import="java.util.*" pageEncoding="UT ...

  3. Python 訪问 LinkedIn (API)

    CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-8-16 @author: guaguastd @name: l ...

  4. Struts2(二)— Result结果配置、Servlet的API的访问、模型驱动、属性驱动

    一.Result结果配置 1.全局和局部结果 ​ 平常我们设置跳转页面,是在action标签里面加上 result标签来控制,这种设置的页面跳转,称之为局部结果页面但是我们有时候在很多个action里 ...

  5. struts2学习笔记(3)---Action中訪问ServletAPI获取真实类型的Servlet元素

    一.源码: struts.xml文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE s ...

  6. struts2学习笔记(2)---Action中訪问ServletAPI获取Map类型的Servlet元素

    源码: strust.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  7. 在struts2中訪问servletAPI

    在struts2中訪问servletAPI,通俗点也就是使用servlet中的两个对象request对象和response对象. 前几天看到一个CRM项目的源代码,里面使用request对象和resp ...

  8. Struts2中使用Servlet API步骤

    Struts2中使用Servlet API步骤 Action类中声明request等对象 Map<String, Object> request; 获得ActionContext实例 Ac ...

  9. Struts2 Action与Servlet API耦合

    单元测试在开发中是非常重要的一个环节程序员在写完代码时,相应的单元测试也应写完整,否则你的代码就是不能让人信服的Struts2将Action与Servlet的API进行解耦之后,就使得单元测试变得非常 ...

随机推荐

  1. UVALive 6661 Equal Sum Sets

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  2. 读书笔记_Effective_C++_条款三十四:区分接口继承和实现继承

    这个条款书上内容说的篇幅比较多,但其实思想并不复杂.只要能理解三句话即可,第一句话是:纯虚函数只继承接口:第二句话是:虚函数既继承接口,也提供了一份默认实现:第三句话是:普通函数既继承接口,也强制继承 ...

  3. SlickOne敏捷开发框架介绍(一) -- 基于Dapper, Mvc和WebAPI 的快速开发框架

    前言:在两年前(最初发布时间:2013年1月9日(csdn),当前文章时间2015年11月10日),项目组推出了基于Dapper,Mvc和WebApi的快速开发框架,随着后续Slickflow产品的实 ...

  4. bootstrap字体图标不正常显示的原因

    本地引入bootstrap.css文件,使用https://v3.bootcss.com/components/站点 字体图标 时不能正常显示,换成 bootstrap 官网的 cdn 链接却能正常显 ...

  5. CentOS 7提示:ERROR unsupported format character '(0xffffffe7) at/域安装失败,您可以运行下列命令重启您的域:

    别理会,直接装即可,这个错误不影响使用.

  6. 第三方网站返回hybrid app H5页面缓存问题应对策略

    最近负责公司各产品线购买模块的开发,各项功能如期开发完成后测试那边反馈回来一个问题:IOS手机在点击支付宝购买后,跳转到支付宝网站时不输入支付密码,直接点返回,返回到我们自己的APP购买界面发现页面显 ...

  7. jQuery碎语(1) 基础、选择要操作的元素、处理DOM元素

    1.基础 jquery对象集: $():jquery对象集合 获取jquery对象集中的元素: 使用索引获取包装器中的javascript元素:var temp = $('img[alt]')[0] ...

  8. 最快的BT软件rtorrent Step by Step指南

    原文地址:http://forum.ubuntu.org.cn/viewtopic.php?t=165069 rtorrent是linux下最快的bt下载软件,由于支持DHT网络,可以很好的于迅雷和B ...

  9. 开始Admob广告盈利模式详细教程

    例子工程源码下载地址:     下载源代码               当然,我也参考了一些网上的资料,主要有: AdMob:在android应用中嵌入广告的方案        如何在Android ...

  10. 如何开启解决android studio的模拟器的问题

    来自:http://jingyan.baidu.com/article/03b2f78c0a19e75ea237ae24.html 有的时候因为电脑系统或者是安装的一些问题我们可能需要对症下药的解决模 ...