一.解耦方式

特点:对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资源//使用ActionContextpublic 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"));//放入新的sessionmapses.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的数据集合@Overridepublic void setApplication(Map<String, Object> arg0) {// 接收mapApp =arg0;}public String testAware(){//访问applicationSystem.out.println("app1="+mapApp.get("app1"));mapApp.put("app2","以Aware方式放入的application");//访问sessionSystem.out.println("set1="+mapses.get("set1"));mapses.put("set2", "以Aware方式放入的session");//访问requestSystem.out.println("req1="+mapReq.get("req1"));mapReq.put("req2", "以Aware方式放入的request");//访问parameterString [] str =mappar.get("user");for(String t : str){System.out.println("user="+t);}mappar.put("pw", new String[]{"1234"});return "success";}@Overridepublic void setSession(Map<String, Object> arg0) {// TODO 自动生成的方法存根mapses = arg0;}@Overridepublic void setRequest(Map<String, Object> arg0) {mapReq=arg0;}@Overridepublic 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,根据与applicationServletContext  sc = ServletActionContext.getServletContext();System.out.println("app1="+sc.getAttribute("app1"));sc.setAttribute("app2", "原生方式放入的内容");//2.访问sessionHttpServletRequest hsr = ServletActionContext.getRequest();HttpSession hs = hsr.getSession();System.out.println("set1="+hs.getAttribute("set1"));hs.setAttribute("set2", "原生方式放入的内容session");//3.访问requestSystem.out.println("req1="+hsr.getAttribute("req1"));hsr.setAttribute("req2", "原生方式放入的request");//4.访问parameterSystem.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;@Overridepublic void setServletContext(ServletContext arg0) {sc=arg0;}@Overridepublic 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";}}

  

转载于:https://www.cnblogs.com/liuyanzeng/p/6066872.html

Struts2中的Action类(解耦方式,耦合方式)相关推荐

  1. Struts2中的action类

    Struts2中的action类 action类在Struts2中承担了Model(模型)的角色,主要用于处理业务逻辑并存放HTTP请求处理过程中各个变量的值. 在Struts2里面,Action充当 ...

  2. Struts2中XXX.Action类中方法的访问(三种方式)

    第一种:使用action标签的method属性(常规方法) Action类: package cn.tedu.web;import org.springframework.context.annota ...

  3. Struts2中的Action

    多数的MVC框架中的Control层,都是一个Java对象.按照惯例,我们通常会把这个层次上面的Java对象统称为Action层.本篇文章,我们就来简单介绍一下Struts2中Action的相关内容. ...

  4. 【struts2】struts2中的Action详解

    在传统的MVC框架(如struts1.Spring等)中,Action都需要实现特定的接口,这些接口都是MVC框架定义的,实现MVC的接口会与MVC框架耦合.struts2的Action要灵活得多,可 ...

  5. struts2中welcome-fileindex.action/welcome-file直接设置action,404的解决方案

    这几天的项目页面的访问全部改为.action访问,在修改首页时遇到了问题.将web.xml文件中<welcome-file>index.action</welcome-file> ...

  6. struts2中把action中的值传递到jsp页面的例子

    例子: RegistAction的代码: package com.wss.action;import javax.servlet.http.HttpServletRequest;import org. ...

  7. 经struts2中的action后,jsp中css失效的问题

    最近在做毕业设计,发现写后台时,jsp页面直接打开是好的,但是经过action跳转便会失去样式,发现原来是打开的action页面和需要的css不在一个目录下,修改很简单,将此action 所在的pac ...

  8. Struts2中jsp前台传值到action后台的三种方式以及valueStack的使用

    struts2中的Action接收表单传递过来的参数有3种方法: 如,登陆表单login.jsp: 1 <form action="login" method="p ...

  9. Struts2 中的数据传输的几种方式

    原文地址:http://blog.csdn.net/li_tengfei/article/details/6098126 1.     如何将参数从界面传递到Action? 你可以把Struts2中的 ...

最新文章

  1. mvn如何执行java代码
  2. 属性处理器Spring攻略学习笔记(2.12)------外部化Bean配置
  3. ASP.NET夜话笔记06
  4. Codeforces - 662A 思路巧妙的异或
  5. webpack3的CommonsChunkPlugin插件详解
  6. JavaScript的原型和原型链
  7. 前端框架你究竟选什么
  8. 零代码、不花钱就能做大屏,这个报表工具帮了大忙
  9. 12. Copy all parts of an object
  10. 大二学生web期末大作业 在线电影网站 HTML+CSS+JS
  11. 【回归预测-LSTM预测】基于布谷鸟算法优化LSTM实现数据回归预测含Matlab代码
  12. VSCode Setting Sync同步设置
  13. 证明:凸多边形裁剪一次最多能够新增一个凸多边形
  14. 【Git】git tag
  15. C# NModbus4 TCP 主从站通信样例
  16. FileZilla的下载与安装
  17. 虚拟机安装systemc
  18. 1.2 webstorm设置pug自动编译
  19. 基于惯性传感器的轨迹记录系统
  20. ajax append进来的图片闪一下就不见了,ajax上传图片问题

热门文章

  1. 如何制作变年轻特效?分享几个简单的方法给你
  2. 如何选择漏电保护器规格型号_漏电保护器规格型号有几种?
  3. 抓包西瓜视频百万英雄实践
  4. 2021-2025年中国减压阀行业市场供需与战略研究报告
  5. 华硕 ASUS D540MC 台式计算机,八代酷睿性能强劲 华硕商用D540MC新年购机好选择
  6. [附源码]java毕业设计JAVA大方汽车租赁管理系统
  7. SRTM数据介绍与说明
  8. 目标检测实现黑花屏分类任务
  9. 天地伟业服务器型号,天地伟业网关服务器价格
  10. Mysql数据库结构优化