Struts2 学习笔记——Action开发详解

对于开发Struts2应用的开发者来讲,Action才是应用的核心,咱们经过开发不一样的业务控制器—Action来处理不一样的用户请求逻辑。jsp

实现Action测试

Struts2采用了低入侵式的、松耦合设计,开发一个Action类,不须要继承或实现任何Struts2的类或接口。url

咱们先来看一下标准的Action类的格式:spa

  public class 类名 {设计

private String  属性1;orm

private String  属性2;xml

... ...对象

属性对应的getset方法继承

 

    public String execute() throws Exception {接口

       return 逻辑视图字符串;

    }

}

从上面的结构中咱们能够看出这与普通的POJO没有多大区别,惟一的区别就是Action类必须包含一个无参数的、返回字符串的execute()方法。而Action的属性则是与Action要处理的HTTP请求信息中封装的参数对应。

Struts2中提供了一个Action接口和一个ActionSupport类来帮助咱们开发Struts2应用。若是须要咱们能够继承他们。

Action接口提供了execute()接口方法和一些经常使用的表示处理逻辑结果的逻辑视图名。

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接口可以帮助咱们规范Action的开发,对经常使用的处理结果有着统一规范的做用。

ActionSupport类围绕请求逻辑处理提供了不少方法,如默认处理用户请求、数据校验、错误消息、国际化资源等方面。

 

Action间接访问ServletAPI

Struts2Action没有与任何ServletAPI耦合,这就可以方便的测试Action。可是在开发Web应用中,不访问ServletAPI是不可能的。在Struts2中提供了一个ActionContext类来帮助咱们访问ServletAPI

 

下面是关于咱们常要访问ServletAPI的一些方法:

方法名

说明

public Object get(String key)

相似于调用HttpServletRequestgetAttribute(String name)方法。

public Map<String, Object> getApplication()

返回一个Map对象,相似于得到ServletContext对象

public static ActionContext getContext()

得到ActionContext实例

public Map<String, Object> getParameters()

相似于调用HttpServletRequestgetParameterMap()方法。

取得值是一个String[]类型的值

public Map<String, Object> getSession()

返回一个Map对象,相似于得到HttpSession对象

 

Action直接访问ServletAPI

Struts2还提供了两种方式直接访问ServletAPI

一、 实现相应的接口

Struts2提供了如下接口来访问ServletAPI

接口

说明

ServletContextAware

实现该接口,就能够直接访问Web应用的ServletContext对象实例。

ServletRequestAware

实现该接口,就能够直接HttpServletRequest对象实例。

ServletResponseAware

实现该接口,就能够直接HttpServletResponse对象实例。

 

二、 借助于ServletActionContext

Struts2中还提供了一个ServletActionContext类,来帮助咱们直接访问ServletAPI

ServletActionContext类中包含了如下静态方法帮咱们得到相应的实例对象:

静态方法名

说明

PageCotext getPageContext()

得到PageCotext对象

HttpServletRequest getRequest()

得到HttpServletRequest对象

HttpServletResponse getResponse ()

得到HttpServletResponse对象

ServletContext getServletContext()

得到ServletContext对象

 

注意:即便咱们在Struts2Action中得到了HttpServletResponse对象,也不要尝试产生对客户端的输出内容信息。

 

配置Action

Struts2使用包来管理Action信息,因此咱们须要在struts.xml文件中使用<action>元素做为<package>元素的子元素来配置Action信息。

一个完整的Action信息以下格式:

<package name="sample1" extends="struts-default"> 

    <action name="index" class="org.struts2.samples1.HelloWorld"> 

        <result name="success">/index.jsp</result> 

    </action> 

</package>

在配置Action信息,class属性能够省略,这时默认的实现类为ActionSupport类。

name属性:Action的名称,其属性值对应着它所处理URL的前半部分。

如:http://localhost://8080/Strurs2Demo/index.action

咱们看到Action类的execute方法在处理完请求逻辑后返回一个字符串,这个字符串只是一个逻辑视图名,和实际的物理视图资源没有任何关联。为了让Struts2可以找寻到请求逻辑后响应的具体物理资源,咱们须要使用<action>元素的子元素<result>元素来表述逻辑视图与物理视图资源的关联关系。

动态方法调用

到目前为止咱们知道了如何编写一个Action类,配置Action信息。可是这个Action只能处理一个请求,如何可以像Struts1那样继承了DispatchAction后,可以一个Action类处理多个请求逻辑?

Struts2中是使用动态方法调用技术来解决这个问题的。下面咱们就来看看如何实现的:

为了让Struts2开启动态调用功能,咱们须要将Struts2常量struts.enable.DynamicMethodInvocation的值设置为true以下:

<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

有两种方式能够实现动态调用,来达到一个Action类处理多个请求逻辑能。

方式一:为<action>元素指定method属性。如:

<action name="login"  class=" org.struts2.samples1.LoginRegistAction">

<action name="regist"  class=" org.struts2.samples1. LoginRegistAction ">

可是这样咱们发现这两个Action的配置信息绝大部分相同,所以这种配置至关冗余。为了解决这个问题,Struts2还提供了另一种形式的动态方法调用。

方式二:使用通配符

在配置Action信息是,咱们须要指定nameclassmethod属性,这3个属性均可支持通配符,这种通配符的方式就是另外一种动态方法调用。

如:

<action name="*Action"  

class=" org.struts2.samples1.LoginRegistAction">

