一,概述
struts1是最早的一种基于MVC模式的应用框架;struts2是在struts1的基础上融合了xwork的功能.因此,可以说:struts2=struts1+xwork.struts本质上相当于是servlet,struts其实就是对servlet的封装,从而提高开发效率.管他三七二十一,先写一个Hello程序吧!
二,struts2之hello程序
0)去Apache官网下载struts2的zip包,本文使用的struts-2.3.4.1版本.
1)创建一个web项目,引入struts的相关jar包.解压刚刚下载的zip包,在lib目录下找到以下这几个核心的jar(如下图),导入web项目中.
1,2jar包:文件上传相关包
3jar包 :struts对java.lang包的扩展
4jar包:struts的标签模板库jar文件
5jar包:struts对字节码的处理相关jar包
6jar包:Ognl表达式功能支持包
最后两个分别是struts2核心功能包,Xwork核心包
需要注意的是,在struts2的lib目录里有很多个jar包,远不止这8个,直接全部导入是不科学的.如果自己不想找这8个常用jar,就去apps目录下的struts2-blank.war里面拷贝现成web示例里的jar包,需要解压struts2-blank.war哦.在里面的lib目录里有13个jar包,直接拷入自己的项目中即可.(多了五个,无所谓了).
2)在项目的web.xml中,引入struts的核心过滤器,配置几行代码就搞定了.(可参考前面说的struts2-blank.war里面的web.xml文件).
<!-- 引入struts2核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<!-- org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter -->
<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.
package com.bighuan.a_action;
import com.opensymphony.xwork2.ActionSupport;
/**
* 开发action:处理请求,继承ActionSupport的叫做动作类.action类是用来替代servlet的.
* action类中业务方法必须返回一个String,方法不能有参数,参考execute()方法
* @author bighuan
*
*/
public class HelloAction extends ActionSupport {
/**
* 处理请求
*/
@Override
public String execute() throws Exception {
System.out.println("访问到了action,正在处理请求ing");
System.out.println("调用service处理请求");
return "success";
}
}
4)配置action,在src下新建一个struts.xml文件,其实也可以参考前面说的那个struts2-blank.war下的struts.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>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<!-- 配置action:通过hello找到Action的全路径,然后通过相应类(HelloAction)找到相应类中的方法,通过返回值确定接下来是否跳转页面 -->
<action name="hello" class="com.bighuan.a_action.HelloAction"
method="execute">
<!-- type默认就是dispatcher
跳转的结果类型
dispatcher 转发,不指定默认为转发
redirect 重定向
redirectAction 重定向到action资源
stream (文件下载的时候用)
-->
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
<!-- Add packages here -->
</struts>
5)发布到tomcat,通过路径(http://localhost:8080/工程名/hello)访问就打印出了HelloAction中那个execute()方法里的两行内容,并且跳转到success.jsp页面.过程很简单,但写起来就很多东西了...所以略了,写博客主要是为了加深自己的印象...
三,struts2框架预先帮开发者实现的功能
1)请求数据自动封装(这功能好啊,以前在servlet封装数据好烦了)
2)文件上传的功能
3)对国际化功能的简化
4)数据校验功能
.....
还有好多
四,struts2的执行流程
服务器启动:
1) 加载项目web.xml
2.)创建Struts核心过滤器对象, 执行filter
-->init()
struts-default.xml, 核心功能的初始化
struts-plugin.xml, struts相关插件
struts.xml 用户编写的配置文件
访问:
3) 用户访问Action, 服务器根据访问路径名称,找对应的aciton配置, 创建action对象
4) 执行默认拦截器栈中定义的18个拦截器
5) 执行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,定义了所有的拦截器
定义了32个拦截器!
为了拦截器引用方便,可以通过定义栈的方式引用拦截器,此时如果引用了栈,栈中的拦截器都会被引用!
defaultStack:默认的栈,其中定义默认要执行的18个拦截器!
b. 默认执行的拦截器栈、默认执行的action
<default-interceptor-ref name="defaultStack"/>
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
<interceptor
name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
<interceptor
name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
3)拦截器
拦截器功能与servlet中的过滤器功能类似。
区别:
共同点: 都拦截资源!
区别:
过滤器,拦截器所有资源都可以; (/index.jsp/servlet/img/css/js)
拦截器,只拦截action请求。
拦截器是struts的概念,只能在struts中用。
过滤器是servlet的概念,可以在struts项目、servlet项目用。
4)拦截器什么时候执行? (访问/启动) 先执行action类创建,先执行拦截器?
a, 用户访问时候按顺序执行18个拦截器;
b, 先执行Action类的创建,再执行拦截器; 最后拦截器执行完,再执行业务方法
六,总结
希望自己坚持下去,好好搞技术!