一.解耦方式

特点:对web资源进行了封装,便于单元测试。

实现:ActionContext和接口方式

1.ActionContext

特点:Action执行的上下文对象。保存了执行Action所需要的所有对象

使用:1.获取ActionContext  2.获取application,session。request,parameter资源  3.打印显示

1.获取ActionContext
ActionContext.getContext()
调用自身的静态方法得到实例
采用的是单例模式

可以再次放入新的键值对,put()

2.session的同application。

3.获取request资源

得到封装request的集合
不能访问得到集合之前的request的属性值
可以使用put()放入新的键值对

4.直接获取传递的参数getParameters

object是String[]类型,为了接收同名的不同参数,使用put放入新值无效

 2.接口方式

特点
实现接口方法,由Struts2自动放入web资源
不需要重复获取

注意:该类要继承ApplicationAware ,SessionAware, RequestAware,ParameterAware。

必须有相对应的私有map集合的属性

实现以上四种借口的方法

访问读取

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. 添加测试用的web资源
  11.  
  12. <%
  13. application.setAttribute("app1", "测试的application");
  14.  
  15. session.setAttribute("set1", "测试的session");
  16.  
  17. request.setAttribute("req1", "测试的request");
  18.  
  19. %>
  20.  
  21. <br>
  22. <a href="testAction?user=sb&user=tom">测试Action类访问web资源</a>
  23.  
  24. <br><br>
  25. <a href="testActionAware?user=sb&user=tom">以Aware方式测试Action类访问web资源</a>
  26.  
  27. </body>
  28. </html>

  

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5.  
  6. <struts>
  7. <!-- 覆盖默认的过滤的扩展名 -->
  8. <constant name="struts.action.extension" value="do,action,,"></constant>
  9.  
  10. <!-- 定义包 -->
  11. <package name="text" extends="struts-default" >
  12. <action name="testAction" class ="com.hanqi.action.TestAction" method="testWeb">
  13.  
  14. <result type="redirect" name="success">test.jsp</result>
  15.  
  16. </action>
  17. <!-- 解耦的接口方式 -->
  18. <action name="testActionAware" class="com.hanqi.action.TestActionAware" method="testAware">
  19.  
  20. <result>test.jsp</result>
  21.  
  22. </action>
  23.  
  24. </package>
  25.  
  26. </struts>

  解耦方式

  1. package com.hanqi.action;
  2.  
  3. import java.util.Map;
  4.  
  5. import com.opensymphony.xwork2.ActionContext;
  6.  
  7. public class TestAction {
  8.  
  9. //解耦方式
  10. //封装了web资源
  11. //使用ActionContext
  12. public String testWeb()
  13. {
  14. //访问web资源
  15. System.out.println("经过了Action");
  16.  
  17. //单利模式
  18. //Action实例的上下文对象
  19. ActionContext ac = ActionContext.getContext();
  20.  
  21. //1.获取application资源
  22. Map<String, Object> mapApp = ac.getApplication();
  23. System.out.println("app1="+mapApp.get("app1"));
  24.  
  25. //放入新的键值对
  26. mapApp.put("app2", "新放入的application");
  27.  
  28. //2.获取session资源
  29. Map<String, Object> mapses = ac.getSession();
  30. System.out.println("set1="+mapses.get("set1"));
  31.  
  32. //放入新的session
  33. mapses.put("set2", "放入的新的session");
  34. //清除
  35. mapses.remove("set1");
  36.  
  37. //3.获取request资源
  38. Map<String, Object> mapReq = (Map<String, Object>)ac.get("request");
  39. System.out.println("req1="+mapReq.get("req1"));//不能获取之前的request属性
  40.  
  41. //可以放入新的
  42. mapReq.put("req2", "放入的新的request");
  43.  
  44. //4.直接获取传递的参数
  45. Map<String, Object> mapPer = ac.getParameters();
  46. //参数值被封装成String[]
  47. String [] str = (String[])mapPer.get("user");
  48. for(String t : str)
  49. {
  50. System.out.println("user="+t);
  51. }
  52.  
  53. //放入新的参数,不能被获取到
  54. mapPer.put("pw",new String[]{"123456"});
  55.  
  56. return "success";
  57. }
  58.  
  59. }

  接口方式

  1. package com.hanqi.action;
  2.  
  3. import java.util.Map;
  4.  
  5. import org.apache.struts2.dispatcher.mapper.ActionMapping;
  6.  
  7. import org.apache.struts2.interceptor.ApplicationAware;
  8. import org.apache.struts2.interceptor.ParameterAware;
  9. import org.apache.struts2.interceptor.RequestAware;
  10. import org.apache.struts2.interceptor.SessionAware;
  11.  
  12. public class TestActionAware implements ApplicationAware ,
  13. SessionAware, RequestAware,ParameterAware{
  14.  
  15. private Map<String, Object> mapApp;
  16.  
  17. private Map<String, Object> mapses;
  18. private Map<String, Object> mapReq;
  19. private Map<String, String[]> mappar;
  20. //实现ApplicationAware接口的方法
  21. //提供给Struts2 进行调用,放入Application的数据集合
  22. @Override
  23. public void setApplication(Map<String, Object> arg0) {
  24. // 接收
  25. mapApp =arg0;
  26.  
  27. }
  28.  
  29. public String testAware()
  30. {
  31. //访问application
  32. System.out.println("app1="+mapApp.get("app1"));
  33.  
  34. mapApp.put("app2","以Aware方式放入的application");
  35.  
  36. //访问session
  37. System.out.println("set1="+mapses.get("set1"));
  38. mapses.put("set2", "以Aware方式放入的session");
  39.  
  40. //访问request
  41. System.out.println("req1="+mapReq.get("req1"));
  42. mapReq.put("req2", "以Aware方式放入的request");
  43.  
  44. //访问parameter
  45. String [] str =mappar.get("user");
  46. for(String t : str)
  47. {
  48. System.out.println("user="+t);
  49. }
  50. mappar.put("pw", new String[]{"1234"});
  51.  
  52. return "success";
  53. }
  54.  
  55. @Override
  56. public void setSession(Map<String, Object> arg0) {
  57. // TODO 自动生成的方法存根
  58. mapses = arg0;
  59. }
  60.  
  61. @Override
  62. public void setRequest(Map<String, Object> arg0) {
  63.  
  64. mapReq=arg0;
  65. }
  66.  
  67. @Override
  68. public void setParameters(Map<String, String[]> arg0) {
  69. //
  70. mappar=arg0;
  71. }
  72.  
  73. }

  

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. 显示application的属性
  11. <br>
  12. app1=${app1}
  13. <br>
  14. app2=${applicationScope.app2}<br><br>
  15.  
  16. 显示session的属性<br>
  17.  
  18. set1=${set1 }
  19. <br>
  20. set2=${sessionScope.set2}
  21. <br><br>
  22.  
  23. 显示request对象<br>
  24. req1=${req1 }
  25. <br>
  26. req2=${req2}<br>
  27. <br><br>
  28.  
  29. <%
  30. out.println("set2===="+session.getAttribute("set2"));
  31.  
  32. String user = request.getParameter("user");
  33. out.print("<br>user="+user);
  34.  
  35. String pw =request.getParameter("pw");
  36. out.print("<br>pw="+pw);
  37.  
  38. %>
  39.  
  40. </body>
  41. </html>

  