这个配置代表只要以*Action结尾的请求均可以处理。好比aAction.actionabcAction.action

 

好比:LoginAction.action请求会被org.struts2.samples1.LoginAction实例的Login方法处理。

<action name="*Action"  

class="org.struts2.samples1.{1}Action"

method="{1}">

 

好比:Book_save.action请求会被org.struts2.samples1.BookAction实例的save方法处理。

<action name="*_*"  

class="org.struts2.samples1.{1}Action"

method="{2}">

 

咱们还能够经过使用通配符来配置一个可以处理任何请求的通用Action。如:

<action name="*"><result>/{1}.jsp</result></action>

 

如今咱们会碰到以下问题:在处理用户请求时,咱们可以找到多个匹配的、符合条件处理这个请求的Action配置信息,这时怎么选择呢?请看下面实例代码:

<package name="sample" extends="struts-default"> 

    <action name="*" class="org.struts2.samples.OneAction"> 

       <result name="success">/welcome.jsp</result> 

    </action>

    <action name="*Action" class="org.struts2.samples.TwoAction"> 

       <result name="success">/welcome.jsp</result> 

    </action>

    <action name="threeAction" class="org.struts2.samples.ThreeAction"> 

       <result name="success">/welcome.jsp</result> 

    </action>

</package> 

当请求http://localhost:8888/Struts2Demo/regist.action到达时,咱们能够看出上述的3action均可以处理这个请求信息,可是Struts2会采用什么策略来肯定选择使用哪个action来处理这个请求呢。

会采用如下策略:

Struts2会扫描struts.xml文件中是否有名为registAction,若是有则使用此Action处理,若是没有,则会查找与regist匹配的action,这时会找到两个匹配的信息,即名称为”*”的通用Action和名称为”*Action”Action,而后会按照顺序选择第一个找到的Action来处理请求。

因而可知,咱们须要将通用的Action配置放到最后,不然它将处理除了请求与action名绝对相同以外的全部的请求。

 

方式三:使用Struts2默认约定格式的URL请求< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

咱们可使用下列格式的请求来达到一个Action处理不一样业务逻辑的效果。

url = 请求前缀+action!方法名.处理请求后缀的格式。

好比:http://locahost:8888/Demo/LoginAction!login.action这样一条请求。

表示须要名为LoginActionActionlogin方法来处理这个请求。

 

配置默认的Action

<default-action-ref name="defaultAction"></default-action-ref>

<action name="defaultAction" class="org.struts2.samples.DefaultAction"> 

     <result name="success">/welcome.jsp</result> 

</action>

Struts2找不到请求与action名绝对相同的Action,也找不到使用通配符可以匹配的Action是就会调用默认的Action来处理请求。也就是说在有通用Action配置的状况下会先调用通用Action来处理请求。

 

Action的处理结果

咱们知道Action只是一个处理用户请求的控制器,他不能也不该该提供处理响应信息。他只提供一个处理结果的逻辑字符串,对应的具体的响应信息则由Struts2查找逻辑视图名对应的物理资源来产生响应信息。

struts.xml文件中咱们使用<result>元素来配置处理结果。

处理结果分为两种类型:

局部处理结果:将<result>元素做为<action>元素的子元素来配置。

全局处理结果:将<result>元素做为<global-results>元素的子元素来配置。如:

<global-results>

<result name="success">/${result}.jsp</result>

<result name="error">/error.jsp</result>

</global-results>

 

下面为<result>元素完整属性配置格式:

<result name="逻辑视图名" type="结果类型">

<param name="location">实际视图资源</param>

<param name="parse">true</param>

</result>

其中:

属性

说明

name

逻辑视图名

type

结果类型,Struts2支持14中类型的结果类型

loaction

指定逻辑视图名对应的实际视图资源

parse

指定了是否容许在实际试图资源名中是否可以使用ONGL表达式。默认值为true。一般无需修改此属性的值。

一般无需指定parse,因此能够简写为:

<result name="逻辑视图名" type="结果类型">实际视图资源</result>

 

Struts2支持处理的14中结果类型:默认dispatcher类型,即jsp资源视图。

 

类型

说明

chain

Action链式处理结果

chart

用于处理JfreeChart类型的视图资源

dispatcher

用于处理JSP视图资源

freemarker

用于FreeMarker视图资源

httpheader

用于控制特殊的Http行为的视图资源

jasper

用于JasperReports视图资源

jsf

用于JSF的结果类型视图资源

redirect

用于直接跳到其余URL视图资源

redirect-action

用于直接跳转到其余的Action视图资源

stream

用于流类型的视图资源

tiles

用于Tiles类型视图资源

velocity

用于Velocity类型视图资源

xslt

用于XML/XSLT类型视图资源

plaintext

用于显示某个页面源码的视图资源

具体详细的说明请参考响应的资料了解。

 

使用通配符配置处理结果:

Action配置信息支持通配符同样,处理结果也支持通配符。如:

<action name="*Action" class="org.struts2.samples.TwoAction"> 

   <result name="success">/{1}.jsp</result> 

</action>

 

使用ONGL表达式结合请求参数来得到处理结果:

ONGL表达式,即${属性名.属性名.属性名…}再结合请求中的请求参数共同组合成一个实际的视图资源。如:

<action name="load" class="org.struts2.samples.TwoAction"> 

   <result name="success" type=”redirect”>/edit.action?name=${user.name}</result> 

</action>

相关文章
相关标签/搜索