struts2笔记2.1

系统 1473 0

二、 struts.xml 配置及例程

1. 配置文件的优先级

struts2 中一些配置(比如常量)可以同时在 struts-default.xml (只读性), strtus-plguin.xml (只读性), struts.xml struts.properties web.xml 文件中配置,它们的优先级逐步升高,即是说后面的配置会覆盖掉前面相同的配置。

2. 配置形式

下面以对 struts.i18n.encoding=UTF-8 的配置为例进行说明:

struts.xml 配置形式如下:

    < constant name = "struts.i18n.encoding" value = "gbk" ></ constant >

struts.properties 的配置形式如下:

struts.i18n.encoding=UTF-8

web.xml 中配置如下:
< filter >

< filter-name > struts2 </ filter-name >

< filter-class >     org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

    </ filter-class >

    < init-param >

       < param-name > struts.i18n.encoding </ param-name >

       < param-value > UTF-8 </ param-value >

    </ init-param >

</ filter >
说明 官方声称配置了此常量可以解决中文乱码问题,但实事上并不能达到目的,在前面的三个项目中,如果我们在表单中输入中文,其结果是会出现乱码。解决此问题参看 [ .7 的注意 ] 。这是 struts2.1.6 中的一 bug, 它的下一版 2.1.8 已解决此问题。

3.package 配置相关

属性名

是否必须

说明

Name

Package 的唯一标识,不允许同名

Extends

指定要继承的包

Namespace

指定名称空间

Abstract

声明包为抽象否

下面我们建立 struts2package 项目 来进行 package 相关测试:

 

6. 初识拦截器

拦截器能在 action 被调用之前和被调用之后执行一些 代码 Struts2 框架的大部分核心功能都是通过拦截器来实现的,如防止重复提交、类型转换、对象封装、校验、 文件上传 、页面预装载等等,都是在拦截器的帮助下实现的。每一个拦截器都是独立装载的 (pluggable) ,我们可以根据实际的需要为每一个 action 配置它所需要的拦截器。

myStruts2 项目 下,重新对配置文件作如下修改:
< package name = "myFirst" namespace = "/" extends = "struts-default" >

< interceptors >

< interceptor name = "timer"

              class = "com.opensymphony.xwork2.interceptor.TimerInterceptor" />


   
< interceptor name = "params"                                                                                                       class = "com.opensymphony.xwork2.interceptor.ParametersInterceptor" />

    </ interceptors >

 

       < action name = "login" class = "com.asm.LoginAction" >

           < interceptor-ref name = "timer" ></ interceptor-ref >

           < interceptor-ref name = "params" ></ interceptor-ref >

           < result name = "loginSuccess" > /success.jsp </ result >

           < result name = "loginFailure" > /failure.jsp </ result >

       </ action >

    </ package >

首先在 package 中定义了两个拦截器,然后在 login action 中引用了这两个拦截器,需要说明的是这里使用的拦截器都是系统自带的拦截器。其实在 extends 所继承的 struts-default 中就包含了很多拦截器,也包括我们这里所用的拦截器,但如果在此 action 中不使用 params 拦截器,将会报空指针错,因为 params 拦截器的作用是传递表单参数,如果不使用此拦截器就不能在 action 中得到表单参数,所以引用时会报空指针错。虽然 extends 继承的 strust-default 自带有 params 拦截器,但是当我们自己引用了拦截器时,继承 struts-default 将不会再为我们分配默认的拦截器(有点类似构造器),但是我们仍然可以通过 < interceptor-ref name = "defaultStack" /> 来继续使用 struts-defalut 的拦截器。 补充 :由于上面的 package 继承于 struts-default ,而我们这里所用到的 timer params 都是在 struts-defalut 中定义过,所以即使我们在 < interceptors > 中没有定义过这两个拦截器,也可以直接在 action 中引用。

使用 </ interceptor-stack > 组合多个拦截器 :比如我们想把上面的 params timer 这两个拦截器组合:

    < interceptor-stack name = "timer_param" >

              < interceptor-ref name = "timer" />

              < interceptor-ref name = "params" />

    </ interceptor-stack >

然后再在 action 引用 < interceptor-ref name = "timer_param" /> ”,效果和分别引用两个是一样的。其实我们使用 strtus-default 中的 < interceptor-ref name = "defaultStack" /> 也是使用 interceptor-stack 方式。

 



