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>

  

时间: 2024-10-31 04:18:31

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

Struts2中获取servlet API的几种方式

struts2是一个全新的MVC框架,如今被广大的企业和开发者所使用,它的功能非常强大.这给我们在使用servlet 纯java代码写项目的时候带来了福音.但是一般来说,我们的项目不到一定规模并不需要框架的.通常功能模块和系统架构复杂的时候会少不了框架的,如果没有框架,我们写的项目和代码会复杂很多,而且扩展性也会大大降低,代码审查效率也会降低.如下代码供大家参考,主要是说明在使用struts2的时候如何获取servlet API,大家可以试着对比一下不用struts2的时候的所写的servelt

struts2中的action标签

struts2中的action标签用于在JSP页面中直接调用一个Action,通过指定executeResult参数,还可以将该Action的处理结果包含到本页面中来. 使用action标签可以允许JSP页面直接调用Action,因为需要调用Action,故可以指定需要被调用的Action的name以及namespace.如果指定了executeResult参数的值为true,该标签还会把Action中处理的结果包含到本页面中来.使用action标签有如下的几个属性: id:          

struts2中两种validation.xml的配置方式_百度文库

在struts中,根据配置的validation.xml文件进行页面输入项目的验证已经众所周知,本文介绍在struts2中两种validation.xml的配置方式.可以根据不同的需要进行不同的配置. 以下以login页面输入firstname,lastname,和age为例进行说明.struts.xml中,成功的话转向成功页面.不成功的话转回到原页面. 首先建立userbean文件.文件名:UserBean.java包:struts2.login.bean文件内容:package struts

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

Struts2中访问web元素的四种方式如下: 通过ActionContext来访问Map类型的request.session.application对象. 通过实现RequestAware.SessionAware.ApplicationAware接口来访问Map类型的request.session.application对象(IoC方式). 通过ServletActionContext来访问Servlet API类型的HttpServletRequest. HttpSession. Serv

Struts2 中的action与页面数据传输

1. 如何将参数从界面传递到Action? 你可以把Struts2中的Action看做是Struts1的Action+ActionForm,即只需在Action中定义相关的属性(要有getters/setters方法),然后界面传参的名称跟这些属性保持一致即可.普通的数据类型,将可自动转换.(空字符串转换为int类型时将报错) 2.如何将数据从Action传输到JSP? 可通过多种方式传输 方式一:通过Action的属性传输 直接给action的属性赋值,在转向之后的JSP中,直接用标签<s:p

【转-整理】Struts2中package,action,result,method配置详解

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 <struts> 6

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

例子: RegistAction的代码: package com.wss.action; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.wss.Dao.

从源代码剖析Struts2中用户自定义配置转换器的两种方式——基于字段的配置转换器和基于类型的配置转换器(解决了实际系统中,因没有区分这两种工作方式的生命周期而引起的异常错误问题)

自定义类型转换器必须实现ongl.TypeConverter接口或对这个接口的某种具体实现做扩展 <<interface>>com.opensymphony.xwork2.conversion.TypeConverter à com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter à org.apache.struts2.util.StrutsTypeConverter 接口及类进行解析 TypeConverter(

struts2简单入门-Action的三种配置方式

普通的配置方式 优点:可读性高 缺点:重复的配置太多. 使用情况 一个actian只有一个方法,只需要处理一种请求. 代码演示 1 <action name="voteResult" class="com.vot.action.VoteResultAction"> 2 <result name="success">VoteResult.jsp</result> 3 </action> 动态方法调用D