在这篇《Struts2学习之实现Action》中,学习完实现Action处理类之后,就需要在struts.xml文件中配置Action了。配置Action就是让Struts2知道以下两件事:
如何配置这个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... />
标签来定义的,它可以包括以下几个属性定义:
从上面的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>
在重新跑一下程序,提示如下:
提示找不到对应的Action。这就是命名空间搞的鬼。如果某个包没有指定namespace属性,即该包使用默认的命名空间;而当某个包指定了namespace属性以后,该包下所有的Action处理的URL应该是命名空间+Action名,所以对应的访问地址为:
http://localhost:8080/Struts2Demo/Login/login.action
可以看出来,这个namespace相当于模块的作用,它允许以模块化的方式来组织Action。同时,对于寻找对应的Action处理类,这里有一个寻找先后顺序:
比如,请求为/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 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... />
时,也有以下两个属性:
配置逻辑视图和物理视图之间的映射关系是通过<result... />
元素来定义的,每个<result... />
元素定义逻辑视图和物理视图之间的一次映射。对于<result... />
的name属性就是execute
方法返回的结果字符串,对于<result... />
的值就是对应的物理视图。
这里对Action的基本配置进行了简单的总结,当然了,这里面还有很多东西没有说,比如Action处理完以后,如何跳转到非JSP页面,这些都在以后的文章中一一总结,好戏即将上演,敬请期待。
果冻想-一个原创技术文章分享网站。
2016年01月11日 于呼和浩特。
未经允许不得转载:果冻想 » Struts2学习之Action的基本配置