struts2历史
struts1是全世界第一个发布的MVC框架
在2001年发布
struts2
并不是struts1的升级版
是由WebWork基础上 发展起来的
吸收了Struts 1和WebWork两者的优势
view control model
显示层 控制层 业务层 持久化层
struts2 struts2 spring hibernate
自定义多个过滤器,让自定义的每一个过滤器只完成一个功能或一个需求,然后struts2框架提供的过滤器只需要调用所有自定义的过滤器,这些自定义的过滤器叫做拦截器
过滤器和拦截器的区别:
相同点:
都是起拦截作用
不同点:
使用范围:
过滤器:属于J2EE范围,过滤器所有web工程都可以使用
拦截器:属于struts2框架的,使用拦截器必须在使用struts2框架,拦截器是离不开struts2框架的
完成的功能
过滤器:只完成拦截页面的请求资源
拦截器:其他所有功能都交给拦截器来处理
执行顺序:过滤器---》拦截器
基本配置
############
struts_primer.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>
<!-- /primer/helloWorldAction.action
package:包
* name:包名,唯一的,必选项
* namespace:命名空间,唯一的,相当于房间号。可选项,省略情况下是"/"。页面中请求连接的前半部分
* extends:继承
* extends="struts-default":struts2框架底层提供的核心包struts2-core-2.3.3.jar下的struts-default.xml文件
* 为什么要继承这个struts-default.xml文件?
* 因为struts2框架底层提供的struts-default.xml声明了所有的拦截器和拦截器栈,
知道在struts2框架运行时执行struts-default.xml文件中的拦截器栈。
* 如果不继承struts-default.xml文件,就没有办法使用struts2框架提供的所有拦截器
-->
<package name="primer" namespace="/primer" extends="struts-default">
<!--
如果找不到对应的action名的时候,配置默认要执行的action
* name:指定action的名称
-->
<default-action-ref name="helloWorldAction" />
<!--
action:
* name:对应页面中请求连接的后面半部分
* class:对应要执行的类的完整路径
-->
<action name="helloWorldAction" class="cn.itcast.primer.HelloWorldAction">
<!--
result:结果类型
* name:对应的是执行的类的方法的返回值
public String execute() throws Exception {
System.out.println("HelloWorldAction ************* execute()");
return "success";
}
* 后半部分的文本内容:要转向到的页面
-->
<result name="success">/primer/success.jsp</result>
</action>
<!--
没有为action指定class
* 在struts2框架底层的struts-default.xml文件中,配置了默认执行的类
com.opensymphony.xwork2.ActionSupport
public String execute() throws Exception {
return SUCCESS;
}
* 实际上,默认执行的是底层提供的ActionSupport类的execute()方法
* result结果类型,默认是根据struts2框架底层提供的ActionSupport类的execute()方法返回值,进行跳转
-->
<action name="actionNoClass">
<result name="success">/primer/success.jsp</result>
</action>
</package>
</struts>
######
结果类型
##########
<!--
result-types:声明结果类型
* name:结果类型的名称
* class:结果类型对应类的完整路径
* default:设置其为默认,true是默认
-->
<result-types>
<!-- 转发到action -->
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<!-- 转发到jsp -->
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
<!-- 重定向到jsp -->
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<!-- 重定向到action -->
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<!-- 用于下载 -->
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
</result-types>
<struts>
<package name="resulttype" namespace="/resulttype" extends="struts-default">
<action name="resulttypeAction" class="cn.itcast.resulttype.ResulttypeAction">
<!-- 方法一
默认为转发
* type:指定结果类型,默认为转发"dispatcher"
-->
<!-- <result name="success" type="dispatcher">/resulttype/success.jsp</result> -->
<!-- 方法二 :标准写法 -->
<!-- <result name="success" type="dispatcher">
param:参数
* name:参数的名称为"location"
实际上,是struts2框架底层的StrutsResultSupport类的setLocation()提供的
public void setLocation(String location) {
this.location = location;
}
* 所谓的参数,应该是set方法或者get方法后面跟的名称才是参数名
<param name="location">/resulttype/success.jsp</param>
</result> -->
<!--
重定向到jsp:org.apache.struts2.dispatcher.ServletRedirectResult
-->
<!-- <result name="success" type="redirect">
<param name="location">/resulttype/success.jsp</param>
</result> -->
<!--
重定向到action:org.apache.struts2.dispatcher.ServletActionRedirectResult
* 无论是重定向到jsp还是重定向到action,底层代码都是一样的
-->
<result name="success" type="redirectAction">
<!--
param:
* actionName:指定 “目的地” 动作的名字。指定的是struts.xml文件action标签的name属性的值
* namespace:指定的是struts.xml文件action对应的package下的namespace属性的值
-->
<param name="actionName">helloWorldAction</param>
<param name="namespace">/primer</param>
</result>
</action>
</package>
</struts>
##########
通配符和动态方法
#######################
<?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">
<!-- 配置全局结果类型 -->
<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="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action> -->
<!--
<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>
-->
<!-- <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> -->
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction_add.action"> 图书</a><br>
<a href="${pageContext.request.contextPath}/pattern/UserAction_add.action">用户</a><br>
-->
<!-- <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> -->
<!--
<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>
-->
<!-- <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> -->
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction!add.action">图书添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/BookAction!delete.action">图书删除</a><br>
动态方法调用:
* 页面中请求连接:namespace+actionName+"!"+执行方法名
* 在struts.xml文件中,不用配置method属性,而是通过页面的连接动态执行指定方法
* 动态方法调用,不经常使用。经常使用的是通配符
* 动态方法调用,默认是开启状态
-->
<!-- <action name="BookAction" class="cn.itcast.pattern.BookAction">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action> -->
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction_add.action">图书添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/BookAction_delete.action">图书删除</a><br>
-->
<!-- <action name="*_*" class="cn.itcast.pattern.{1}" method="{2}">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/{1}.jsp</result>
</action> -->
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction_find.action">图书查找</a><br>
-->
<action name="BookAction_find" class="cn.itcast.pattern.BookAction" method="find">
<!--
如果局部结果类型和全局结果类型,同时存在
* 局部结果类型会覆盖了全局的结果类型
局部结果类型和全局结果类型的作用范围:
* 全局结果类型:作用于整个package
* 局部结果类型:作用于某个action
-->
<result name="success">/pattern/success.jsp</result>
</action>
</package>
</struts>
###########################
struts1是全世界第一个发布的MVC框架
在2001年发布
struts2
并不是struts1的升级版
是由WebWork基础上 发展起来的
吸收了Struts 1和WebWork两者的优势
view control model
显示层 控制层 业务层 持久化层
struts2 struts2 spring hibernate
自定义多个过滤器,让自定义的每一个过滤器只完成一个功能或一个需求,然后struts2框架提供的过滤器只需要调用所有自定义的过滤器,这些自定义的过滤器叫做拦截器
过滤器和拦截器的区别:
相同点:
都是起拦截作用
不同点:
使用范围:
过滤器:属于J2EE范围,过滤器所有web工程都可以使用
拦截器:属于struts2框架的,使用拦截器必须在使用struts2框架,拦截器是离不开struts2框架的
完成的功能
过滤器:只完成拦截页面的请求资源
拦截器:其他所有功能都交给拦截器来处理
执行顺序:过滤器---》拦截器
基本配置
############
struts_primer.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>
<!-- /primer/helloWorldAction.action
package:包
* name:包名,唯一的,必选项
* namespace:命名空间,唯一的,相当于房间号。可选项,省略情况下是"/"。页面中请求连接的前半部分
* extends:继承
* extends="struts-default":struts2框架底层提供的核心包struts2-core-2.3.3.jar下的struts-default.xml文件
* 为什么要继承这个struts-default.xml文件?
* 因为struts2框架底层提供的struts-default.xml声明了所有的拦截器和拦截器栈,
知道在struts2框架运行时执行struts-default.xml文件中的拦截器栈。
* 如果不继承struts-default.xml文件,就没有办法使用struts2框架提供的所有拦截器
-->
<package name="primer" namespace="/primer" extends="struts-default">
<!--
如果找不到对应的action名的时候,配置默认要执行的action
* name:指定action的名称
-->
<default-action-ref name="helloWorldAction" />
<!--
action:
* name:对应页面中请求连接的后面半部分
* class:对应要执行的类的完整路径
-->
<action name="helloWorldAction" class="cn.itcast.primer.HelloWorldAction">
<!--
result:结果类型
* name:对应的是执行的类的方法的返回值
public String execute() throws Exception {
System.out.println("HelloWorldAction ************* execute()");
return "success";
}
* 后半部分的文本内容:要转向到的页面
-->
<result name="success">/primer/success.jsp</result>
</action>
<!--
没有为action指定class
* 在struts2框架底层的struts-default.xml文件中,配置了默认执行的类
com.opensymphony.xwork2.ActionSupport
public String execute() throws Exception {
return SUCCESS;
}
* 实际上,默认执行的是底层提供的ActionSupport类的execute()方法
* result结果类型,默认是根据struts2框架底层提供的ActionSupport类的execute()方法返回值,进行跳转
-->
<action name="actionNoClass">
<result name="success">/primer/success.jsp</result>
</action>
</package>
</struts>
######
结果类型
##########
<!--
result-types:声明结果类型
* name:结果类型的名称
* class:结果类型对应类的完整路径
* default:设置其为默认,true是默认
-->
<result-types>
<!-- 转发到action -->
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<!-- 转发到jsp -->
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
<!-- 重定向到jsp -->
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<!-- 重定向到action -->
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<!-- 用于下载 -->
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
</result-types>
<struts>
<package name="resulttype" namespace="/resulttype" extends="struts-default">
<action name="resulttypeAction" class="cn.itcast.resulttype.ResulttypeAction">
<!-- 方法一
默认为转发
* type:指定结果类型,默认为转发"dispatcher"
-->
<!-- <result name="success" type="dispatcher">/resulttype/success.jsp</result> -->
<!-- 方法二 :标准写法 -->
<!-- <result name="success" type="dispatcher">
param:参数
* name:参数的名称为"location"
实际上,是struts2框架底层的StrutsResultSupport类的setLocation()提供的
public void setLocation(String location) {
this.location = location;
}
* 所谓的参数,应该是set方法或者get方法后面跟的名称才是参数名
<param name="location">/resulttype/success.jsp</param>
</result> -->
<!--
重定向到jsp:org.apache.struts2.dispatcher.ServletRedirectResult
-->
<!-- <result name="success" type="redirect">
<param name="location">/resulttype/success.jsp</param>
</result> -->
<!--
重定向到action:org.apache.struts2.dispatcher.ServletActionRedirectResult
* 无论是重定向到jsp还是重定向到action,底层代码都是一样的
-->
<result name="success" type="redirectAction">
<!--
param:
* actionName:指定 “目的地” 动作的名字。指定的是struts.xml文件action标签的name属性的值
* namespace:指定的是struts.xml文件action对应的package下的namespace属性的值
-->
<param name="actionName">helloWorldAction</param>
<param name="namespace">/primer</param>
</result>
</action>
</package>
</struts>
##########
通配符和动态方法
#######################
<?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">
<!-- 配置全局结果类型 -->
<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="add">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action> -->
<!--
<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>
-->
<!-- <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> -->
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction_add.action"> 图书</a><br>
<a href="${pageContext.request.contextPath}/pattern/UserAction_add.action">用户</a><br>
-->
<!-- <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> -->
<!--
<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>
-->
<!-- <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> -->
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction!add.action">图书添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/BookAction!delete.action">图书删除</a><br>
动态方法调用:
* 页面中请求连接:namespace+actionName+"!"+执行方法名
* 在struts.xml文件中,不用配置method属性,而是通过页面的连接动态执行指定方法
* 动态方法调用,不经常使用。经常使用的是通配符
* 动态方法调用,默认是开启状态
-->
<!-- <action name="BookAction" class="cn.itcast.pattern.BookAction">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/BookAction.jsp</result>
</action> -->
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction_add.action">图书添加</a><br>
<a href="${pageContext.request.contextPath}/pattern/BookAction_delete.action">图书删除</a><br>
-->
<!-- <action name="*_*" class="cn.itcast.pattern.{1}" method="{2}">
<result name="success">/pattern/success.jsp</result>
<result name="add">/pattern/{1}.jsp</result>
</action> -->
<!--
<a href="${pageContext.request.contextPath}/pattern/BookAction_find.action">图书查找</a><br>
-->
<action name="BookAction_find" class="cn.itcast.pattern.BookAction" method="find">
<!--
如果局部结果类型和全局结果类型,同时存在
* 局部结果类型会覆盖了全局的结果类型
局部结果类型和全局结果类型的作用范围:
* 全局结果类型:作用于整个package
* 局部结果类型:作用于某个action
-->
<result name="success">/pattern/success.jsp</result>
</action>
</package>
</struts>
###########################
作者:chentaiyan 发表于2013-6-3 21:33:49 原文链接
阅读:0 评论:0 查看评论