在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>

Struts2之配置文件中Action的详细配置的更多相关文章

  1. Struts2之配置文件中Action的详细配置(续)

    承接上一篇 4.处理结果的配置 Action类的实例对象调用某个方法,处理完用户请求之后,将返回一个逻辑视图名的字符串.核心Filter收到返回的逻辑视图名字符串,根据struts.xml中的逻辑视图 ...

  2. struts2配置文件中action的name属性

    struts2配置文件中action的name属性的第一个字符不要加斜杠 <action name="see" class="baoxiuManage_seeAct ...

  3. Struts2的配置文件中, <package>的作用,<action><result>重名?

    问:Struts2的配置文件中, <package>的作用是什么? 答:防止action重名啊,例如前台和后台,总会有很多地方起名重复的! 问:可是访问的时候,不也是访问action吗,能 ...

  4. Struts2 框架使用 核心以及其他详细配置

    因为在使用SSH框架的过程,关于struts2的配置比较繁琐,所以做个总结. 一.导入并且关联其他XML 1.   因为在核心配置文件(Struts2.xml)中,如果存在很多需要配置的Action项 ...

  5. struts2配置文件中Action中的各属性的含义

    StrutsApacheBeanJSPServlet attribute:      这个属性用来指定ActionForm保存到指定上下文时所使用的属性名.如果不指定attribute属性的值,将使用 ...

  6. Apache中AllowOverride的详细配置使用

    我们通常利用Apache的rewrite模块对URL进行重写,rewrite规则会写在 .htaccess 文件里.但要使 apache 能够正常的读取.htaccess 文件的内容,就必须对.hta ...

  7. 对于nginx配置文件中的fastcgi_param的配置错误

    在centos中搭建LNMP的时候,遇到了一个问题 在浏览器中访问.php文件的时候,nginx不能正常解析,页面返回404,后来百度了一下,发现了问题 在nginx的配置文件nginx.conf中的 ...

  8. spring 配置文件中使用properties文件 配置

    配置Bean载入properties文件: <bean id="propertyPlaceholderConfigurer" class="org.springfr ...

  9. struts2使用配置文件中使用json-default的问题

    使用Struts2实现异步验证数据: 与Struts2相关的jar包如下: freemarker-2.3.13.jar ognl-2.6.11.jar struts2-core-2.1.6.jar s ...

随机推荐

  1. mybatis快速入门(八)-spring-mybatis动态代理整合

    将上一节的代码改造下就好了,不过这一章会加一个basedaomapper.废话不多说直接上代码了. 创建一个BaseDaoMapper.java package cn.my.sm.mapper; /* ...

  2. NOIP2017总结

    NOIP2017 总结 今年又炸飞天了,day1T1T2加起来不到100分,T3只有10分--怕真的要AFO了. 和去年一模一样day1炸飞天,day2虽然发挥正常但也无力回天 day1 Day1T1 ...

  3. Luogu P1410 子序列

    题目大意: 给定一个长度为\(N\)(\(N\)为偶数)的序列,] 问能否将其划分为两个长度为\(\frac{N}{2}\)的严格递增子序列, 输入一共有\(50\)组数据,每组数据保证\(N \le ...

  4. 【BZOJ2004】公交线路(动态规划,状态压缩,矩阵快速幂)

    [BZOJ2004]公交线路(动态规划,状态压缩,矩阵快速幂) 题面 BZOJ 题解 看到\(k,p\)这么小 不难想到状态压缩 看到\(n\)这么大,不难想到矩阵快速幂 那么,我们来考虑朴素的\(d ...

  5. 【Luogu3807】【模板】卢卡斯定理(数论)

    题目描述 给定\(n,m,p(1≤n,m,p≤10^5)\) 求 \(C_{n+m}^m mod p\) 保证\(P\)为\(prime\) \(C\)表示组合数. 一个测试点内包含多组数据. 输入输 ...

  6. angular路由模块(二)

    上一章写的是如何创建一个简单的路由,这一样我们来看看如何创建一个路由模块.angular的思想就是(模块,组件,子组件.....). 我们在src/app目录下创建一个跟路由模块app-routing ...

  7. NOIP2017 总结

    联赛结束,但是我并没有得到预期的结果,特写此文分析原因,希望我不会就此退役. 回顾一年,我做了什么? 2016年联赛,我水了两天,抱着挂掉的心态拿到了1=. 2016-2017寒假,参加集训,三天考试 ...

  8. 关于Android SDK Manager无法更新的解决办法

    网上其实也提供了很多的解决方法,但是很多方法下载已经失效了,这里我提供一个解决方法: 1.打开SDK Manager,点击Tools-Options... 2.做如下修改: (这张图片是参考其他网站的 ...

  9. python函数名称空间

    一.命名空间概念 命名空间(name space),若变量x=1,1存放在内存中,命名空间是存放名字x.x与1绑定关系的地方.命名空间分三种: locals:函数内的名称空间,包括局部变量和形参 gl ...

  10. Mysql设置字段自动获取时间

    问题:现在在用户表中有一个字段表示用户创建的时间 第一个想法是写一段程序获得系统当前时间,想想就太麻烦了,果断放弃,之后想到了存储过程和函数,再想想还要编写存储过程或者函数的代码,有点放弃的想法,但是 ...