Struts2 - 02 配置文件及常见标签

/**

本博客由马瘦风整理并发布,创作不易,转载请注明出处:

 
 

http://blog.csdn.net/ma_shou_feng

*/

1 Struts2的配置文件

1.1 六种配置文件

 
  

Struts2提供了两种配置的方式:

1) key=value的方式,即使用.properties文件;

2) xml文件配置方式. -- 使用xml文件(它能描述层级关系)

 
  

加载顺序

配置文件名

所在位置

说明

1

default.properties

struts2-core-2.3.15.3.jar\org\apache\struts2

用于配置Struts常量.

不能修改

2

struts-default.xml

struts2-core-2.3.15.3.jar

Struts提供的默认核心配置文件,struts大部分功能都在此配置文件中.不能修改

3

struts-plugin.xml

Struts2提供的插件包中

struts插件核心配置文件, struts整合其他框架或工具.

不能修改

4

struts.xml

应用中

用户自定义核心配置文件.

可以修改(推荐)

5

struts.properties

应用中

用于自定义struts常量配置文件.一般不使用.可以修改

6

web.xml

应用中

配置过滤器参数等,也可配置struts常量.可以修改(不推荐)

 
  

注意:如果配置常量,则存在优先级之分,编号越大优先级越高--即以优先级高的为准.

 
 

1.2 配置文件的加载

1.2.1 加载时机

 
  

服务器启动时, Struts2的配置文件被依次加载.

 
 

1.2.2 加载顺序

 
  

查看核心控制器StrutsPrepareAndExecuteFilter:

 
  

[1] init_DefaultProperties();    --default.properties

 
  

[2][3] init_TraditionalXmlConfigurations();

 
  

--struts-default.xml,struts-plugin.xml

 
  

[4] init_LegacyStrutsProperties();    --struts.properties

 
  

[5] init_CustomConfigurationProviders(); --struts.xml

 
  

[6] init_FilterInitParameters(); --web.xml中的参数

 
  

多个配置文件中若有相同的参数,则后面的配置值会覆盖前面的配置值--后面的优先级更高.

 
 

1.3 Struts2中的常量

 
  

* 常量定义在default.properties配置文件中,体现形式都是key=value.

* 所有的Struts2应用都会用到这些常量.

常量名

常量默认值

说明

struts.configuration

org.apache.struts2.config.

DefaultConfiguration

指定加载Struts2配置文件的配置文件管理器,默认值是Struts2中的默认配置文件管理器,如果需要实现自己的配置管理器可实现 Configuration接口

struts.locale

en_US

指定 web 应用的默认本地环境Locale

struts.i18n.encoding

UTF-8

指定 web 应用的默认编码集.如果设置为 GBK,控制端还需用HttpServletRequest.setCharacterEncoding()设置字符集

struts.objectFactory

spring

指定Struts2 默认的 ObjectFactory Bean,默认注释掉了

struts.objectFactory.

spring.autoWire

name

指定Spring 框架的自动装箱模式.默认根据Bean的name属性自动装配.(默认被注释掉了)

struts.objectFactory.spring.

useClassCache

true

指定整合Spring框架是是否缓存Bean实例.不建议修改此值.

struts.objectFactory.spring.

autoWire.alwaysRespect

false

Spring 的装箱策略,不建议修改

struts.objectTypeDeterminer

tiger

指定Struts2的类型检测机制,通常支持tiger和notiger 两个属性值

struts.multipart.parser

jakarta

指定处理MIME-type multipart/form-data(文件上传)请求框架.

支持 cos,pell,jakarta.Struts2中已经导入jakarta的Jar包.

struts.multipart.saveDir=

Javax.servlet.context.tempdir

设置Strut2上传的文件的临时保存路径

struts.multipart.maxSize

2097152

设置Struts2 上传文件的最大字节数(2M)

struts.custom.properties

application,

org/apache/struts2/extension/custom

指定Struts2加载用户自定义的属性文件,自定义文件不会覆盖 struts.properties文件中指定的属性值,加载多个属性文件时在文件名间用','分割.

struts.mapper.class

org.apache.struts2.dispatcher.mapper.

DefaultActionMapper

指定将HTTP请求映射到指定的Action的映射器.映射器根据请求的前缀与Action 的name属性相映射.

struts.action.extension

action,,

指定action请求路径的扩展名,默认值为 action或空,即所有*.action 或没有扩展名的请求都由Strut2 处理.

要指定多个请求后缀,需要用','分割

struts.serve.static

true

