首页 > 其他 > 详细

Action配置及使用

时间:2015-03-23 16:12:19      阅读:440      评论:0      收藏:0      [点我收藏+]


一、Struts配置文件

         Struts2默认会加载类加载路径下的struts.xmlstruts-default.xmlstruts-plugin.xml三类文件,其中struts.xml是开发者定义的默认配置文件,struts-default.xmlStruts2框架自带的配置文件,而struts-plugin.xml则是Struts2插件的默认配置文件。

         struts.xml配置文件最大的作用是配置Action和请求之间的对应关系,并配置逻辑试图名和物理视图资源之间的对应关系。除此之外,struts.xml文件还有一些额外的功能,例如Bean配置、常量配置、导入其他配置文件等。

         Struts2的常量相当于对于Struts2应用整体起作用的属性,因此Struts2常量常常也被称为Struts2属性。

         虽然Struts2配置常量有三种方式:通过struts.properties文件;通过struts.xml配置文件;通过web应用的web.xml文件。通常推荐在struts.xml文件中定义Struts2属性,而不是在struts.properties文件中定义Struts2属性。

         可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件,示例如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

         "-//Apache SoftwareFoundation//DTD Struts Configuration 2.1.7//EN"

         "http://struts.apache.org/dtds/struts-2.1.7.dtd">

<!-- 指定Struts 2配置文件的根元素 -->

<struts>

         <!-- 通过include元素导入其他配置文件-->

         <includefile="struts-part1.xml"/>

         <includefile="struts-part2.xml"/>

         ...

</struts>

         被包含的struts-part1.xml文件是标准的Struts2配置文件,一样包含了DTD信息、Struts2配置文件的根元素等信息。通常,将Struts2的所有配置文件都放在web应用的WEB-INF/classes路径下,struts.xml文件包含了其他的配置文件,struts.xml文件由Struts2框架负责加载,从而可以将所有配置信息都加载进来。

二、实现Action

1.Action介绍

         Action是应用的核心,开发者需要提供大量的Action类,并在struts.xml文件中配置ActionAction类里包含了对用户请求的处理逻辑,Action类也被称为业务控制器

         Action类是一个POJO,包含settergetter方法,默认处理用户请求的方法:execute()方法。

         ActionSupport是一个默认的Action实现类。如果我们配置的Action没有指定class属性(即没有用户提供Action类),系统自动使用ActionSupport类作为Action处理类。

2.Action访问Servlet API

         由于Action类不在于ServletAPI耦合,从而能更轻松地测试该ActionWeb应用中通常要访问的Servlet API就是HttpServletRequestHttpSessionServletContext,这三个接口分别代表JSP内置对象中的requestsessionapplication

方法一:Struts2提供了一个ActionContext类,Struts2Action可以通过该类来访问Servlet API。类中常用方法如下:

Object get(Object key):相当于HttpServletRequestgetAttribute(Stringname)方法。

Map getApplication():返回一个Map对象,该对象模拟了该应用的ServletContext实例。

static ActionContext getContext():静态方法,获取系统的ActionContext实例。

Map getParameters():获取所有请求参数。类似于HttpServletRequestgetParameterMap().

Map getSession():返回一个Map对象,该Map对象模拟了HttpSession实例。

void setApplication(Map application):传入一个Mapkey-value,转换成application的属性名、属性值。

void setSession(Map session):传入一个Mapkey-value,转换成session的属性名、属性值。

方法二:Struts2提供如下几个接口(需要implements并实现方法):

ServletContextAware:实现该接口的Action可以直接访问Web应用的ServletContext实例。

ServletRequestAware:实现该接口的Action可以直接访问用户请求的HttpServletRequest实例。

ServletResponseAware:实现该接口的Action可以直接访问服务器响应的HttpServletResponse实例。

方法三:使用ServletActionContext(工具类)访问Servlet API

static PageContext getPageContext():取得Web应用的PageContext对象。

Static HttpServletRequest getRequest():取得Web应用的HttpServletRequest对象。

Static HttpServletResponse getResponse ():取得Web应用的HttpServletResponse对象。

Static ServletContext getServletContext():取得Web应用的ServletContext对象。

 

3.配置action

         实现了Action处理类之后,就可以在struts.xml文件中配置该Action了。配置Action就是让Struts2知道哪个Action处理哪个请求,也就是完成用户请求和Action之间的对应关系。我们可以认为,ActionStruts2的基本程序单位

