一、ActionSupport

     为了让用户开发的Action类更加规范,Struts2提供了一个Action接口,这个接口定义了Struts2的Action处理类应该实现的规范。下面是标准Action接口的代码:

public interface Action {

    public static final String SUCCESS = "success";

    public static final String NONE = "none";

    public static final String ERROR = "error";

    public static final String INPUT = "input";

    public static final String LOGIN = "login";

    public String execute() throws Exception;

}

     上面的Action接口里只定义了一个execute()方法,该接口规范规定了Action类应该包含一个execute()方法,该方法返回一个字符串,此外,该接口还定义了5个字符串常量,他的作用是统一execute()方法的返回值。

     Struts2还为Action接口提供了一个实现类:ActionSupport。

    

    

     ActionSupport是一个默认的Action实现类,该类里已经提供了许多默认方法,这些方法包括表单域校验、错误信息设置和获取国际化信息一些方法,实际上,ActionSupport是Struts2的默认的Action处理类,如果让开发者的Action类继承该 ActionSupport类,则会大大简化Action的开发。

 

二、使用通配符配置Action

(1)在配置<action>元素时,允许在指定name属性时,使用模式字符串(用"*"代表一个或多个任意字符) 。

(2)在class、method属性及<result>子元素中通过 {N} 形式代表前面地N个* 匹配子串。

    

 

    

     *_*代表匹配两个字符串。

     {1} 匹配UserAction 用于执行class 。

     {2} 匹配login用于指定method执行方法和结果页面。

 

包声明

    

可以改写为:

    

 

三、动态方法的调用

(1)通过url动态指定调用Action哪个方法而无需配置<action>的method属性 。

(2)通过 !方法名 指定调用Action哪个方法。

		<action name="cus" class="com.kiwi.action.CusAction">
<result name="success">/success.jsp</result>
</action>

访问路径:

          

     struts2默认是不能通过这种方式来访问的,必须配置一个常量。

	<!-- 允许动态访问 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>

 

四、默认的Action

     如果用户输入一个不存在的action,默认会报错,我们可以配置一个默认的action。

		<!-- 用户访问的Action如果不存在,就会访问此默认的Action -->
<default-action-ref name="defaultAction"></default-action-ref>
<action name="defaultAction">
<result>/success.jsp</result>
</action>

例如:

    

 

五、访问Web资源

     在Action中,如果想访问HttpSession、HttpServletRequest、HttpServletResponse等Servlet原生API我们可以通过如下两种方式。

     (1)与Servlet API解耦的方式访问

         A: 通过ActionContext

         B: 实现ApplicationAware、SessionAware、RequestAware接口

     (2)与Servlet API耦合的方式访问

         A: 通过ServletActionContext

         B: 实现ServletApplicationAware、ServletSessionAware、ServletRequestAware接口

 

1.与Servlet API解耦的访问方式

     为了避免与Servlet API耦合在一起, 方便Action做单元测试, Struts2对HttpServletRequest, HttpSession 和ServletContext 进行了封装, 构造了3个Map 对象来替代这3个对象, 在Action中可以直接使用3个对象对应的Map对象来保存和读取数据。

 

(1)通过ActionContext访问Web资源

     ActionContext是Action执行的上下文对象, 在ActionContext中保存了Action执行所需要的所有对象, 包括parameters, request, session, application 等。

public Map getSession(): 获取HttpSession对应的Map。

public Map getApplication(): 获取ServletContext对应的Map 。

public Map getParameters(): 获取对象获取请求参数对应的Map。

public Object get(Object key): ActionContext类中没有提供类似getRequest()这样的方法来获取Request对应的Map 对象. 要得到HttpServletRequest对应的Map对象, 可以通过为get()方法传递"request"参数实现。

 

index.jsp

<a href="${pageContext.request.contextPath}/testServlet.action?name=Tom">Struts2入门</a>

struts.xml

		<action name="testServlet" class="com.kiwi.action.ServletTestAction">
<result name="success" >/result.jsp</result>
</action>

result.jsp

  <body>

    application: ${applicationScope.applicationKey}<br>
session: ${sessionScope.sessionKey}<br>
request: ${requestScope.requestKey}<br>
name: ${parameters.name[0]}<br> </body>

ServletTestAction.java

public class ServletTestAction extends ActionSupport{

	@Override
public String execute() throws Exception{ //1.获取ActionContext对象,是Action的上下文对象
ActionContext actionContext = ActionContext.getContext(); //2.获取application对应map,并添加一个属性
Map<String,Object> applicationMap = actionContext.getApplication();
applicationMap.put("applicationKey","这是application的值"); //3.获取session对应map,并添加一个属性
Map<String,Object> sessionMap = actionContext.getSession();
sessionMap.put("sessionKey","这是session的值"); /*
* 4.获取request对应map,并添加一个属性
* 注意:
* ActionContext中没有提供getRequest()方法来获取request对应的Map
* 需要调用get()方法并传入"request"字符来获取
*/
Map<String,Object> requestnMap = (Map<String,Object>)actionContext.get("request");
requestnMap.put("requestKey","这是request的值"); /*
* 5.获取请求参数对应map,并获取指定的参数值
* 注意:
* 1.键:请求参数的名字 值:请求参数对应的字符串的数组
* 2.paramters这个Map只能读不能写
*/
Map<String,Object> parametersMap = actionContext.getParameters();
String[] names = (String[])parametersMap.get("name");
System.out.println("name: " + names[0]); //Tom return SUCCESS;
}
}

结果:

    

 

(2)通过实现Aware访问Web资源

    Action 类通过可以实现某些特定的接口, 让Struts2框架在运行时向Action实例注入parameters, request, session 和 application对应的Map对象。

