您当前的位置:首页>>编程相关>>正文
 
动态方法、通配符、常量
作者: 来源:chinatlab 日期:2013/7/30 18:08:02  点击次数:

 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

  访问PersonAction的add方法:<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

  访问PersonAction的add方法:<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.action、b_add.action、c_add.action全部请求PatternAction的add方法

  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的路径都指向PatternAction的add方法。

  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)、 映射一

  请求PersonAction和StudentAction的add方法

  Pattern.jsp

  通配符映射实例2:

  <br>

  <a

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

  <a

  href="${pageContext.request.contextPath}/pattern/studentAction_add.action">请求studentAction的add方法</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">请求teacherAction的add方法</a>

  <a

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

  <a

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

  <a

  href="${pageContext.request.contextPath}/pattern/StudentAction_query.action">请求teacherAction的query方法</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"/>

 


上一篇:影响Java EE性能的十大问题
下一篇:没有了
  北京总部: 4006-505-808
  天 津 部: 4006-505-808
  上 海 部: 4006-505-808
  深 圳 部: 4006-505-808
  广 州 部: 4006-505-808
  重 庆 部: 4006-505-808
  南 京 部: 4006-505-808
  其它地区: 4006-505-808
经典案例
中国石油管理局-Oracle数据库恢
中国网通-IBM EXP300磁盘阵列数
大连鸿德经贸有限责任公司-SQL
中国地质环境监测院-HP LH3000
藁城市东街百货-EFS文件解密成
工商银行某省分行-AIX删除LV数
中央电视台新闻评论部-苹果分
promise乔鼎硬盘阵列数据恢复成
麒麟童文化-苹果分区无法打开,
NAS 8100服务器数据恢复成功 
解决方案
raid磁盘阵列OFFLINE后的应急方
磁盘未被格式化,是否格式化数据
误GHOST、误一键恢复灾难应急方
误删除、误格式化数据灾难应急
LINUX FSCK数据出错灾难应急方
北亚数据恢复 - 联系我们 - 关于北亚 - 友情链接 - 网站地图 - RSS聚合 
版权所有 北亚数据恢复中心
全国统一客服热线:4006-505-808
北京总部:北京市海淀区永丰基地丰慧中路7号新材料创业大厦B座205室
"