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>
    <!-- constant:配置常量
         *name:指定的是struts2框架底层提供的default.properties资源文件中配置的常量 
         *value:指定的是配置常量的值
         *struts.xml文件中,配置的常量的值会覆盖底层提供的default.properties资源文件中配置的常量的值 
        配置struts2框架中请求连接的后缀名,如果是指定多个的话,用逗号隔开 如果在struts.xml中和struts.properties资源文件中同时进行配置,struts.properties的配置起作用 
        * 因为常量可以在多个配置文件中进行定义,所以我们需要了解下struts2加载常量的搜索顺序: 
        1 struts-default.xml
        2 struts-plugin.xml 
        3 struts.xml 
        4 struts.properties(自己创建) 
        5 web.xml -->
    <!-- -->
    <!-- <constant name="struts.action.extension" value="do,love"></constant> -->
    <!-- 配置国际化资源文件修改时,是否重新加载。默认是false,为不加载。true为加载 -->
    <!-- <constant name="struts.i18n.reload" value="true"></constant> -->
    <!-- 配置struts2框架的配置文件修改时,是否重新加载,默认是false为不加载,true是加载 -->
    <!-- <constant name="struts.configuration.xml.reload" value="true"></constant> -->
    <!-- 配置struts2框架的模式 *默认是false,是生产模式 *true是开发模式,需要更多的调试信息 ### includes: ### 
        - struts.i18n.reload = true ### - struts.configuration.xml.reload = true -->
    <constant name="struts.devMode" value="true"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    <!-- 引入自定义配置文件 -->
    <include file="cn/itcast/primer/struts_primer.xml"></include>
    <include file="cn/itcast/resulttype/struts_resulttype.xml"></include>
    <include file="cn/itcast/pattern/struts_pattern.xml"></include>
</struts>


局部xml:struts_pattern.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>
    <package name="pattern" namespace="/pattern" extends="struts-default">
        
        
         <default-action-ref name="bookAction"></default-action-ref>
            <!-- 全局结果类型 -->
         <global-results>
            <result name="success">/pattern/successGlobal.jsp</result>
        </global-results>  
        <!-- 
             *struts2框架默认执行action类中的execute方法
            *在action标签里的method属性:指定的是要执行的action类中的那个方法
        
         -->
        <!-- <action name="bookAction" class="cn.itcast.pattern.BookAction" method="execute">
            <result name="success">
                /pattern/success.jsp    
            </result>
            <result name="add">
                /pattern/BookAction.jsp
            </result>
        </action> -->
        <!--  <action name="a_add" class="cn.itcast.pattern.BookAction" method="add" >
            <result name="success">
                /pattern/success.jsp    
            </result>
            <result name="add">
                /pattern/BookAction.jsp
            </result>
        </action>
        <action name="b_add" class="cn.itcast.pattern.BookAction" method="add" >
            <result name="success">
                /pattern/success.jsp    
            </result>
            <result name="add">
                /pattern/BookAction.jsp
            </result>
        </action>
        <action name="c_add" class="cn.itcast.pattern.BookAction" method="add" >
            <result name="success">
                /pattern/success.jsp    
            </result>
            <result name="add">
                /pattern/BookAction.jsp
            </result>
        </action>-->
        
        <!-- 以上配置可以改写如下: -->
        <!-- '*'就是通配符,匹配的是不一样的内容 -->
            <!-- <action name="*_add" class="cn.itcast.pattern.BookAction" method="add" >
            <result name="success">
                /pattern/success.jsp    
            </result>
            <result name="add">
                /pattern/BookAction.jsp
            </result>
            </action> -->
        
         <!--<action name="BookAction_add" class="cn.itcast.pattern.BookAction" method="add">
            <result name="success">/pattern/success.jsp</result>
            <result name="add">/pattern/BookAction.jsp</result>
        </action>
        <action name="UserAction_add" class="cn.itcast.pattern.UserAction" method="add">
            <result name="success">/pattern/success.jsp</result>
            <result name="add">/pattern/UserAction.jsp</result>
        </action> -->
        <!-- 以上配置可以改写如下: -->
        <!-- {1}表示的是匹配"*"通配符的第一个字串 -->
        <!--  <action name="*_add" class="cn.itcast.pattern.{1}" method="add">
            <result name="success">/pattern/success.jsp</result>
            <result name="add">/pattern/{1}.jsp</result>
        </action>     --> 
        
        <!--  <action name="BookAction_add" class="cn.itcast.pattern.BookAction" method="add">
            <result name="add">/pattern/BookAction.jsp</result>
        </action>
        <action name="BookAction_delete" class="cn.itcast.pattern.BookAction" method="delete">
            <result name="success">/pattern/success.jsp</result>
        </action>
        <action name="UserAction_add" class="cn.itcast.pattern.UserAction" method="add">
            <result name="add">/pattern/UserAction.jsp</result>
        </action>
        <action name="UserAction_delete" class="cn.itcast.pattern.UserAction" method="delete">
            <result name="success">/pattern/success.jsp</result>
        </action>  -->
        <!-- 以上配置可以改写如下: -->
        <!-- {2}匹配就是"*" 通配符的第二个字串 -->
        <!-- {0}匹配的就是"*" 通配符的整个串 -->
         <!--  <action name="*_*" class="cn.itcast.pattern.{1}" method="{2}">
            <result name="success">/pattern/success.jsp</result>
            <result name="add">/pattern/{1}.jsp</result>
        </action>-->
        
        <!-- 
        动态方法调用:
            *页面中请求连接:namespace+actionName+"!"+执行方法名
            *在struts.xml文件中,不用配置method属性,而是通过页面的连接动态执行指定方法
             *动态方法调用,不经常使用.经常使用的是通配符
             *动态方法调用,需要开启,默认是关闭状态(下面是开启的语句,卸载struts.xml)
             <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
             
         -->
        
        <!-- <action name="BookAction" class="cn.itcast.pattern.BookAction">
            <result name="success">/pattern/success.jsp</result>
            <result name="add">/pattern/BookAction.jsp</result>
        </action> 
          -->
        
        
         <action name="*_*" class="cn.itcast.pattern.{1}" method="{2}">
         <result name="success">/pattern/success.jsp</result>
            <result name="add">/pattern/{1}.jsp</result>
         </action>
        
        <action name="BookAction_find" class="cn.itcast.pattern.BookAction" method="find">
            <!-- 
                如果局部结果类型和全局结果类型,同事存在,局部结果类型会覆盖了全局的结果类型
                
                局部结果类型和全局结果类型的作用范围,
                    *全局结果类型:作用于整个package
                    *局部结果类型:作用于某个action
                
             -->
            
            <!-- <result name="success">/pattern/success.jsp</result> -->
        </action>
        
        
    </package>
