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>