3.1包和命名空间

         Struts2使用包来组织Action,因此,将Action定义放在包定义下完成,定义Action通过使用<package…/>下的<action…>子元素来完成,而每个package元素配置一个包。

         Struts2框架中的核心组件就是Action、拦截器等,Struts框架使用包来管理Action、拦截器。

         几个属性:

         name:这是一个必须属性,该属性指定该包的名字,改名字是该包被其他包引用的key

         extends:该属性是一个可选属性,指定该包继承其他包(从而继承Action、拦截器)

         namespace:该属性是一个可选属性,该属性定义该包的命名空间。

         abstract:该属性是一个可选属性,它指定该包是否是一个抽象包(不包含Action定义)。

         Strut2-core.jar定义了struts-default抽象包,包含了大量结果类型定义、拦截器定义、拦截器引用定义等,这些都是配置普通Action的基础,所以开发者定义的package通常应该继承struts-default包。

         如果配置<package…/>时没有指定namespace属性,则该包的Action处于默认的包空间下。

         当某个包指定命名空间后,该包下所有的Action处理的URL应该是命名空间+Action名。

         Namespace=”/”为根命名空间。

         Action顺序:先找命名空(包括根命名空间)间下的,再找默认命名空间下的。

3.2Action的基本配置

         Struts2Action名字就是它所处理的URL

         通常需要为action元素指定一个class属性,其中class属性指定了该Action的实现类。

         配置Action时应该配置逻辑试图和物理视图资源之间的对应关系,一次一个<result…/>

         Name中开启斜线支持:将struts.enable.SlashesInActionNames值设置为true

配置模版如下:

                   <actionname="login" class="org.crazyit.app.action.LoginAction">

                            <!--定义三个逻辑视图和物理资源之间的映射 -->           

                            <resultname="input">/login.jsp</result>

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

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

                   </action>

3.3分配多个Action的处理逻辑

方法一:使用DMIDynamic Method Invocation

         动态方法调用是指表单元素的action并不是直接等于某个Action的名字,而是以如下形式来指定表单的action属性:

         action=”ActionName!methodName”(放在javascript)

例子:

         网页中<inputtype=”submit” value=”注册” onclick=”regist();”>//点注册按钮调用regist函数

         functionregist(){

                  targetForm = document.forms[0];

                   targetForm.action= “login!regist”;

         }

 

当用户点击注册,系统交给loginActionregist方法处理。

         通过这种方式,我们可以在一个Action中包含多个处理逻辑,并通过为表单元素指定不同action属性来提交给Action的不同方法,默认是execute方法。

 

         开启系统的动态方法调用是通过设置strut.enable. DynamicMethodInvocationtrue

方法二:指定method属性及使用通配符

示例代码:

<?xml version="1.0"encoding="GBK"?>

<!DOCTYPE struts PUBLIC

         "-//ApacheSoftware Foundation//DTD Struts Configuration 2.1.7//EN"

         "http://struts.apache.org/dtds/struts-2.1.7.dtd">

<struts>

         <packagename="lee" extends="struts-default">

                   <!--使用模式字符串定义Actionname,指定所有以Action结尾的请求,

                   都可用LoginRegistAction来处理,method属性使用{1}

                   这个{1}代表进行模式匹配时第一个*所代替的字符串-->

                   <actionname="*Action"class="org.crazyit.app.action.LoginRegistAction"

                            method="{1}">

                            <!--定义逻辑视图和物理视图之间的映射关系 -->

                            <resultname="input">/login.jsp</result>

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

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

                   </action>

         </package>

</struts>

         上面的<actionname=”*Action”…/>元素不是定义了一个普通Action,而是定义了一系列的Action,只要用户请求的URL*Action.action的模式,都可以用该Action来处理。该method属性使用了一个表达式{1},该表达式的值就是name属性值中第一个*的值。

         例如:

         用户请求的URLloginAction.action,则调用lee.LoginRegistAction类的login方法;如果请求的URLregistAction.action,则调用lee.LoginRegistAction类的regist方法;

 

         也可以使用两个通配符:

         <actionname=”*_*” method=”{2}” class=”actions.{1}”>

 

Action处理的优先级:

         如果有URLabcAction.action的请求,如果struts.xml文件中有abcAction.action则先有它处理,如果没有,则找*Action**Action并不比*更优先匹配abcAction的请求,而是先找到哪个Action就会由哪个Action来处理用户的请求。

Action配置及使用

原文:http://blog.csdn.net/kakarot5/article/details/44564699

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!