Struts2配置文件

一、配置struts2的过滤器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>zjs_bos</display-name>
 
  <!-- 创建struts2的过滤器 -->
  <filter>
      <filter-name>struts2</filter-name>
      <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>

  <!--同时拦截转发数据和请求数据-->

   <dispatcher>REQUEST</dispatcher>
   <dispatcher>FORWARD</dispatcher>
  </filter-mapping>
 
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

二、Struts.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <!-- 开发者模式,在开发者模式中,

  如果jsp发送的请求数据, 在action中没有给提供相应的get和set方法,会报错java.lang.NoSuchFieldException -->

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

  <!-- 配置struts国际化参数,设置编码区默认的编码格式  -->
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>

  <!-- 配置struts国际化参数,设置message.properties路径,文件后缀名可以省略不写 -->
    <constant name="struts.custom.i18n.resources" value="message"></constant>

  (备注,可以在action类中,通过this.getText("usernameOrPasswordError")来获取message.properties文件中usernameOrPasswordError对应的值)

 <!-- 配置package -->

  <!--

  name属性, 理论上可以为任意值, 但是不同的package不能有相同的name属性;

  extends属性, 为固定值struts-default;

  namespace属性, 名称空间, 域action的标签的name属性一起构成action的访问路径

  -->
    <package name="basicstruts2" extends="struts-default" namespace="/">

  <!-- 配置拦截器 -->
        <interceptors>
            <interceptor name="bosLoginInterceptor" class="cn.rodge.bos.web.interceptoer.BOSLoginInterceptor">
                <param name="excludeMethods">login</param>
            </interceptor>
            
            <!-- 声明拦截器栈 -->
            <interceptor-stack name="bos">

      <!--自定义拦截器后, 默认的拦截器就不会执行了, 所以需要手动将默认拦截器栈添加上来-->
                <interceptor-ref name="bosLoginInterceptor"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!-- 将bos定义为默认拦截器栈 -->

  <default-interceptor-ref name="bos"></default-interceptor-ref>

    <!--声明全局结果变量,注意全局结果变量的声明是有顺序的,不能再拦截器前面声明,不然会报错-->
        <global-results>
            <result name="login">/login.jsp</result>
        </global-results>


        <!-- 配置通过action访问jsp的路径
            class不配置的话,默认访问actionsupport(在struts的默认配置文件中有配置)
            method不配置的话,默认访问execute方法
         -->
        <action name="page_*_*">
            <!--   

      result标签中name不配置的话,默认访问SUCCESS对应的

      type属性:dispatcher请求转发(默认)

           redirect重定向

           redirectAction重定向到action中

     -->
            <result type="dispatcher">/WEB-INF/pages/{1}/{2}.jsp</result>
        </action>
        
        <!-- 配置UserAction -->
        <action name="user_*" class="userAction" method="{1}">
            <result name="home">/WEB-INF/pages/common/index.jsp</result>
            <result name="login">/login.jsp</result>
        </action>
    </package>
</struts>

三、struts2中Action类的编写域访问

3.2Action类创建的三种方式

3.1.1 直接编写一个java类,命名为***Action, 当然命名没有规定

  创建一个类,不继承任何类,也不实现任何借口,在struts.xml中配置该Java类

  public class UserAction {

    ......

  }

3.1.2 实现Action接口

  可以实现Action接口, 在Action接口中有一些常量,如SUCCESS, NONE等可供用户使用, 在配置文件中result没有指定name时,默认是success

  public class UserAction implements Action {

    ......

  }

3.1.3继承ActionSupport类(一般推荐使用该方法)

  而Actionsupport这个工具类在实现了Action接口的基础上还定义了一个validate()方法,重写该方法,它会在execute()方法之前执行,如校验失败,会转入input处,必须在配置该 Action时配置input属性。 另外,Actionsupport还提供了一个getText(String key)方法还实现国际化,该方法从资源文件上获取国际化信息. 这样在自定义标签时可以定义一个变量为new actionsupport对象实现国际化。

  ActionSupport类的作用: 
    struts2不要求我们自己设计的action类继承任何的struts基类或struts接口,但是我们为了方便实现我们自己的action,大多数情况下都会继承ActionSupport类,并重写此类里的public String execute() throws Exception方法。因为此类中实现了很多的实用借口,提供了很多默认方法,这些默认方法包括国际化信息的方法、默认的处理用户请求的方法等,这样可以大大的简化Acion的开发。

  public class UserAction extends ActionSupport {

    .....

  }

3.2Action类中方法访问的三种方式

3.2.1通过在Action标签中配置method属性来实现

缺点: 每写一个方法都需要配置一个action标签, 当方法较多时, 配置比较繁琐

  <action name="userAdd" class="cn.rodge.action.UserAction" method="add">
            <result name="list">/jsp/common/userList.jsp</result>
        </action>

3.2.2使用通配符*方法进行配置(常用)

在action标签的name属性中, 使用*代替具体的方法名, 在method属性同中国{1}、{2}、{3}。。。来获取name标签中第一个、第二个、第三个。。。*号代表的值

  <action name="user_*" class="userAction" method="{1}">
           <result name="list">/jsp/common/userList.jsp</result>
        </action>

访问路径写法:http://localhost:8080/OA_pro/user_add.action

3.2.3使用动态访问的方式

1> 开启常量

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

2> 创建action, 创建多个方法

 <package name="demo4" extends="struts-default" namespace="/">
        <action name="user" class="com.rodge.struts2.demo.UserAction"></action>
    </package>

3> 配置action, 在action标签中配置name和class属性

4> 访问方式

http://localhost:8080/OA_pro/user!add.action

Action类与Servlet的区别

  1.Action是多实例的, 每次访问都会创建一个新的Action对象, 当返回结果调用return时action被销毁; 而Servlet是单实例的, 默认只在第一次访问时创建

  2.Servlet中, 成员变量存在线程安全的问题

原文地址:https://www.cnblogs.com/rodge-run/p/6418092.html