Struts2中的Action类(解耦方式,耦合方式)
一.解耦方式
特点:对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集合的属性
实现以上四种借口的方法
访问读取
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- 添加测试用的web资源
- <%
- application.setAttribute("app1", "测试的application");
- session.setAttribute("set1", "测试的session");
- request.setAttribute("req1", "测试的request");
- %>
- <br>
- <a href="testAction?user=sb&user=tom">测试Action类访问web资源</a>
- <br><br>
- <a href="testActionAware?user=sb&user=tom">以Aware方式测试Action类访问web资源</a>
- </body>
- </html>
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
- "http://struts.apache.org/dtds/struts-2.3.dtd">
- <struts>
- <!-- 覆盖默认的过滤的扩展名 -->
- <constant name="struts.action.extension" value="do,action,,"></constant>
- <!-- 定义包 -->
- <package name="text" extends="struts-default" >
- <action name="testAction" class ="com.hanqi.action.TestAction" method="testWeb">
- <result type="redirect" name="success">test.jsp</result>
- </action>
- <!-- 解耦的接口方式 -->
- <action name="testActionAware" class="com.hanqi.action.TestActionAware" method="testAware">
- <result>test.jsp</result>
- </action>
- </package>
- </struts>
解耦方式
- package com.hanqi.action;
- import java.util.Map;
- import com.opensymphony.xwork2.ActionContext;
- public class TestAction {
- //解耦方式
- //封装了web资源
- //使用ActionContext
- public String testWeb()
- {
- //访问web资源
- System.out.println("经过了Action");
- //单利模式
- //Action实例的上下文对象
- ActionContext ac = ActionContext.getContext();
- //1.获取application资源
- Map<String, Object> mapApp = ac.getApplication();
- System.out.println("app1="+mapApp.get("app1"));
- //放入新的键值对
- mapApp.put("app2", "新放入的application");
- //2.获取session资源
- Map<String, Object> mapses = ac.getSession();
- System.out.println("set1="+mapses.get("set1"));
- //放入新的session
- mapses.put("set2", "放入的新的session");
- //清除
- mapses.remove("set1");
- //3.获取request资源
- Map<String, Object> mapReq = (Map<String, Object>)ac.get("request");
- System.out.println("req1="+mapReq.get("req1"));//不能获取之前的request属性
- //可以放入新的
- mapReq.put("req2", "放入的新的request");
- //4.直接获取传递的参数
- Map<String, Object> mapPer = ac.getParameters();
- //参数值被封装成String[]
- String [] str = (String[])mapPer.get("user");
- for(String t : str)
- {
- System.out.println("user="+t);
- }
- //放入新的参数,不能被获取到
- mapPer.put("pw",new String[]{"123456"});
- return "success";
- }
- }
接口方式
- package com.hanqi.action;
- import java.util.Map;
- import org.apache.struts2.dispatcher.mapper.ActionMapping;
- import org.apache.struts2.interceptor.ApplicationAware;
- import org.apache.struts2.interceptor.ParameterAware;
- import org.apache.struts2.interceptor.RequestAware;
- import org.apache.struts2.interceptor.SessionAware;
- public class TestActionAware implements ApplicationAware ,
- SessionAware, RequestAware,ParameterAware{
- private Map<String, Object> mapApp;
- private Map<String, Object> mapses;
- private Map<String, Object> mapReq;
- private Map<String, String[]> mappar;
- //实现ApplicationAware接口的方法
- //提供给Struts2 进行调用,放入Application的数据集合
- @Override
- public void setApplication(Map<String, Object> arg0) {
- // 接收
- mapApp =arg0;
- }
- public String testAware()
- {
- //访问application
- System.out.println("app1="+mapApp.get("app1"));
- mapApp.put("app2","以Aware方式放入的application");
- //访问session
- System.out.println("set1="+mapses.get("set1"));
- mapses.put("set2", "以Aware方式放入的session");
- //访问request
- System.out.println("req1="+mapReq.get("req1"));
- mapReq.put("req2", "以Aware方式放入的request");
- //访问parameter
- String [] str =mappar.get("user");
- for(String t : str)
- {
- System.out.println("user="+t);
- }
- mappar.put("pw", new String[]{"1234"});
- return "success";
- }
- @Override
- public void setSession(Map<String, Object> arg0) {
- // TODO 自动生成的方法存根
- mapses = arg0;
- }
- @Override
- public void setRequest(Map<String, Object> arg0) {
- mapReq=arg0;
- }
- @Override
- public void setParameters(Map<String, String[]> arg0) {
- //
- mappar=arg0;
- }
- }
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- 显示application的属性
- <br>
- app1=${app1}
- <br>
- app2=${applicationScope.app2}<br><br>
- 显示session的属性<br>
- set1=${set1 }
- <br>
- set2=${sessionScope.set2}
- <br><br>
- 显示request对象<br>
- req1=${req1 }
- <br>
- req2=${req2}<br>
- <br><br>
- <%
- out.println("set2===="+session.getAttribute("set2"));
- String user = request.getParameter("user");
- out.print("<br>user="+user);
- String pw =request.getParameter("pw");
- out.print("<br>pw="+pw);
- %>
- </body>
- </html>
二。耦合方式
特点:
获取原生的web资源
必须在Servlet容器的支持
1.ServletActionContext方式
特点:提供了静态方法,获得原生的资源
getServletContex()
得到原生的ServletContext
相当于内置对象application
getRequest()
得到原生的HttpServletRequest getSession() getParameter(参数名)
不能得到之前的request属性值
- package com.hanqi.action;
- import javax.servlet.ServletContext;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpSession;
- import org.apache.struts2.ServletActionContext;
- public class TestServletAction {
- public String testServletAction()
- {
- //访问原生的web资源
- //1得到Servletcontext,根据与application
- ServletContext sc = ServletActionContext.getServletContext();
- System.out.println("app1="+sc.getAttribute("app1"));
- sc.setAttribute("app2", "原生方式放入的内容");
- //2.访问session
- HttpServletRequest hsr = ServletActionContext.getRequest();
- HttpSession hs = hsr.getSession();
- System.out.println("set1="+hs.getAttribute("set1"));
- hs.setAttribute("set2", "原生方式放入的内容session");
- //3.访问request
- System.out.println("req1="+hsr.getAttribute("req1"));
- hsr.setAttribute("req2", "原生方式放入的request");
- //4.访问parameter
- System.out.println("user1="+hsr.getParameter("user"));
- System.out.println("user2="+hsr.getParameter("user"));
- return "success";
- }
- }
2.接口方式
特点
实现接口方法,由Struts2自动放入web资源
不需要重复获取
API
ServletContextAware void setServletContext(ServletContext arg0)
ServletRequestAware void setServletRequest(HttpServletRequest arg0)
- package com.hanqi.action;
- import javax.servlet.ServletContext;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpSession;
- import org.apache.struts2.interceptor.ServletRequestAware;
- import org.apache.struts2.util.ServletContextAware;
- public class TestServletActionAware implements ServletRequestAware, ServletContextAware {
- private ServletContext sc;
- private HttpServletRequest hsr;
- private HttpSession hs;
- @Override
- public void setServletContext(ServletContext arg0) {
- sc=arg0;
- }
- @Override
- public void setServletRequest(HttpServletRequest arg0) {
- // TODO 自动生成的方法存根
- hsr=arg0;
- hs=arg0.getSession();//得到session
- }
- public String testServletAware()
- {
- System.out.println("app1="+sc.getAttribute("app1"));
- sc.setAttribute("app2", "新的APP2");
- System.out.println("set1"+hs.getAttribute("set1"));
- hs.setAttribute("set2", "新的set2");
- System.out.println("user="+hsr.getParameter("user"));
- hsr.setAttribute("req2", "新的req2");
- return "success";
- }
- }
Struts2中的Action类(解耦方式,耦合方式)的更多相关文章
- struts2中的Action实现的三种方式
Action类创建方式有哪些? 方式一:直接创建一个类,可以是POJO,即原生Java类,没有继承任何类,也没有实现任何接口 这种方式使得strust2框架的代码侵入性更低,但是这种方式是理想状态,开 ...
- struts2中,Action通过什么方式获得用户从页面输入的数据,又是通过什么方式把其自身的数据传给视图的?
struts2中,Action通过什么方式获得用户从页面输入的数据,又是通过什么方式把其自身的数据传给视图的? 解答: 1)可以直接通过与表单元素相同名称的数据成员(需要存在符合命名规范set和get ...
- 在Struts2中配置Action
在Struts2中配置Action <package>: 1.定义Action使用<package>标签下的<action>标签完成,一个<package&g ...
- Struts2中访问web元素的四种方式
Struts2中访问web元素的四种方式如下: 通过ActionContext来访问Map类型的request.session.application对象. 通过实现RequestAware.Sess ...
- Struts2框架(3)---Action类的3种书写方式
Action类的3种书写方式 本文主要写有关写Action类的3种书写方式: (1)第一种 Action可以是POJO (简单模型对象) 不需要继承任何父类 也不需要实现任何接口 (2)实现Acti ...
- 07. struts2中对Action的管理方式
web.xml配置文件的常用代码 <filter> <filter-name>struts2</filter-name> <filter-class>o ...
- Struts2框架(4)---Action类访问servlet
Action类访问servlet Action类有三种方式servlet: (1)间接的方式访问Servlet API ---使用ActionContext对象 (2) 实现接口,访问Action ...
- Struts2框架之Action类的访问
1. 通过<action>标签中的method属性,访问到Action中的具体的方法. * 传统的配置方式,配置更清晰更好理解!但是扩展需要修改配置文件等! * 具体的实例如下: * 页面 ...
- 详解struts2中配置action的方法
如何解决action太多的问题??我们因为需要不同的方法,所以往往建立很多不同的类,但是每个类中往往仅仅几行代码,不仅浪费了时间,而且配置起来也很繁琐,所以,建立一个共有的类,然后根据以下方式来操作, ...
随机推荐
- ListView遍历每个Item出现NullPointerException的异常(转)
在使用ListView过程中我们有时候需要遍历取得每个Item项中的一些数据(比如每个Item里面有TextView,需要获取它的文本等等),但是我们在遍历过程中经常会遇到NullPointerExc ...
- Android开发学习笔记:浅谈WebView(转)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/647456 ...
- IIS 内部运行机制
ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用. 绝大多数的人只熟悉高层的框架如: WebForms 和 WebServices ...
- 程序员必懂:javaweb三大框架知识点总结
原文链接:http://www.cnblogs.com/SXTkaifa/p/5968631.html javaweb三大框架知识点总结 一.Struts2的总结 1.Struts 2的工作流程,从请 ...
- 《大话》之 装饰模式 Vs 建造者模式
一.简介: 装饰模式: 背景:小菜要见美女娇娇,感慨自己不会着装,怕给娇娇留下坏印象 内容:动态的给一个对象添加一些额外职责 图文并茂: ...
- JVM性能监控工具-Jvisualvm
用法:Jvisualvm是JDK自带的一款性能分析工具 使用方式: 1.配置好JDK环境变量 1.本地JVM监控略 2.远程JVM监控 用JMX对Resin内存状态进行监控 ,可以看到本地所有可监控的 ...
- 廖雪峰js教程笔记11 操作DOM(包含作业)
由于HTML文档被浏览器解析后就是一棵DOM树,要改变HTML的结构,就需要通过JavaScript来操作DOM. 始终记住DOM是一个树形结构.操作一个DOM节点实际上就是这么几个操作: 更新:更新 ...
- Android学习系列(36)--App调试内存泄露之Context篇(上)
Context作为最基本的上下文,承载着Activity,Service等最基本组件.当有对象引用到Activity,并不能被回收释放,必将造成大范围的对象无法被回收释放,进而造成内存泄漏. 下面针对 ...
- JQuery学习之语法
1.JQuery语法就是通过选取HTML元素,并对选取的元素执行某些操作: 基础语法:$(selector).action() (1)美元符号定义jQuery (2)选择符(selector)查询和查 ...
- spring mvc 通过配置xml访问控制器的三种方式
(一)通过 name 来一一映射(默认) (二)通过简单url 来指定映射,key 表示访问url value 是bean的ID (三)通过控制类的类名控制器,访问时类名首字母需要小写 <!-- ...