该属性设置是否通过 jar 文件提供静态内容服务,该属性只支持 true 或 false 两个值,默认为 true

struts.serve.static.browserCache

true

该属性设置浏览器是否缓存静态内容,当应用处于开发阶段,我们希望每次请求都获得服务器的最新响应,则可设置该属性为 false.

struts.enable.

DynamicMethodInvocation

false

设置Struts2 是否支持动态方法调用

struts.enable.

SlashesInActionNames

false

该属性设置 struts2是否允许在 Action 名中使用斜线,该属性的默认值是 false,如果想和 struts1 的path 中用斜线命名,可以把该属性设置为 true.

struts.tag.altSyntax

true

该属性指定是否允许在 struts2标签中使用表达式语法,开发中通常需要在标签中使用表达式语法,默认值是 true 可以使用.

struts.devMode

false

设置Struts2 应用是否使用开发模式.开发模式:改了配置文件,不需要重启.输出更多的错误信息.建议开发时设置为true,产品阶段设置为 false.

struts.i18n.reload

false

设置HTTP 请求到达时,系统是否重新加载国际化资源文件,建议开发时设置为true,保证资源为最新,产品阶段设置为 false.

struts.ui.theme

xhtml

设置Struts2的视图标签默认的视图主题.取值:simple.开发中常用simple.xhtml

struts.ui.templateDir

template

指定视图主题所需要的模板文件的位置

 
  

 
 

1.3.1 在struts.xml中覆盖常量

 
  

* 使用<constantname="" value=""></constant>元素进行覆盖

<struts>
   <!-- 把扩展名.action或无拓展名,改为只能是.do -->
   <constant name="struts.action.extention" value="do"></constant>
   <package name="hello" extends="struts-default">
       <!-- name:对应请求的地址,注意:没有后缀(与页面上是否写了后缀没有关系)
            class:为该名称指定其动作类
            method:动作类中对应的hello要执行的方法
       -->
       <action name="hello" class="com.healchow.action.HelloAction" method="sayHello">
            <!-- 配置结果视图 -->
            <result name="success" type="dispatcher">/success.jsp</result>
       </action>
   </package>
</struts>
 
 

1.3.2 创建struts.properties文件覆盖常量

 
  

* 在应用的构建路径(src目录)下创建一个struts.properties的文件:

#设置为开发模式 struts.devMode=true

#设置请求资源的URI扩展名 struts.action.extention=do

 
 

1.3.3 在web.xml中配置过滤器参数

 
  

<!-- Struts2的核心控制器:过滤器-->
<filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  <!-- 配置过滤器参数-->
  <init-param>
       <param-name>struts.action.extention</param-name>
       <param-value>dodo</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
 
 

1.4 struts.xml中的标签

1.4.1 constant标签

 
  

* 作用:用于配置struts常量

 
  

* 属性:

 
   

name:struts提供固定常量名称(从 default.properties文件获得);

 
   

value:常量值

 
    

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

 
 

1.4.2 package标签

 
  

* 作用:在struts2的配置文件中引入了面向对象思想,使用了分包管理.易于管理动作类.便于模块化开发动作类.

 
  

* 属性:

 
   

name:包的名称.必须写.且必须唯一.

extends:一般需要继承struts-default包,但不是必须的.(如果不继承,将无法使用struts2提供的核心功能)

 
    

--struts-default.xml中定义struts-default这个包.

--struts-default.xml在struts.xml加载之前加载.

 
   

abstract:把包声明为抽象包-->用来被继承.没有<action>元素的包,就可声明为抽象包.

namespace:名称空间,作用是把访问的 URL 按照模块化来管理.

 
    

名称空间 + 动作名称 = 访问路径

名称空间的写法:

* 必须以/开头;

* 后面可以是字母和数组的组合,也可只有字母;

* 如果有数字,数字不能作为/后面的第一个字符.

指定名称空间后,访问的URL = 名称空间 + action标签的name属性值如:

/customer/addCustomer.action

/customer/updateCustomer.action

/linkman/findAllLinkMan.action

/linkman/removeLinkMan.action

名称空间的默认值是:""(struts2官方文档中提供的)

<struts>
   <package name="myDefault" extends="struts-default" abstract="true"> 
      <!-- 此处就可以定义公共配置,该公共配置应该是当前应用中的公共配置 -->
   </package>
   <!-- 把扩展名.action或无拓展名,改为只能是.do-->
   <constant name="struts.action.extention" value="do"></constant>
   <package name="hello" extends="myDefault" namespace="customer">
      <!-- name:对应请求的地址,注意:没有后缀(与页面上是否写了后缀没有关系) 
           class:为该名称指定其动作类
           method:动作类中对应的hello要执行的方法
      -->
      <action name="hello" class="com.healchow.action.HelloAction" method="sayHello">
           <!-- 配置结果视图 -->
           <result name="success" type="dispatcher">/success.jsp</result>
      </action>
   </package>
