struts2入门知识3--动态方法、通配符、常量

来源:互联网 发布:测绘数据数据转换工具 编辑:程序博客网 时间:2024/06/05 05:01

struts2.X心得5--struts2入门知识3--动态方法、通配符、常量



1.通配符


1)Execute方法的弊端

假设有这样的需求:

A.    有一个action为PersonAction。

B.    在PersonAction中要实现增、删、改、查四个方法。

C.    但是在action中方法的入口只有一个execute方法

D.    所以要想完成这样的功能,有一种方法就是在url链接中加参数。

那么在action中的代码可能是这样的:

PatternAction

public class PatternAction extends ActionSupport{

       private String method;

       public String execute(){

              if(method.equals("add")){

                     //增加操作

              }else if(method.equals("update")){

                     //修改操作

              }else if(method.equals("delete")){

                     //删除操作

              }else{

                     //查询操作

              }

              return "";

       }

}

       可以看出这样写结构并不是很好。而通配符的出现解决了这个问题。

Pattern.jsp

访问PersonActionadd方法:<br>

<a href="${pageContext.request.contextPath}/pattern/patternAction.action">测试</a><br>

Struts-pattern.xml

<package name="pattern" namespace="/pattern"

              extends="struts-default">

              <action name="patternAction" method="add"

                     class="cn.itcast.struts2.action.pattern.PatternAction">

              </action>

</package>

PatternAction

public String add(){

              return "add";

}

2) method属性

 

Pattern.jsp

访问PersonActionadd方法:<br>

<a href="${pageContext.request.contextPath}/pattern/patternAction.action">测试</a><br>

Struts-pattern.xml

<package name="pattern" namespace="/pattern"

              extends="struts-default">

              <action name="patternAction" method="add"

                     class="cn.itcast.struts2.action.pattern.PatternAction">

              </action>

</package>

PatternAction

public String add(){

              return "add";

}

 说明:从上述代码可以看出只要配置文件中的method属性的值和方法名称一样就可以了。但是这种写法有弊端。如果aciton中需要5个方法。则在struts的配置文件中需要写5个配置,这样会导致配置文件的篇幅很大。而且重复性也很大

 

3) 动态调用方法

在url中通过action名称!方法名称可以动态调用方法。

Pattern.jsp

动态调用PatternAction中的add方法:<br>

<a

       href="${pageContext.request.contextPath}/pattern/patternAction!add.action">测试</a>

struts-pattern.xml

<action name="patternAction"

       class="cn.itcast.struts2.action.pattern.PatternAction">

</action>

说明:这样的情况在配置文件中不需要method属性

 

4) 通配符映射

需求:a_add.actionb_add.actionc_add.action全部请求PatternActionadd方法

Pattern.jsp

通配符映射实例1:<br>

<a href="${pageContext.request.contextPath}/pattern/a_add.action">测试</a>

<a href="${pageContext.request.contextPath}/pattern/b_add.action">测试</a>

<a href="${pageContext.request.contextPath}/pattern/c_add.action">测试</a>

说明:不管是a_add还是b_add还是c_add的路径都指向PatternActionadd方法。

struts-pattern.xml

<action name="a_add" method="add"

       class="cn.itcast.struts2.action.pattern.PatternAction">

</action>

<action name="b_add" method="add"

       class="cn.itcast.struts2.action.pattern.PatternAction">

</action>

<action name="c_add" method="add"

       class="cn.itcast.struts2.action.pattern.PatternAction">

</action>

上述结构是很差的,经过改进如下:

<action name="*_add" method="add"

       class="cn.itcast.struts2.action.pattern.PatternAction">

(1)、 映射一

请求PersonActionStudentActionadd方法

Pattern.jsp

通配符映射实例2:

<br>

<a

       href="${pageContext.request.contextPath}/pattern/personAction_add.action">请求personActionadd方法</a>

<a

       href="${pageContext.request.contextPath}/pattern/studentAction_add.action">请求studentActionadd方法</a>

(2)、映射二

 

Struts-pattern.xml

<action name="personAction_add" method="add" class="cn.itcast.struts2.action.pattern.PersonAction"></action>

<action name="studentAction_add" method="add" class="cn.itcast.struts2.action.pattern.StudentAction"></action>

改进如下:

<action name=”*_add” method=”add” class=” cn.itcast.struts2.action.pattern.{1}”/>

说明:*{1}是相对应的关系。

 


