配置详解、常量配置、配置进阶、Action的创建方式

struts2.xml配置

package元素:和java中的包不是一个概念,将Action配置封装,就可以在package中配置很多Action

name属性:

给包起名字,起到一个标识的作用,没有特殊的意义,不能与其他的包名重复

namespace属性:

给action的访问路径中定义一个命名空间,方便从URL中区分不同模块下的action

extends属性:

继承指定的包

abstract属性:

报是否为抽象的,标示性属性,于struts2没有任何意义,只是告诉开发者这个包是用来继承的,不能独立运行

action元素:配置action类

name属性:

决定了Action访问的资源名

class属性:

action的完整类名

method属性:

指定调用Action中的哪个方法处理请求

struts2.xml配置

<struts>
    <!-- package: 和java中的包不是一个概念,将Action配置封装,就可以在package中配置很多Action
        name属性: 给包起名字,起到一个标识的作用,没有特殊的意义,不能与其他的包名重复
        namespace属性: 给action的访问路径中定义一个命名空间,方便从URL中区分不同模块下的action
        extends属性: 继承指定的包
        abstract属性: 报是否为抽象的,标示性属性,于struts2没有任何意义,只是告诉开发者这个包是用来继承的,不能独立运行
    -->
    <package name="hello" namespace="/hello" extends="struts-default">
        <!--  action元素: 配置action类
	    name属性:决定了Action访问的资源名
	    class属性: action的完整类名
	    method属性: 指定调用Action中的哪个方法处理请求
	-->
	<action name="helloAction" class="com.jinxin.action.HelloAction" method="hello">
            <!--result元素:结果匹配
	        name属性: 标识结果处理的名称,与Action中的方法的返回值对应
	        type属性: 指定调用哪一个result类来处理结果,默认使用转发
	        标签体: 填写转发页面的相对路径
	    -->
	    <result name="success" type="redirect">/hello.jsp</result>
        </action>
    </package>
</struts>

引入其他的struts配置文件

为了方便模块化管理,应该把struts配置分开,可以利用 <include file="com/jinxin/struts/struts.xml"></include> 在src目录下的struts.xml中引入这些配置文件

<struts> 
    <!-- 引入其他的struts配置文件,方便模块化管理 -->
    <include file="src/com/jinxin/struts/struts.xml"></include>
</struts>

struts2常量配置

struts2默认常量的位置

struts2定义了很多个常量,这些常量可以通过 struts2核心包 --> org.apache.struts2 --> defaults.propertites 找到这些常量

修改struts2常量配置

通过上面的路径可以找到这些常量所在的地方,那么如果想要修改应该怎么做呢?下面提供三种方式,这些方式的介绍顺序也是struts2加载的顺序,其中方式一最为常用,即在struts2.xml中配置是最常用的

下面以修改 struts.i18n.encoding = UTF-8 为例进行说明

方式一(重点)

在struts.xml文件中进行修改,使用 <constant name="struts.i18n.encoding" value="UTF-8"></constant> 修改

方式二(了解)

在src目录下建立struts.properties  然后将想要修改的键值对重新写到这个文件中

struts.i18n.encoding = UTF-8

方式三(了解)

在web.xml文件中修改

<context-param>
    <param-name>struts.i18n.encoding</param-name>
    <param-value>UTF-8</param-value>
</context-param>

常量介绍

struts.i18n.encoding = UTF-8   // 国际化,解决post提交乱码
      
struts.action.extension = action,do,    // 指定访问Action时的后缀名,这里表示接受.action和.do以及没有后缀,多个后缀名用逗号隔开  http://127.0.0.1:8080/hello/helloAction.action

struts.deMode = true        // 指定struts2是否开启开发模式运行
            1. 热加载主配置(更改后不需要重启即可生效)
            2. 提供更多的错误信息输出,方便开发调试

struts2配置进阶

动态方法调用(重点)

在一个Action类中,可以有多个方法,由于在action标签中method属性是写死了的,那么岂不是有多少个方法就得配置多少个action标签?那样当然是可以的,但是这样会增加代码量,而且很麻烦,那么有没有只配置一个action标签就可以匹配上该Action类中的所有方法的方法呢?当然是有的,这就是动态方法,配置动态方法有两种方式,其中第二种方式更为常用

方式一(了解)

将action元素中的method属性去掉,并且配置调用动态方法的常量 struts.enable.DynamicMethodInvocation 开启,在浏览器访问的时候,在该action标签的name属性后面加上叹号和要执行的方法,例如: http://127.0.0.1:8080/hello/helloAction!add.action 就会执行HelloAction的add()方法

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>  <!-- 在此处将调用动态方法的常量开启 -->
    <package name="hello" namespace="/hello" extends="struts-default">
        <action name="helloAction" class="com.jinxin.action.HelloAction">    <!-- 将method属性去掉 -->
            <result name="success">/hello.jsp</result>
        </action>
    </package>   
</struts>

方式二(重点)

在这种方式中不再需要使用常量,只需要将action标签的name属性后面加上*号,将method属性设置成{1}表示匹配第一个*处的内容

比如: http://127.0.0.1:8080/hello/helloAction_add ,此时method属性里面匹配的内容就是add,所以此时调用的方法就是add()方法

既然有{1},那么有没有{2}呢?当然是有的,比如我想把class里面的内容也设置成动态匹配的,那么就可以这样写:

<action name="helloAction_*_*" class="com.jinxin.action.{1}" method="{2}">   // {1}表示匹配第一个*的内容,{2}表示匹配第二个*的内容

具体配置如下

<struts>
    <package name="hello" namespace="/hello" extends="struts-default">
        <action name="helloAction_*" class="com.jinxin.action.HelloAction" method="{1}">
            <result name="success">/hello.jsp</result>
        </action>
    </package>   
</struts>

struts2默认配置(了解)

result标签

method属性:如果没有配置就默认执行execute()方法

name属性:如果没有配置就默认success

type属性:默认dispatcher

class属性:默认com.opensymphony.xwork2.ActionSupport

default-action-ref:放在package里面的首行

如果URL中的Action名无法找到,就默认找Demo2Action

<default-action-ref name="Demo2Action"></default-action-ref>

action创建方式

action创建方式有三种

方式一(不常用)

创建一个类,可以是POJO实体类,使struts2的代码侵入性更低

POJO:不用继承任何父类和实现任何接口

public class HelloAction{
    public String execute(){
        System.out.println("hello world");
        return "success";
    }
}

方式二(不常用)

实现一个Action接口,重写execute()方法
execute()方法提供了action方法的规范,Action接口还预置了一些字符串,可以在返回结果时使用

public class HelloAction implements Action{

    @override
    public String execute(){
        System.out.println("hello world");
        return "success";
    }
}

方式三(常用)

继承一个ActionSupport类,它帮我们实现了很多接口 Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable ,不需要自己来实现了

public class HelloAction extends ActionSupport{
    public String execute(){
        System.out.println("hello world");
        return "success";
    }
}

  

 

posted @ 2018-07-08 21:32  Jin同学  阅读(359)  评论(0)    收藏  举报