struts2笔记2.1

二、struts.xml配置及例程

1.配置文件的优先级

struts2中一些配置(比如常量)可以同时在struts-default.xml(只读性),strtus-plguin.xml(只读性),struts.xmlstruts.propertiesweb.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,而我们这里所用到的timerparams都是在struts-defalut中定义过,所以即使我们在<interceptors>中没有定义过这两个拦截器,也可以直接在action中引用。

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

    <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
 

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

<constant name="struts.enable.SlashesInActionNames" value="true"/> 这样配置后就可以再actionname元素中使用“/”了。比如:
<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,如果参照namespaceactionname不能找到也之完全对应的action,它会再到依次追溯到上级目录中查找,即是说它会以…/test/test.action这样的路径来对应namespaceactionname进行查找。如果返回到最终的目录仍找不到,它就会到namespace="/"对应的包下查找名为testaction,如果仍找不到,它就会去默认的namespace下查找名为testaction,如果找到则执行此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/,而如果以后我们修改了actionnamespace时,相对路径又要变,所以链接不能写成相对路径。以下介绍绝对路径的写法:通常用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了。

 

你可能感兴趣的:(jsp,Web,xml,MyEclipse,struts)