</struts>

BookAction.java

package cn.itcast.pattern;
import com.opensymphony.xwork2.ActionSupport;
public class BookAction extends ActionSupport {
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("BookAction ******** execute()");
        return "success";
    }
    
    /*
     * 在struts2框架中action是多实例的比单实例安全,单实例慢线程不安全
     */
    
    public BookAction(){
        System.out.println("BookAction 的构造方法");
    }
    
    /*
     * 自定义方法:
     *         *:由public来修饰
     *         *:必须是String返回类型
     *         *:不能传参数
     *         *:方法名自定义
     * *总之,一句话:除了方法名与execute()不一样,其他所有内容都一样
     * 
     * 
     * 
     * 
     */
    
    
    public String add() {
        System.out.println("BookAction ********** add()");
        return "add";
    }
    
    public String delete() {
        System.out.println("BookAction ********** delete()");
        return "success";
    }
    
    public String find() {
        System.out.println("BookAction ********** find()");
        return "success";
    }
}

UserAction.java

package cn.itcast.pattern;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("UserAction ******** execute()");
        return "success";
    }
    
    /*
     * 自定义方法:
     *         *:由public来修饰
     *         *:必须是String返回类型
     *         *:不能传参数
     *         *:方法名自定义
     * *总之,一句话:除了方法名与execute()不一样,其他所有内容都一样
     * 
     * 
     * 
     * 
     */
    
    
    public String add() {
        System.out.println("UserAction ********** add()");
        return "add";
    }
    public String delete() {
        System.out.println("UserAction ********** delete()");
        return "success";
    }
}

test.jsp

<%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags"   prefix="s"%>
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
    </head>
  <body>
     访问BookAction_add 测试action标签中的method属性<br> 
    <a href="${pageContext.request.contextPath}/pattern/bookAction.action"> 测试</a><br>
    <br> 
    <br>
    
     
     通配符映射示例(1):<br>
    <a href="${pageContext.request.contextPath}/pattern/a_add.action"> 通配符映射示例(1)</a><br>
    <a href="${pageContext.request.contextPath}/pattern/b_add.action"> 通配符映射示例(1)</a><br>
    <a href="${pageContext.request.contextPath}/pattern/c_add.action"> 通配符映射示例(1)</a><br>
    <br> 
    <br>
    <br>
    
     通配符映射示例(2):<br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction_add.action"> 图书</a><br>
    <a href="${pageContext.request.contextPath}/pattern/UserAction_add.action">用户</a><br>
     <br>
     <br>
     
     通配符映射示例(3):<br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction_add.action">图书添加</a><br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction_delete.action">图书删除</a><br>
     <br>
     <br>
    <a href="${pageContext.request.contextPath}/pattern/UserAction_add.action">用户添加</a><br>
    <a href="${pageContext.request.contextPath}/pattern/UserAction_delete.action">用户删除</a><br>
    <br>
     <br>
   
   
     动态方法调用!形式:<br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction!add.action">图书添加</a><br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction!delete.action">图书删除</a><br>
   
   
     <br><br>
     使用通配符定义action<br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction_add.action">图书添加</a><br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction_delete.action">图书删除</a><br>
    
     <br><br>
     测试全局和局部的action<br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction_find.action">图书查找</a><br>
 
  </body>
</html>