二。耦合方式

特点:
获取原生的web资源
必须在Servlet容器的支持

1.ServletActionContext方式

特点:提供了静态方法,获得原生的资源

getServletContex()
得到原生的ServletContext
相当于内置对象application

getRequest()
得到原生的HttpServletRequest   getSession()  getParameter(参数名)
不能得到之前的request属性值

  1. package com.hanqi.action;
  2.  
  3. import javax.servlet.ServletContext;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpSession;
  6.  
  7. import org.apache.struts2.ServletActionContext;
  8.  
  9. public class TestServletAction {
  10.  
  11. public String testServletAction()
  12. {
  13.  
  14. //访问原生的web资源
  15. //1得到Servletcontext,根据与application
  16. ServletContext sc = ServletActionContext.getServletContext();
  17.  
  18. System.out.println("app1="+sc.getAttribute("app1"));
  19. sc.setAttribute("app2", "原生方式放入的内容");
  20.  
  21. //2.访问session
  22. HttpServletRequest hsr = ServletActionContext.getRequest();
  23. HttpSession hs = hsr.getSession();
  24. System.out.println("set1="+hs.getAttribute("set1"));
  25.  
  26. hs.setAttribute("set2", "原生方式放入的内容session");
  27.  
  28. //3.访问request
  29. System.out.println("req1="+hsr.getAttribute("req1"));
  30. hsr.setAttribute("req2", "原生方式放入的request");
  31.  
  32. //4.访问parameter
  33. System.out.println("user1="+hsr.getParameter("user"));
  34. System.out.println("user2="+hsr.getParameter("user"));
  35. return "success";
  36. }
  37.  
  38. }

  

2.接口方式

特点
实现接口方法,由Struts2自动放入web资源
不需要重复获取

API
ServletContextAware   void setServletContext(ServletContext arg0)
ServletRequestAware   void setServletRequest(HttpServletRequest arg0)

  1. package com.hanqi.action;
  2.  
  3. import javax.servlet.ServletContext;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpSession;
  6.  
  7. import org.apache.struts2.interceptor.ServletRequestAware;
  8. import org.apache.struts2.util.ServletContextAware;
  9.  
  10. public class TestServletActionAware implements ServletRequestAware, ServletContextAware {
  11.  
  12. private ServletContext sc;
  13. private HttpServletRequest hsr;
  14. private HttpSession hs;
  15.  
  16. @Override
  17. public void setServletContext(ServletContext arg0) {
  18. sc=arg0;
  19.  
  20. }
  21.  
  22. @Override
  23. public void setServletRequest(HttpServletRequest arg0) {
  24. // TODO 自动生成的方法存根
  25.  
  26. hsr=arg0;
  27. hs=arg0.getSession();//得到session
  28. }
  29.  
  30. public String testServletAware()
  31. {
  32. System.out.println("app1="+sc.getAttribute("app1"));
  33. sc.setAttribute("app2", "新的APP2");
  34. System.out.println("set1"+hs.getAttribute("set1"));
  35. hs.setAttribute("set2", "新的set2");
  36. System.out.println("user="+hsr.getParameter("user"));
  37. hsr.setAttribute("req2", "新的req2");
  38.  
  39. return "success";
  40. }
  41.  
  42. }

  

