一.环境搭建
一般是三个步骤
第一步:拷贝所需的Struts2的jar包
第二步:在顶层文件路径下,配置一个文件名为struts.xml的xml文件
第二步:在web.xml中配置控制器
1.Struts2 的jar包
Struts2-core和xwork-core是Struts2最为核心的包,这两个是必须拷贝进去的,其它的包可以根据需要进行拷贝,一般在下载Struts2后,会有例子,可以报实例中所引用的包都拷贝进去。
当我们搭建好环境后,就可以开发第一个Struts2的项目了
二开发Struts2项目
第一步:可以编写一个jsp页面
第二步:在struts.xml中配置动作类和动作方法,
第三部:编写动作方法和动作类
第四部:编写结果视图,结果视图是请求服务器后,要返回给前端的页面。
三.当一个请求发送过来之后,它的执行过程
首先是启动tomcat服务器后做的操作
1.加载web.xml文件
2.初始过滤器
3.加载struts.xml文件
下面是一个请求发送过来后,所做的操作
4.客户端的发送请求 *.do
5.请求到达过滤器
6.截获请求的动作名称,并且在struts.xml中查找其请求名称
7.找到动作名称后,实例化动作类
8.执行动作方法
9.根据返回值,在struts2.xml中取到返回的jso页面
10.找到其jsp页面
11.返回给前端页面
四.详解Struts2
1.struts2的配置文件
在Tomact启动的时候,其配置文件就被加载了
配置文件的加载也有一定的顺序,顺序如下:default.properties——>struts-default.xml——>strtuts-plugin.xml——>struts.xml——>struts.properties——>过滤器配置文件
注意: 1.红颜色表示的,我们可以修改其中的参数值
2.如果多个配置文件中有相同的值,那么后面值会把前面的值覆盖掉
2.修改一些常量,验证上述结果
例如,我们可以修改其扩展名
<constant name="struts.action.extension" value="do"></constant>
这样修改后,就只有是后缀带.do的请求才可以访问,后缀是action和不带任何后缀的都不可以访问(不带默认后缀是action)
3.xml中配置元素
a.package元素
struts2中引入了面向对象的思想,引入了包的管理机制,为了更好的管理action动作类。
(1).属性
name,必须写,其必须唯一
extends:一般需要继承struts-default.xml文件,在这个文件有定义着struts-default包,不一定非要继承,如果不继承,那么将不能使用struts2的核心包
abstract:把包声明为抽象包,抽象包被用来继承的,只要是没有action的元素都可以被声明为抽象包
namespace:名称空间,在有名称空间后,访问路径=名称空间+动作名称
属性配置如下:
<struts>
<constant name="struts.action.extension" value="do"></constant>
<package name="p1" extends="struts-default" namespace="/struts">
<action name="hello" class="com.yu.web.action.HelloAction" method="sayHello">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
只有加上名称空间才可以访问到页面
<a href='${pageContext.request.contextPath}/hello.action'>带action的</a>
<a href='${pageContext.request.contextPath}/hello'>不带action的</a>
<a href='${pageContext.request.contextPath}/hello.do'>带do的</a>
<a href='${pageContext.request.contextPath}/struts/hello.do'>带namespace的do</a>
b.package中的元素详解
(1)namespace
经过的上面我们可以看到,namespace有两种可能,一种写了此属性,一种不写此属性
不写此属性时:该namespace默认值是"",即namespace="";
注意:不是"/"
(2)action
(1)
name:动作名称 class:类名 默认为:com.opensymphony.xwork2.ActionSupport,是在struts-default.xml中定义的
我们可以替换该动作类,怎么替换了,在上面我们学到的可以替换变量一样的,可以在struts.xml中替换该变量。
<default-class-ref class="自己想写的类名" />
method:动作类的方法名称,,默认是public string execute()
当然,该动作名称有一定的规则要求:必须是public ,返回名称必须是String类型,没有参数
(2)动作类的创建方式
第一种,创建一个pojo类,
public class HelloAction {
public String sayHello(){
System.out.println("访问完成");
return "success";
}
}
第二种实现com.opensymphony.xwork2.Action接口
该接口中,有很多的变量,可以表示其返回的字符串,比如:success表示成功的页面,error表示错误页面
第三种继承com.opensymphony.xwork2.ActionSupport
(3)动作访问的配置方式
a.使用通配符:
我们在配置动作方法的时候,根据动作名来配置动作类,这样会写很多的动作配置
<action name="addUser" class="com.yu.web.action.ActionImpl" method="addUser">
<result name="addUser">/addUser.jsp</result>
</action>
<action name="updateUser" class="com.yu.web.action.ActionImpl" method="updateUser">
<result name="updateUser">/updateUser.jsp</result>
用通配符写一个方法就可以了
<action name="*" class="com.yu.web.action.ActionExtends" method="{1}">
<result name="*">/{1}.jsp</result>
*表示任意的请求动作名,{1}表示匹配第一个*号
使用两个通配符
<action name="*_*" class="com.yu.web.action.{1}Action" method="{1}">
<result name="success">/{1}{2}.jsp</result>
</action>
{1}对应第一个星号,{2}对应第二个星号
在stratus.xml中的找寻action时的原则:
绝对匹配优先,如果有通配符,那么按照在配置文件中的顺序来匹配(注意,一个通配符和两个通配符是同样级别的,即所有通配符的匹配都是按照其顺序来匹配)
b.动态访问
如果想使用动态访问,那么首先要允许动态调用.
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
动态访问的格式是动作名!动作方法
<a href='${pageContext.request.contextPath}/struts/hello!sayHello'>动态调用</a>
<action name="hello" class="com.yu.web.action.HelloAction" >
<result name="success">/success.jsp</result>
</action>