一、简介Struts2
首先,Struts 是基于MVC模式的框架。Struts2框架预先实现了一些功能:
Struts开发步骤:
1、web项目,引入 struts-jar包
引入jar文件
commons-fileupload-1.2.2.jar 【文件上传相关包】
commons-io-2.0.1.jar
struts2-core-2.3.4.1.jar 【struts2核心功能包】
xwork-core-2.3.4.1.jar 【Xwork核心包】
ognl-3.0.5.jar 【Ognl表达式功能支持表】
commons-lang3-3.1.jar 【struts对java.lang包的扩展】
freemarker-2.3.19.jar 【struts的标签模板库jar文件】
javassist-3.11.0.GA.jar 【struts对字节码的处理相关jar】
2、配置web.xml
Tomcat启动,首先加载自身web.xml,然后加载所有项目的web.xml。通过在项目的web.xml中引入过滤器,Struts的核心功能的初始化,通过过滤器完成。struts2-core-2.3.4.1.jar-----》StrutsPrepareAndExecuteFilter 即为核心过滤器
注意:使用的struts的版本不同,核心过滤器类是不一样的!
<!-- 引入struts核心过滤器:不同版本,核心过滤器的名字不一样 -->
<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>
3、开发action
// 开发action: 处理请求
public class HelloAction extends ActionSupport { // 处理请求
public String execute() throws Exception { System.out.println("访问到了action,正在处理请求"); System.out.println("调用service"); return "success"; } }
为什么要继承ActionSupport类?
理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下都会继承 com.opensymphony.xwork2.ActionSupport类,并重载(Override)此类里的String execute()方法。当然我们也可以在写action的时候实现Action接口.
Action接口有:
public static final java.lang.String SUCCESS = "success"; public static final java.lang.String NONE = "none"; public static final java.lang.String ERROR = "error"; public static final java.lang.String INPUT = "input"; public static final java.lang.String LOGIN = "login"; public abstract java.lang.String execute() throws java.lang.Exception;
而Actionsupport这个工具类在实现了Action接口的基础上还定义了一个validate()方法,重写该方法,它会在 execute()方法之前执行,如校验失败,会转入input处,必须在配置该Action时配置input属性。 另外,Actionsupport还提供了一个getText(String key)方法还实现国际化,该方法从资源文件上获取国际化信息. 这样在自定义标签时可以定义一个变量为new actionsupport对象实现国际化。
ActionSupport类的作用:
4. 配置action : src/struts.xml
<?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="xxxx" extends="struts-default">
<action name="hello" class="cn.itcast.action.HelloAction" method="execute">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
二、Struts2执行流程
服务器启动:
1、加载项目web.xml
2、创建Struts核心过滤器对象,执行Filter的init(),加载三个xml文件:
访问:
1、用户访问Action, 服务器根据访问路径名称,找对应的aciton配置, 创建action对象
2、执行默认拦截器栈中定义的18个拦截器
3、执行action的业务处理方法
三、struts-default.xml详解
目录:struts2-core-2.3.4.1.jar/ struts-default.xml
内容:
1. bean节点指定struts在运行的时候创建的对象类型
2.指定struts-default包 【用户写的package(struts.xml)一样要继承此包 】
package struts-default 包中定义了:
a. 跳转的结果类型
b. 定义了所有的拦截器
定义了32个拦截器!为了拦截器引用方便,可以通过定义栈的方式引用拦截器,此时如果引用了栈,栈中的拦截器都会被引用!
defaultStack:默认的栈,其中定义默认要执行的18个拦截器!
c. 默认执行的拦截器栈、默认执行的action
<default-interceptor-ref name="defaultStack"/> <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
四、struts.xml详解
<?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 定义一个包。 包作用,管理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>
其他过滤器要在默认过滤器前边。