一、Struts2开发流程
1.Struts2版本:2.3
2.引入jar文件(8个)
commons-fileupload-1.3.1.jar 【文件上传相关包】
commons-io-2.2.jar
commons-lang3-3.2.jar 【Struts对java.lang包的扩展】
freemarker-2.3.22.jar 【Struts的标签模板库jar文件】
javassist-3.11.0.GA.jar 【Struts对字节码的处理相关jar】
ognl-3.0.6.jar 【Ognl表达式功能支持包】
struts2-core-2.3.24.1.jar 【Struts2核心功能包】
xwork-core-2.3.24.1.jar 【Xwork核心包】
3.配置web.xml。
Tomcat启动→加载自身web.xml→加载所有项目的web.xml,通过在项目的web.xml中引入过滤器→Struts的核心功能的初始化,通过过滤器完成→Filter【init()启动执行,doFilter()访问执行,destroy()】
<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>
StrutsPrepareAndExecuteFilter即是核心过滤器
使用的Struts版本不一样,核心过滤器是不一样的!
4.开发Action。
1)Action类,也叫做动作类;一般继承ActionSupport类,即处理请求的类(Struts中的Action类取代之前的Servlet)
2)Action中的业务方法,处理具体的请求。方法要求:必须返回String,方法不能有参数。
public class HelloAction extends ActionSupport {
// 处理请求
public String execute() throws Exception {}
}
5.配置Struts.xml
二、Struts2执行流程
服务器启动:
1.加载项目web.xml
2.创建Struts2核心过滤器对象,执行Filter的init()方法,依次加载struts-default.xml(核心功能的初始化)、struts-plugin.xml(struts相关插件)、struts.xml(用户编写的配置文件)文件。
访问:
3.用户访问Action,服务器根据访问路径名称,找对应的Action配置,创建Action对象
4.执行默认拦截器栈中定义的18个拦截器
5.执行Action的业务处理方法
三、struts-default.xml详解
1.目录:struts2-core-2.3.24.1.jar/struts-default.xml
2.内容:
1)bean节点指定Struts在运行的时候创建的对象类型
2)指定struts-default包【用户写的package(struts.xml)一样要继承此包】
package struts-default包中定义了:
a. 跳转的结果类型
dispatcher 转发,不指定默认为转发
redirect 重定向
redirectAction 重定向到Action资源
stream 文件下载的时候用
b.定义了所有的拦截器。总共定义了32个拦截器。为了拦截器引用方便,可以通过定义栈的方式引用拦截器,此时如果引用了栈,栈中的拦截器都会被引用!defaultStack:默认的栈,其中定义了默认要执行的18个拦截器!
c.默认执行的拦截器栈、默认执行的Action
四、面试题
1.拦截器什么时候执行?先执行Action类创建还是先执行拦截器?
用户访问的时候按顺序执行18个拦截器;先执行Action类的创建,再执行拦截器;最后拦截器执行完,再执行业务方法。
五、Struts2配置
<?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 定义一个包。 包作用,管理action。 (通常,一个业务模板用一个包) name 包的名字; 包名不能重复; extends 当前包继承自哪个包 在struts中,包一定要继承struts-default struts-default在struts-default.xml中定的包 abstract 表示当前包为抽象包; 抽象包中不能有action的定义,否则运行时期报错 abstract=true 只有当当前的包被其他包继承时候才用! 如: <package name="basePackage" extends="struts-default" abstract="true"></package> <package name="user" extends="basePackage"> namespace 名称空间,默认为"/" 作为路径的一部分 访问路径= http://localhost:8080/项目/名称空间/ActionName action 配置请求路径与Action类的映射关系 name 请求路径名称 class 请求处理的aciton类的全名 method 请求处理方法 result name action处理方法返回值 type 跳转的结果类型 标签体中指定跳转的页面 --> <package name="user" extends="struts-default" namespace="/"> <action name="login" class="cn.itcast.b_execute.UserAction" method="login"> <result name="login">/index.jsp</result> </action> </package> </struts>