</struts>
 
  

⭐️ Action类的访问搜索顺序: 

默认访问一个action(package.namespace= /a/b/c)时的Url搜索顺序:

 
   

* 优先从"/a/b/c" 对应的namespace获得相应的aciton,

* 如果没有获得,将从"/a/b"中获得;

* 如果没有获得,将从"/a"中获得;

* 如果没有获得,将从"/"中获得;

* 如果没有获得,将从""中获得.

 
 

1.4.3 action标签

 
  

* 作用:配置Action类(请求处理类)

 
  

* 属性:

 
   

name:指定动作名称,和页面中url后的名称保持一致.

 
    

--此处不能有后缀;

--动作名称必须唯一.

 
   

class:动作类的全限定名.

 
    

--默认的动作类:com.opensymphony.xwork2.ActionSupport(在struts-default.xml中定义)

替换默认动作类:在应用的struts.xml中,package标签中加入:

<default-class-refclass="自己的类名"></default-class-ref>

 
   

method:动作类中的方法名称.默认是execute(),故可不指定method属性.

 
   

* 动作方法的要求:

 
   

a) 必须是 public 的;

 
   

b) 必须是非静态的;

 
   

c) 返回值必须是 String(若没有返回值,则 return "none");

 
   

d) 方法名称自定义;

 
   

e) 没有参数;

 
   

f) 需要 throw Exception;

 
 

1.4.4 其他标签

 
  

* <interceptors>: 用于注册拦截器.

* <interceptor-stack>:拦截器栈,将已注册的拦截器组合在一起,形成一个栈.

 
   

如: 声明一个拦截器栈,名称是:defaultStack

<interceptor-stackname="defaultStack">

* <default-interceptor-ref>: 确定默认的拦截器

如:将“defaultStack”拦截器栈,声明默认拦截器栈

<default-interceptor-refname="defaultStack"/>

* <default-action-ref>: 指定如果访问的action不存在,默认执行的aciton.

如:/a/b/c/d/oneAction 此aciton没有配置,默认情况下显示找不到action;

配置了<default-action-ref>,存在404时,不显示错误,直接跳转到此默认action.

* <default-class-ref>: 配置默认的action实现类

<default-class-refclass="com.opensymphony.xwork2.ActionSupport" />

如果配置文件中没有声明class属性,则<actionname="">将执行ActionSupport类.

 
 

2 动作类的创建与访问

2.1 动作类的创建

2.1.1 方式一:无侵入式创建

 
  

动作类就是一个POJO(Plain Old Java Object,原始的普通的Java对象),非常简单的JavaBean(可重用组件).

Struts2 -01 入门与环境搭建 中的入门案例.

 
 

2.1.2 方式二:动作类实现Action接口

 
  

接口的全限定名为:com.opensymphony.xwork2.Action(使用较少)

/**
* 动作类的第二种创建方式:
* 实现 Action 接口--提供了5个字符串常量用于标识返回的映射字符串
*/
public class HelloAction implements Action{
   @Override
   public String execute() throws Exception { 
      System.out.println("HelloAction的execute 方法执行了....."); 
      return ERROR;  //返回的常量
   }
}
 
  

* 常量:供动作方法返回值使用--使应用规范和统一.

 
  

常量变量名

对应的值

常量说明

SUCCESS

success

动作方法执行一切OK

ERROR

error

动作方法执行时遇到了异常

INPUT

input

回显(表示用户输入错误)

LOGIN

login

一般转向登陆页面(表示需要登录权限)

NONE

none

没有返回值,即不转向任何的视图

常用语Ajax操作,使用response发送数据

 
 

2.1.3 方式三:动作类继承ActionSuppoer(Action的实现类)

 
  

类的全限定名为:com.opensymphony.xwork2.ActionSupport(推荐使用),此类已默认实现多个接口,支持验证框架,国际化,数据序列化等:

public class HelloAction extends ActionSupport{}
//不用配置method
<action name="hello" class="com.healchow.action.HelloAction">
    <result name="success" type="dispatcher">/success.jsp</result>
