一、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的依赖。减少了耦合。




struts2中Action訪问servlet的两种方式的更多相关文章

  1. Struts2中获取HttpServletRequest,HttpSession等的几种方式

    转自:http://www.kaifajie.cn/struts/8944.html package com.log; import java.io.IOException; import java. ...

  2. SpringBoot整合Servlet的两种方式

    SpringBoot整合Servlet有两种方式: 1.通过注解扫描完成Servlet组件的注册: 2.通过方法完成Servlet组件的注册: 现在简单记录一下两种方式的实现 1.通过注解扫描完成Se ...

  3. 【SpringBoot】03.SpringBoot整合Servlet的两种方式

    SpringBoot整合Servlet的两种方式: 1. 通过注解扫描完成Servlet组件注册 新建Servlet类继承HttpServlet 重写超类doGet方法 在该类使用注解@WebServ ...

  4. python中字典的循环遍历的两种方式

    开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...

  5. Android中H5和Native交互的两种方式

    Android中H5和Native交互的两种方式:http://www.jianshu.com/p/bcb5d8582d92 注意事项: 1.android给h5页面注入一个对象(WZApp),这个对 ...

  6. C语言中存储多个字符串的两种方式

    C语言中存储多个字符串的两种方式 方式一    二维字符串数组 声明: char name[][] = { "Justinian", "Momo", " ...

  7. 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

    在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...

  8. java中读取配置文件ResourceBundle和Properties两种方式比较

    今天在开发的时候,需要把一些信息放到配置文件中,方便后续的修改,注意到用的是ResourceBundle读取配置文件的方式,记得之前也见过使用Properties的方式,就比较好奇这两种方式的区别,网 ...

  9. 程序中使用log4J打印信息的两种方式

    (1)通过org.apache.commons.logging.Log 接口实例化: public static Log log = LogFactory.getLog(String name); p ...

随机推荐

  1. [libgdx游戏开发教程]使用Libgdx进行游戏开发(11)-高级编程技巧 Box2d和Shader

    高级编程技巧只是相对的,其实主要是讲物理模拟和着色器程序的使用. 本章主要讲解利用Box2D并用它来实现萝卜雨,然后是使用单色着色器shader让画面呈现单色状态:http://files.cnblo ...

  2. onethink 插件模板定位

    <?php // +---------------------------------------------------------------------- // | OneThink [ ...

  3. [xampp] phpmyadmin 设置登录密码

    $ cd /opt/lampp/bin $ ./mysqladmin -u root password 'new_password' $ vim ../phpmyadmin/config.inc.ph ...

  4. RobotFramework操作浏览器滚动条

    RobotFramework操作浏览器滚动条 (2016-12-21 11:52:43) 转载▼ 标签: selenium it 分类: 自动化测试 其实只要是用多了selenium+webdrive ...

  5. 【二分答案】【分块答案】【字符串哈希】【set】bzoj2946 [Poi2000]公共串

    我们二分/分块枚举答案x,暴力把除了最短的字符串以外的其他字符串的x长度子串哈希搞出来,分别扔到set里. 然后暴力枚举最短的字符串的x长度字串,查看是否在全部的set里出现过. #include&l ...

  6. 智能dns或CDN应用中,如何很好的解决DNS缓存问题? - 知乎

    智能dns或CDN应用中,如何很好的解决DNS缓存问题? - 知乎 LISP路由器

  7. [JQuery]用InsertAfter实现图片走马灯展示效果2——js代码重构

    写在前面 前面写过一篇文章<[JQuery]用InsertAfter实现图片走马灯展示效果>,自从写过那样的也算是使用面向对象的写法吧,代码实在丑陋,自从写过那样的代码,就是自己的一块心病 ...

  8. Cesium 事件

    1.相机事件(移动开始.移动结束等等) viewer.scene.camera.moveEnd.addEventListener(function(){ }): 2.鼠标事件(单击.移动.右键等) v ...

  9. 使用Vue-cli创建project遇到的坑

    环境: win10 / node( v10.2.1) /npm( v5.6.0) 准备: 1.安装node:上node官网下载node版本进行安装 2.安装vue-cli:npm install -- ...

  10. spring融合activitymq-all启动报错的解决办法

    报错信息: nested exception is java.lang.NoSuchMethodError: org.springframework.core.annotation.Annotated ...