您的位置:首页 > 编程语言 > Java开发

Struts2之配置文件中Action的详细配置

2014-11-23 19:36 281 查看
在Struts2之配置一文中,我们知道一个struts配置文件可以分为三部分:常量配置 包含其他配置文件的配置 Action配置 。

这其中 常量配置 和 包含其他配置文件的配置 二者的变化不多 相对来说比较简单,而Action的配置 相对来说比较复杂。

当我们写好了一个Action类之后 我们就要想着该Action类为哪个URL的请求提供服务,这就需要配置 。

1.包和命名空间

Struts2利用包(<package>)来组织Action,将Action配置(<Action >)放在包定义之下。

也就是总体是这样:

<package >
<action >

</action>
</package>

其中包的定义(<package>)有如下属性可以指定:

name : 必需属性 该包的名称

extends :可选属性 该属性指定该包继承了哪个包 。继承其他包,可以继承其他包中的Action定义,拦截器定义。

namespace: 可选属性 该属性指定指定该包的命名空间

abstract: 可选属性 指定该包是不是抽象包。抽象包中不能有Action定义 。

其中比较难理解的是命名空间(namespace)属性 。

假设某个应用叫 bookshop 该应用中Action配置如下 :

<package name="book" namespace="/book">
<action name="getBook" class="org.lingtong.web.action.BookAction" >
<result name="myBook">/myBook.jsp</result>

</action>

</package>

其中的Action可以服务的请求是 http://localhost:8080/bookshop/book/getBook.action 即 应用名 + 命名空间名 + Aciton名.action

同一个命名空间(同一个包下)不允许出现具有相同name的Action,否则就会造成 一个请求链接 对应多个Action 的混乱状况。

不同命名空间(不同包下) 允许出现和和另外一个包中具有相同name的Action , 因为请求链接 是由 应用名 ,命名空间名 ,Action名三者拼接而成的。

这里我们也应该知道如何划分一个包:根据命名空间

如:这里有三个Action类 :

BooKAction类 它服务的 请求地址是 http://localhost:8080/bookshop/book/getBook.action

CheckBookAction类 它服务的 请求地址是 http://localhost:8080/bookshop/book /checckBook.action

AllBookAction类 它服务的 请求地址是 http://localhost:8080/book/allBookAction.action

它们三个Action应该配置在同一个命名空间(同一个包下),即namespace="/book"的包下 ,因为三者的请求链接的命名空间 均是book

如果一个包(<package>)没有配置namespace属性 那么这个包具有默认命名空间

<package name="book" >

<action name="getBook" class="org.lingtong.web.action.BookAction">

</action>
</package>

意味BooKAction可以处理任何请求的Action名是 getBook.action的请求 (bookshop是应用名)

http://localhost:8080/bookshop/getBook.action ---没有命名空间的请求链接

http://localhost:8080/bookshop/book/getBook.action ---命名空间是/book的 请求链接

http://localhost:8080/bookshop/mybook/getBook.action ----命名空间是/mybook 的请求链接

http://localhost:8080/bookshop/mybook/allbook/getBook.action ----命名空间是/mybook/allbook 的请求链接

如果一个包(<package>)如果配置了namespace="/" 那么这个包具有的是根命名空间

<package name="book" namespace="/" >

<action name="getBook" class="org.lingtong.web.action.BookAction">

</action>

</package>

意味着BookAction类 只能处理这一种 (其中bookshop是应用名) http://localhost:8080/bookshop/getBook.action ---没有命名空间的请求链接

这里综合看一个例子

假设有这样是一个 请求链接 http://localhost:8080/bookshop/myBook/allBook/getAllBook.action

struts的配置文件片段

<package name="book" > ----1号 具有默认命名空间的包

<action name="getBook" class="org.lingtong.web.action.BookAction">

</action>

</package>

<package name="book" namespace="/"> ------2号 具有根命名空间的包

<action name="getBook" class="org.lingtong.web.action.BookAction">

</action>

</package>

<package name="book" namespace="/myBook/allBook"> ------3号 具有/myBook/allBook命名空间的包

<action name="getBook" class="org.lingtong.web.action.BookAction">

</action>

</package>

<package name="book" namespace="/myBook"> -------4号 具有/myBook 命名空间的包

<action name="getBook" class="org.lingtong.web.action.BookAction">

</action>

</package>

流程:

首先系统自动分析出 请求链接中的命名空间是 /myBook/allBook (去除应用名 和 Action名.action 之后的 字符串全是命名空间名) 直接在命名空间是/myBook/allBook的2号包中找 Action名是getBook的Action , 如果找到了直接服务 ,如果没有找到 就去 具有默认命名空间的1号包 中找Action名 是getBook的Action ,如果找到了 直接服务 ,没找到 ,到此为止 就会报错 。

此处注意 找完/myBook/allBook命名空间的包之后 如果没找到 ,并不会到/myBook命名空间的4号包去找 。“命名空间只有一个级别,要么全匹配 ,要么不匹配,去默认命名空间的包中找 ,不存在部分匹配的情况”。

2.<Action>元素的配置

<Action>有三个属性

name属性 --------必需属性 Action 名 对应于 请求链接中的 xxxx.action

class属性 -------可选属性 对应的Action类 如果不写 表示默认使用ActionSupport类来处理请求

method属性 --------可选属性 表示使用Action类的哪个方法来处理请求 如果不写 表示默认用execute()方法来处理请求

注意点:一般情况下name属性中没有“/”,如果希望name属性中可以出现“/”,可以通过常量配置struts.enable.SlashesInActionNames的常量值为true.

不要在name属性中使用“.”或“-”,否则会引发一些未知异常。

关于动态方法调用与method属性的设置:

我们知道一个Action类,我们默认会提供一个execute()方法,但是我们还可以在Action类中定义其他的方法,通过为 请求链接指定调用的方法 和在Action元素配置中设置method属性来 ,进行动态方法调用。

如:

请求链接 :http://localhost:8080/bookshop/myBook/allBook/getBook!getBookByName 规则 “actionName!methodName”

Action配置 :

<aciton name="getBook" class="org.lingtong.web.action.BookAction" method="getBookByName">

</action>

Action类: 提供 getBookByName方法

使用动态方法调用前必须通过常量设置Struts2允许使用动态方法调用 设置struts.enable.DynamicMethodInvocation 常量的值为 true。

3.配置默认Action

当用户请求在struts.xml文件中找不到对应的Action配置时,我们可以指定一个Action来处理这些找不到Action的用户请求

在具有默认命名空间的包(package)之下,配置如下:

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

<action name="defaultAction" class="org.org.lingtong.web.action.DefaultAction"> //找不到对应Action配置的请求,都交给DefaultAction类处理

</action>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