玩技术,Geeker
一个原创技术文章分享网站

Struts2学习之Action的基本配置

前言

在这篇《Struts2学习之实现Action》中,学习完实现Action处理类之后,就需要在struts.xml文件中配置Action了。配置Action就是让Struts2知道以下两件事:

  • 用户请求和Action之间的对应关系
  • 逻辑视图和物理视图之间的对应关系

如何配置这个struts.xml文件还是有很多说道的,下面就来说说如何配置struts.xml文件。

Struts2使用包来管理和组织Action,所以将Action的定义放在包定义下完成。Struts2框架中核心组件就是Action、拦截器等,Struts2框架使用包来管理Action和拦截器等,每个包就是多个Action、拦截器的集合。再把《Struts2学习之初见Struts2》这篇文章中的struts.xml拿出来:

<struts> 
    <package name="lee" extends="struts-default">
        <action name="login" class="com.jellythink.practise.LoginAction">
            <result name="input">/login.jsp</result>
            <result name="error">/error.jsp</result>
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>

包是通过<package... />标签来定义的,它可以包括以下几个属性定义:

  • name:必须属性,表示包的名字,其它包可以通过该属性引用该包
  • extends:可选属性,表示该包继承自其它包;通过继承其它包,可以继承其它包中的Action定义、拦截器定义等
  • namespace:可选属性,表示该包的命名空间,具体请参见命名空间小节
  • abstract:可选属性,表示该包是否为抽象包,抽象包中不能包含Action定义

从上面的struts.xml代码中,可以看到<package name="lee" extends="struts-default">继承了一个名为struts-default的包,这个struts-default包是在struts2-core-2.3.24.1.jar里定义的一个抽象包,它里面包含了大量结果类型定义、拦截器定义等,这些定义是配置普通Action的基础,所以我们在定义package时,应该继承struts-default包。

命名空间

在上面说到<package... />的属性时,有一个可选的namespace属性,这个属性在我们开发时,可能会经常用到,那它到底是用来干嘛的呢?

Struts2框架之所以提供命名空间的功能,主要是为了处理同一个Web应用中包含同名Action的情形(如同C++)。Struts2以命名空间的方式来管理Action,虽然同一个命名空间里不能有同名的Action,但是不同的命名空间里可以有同名的Action。下面来说说这个命名空间的具体作用,还是把《Struts2学习之初见Struts2》这篇文章中的struts.xml拿出来:

<struts> 
    <package name="lee" extends="struts-default">
        ...
    </package>
</struts>

先不配置命名空间,我们通过浏览器访问,看到浏览器里的地址为:

http://localhost:8080/Struts2Demo/login.action;jsessionid=7F8E08BD3E49323730C87DF931C032BE

现在配置一个命名空间:

<struts> 
    <package name="lee" extends="struts-default" namespace="/Login">
        ...
    </package>
</struts>

在重新跑一下程序,提示如下:

error info

提示找不到对应的Action。这就是命名空间搞的鬼。如果某个包没有指定namespace属性,即该包使用默认的命名空间;而当某个包指定了namespace属性以后,该包下所有的Action处理的URL应该是命名空间+Action名,所以对应的访问地址为:

http://localhost:8080/Struts2Demo/Login/login.action

可以看出来,这个namespace相当于模块的作用,它允许以模块化的方式来组织Action。同时,对于寻找对应的Action处理类,这里有一个寻找先后顺序:

  1. 系统先在指定的namespace中寻找Action处理类
  2. 当在指定的namespace中找不到的情况下,则在默认namespace中去找Action处理类
  3. 如果都没有找到,则出现系统错误

比如,请求为/Login/login.action,系统先在/Login命名空间中寻找名为login的Action,如果在/Login命名空间找到了对应的Action,则使用该Action处理用户请求;否则转到默认的命名空间中查找名为login的Action,如果找到,就使用该Action处理用户请求;如果两个命名空间里都没有名为login的Action,则会报上图所示的错误信息。

当指定了命名空间以后,在前台页面中的FORM表单也要指定对应的命名属性,如下:

<s:form action="login" namespace="/Login">
    <s:textfield name="userName" key="user" />
    <s:password name="password" key="pass" />
    <s:submit key="login" />
</s:form>

这样才能将请求发送到对应的Action进行处理。

Action的基本配置

Action只是一个逻辑控制器,它并不直接对请求者生成任何响应。因此,Action处理完用户请求后,Action需要将指定的视图资源呈现给用户。上面说完了如何让用户请求找到对应的Action,接下来说说如何配置这个逻辑视图和物理视图之间的映射关系。先看看这段配置代码:

<action name="login" class="com.jellythink.practise.LoginAction">
    <result name="input">/login.jsp</result>
    <result name="error">/error.jsp</result>
    <result name="success">/success.jsp</result>
</action>

配置<action... />时,也有以下两个属性:

  • name:必须属性,外部就是通过这个名字找到对应的Action
  • class:可选属性,该属性指定了Action的实现类;如果不指定该属性,系统则默认使用ActionSupport类作为处理用户请求的Action

配置逻辑视图和物理视图之间的映射关系是通过<result... />元素来定义的,每个<result... />元素定义逻辑视图和物理视图之间的一次映射。对于<result... />的name属性就是execute方法返回的结果字符串,对于<result... />的值就是对应的物理视图。

总结

这里对Action的基本配置进行了简单的总结,当然了,这里面还有很多东西没有说,比如Action处理完以后,如何跳转到非JSP页面,这些都在以后的文章中一一总结,好戏即将上演,敬请期待。

果冻想-一个原创技术文章分享网站。

2016年01月11日 于呼和浩特。

打赏

未经允许不得转载:果冻想 » Struts2学习之Action的基本配置

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

在这里玩技术,享受技术带来的疯狂

捐赠名单关于果冻