public class ServletTest2Action extends ActionSupport implements ApplicationAware,SessionAware,RequestAware,
ParameterAware{ private Map<String,Object> application;
private Map<String,Object> session;
private Map<String,Object> request;
private Map<String,String[]> parameters; @Override
public String execute() throws Exception{ //1.向application加入一个属性
application.put("applicationKey","application值---接口实现"); //2.向session加入一个属性
session.put("sessionKey","session值---接口实现"); //3.向request加入一个属性
request.put("requestKey","request值---接口实现"); //4.从parameters读取指定的值
String[] names = parameters.get("name");
System.out.println(names[0]); //Tom return SUCCESS;
} @Override
public void setApplication(Map<String,Object> application){
this.application = application;
} @Override
public void setSession(Map<String,Object> session){
this.session = session;
} @Override
public void setRequest(Map<String,Object> request){
this.request = request;
} @Override
public void setParameters(Map<String,String[]> parameters){
this.parameters = parameters;
} }

结果:

     

     建议: 若一个Action类中有多个Action方法,且多个方法都需要使用域对象的Map或parameters,则建议使用实现接口的方法。

 

2.与Servlet耦合的方式访问Web资源

(1)通过ServletActionContext访问Web资源

getSession(): 直接获取HttpSession对象。

getRequest(): 直接获取HttpServletRequest对象 。

getServletContext(): 直接获取HttpServletContext对象

 

(2)通过实现Aware访问Web资源

     实现ServletRequestAware, ServletContextAware 接口的方式。

Struts2基础学习(二)—Action的更多相关文章

  1. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  2. Struts2基础学习2

    Struts2基础学习2 项目结构,测试页面与实体类 <%@ page language="java" contentType="text/html; charse ...

  3. Python入门基础学习 二

    Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...

  4. Python基础学习二

    Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...

  5. Go基础学习(二)

    数组[array] 数组定义[定义后长度不可变] 12 symbol := [...]string{USD: "$", EUR: "€", GBP: " ...

  6. Struts2基础学习(七)—值栈和OGNL

    目录: 一.值栈 二.OGNL表达式 一.值栈(ValueStack) 1.定义      ValueStack贯穿整个Acton的生命周期,每个Action类的对象实例都拥有一个ValueStack ...

  7. Django基础学习二

    今天继续学习django的基础 学习用户提交url如何获得返回值 1.首先需要在工程的urls文件定义指定的urls要路由给哪个函数 在这个例子中,我们定义home的urls路由给views里的tes ...

  8. Struts2基础学习总结

    引用自:http://www.cnblogs.com/jbelial/archive/2012/05/10/2486886.html Struts 2是在WebWork2基础发展而来的. 注意:str ...

  9. salesforce lightning零基础学习(二) lightning 知识简单介绍----lightning事件驱动模型

    看此篇博客前或者后,看一下trailhead可以加深印象以及理解的更好:https://trailhead.salesforce.com/modules/lex_dev_lc_basics 做过cla ...

随机推荐

  1. Java多线程编程(四)—浅谈synchronized与lock

    一.共享资源竞争问题 在Java语言的并发编程中,由于我们不知道线程实际上在何时运行,所以在实际多线程编程中,如果两个线程访问相同的资源,那么由于线程运行的不确定性便会在这种多线程中产生访问错误.所以 ...

  2. 【转】Java中关于异常处理的十个最佳实践

    原文地址:http://www.searchsoa.com.cn/showcontent_71960.htm 导读:异常处理是书写强健Java应用的一个重要部分,Java许你创建新的异常,并通过使用 ...

  3. UI状态控制

    if(BillBaseStatusEnum.ADD==this.editData.getBaseStatus()){ this.btnSave.setEnabled(true); this.btnSu ...

  4. Java面试13|算法

    1.冒泡排序 for(int i=0;i<n;i++){ for(int j=0;j<n-1-i;j++){ if(temp[j]>temp[j+1]){ int t=temp[j] ...

  5. JS一周游~(基础、运算符、条件语句)

    一.基础篇 JavaScript 基于浏览器(客户端).基于(面向)对象{没有继承}.事件驱动(要有对象).脚本语言(灵活多变) 1.作用 表单的验证,减轻服务端的压力 添加页面动画效果 动态更改页面 ...

  6. java装箱跟拆箱解析

    /** * 在jdk1.5之后,java为基本数据类型到对应的应用数据类型提供了自动拆箱装箱操作 * 不管是自动拆箱还是自动装箱都是应用数据类型有的方法,基本数据类型是没有任何方法可调用的 *从概念上 ...

  7. 通过Servlet生成验证码图片

    原文出自:http://www.cnblogs.com/xdp-gacl/p/3798190.html 一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类, ...

  8. .net平台的MongoDB使用

    前言 最近花了点时间玩了下MongoDB.Driver,进行封装了工具库,平常也会经常用到MongoDB,因此写一篇文章梳理知识同时把自己的成果分享给大家. 本篇会设计到Lambda表达式的解析,有兴 ...

  9. cuda线程/线程块索引小结

    内建变量: threadIdx(.x/.y/.z代表几维索引):线程所在block中各个维度上的线程号 blockIdx(.x/.y/.z代表几维索引):块所在grid中各个维度上的块号 blockD ...

  10. 基于Intranet的零件库管理信息系统设计--part02

    昨天建了第一个子表,今天继续. 按照这个一个一个来: 轴承参数查询如下(来源:轴承查询型号网) 照这个来大概就是这么几个属性: 轴承主键,轴承名称,新型号,旧型号,内径,外径,宽度,Cr,Cor(话说 ...