struts2笔记2.1
 

说明: 在上面的配置文件中所用到的 Test1Action Test2Action 这两个 Action 都只是继承了 com.opensymphony.xwork2.ActionSupport 类,而 ActionSupport 默认返回的就是“ success , 所以当点击上面的链接分别转到了 forward 目录下的 test1.jsp test2.jsp 。下面重点来看这个 package 元素的 namespace 属性及 action name 属性,它们共同定义了 action 所映射到的实质文件。上图展示了链接地址和 action 的对应关系, 所以当我们要想访问一个 action 所关联到的 jsp 文件时,应该用 namespace+action name 关于它的内容测试可以参考 struts2package 项目。
补充 :通常情况下, action 元素的 name 是属性值是不能出现“ / ”的,所以希望通过 action name 属性来实现多级映射,需要在 sturts.xml 中增加如下属性:
 

< constant name = "struts.enable.SlashesInActionNames" value = "true" /> 这样配置后就可以再 action name 元素中使用“ / ”了。比如:
< package name = "tt3" extends = "struts-default" >

       < action name = "test3/test3" class = "com.asm.Test3Action" >

           < result name = "success" > /forward/test3.jsp </ result >

       </ action >

</ package >

然后输入 < a href = " <%= path %> /test3/test3.action " > test3 </ a >< br > 链接地址就可以访问了

强调 namespace 默认值“”,即不配置 namespace 属性。它的意思是:如果 action 不能进行完整路径匹配,则会来此 namespace 下进行匹配,比如: .../test/test/test.action ,如果参照 namespace action name 不能找到也之完全对应的 action ,它会再到依次追溯到上级目录中查找,即是说它会以 …/test/test.action 这样的路径来对应 namespace action name 进行查找。如果返回到最终的目录仍找不到,它就会到 namespace = "/" 对应的包下查找名为 test action, 如果仍找不到,它就会去默认的 namespace 下查找名为 test action ,如果找到则执行此 action 另外 namespace 也可以配置成 namespace = "/" 。它代表配置为项目的根。 总结 action 的名称探索顺序:完全对应、逐步追溯到上级目录查找、 "/" 下查找、默认 namespace 下查找。

为什么要提出 namespace ,主要是避免多人共同开发项目出现名字冲突。如果不使用 namespace ,多个人所写的 action 中可能出现重名的现象,这样当项目合并时就会出现冲突。而有了 namespace 可以在项目开发时由项目经理给每一个人分不同的 namespace ,这样每个开发人员只需要保证自己所写的 action 不同名即可。
namespace
引发的链接问题 :当我们为 action 配置了 namespace 时,访问此 action 的形式总会是如下形式: .../webappname/xxx/yyy/ActionName.action 而当此 action 成功执行跳转到某个 jsp 页面时,如想在此 jsp 页面写链接,一定要写绝对路径,因为相对路径是相对 .../webappname/xxx/yyy/ ,而如果以后我们修改了 action namespace 时,相对路径又要变,所以链接不能写成相对路径。以下介绍绝对路径的写法:通常用 myeclipse 开发时建立一个 jsp 文件,默认总会有如下内容:

<%

String path = request.getContextPath();

String basePath = request.getScheme()+ "://" +request.getServerName()+ ":" +request.getServerPort()+path+ "/" ;

%>
我们写绝对路径可以参此内容。还可以参 <head> 下的 < base href = " <%= basePath %> " > 来完成绝对路径的书写。

4. 分工合作 include: 指定多个配置文件

比如让 jack 来单独开发一个 action ,在 jack.xml 中的配置文件为:
< struts >

    < package name = "jack" namespace = "/jack" extends = "struts-default" >

       < action name = "test4" class = "com.asm.Test4Action" >

           < result name = "success" > /forward/test4.jsp </ result >

       </ action >

    </ package >

</ struts >

然后在 struts.xml 文件中增加如下内容: < include file = "jack.xml" ></ include > 它实质就是把 jack.xml 中的 <package> 及其内容写进 struts.xml 中的 < struts > 根元素下。

链接: < a href = " <%= path %> /jack/test4.action " > test4 </ a > 这样便可以访问到了 forward 目录下的 test4.jsp 了。

 

struts2笔记2.1


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论