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资源//使用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类(解耦方式,耦合方式)相关推荐
- Struts2中的action类
Struts2中的action类 action类在Struts2中承担了Model(模型)的角色,主要用于处理业务逻辑并存放HTTP请求处理过程中各个变量的值. 在Struts2里面,Action充当 ...
- Struts2中XXX.Action类中方法的访问(三种方式)
第一种:使用action标签的method属性(常规方法) Action类: package cn.tedu.web;import org.springframework.context.annota ...
- Struts2中的Action
多数的MVC框架中的Control层,都是一个Java对象.按照惯例,我们通常会把这个层次上面的Java对象统称为Action层.本篇文章,我们就来简单介绍一下Struts2中Action的相关内容. ...
- 【struts2】struts2中的Action详解
在传统的MVC框架(如struts1.Spring等)中,Action都需要实现特定的接口,这些接口都是MVC框架定义的,实现MVC的接口会与MVC框架耦合.struts2的Action要灵活得多,可 ...
- struts2中welcome-fileindex.action/welcome-file直接设置action,404的解决方案
这几天的项目页面的访问全部改为.action访问,在修改首页时遇到了问题.将web.xml文件中<welcome-file>index.action</welcome-file> ...
- struts2中把action中的值传递到jsp页面的例子
例子: RegistAction的代码: package com.wss.action;import javax.servlet.http.HttpServletRequest;import org. ...
- 经struts2中的action后,jsp中css失效的问题
最近在做毕业设计,发现写后台时,jsp页面直接打开是好的,但是经过action跳转便会失去样式,发现原来是打开的action页面和需要的css不在一个目录下,修改很简单,将此action 所在的pac ...
- Struts2中jsp前台传值到action后台的三种方式以及valueStack的使用
struts2中的Action接收表单传递过来的参数有3种方法: 如,登陆表单login.jsp: 1 <form action="login" method="p ...
- Struts2 中的数据传输的几种方式
原文地址:http://blog.csdn.net/li_tengfei/article/details/6098126 1. 如何将参数从界面传递到Action? 你可以把Struts2中的 ...
最新文章
- mvn如何执行java代码
- 属性处理器Spring攻略学习笔记(2.12)------外部化Bean配置
- ASP.NET夜话笔记06
- Codeforces - 662A 思路巧妙的异或
- webpack3的CommonsChunkPlugin插件详解
- JavaScript的原型和原型链
- 前端框架你究竟选什么
- 零代码、不花钱就能做大屏,这个报表工具帮了大忙
- 12. Copy all parts of an object
- 大二学生web期末大作业 在线电影网站 HTML+CSS+JS
- 【回归预测-LSTM预测】基于布谷鸟算法优化LSTM实现数据回归预测含Matlab代码
- VSCode Setting Sync同步设置
- 证明:凸多边形裁剪一次最多能够新增一个凸多边形
- 【Git】git tag
- C# NModbus4 TCP 主从站通信样例
- FileZilla的下载与安装
- 虚拟机安装systemc
- 1.2 webstorm设置pug自动编译
- 基于惯性传感器的轨迹记录系统
- ajax append进来的图片闪一下就不见了,ajax上传图片问题