一.解耦方式

特点:对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类(解耦方式,耦合方式)的更多相关文章

  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. visio调整画布大小和旋转画布(转)

    1.调整画布大小: 鼠标移至画布边界(注意不能是顶点附近),按下ctrl,就会出现双向箭头,拖动鼠标即能调整画布大小. 2.旋转画布: 鼠标移至画布顶点或附近,按下ctrl, 出现单箭头优弧,移动鼠标 ...

  2. python web编程-概念预热篇

    互联网正在引发一场革命??不喜欢看概念的跳过,注意这里仅仅是一些从python核心编程一书的摘抄 这正是最激动人心的一部分了,web编程 Web 客户端和服务器端交互使用的“语言”,Web 交互的标准 ...

  3. Java学习笔记(七)——对象

    一.类与对象 1.类的定义 类就是模型,确定对象将会拥有的特征(属性)和行为(方法). 2.类的特点 (1)类是对象的类型 (2)具有相同属性和方法的一组对象的集合. 3.对象的属性: 对象具有的各种 ...

  4. Input对象的type类型

    Input表示Form表单中的一种输入对象,其又随Type类型的不同而分文本输入框,密码输入框,单选/复选框,提交/重置按钮等,下面一一介绍. 1,type=text        输入类型是text ...

  5. AJAX案例三:处理XML响应

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  6. 读懂Android项目结构目录

    我们看到下图:当我们创建了第一Android项目的时候有没有被吓到.怎么这么多目录,好头晕啊!没事, 那我们今天就了解一下这些目录是做什么的: src: src 目录是放置我们所有 Java 代码的地 ...

  7. POJ 2785 HASH

    题目链接:http://poj.org/problem?id=2785 题意:给定n行数字,每行4个数分别是a,b,c,d,现在要求能有多少个(a,b,c,d)组合并且和为0 思路:n^2统计所有(a ...

  8. 分享Kali Linux 2016.2第48周虚拟机

    分享Kali Linux 2016.2第48周虚拟机该虚拟机使用Kali Linux 2016.2第48周的64位镜像安装而成.基本配置如下:(1)该系统默认设置单CPU双核,内存为2GB,硬盘为50 ...

  9. HBase 分布式环境搭建

    一.前期环境 安装概览 IP Host Name Software Node 192.168.23.128 ae01 JDK 1.7, Zookeeper-3.4.5 HMaster 192.168. ...

  10. ural 1142. Relations

    1142. Relations Time limit: 1.0 secondMemory limit: 64 MB Background Consider a specific set of comp ...