Struts2中的Action类(解耦方式,耦合方式)的更多相关文章

  1. struts2中的Action实现的三种方式

    Action类创建方式有哪些? 方式一:直接创建一个类,可以是POJO,即原生Java类,没有继承任何类,也没有实现任何接口 这种方式使得strust2框架的代码侵入性更低,但是这种方式是理想状态,开 ...

  2. struts2中,Action通过什么方式获得用户从页面输入的数据,又是通过什么方式把其自身的数据传给视图的?

    struts2中,Action通过什么方式获得用户从页面输入的数据,又是通过什么方式把其自身的数据传给视图的? 解答: 1)可以直接通过与表单元素相同名称的数据成员(需要存在符合命名规范set和get ...

  3. 在Struts2中配置Action

    在Struts2中配置Action <package>: 1.定义Action使用<package>标签下的<action>标签完成,一个<package&g ...

  4. Struts2中访问web元素的四种方式

    Struts2中访问web元素的四种方式如下: 通过ActionContext来访问Map类型的request.session.application对象. 通过实现RequestAware.Sess ...

  5. Struts2框架(3)---Action类的3种书写方式

    Action类的3种书写方式 本文主要写有关写Action类的3种书写方式: (1)第一种 Action可以是POJO (简单模型对象)  不需要继承任何父类 也不需要实现任何接口 (2)实现Acti ...

  6. 07. struts2中对Action的管理方式

    web.xml配置文件的常用代码 <filter> <filter-name>struts2</filter-name> <filter-class>o ...

  7. Struts2框架(4)---Action类访问servlet

    Action类访问servlet Action类有三种方式servlet: (1)间接的方式访问Servlet API  ---使用ActionContext对象 (2)  实现接口,访问Action ...

  8. Struts2框架之Action类的访问

    1. 通过<action>标签中的method属性,访问到Action中的具体的方法. * 传统的配置方式,配置更清晰更好理解!但是扩展需要修改配置文件等! * 具体的实例如下: * 页面 ...

  9. 详解struts2中配置action的方法

    如何解决action太多的问题??我们因为需要不同的方法,所以往往建立很多不同的类,但是每个类中往往仅仅几行代码,不仅浪费了时间,而且配置起来也很繁琐,所以,建立一个共有的类,然后根据以下方式来操作, ...

随机推荐

  1. ListView遍历每个Item出现NullPointerException的异常(转)

    在使用ListView过程中我们有时候需要遍历取得每个Item项中的一些数据(比如每个Item里面有TextView,需要获取它的文本等等),但是我们在遍历过程中经常会遇到NullPointerExc ...

  2. Android开发学习笔记:浅谈WebView(转)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/647456 ...

  3. IIS 内部运行机制

    ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用. 绝大多数的人只熟悉高层的框架如: WebForms 和 WebServices ...

  4. 程序员必懂:javaweb三大框架知识点总结

    原文链接:http://www.cnblogs.com/SXTkaifa/p/5968631.html javaweb三大框架知识点总结 一.Struts2的总结 1.Struts 2的工作流程,从请 ...

  5. 《大话》之 装饰模式 Vs 建造者模式

    一.简介: 装饰模式:     背景:小菜要见美女娇娇,感慨自己不会着装,怕给娇娇留下坏印象               内容:动态的给一个对象添加一些额外职责               图文并茂: ...

  6. JVM性能监控工具-Jvisualvm

    用法:Jvisualvm是JDK自带的一款性能分析工具 使用方式: 1.配置好JDK环境变量 1.本地JVM监控略 2.远程JVM监控 用JMX对Resin内存状态进行监控 ,可以看到本地所有可监控的 ...

  7. 廖雪峰js教程笔记11 操作DOM(包含作业)

    由于HTML文档被浏览器解析后就是一棵DOM树,要改变HTML的结构,就需要通过JavaScript来操作DOM. 始终记住DOM是一个树形结构.操作一个DOM节点实际上就是这么几个操作: 更新:更新 ...

  8. Android学习系列(36)--App调试内存泄露之Context篇(上)

    Context作为最基本的上下文,承载着Activity,Service等最基本组件.当有对象引用到Activity,并不能被回收释放,必将造成大范围的对象无法被回收释放,进而造成内存泄漏. 下面针对 ...

  9. JQuery学习之语法

    1.JQuery语法就是通过选取HTML元素,并对选取的元素执行某些操作: 基础语法:$(selector).action() (1)美元符号定义jQuery (2)选择符(selector)查询和查 ...

  10. spring mvc 通过配置xml访问控制器的三种方式

    (一)通过 name 来一一映射(默认) (二)通过简单url 来指定映射,key 表示访问url value 是bean的ID (三)通过控制类的类名控制器,访问时类名首字母需要小写 <!-- ...