</action>
//默认动作类:ActionSupport 类
//在struts-default.xml中设置了,默认的动作类是 ActionSupport
//如果实现该类的 execute 方法,则可不用指定 class 和method 属性
<action name="defaultAction">
    <result name="success" type="dispatcher">/success.jsp</result>
</action>
 
 

2.2 Action的访问方式

2.2.1 原始全匹配配置

 
  

<package name="user" extends="struts-default" namespace="/user" >
   <action name="addUser" class="com.healchow.action.UserAction" method="addUser">
       <result name="success">/success.jsp</result>
   </action>
   <action name="updateUser" class="com.healchow.action.UserAction" method="updateUser">
       <result name="success">/success.jsp</result>
   </action>
   <action name="deleteUser" class="com.healchow.action.UserAction" method="deleteUser">
       <result name="success">/success.jsp</result>
   </action>
   <action name="findUser" class="com.healchow.action.UserAction" method="findUser">
       <result name="success">/success.jsp</result>
   </action>
</package>
 
  

* 页面访问方式:

<a href="${pageContext.request.contextPath}/addUser.action">添加用户</a>
<a href="${pageContext.request.contextPath}/updateUser.action">修改用户</a>
<a href="${pageContext.request.contextPath}/deleteUser.action">删除用户</a>
<a href="${pageContext.request.contextPath}/findUser.action">查询用户</a>

 
  

* Action类中的方法:

public class UserAction extends ActionSupport {
   public String addUser(){ 
      System.out.println("添加了用户");
      return SUCCESS; 
   }

   public String updateUser(){ 
      System.out.println("更新了用户"); 
      return SUCCESS;
   }

   public String deleteUser(){
      System.out.println("删除了用户");
      return SUCCESS; 
   }

   public String findUser(){ 
      System.out.println("查询了用户");
      return SUCCESS;
   }
}
 
 

2.2.2 单一通配符

 
  

* action.name可使用通配符(*)替换动作名称,在action.class、aciton.method、result.name 处使用{n}方式匹配星号.

<package name="user" extends="struts-default">
   <!-- {1}代表第一个*的内容-->
   <action name="*" class="com.healchow.action.UserAction" method="{1}">
      <result name="success">/success.jsp</result>
   </action>
</package>
 
  

* 页面访问方式和 Action 类中的方法不变

 
 

2.2.3 多个通配符组合使用

 
  
<package name="user" extends="struts-default">
   <!--
       {1}代表下划线左边的*的内容 
       {2}代表下划线右边的*的内容
   -->
   <action name="*_*" class="com.healchow.action.{2}Action" method="{1}{2}">
       <result name="success">/success.jsp</result>
   </action>
</package>

 
  

* 页面访问方式:

<a href="${pageContext.request.contextPath}/add_User.action">添加用户</a>
<a href="${pageContext.request.contextPath}/update_User.action">修改用户</a>
<a href="${pageContext.request.contextPath}/delete_User.action">删除用户</a>
<a href="${pageContext.request.contextPath}/find_User.action">查询用户</a>
* Action类中的方法不变

* 优先级:(单一)绝对匹配优先.使用通配符要按照配置文件中的先后顺序进行匹配.

* 案例:

userAction_*_*	{1} 匹配第一颗星;{2}匹配第二颗星
请求路径 /userAction_add_success
<action name="userAction_*_*" method="{1}">
    <resutl name="{2}">xxx</result>
</action>
{1}匹配add方法,{2}匹配返回值的名称success

*_*_* 采用多个分别描述不同的内容,通过{1}{2}{3}获得
请求路径 /UserAction_add_success
<action name="*_*_*"  class="com.healchow.action.{1}" method="{2}">
    <result name="{3}">/pages/{3}.jsp</result>
</action>

2.2.4 动态方法调用(使用较少)

<!-- 开启动态方法调用 -->
<constantname="struts.enable.DynamicMethodInvocation"value="true"></constant>
<package name="user" extends="struts-default">
    <action name="user" class="com.healchow.action.UserAction"> 
       <result name="success">/success.jsp</result>
    </action>
</package>

* 页面访问方式:

<%--  动态方法调用:动作名称!动作方法名称--%>
<a href="${pageContext.request.contextPath}/user!addUser.action">添加用户</a>
<a href="${pageContext.request.contextPath}/user!updateUser.action">修改用户</a>
<a href="${pageContext.request.contextPath}/user!deleteUser.action">删除用户</a>
<a href="${pageContext.request.contextPath}/user!findUser.action">查询用户</a> 

* Action 类中的方法不变.

猜你喜欢

转载自blog.csdn.net/ma_shou_feng/article/details/78837972
今日推荐