Struts2是一个MVC框架!
框架的作用是让我们操作更爽!更优雅!
比如更加优雅的url配置,更简洁的获取表单数据,更爽快的方法级别的细粒度控制。。。。
一。Struts2工程步骤:
1.建立一个web工程,取名mystruts2,在web.xml中配置过滤器:
<
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>
</filter-mapping >
|
2.导入相关包
3.源码根目录下的struts.xml:
解决struts.xml没有提示:
preference->搜索xml-> xml Catalog ->add 选择dtd文件的位置,key值为从xml文件copy!
<?
xml
version= "1.0" encoding ="UTF-8" ?>
<!
DOCTYPE
struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<
struts
>
<
package
name="user" namespace="/" extends="struts-default" >
<action name= "userAction" method ="add"
class= "com.oterman.struts.bean.UserAction" >
<result name= "index">index.jsp </result>
</action>
</
package
>
</
struts
>
|
4.新建一个action:UserAction,该action就是上面配置的action,里面有一个add方法,返回"index"
5.访问:localhost/mystruts2/userAction.action,既可以看到jsp页面!
extends 机制:
<package name="user" namespace="/aa" extends="struts-default">
<action name="userAction" method="add" class="cn.itheima03.struts2.action.UserAction">
<result name="index">index.jsp</result>
</action>
</package>
<package name="aa" namespace="/bb" extends="user"></package>
说明:
1、struts2配置文件中的包具有继承机制
2、name为aa的包已经把name为user的包的所有的内容继承过来了
3、访问命名空间为bb的userAction也行
4、因为在struts-default.xml文件中拥有struts2运行时的所有的内容,所以必须继承过来才能使用struts2
5、所以一个配置文件中的package必须继承struts-default.xml文件
6、在struts-default.xml文件中,定义了一些结果集,这些结果集是struts2运行的关键
<result-types>
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<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"/>
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<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>
<action name="userAction" method="add" class="cn.itheima03.struts2.action.UserAction">
<result name="index">index.jsp</result>
</action>
</package>
<package name="aa" namespace="/bb" extends="user"></package>
说明:
1、struts2配置文件中的包具有继承机制
2、name为aa的包已经把name为user的包的所有的内容继承过来了
3、访问命名空间为bb的userAction也行
4、因为在struts-default.xml文件中拥有struts2运行时的所有的内容,所以必须继承过来才能使用struts2
5、所以一个配置文件中的package必须继承struts-default.xml文件
6、在struts-default.xml文件中,定义了一些结果集,这些结果集是struts2运行的关键
<result-types>
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<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"/>
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<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>
如果namespace配置为/aa,那么/aa/uaseAction.action能正常访问action,但是结果集访问不到,需要将结果集放于webroot/aa/index.jsp;
/aa/bb/userAction.action,能访问到action,因为本级查找不到会往上一级查找,但是最多查找到/aa这一级!
action 的三种写法:
1、简单的一个javabean
2、让一个action 实现接口Action
public class ExecutionAction implements Action{
execute(){
}
}
在配置文件中
<action name="executeAction" class="cn.itheima03.struts2.action.ExecuteAction">
这里不需要写method属性,默认执行execute方法
3、让一个action类继承actionSupport
public class ActionSupport implements Action, Validateable, ValidationAware
说明:在ActionSupport类中做了很多的操作,比如:验证器、国际化等。程序员只要重写execute方法即可
4、在struts的配置文件中,在写action元素的时候,可以不写class属性
<action name="defaultAction">
<result name="success">index.jsp</result>
</action>
根据struts-default.xml
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
如果没有class属性,则struts2会去查找ActionSupport
2、让一个action 实现接口Action
public class ExecutionAction implements Action{
execute(){
}
}
在配置文件中
<action name="executeAction" class="cn.itheima03.struts2.action.ExecuteAction">
这里不需要写method属性,默认执行execute方法
3、让一个action类继承actionSupport
public class ActionSupport implements Action, Validateable, ValidationAware
说明:在ActionSupport类中做了很多的操作,比如:验证器、国际化等。程序员只要重写execute方法即可
4、在struts的配置文件中,在写action元素的时候,可以不写class属性
<action name="defaultAction">
<result name="success">index.jsp</result>
</action>
根据struts-default.xml
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
如果没有class属性,则struts2会去查找ActionSupport
二。配置文件中的通配符:
有了通配符,对于url的操作更加的优雅了 !通配符解决的就是url与action中的方法的映射问题!
<
struts
>
<
package
name="pattern1" namespace="/" extends="struts-default" >
<action name= "a_add" method ="add"
class= "com.oterman.struts.action.PatternAction" >
<result >index.jsp </result>
</action>
<action name= "b_add" method ="add"
class= "com.oterman.struts.action.PatternAction" >
<result >index.jsp </result>
</action>
<action name= "c_add"
class= "com.oterman.struts.action.PatternAction" >
<result >index.jsp </result>
</action>
</
package
>
</
struts
>
|
如上所示:为了实现多个地址访问同一个方法,可以使用通配符:
<action name= "*_add" method ="add"
class
=
"com.oterman.struts.action.PatternAction" >
<result >index.jsp </result>
</
action
>
|
浏览器访问时,可以通过url来指定要访问的方法:a_add!add.action, 感叹号后面表示要访问的方法!
通配符二:
<
package
name="pattern2" namespace="/" extends="struts-default" >
<!--
<action name="personAction" method="add"
class="com.oterman.struts.action.PersonAction">
<result >index.jsp</result>
</action>
<action name="studentAction" method="add"
class="com.oterman.struts.action.StudentAction">
<result >index.jsp</result>
</action>
-->
<action name= "*" method ="add"
class= "com.oterman.struts.action.{1}" >
<result >index.jsp </result>
</action>
</
package
>
通配符三:
TeacherAction中有add ,delete ,update方法
<action name= "teacherAction" class="com.oterman.struts.action.TeacherAction" >
<result >index.jsp </result>
</action>
|
采用如上配置,不指定method属性,在url中指定要访问的方法!
http://localhost/mystruts2/teacherAction!delete.action访问delete方法;(.action可以不要!!!)
通配符映射
在struts2的配置文件中可以使用通配符映射
<action name="personAction_*">
其中的*可以代表任意字符
*可以和{1}匹配
{1}可以出现在method、class、result中
method={1}
class="……{1}"
<result>………{1}.jsp</result>
<action name="*_*">这个是一个变态的写法,效率比较低,而且很容器和其他的url产生冲突
说明:通常的写法有两种
1、<action name="userAction_*" method="{1}" class=".....UserAction">
要写具体的类,方法可以用*来代替
2、方法的动态调用来做
在struts2的配置文件中可以使用通配符映射
<action name="personAction_*">
其中的*可以代表任意字符
*可以和{1}匹配
{1}可以出现在method、class、result中
method={1}
class="……{1}"
<result>………{1}.jsp</result>
<action name="*_*">这个是一个变态的写法,效率比较低,而且很容器和其他的url产生冲突
说明:通常的写法有两种
1、<action name="userAction_*" method="{1}" class=".....UserAction">
要写具体的类,方法可以用*来代替
2、方法的动态调用来做
三.拦截器:
1、如果有一个比较复杂的逻辑,在没有拦截器的情况下,会把这些需求全部写在action的方法中
这样会导致方法的结构不好
2、会把一些重用性的内容写在拦截器中
3、要把这些重用性比较高的代码以很好的组织形式结合起来,一个拦截器是不够的,所以需要
拦截器栈
4、怎么样写一个拦截器
1、声明一个拦截器
2、使用拦截器
这样就可以覆盖struts-default.xml文件的内容了
3、写的拦截器类必须实现Interceptor接口
intercept(){
return invocation.invoke();//往下继续执行
}
1、如果有一个比较复杂的逻辑,在没有拦截器的情况下,会把这些需求全部写在action的方法中
这样会导致方法的结构不好
2、会把一些重用性的内容写在拦截器中
3、要把这些重用性比较高的代码以很好的组织形式结合起来,一个拦截器是不够的,所以需要
拦截器栈
4、怎么样写一个拦截器
1、声明一个拦截器
<interceptors> 声明了一个拦截器 <interceptor name="imageInterceptor" class="cn.itheima03.struts2.interceptor.MyInterceptor"></interceptor> 声明了一个拦截器栈:可以放很多个拦截器 <interceptor-stack name="myInterceptor"> <interceptor-ref name="imageInterceptor"></interceptor-ref> 为struts2默认执行的拦截器 interceptor-ref即能指向拦截器,也能指向拦截器栈 <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> |
<default-interceptor-ref name="myInterceptor"></default-interceptor-ref> |
3、写的拦截器类必须实现Interceptor接口
intercept(){
return invocation.invoke();//往下继续执行
}