需求:在TeacherAction中有增、删、改、查的方法。这个时候配置文件怎么写比较简单?

Pattern.jsp

通配符映射实例3:

<a

       href="${pageContext.request.contextPath}/pattern/PersonAction_add.action">请求teacherActionadd方法</a>

<a

       href="${pageContext.request.contextPath}/pattern/StudentAction_update.action">请求teacherActionupdate方法</a>

<a

       href="${pageContext.request.contextPath}/pattern/StudentAction_delete.action">请求teacherActiondelete方法</a>

<a

       href="${pageContext.request.contextPath}/pattern/StudentAction_query.action">请求teacherActionquery方法</a>

struts-pattern.xml

<action name="teacherAction_*" method="{1}"

       class="cn.itcast.struts2.action.pattern.TeacherAction">

</action>

说明:*method的属性值保持一致。

延伸:

<action name="*_*" method="{2}"

       class="cn.itcast.struts2.action.pattern.{1}">

</action>

第一个*匹配{1},第二个*匹配{2}

(3)、映射三

2.指定需要Struts 2处理的请求后缀

前面我们都是默认使用.action后缀访问Action。其实默认后缀是可以通过常量”struts.action.extension“进行修改的,例如:我们可以配置Struts 2只处理以.do为后缀的请求路径:

如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。如:

 <constant name="struts.action.extension" value="do,go"/>

3.细说常量定义

常量可以在struts.xml或struts.properties中配置,建议在struts.xml中配置,两种配置方式如下:

在struts.xml文件中配置常量

<struts>

    <constant name="struts.action.extension" value="do"/>

</struts>

 

在struts.properties中配置常量

struts.action.extension=do

 

因为常量可以在下面多个配置文件中进行定义,所以我们需要了解struts2加载常量的搜索顺序:

struts-default.xml

struts-plugin.xml

struts.xml

struts.properties

web.xml

如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值.

4.常用的常量介绍

<!-- 指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法和freemarker 、velocity的输出 -->

<constant name="struts.i18n.encoding" value="UTF-8"/>

 

    <!-- 该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。

    如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。 -->

<constant name="struts.action.extension" value="do"/>

 

    <!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 -->

<constant name="struts.serve.static.browserCache" value="false"/>

 

    <!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 -->

<constant name="struts.configuration.xml.reload" value="true"/>

 

    <!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->

<constant name="struts.devMode" value="true" />

 

     <!-- 默认的视图主题 -->

<constant name="struts.ui.theme" value="simple" />

 

<!– 与spring集成时,指定由spring负责action对象的创建 -->

<constant name="struts.objectFactory" value="spring" />

 

 <!–该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。 -->

<constant name="struts.enable.DynamicMethodInvocation" value="false"/>

 

 <!--上传文件的大小限制-->

<constant name="struts.multipart.maxSize" value=“10701096"/>

5.Struts2的处理流程

l     StrutsPrepareAndExecuteFilter是Struts 2框架的核心控制器,它负责拦截由<url-pattern>/*</url-pattern>指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。默认情况下,如果用户请求的路径不带后缀或者后缀以.action结尾,这时请求将被转入Struts 2框架处理,否则Struts 2框架将略过该请求的处理。当请求转入Struts 2框架处理时会先经过一系列的拦截器,然后再到Action。与Struts1不同,Struts2对用户的每一次请求都会创建一个Action,所以Struts2中的Action是线程安全的。

6.为应用指定多个struts配置文件

在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。下面的struts.xml通过<include>元素指定多个配置文件:

<struts>

   <include file="struts-user.xml"/>

   <include file="struts-order.xml"/>

</struts>

通过这种方式,我们就可以将Struts 2的Action按模块添加在多个配置文件中。

7.动态方法调用

如果Action中存在多个方法时,我们可以使用!+方法名调用指定方法。如下:

   public String execute() throws Exception{

      this.message = "我的第一个struts2应用";

      return "success";

   } 

   public String other() throws Exception{

      this.message = "第二个方法";

      return "success";

   }

假设访问上面action的URL路径为: /struts/test/helloworld.action;要访问action的other() 方法,我们可以这样调用:/struts/test/helloworld!other.action

如果不想使用动态方法调用,我们可以通过常量struts.enable.DynamicMethodInvocation关闭动态方法调用。

<constant name="struts.enable.DynamicMethodInvocation" value="false"/>

 

0 0
原创粉丝点击