作用
使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。
结合MVC模型理解struts作用
MVC模型是理解struts很好的角度,因为struts的目的主要是针对简化MVC模型中的C(控制器)。
MVC模型
- 【调用 与 事件通知】
此处只站在3个元素的空间来进行理解,包括视图,模型,控制器。
【定义: 调用】从视图出发,通过方法调用形式进行信息传递。
【定义:事件】从非视图元素出发,进行信息信息传递。
【分析web事务】现在的互联网信息传递的形式,大部分 以 请求-通知的模式进行。意味着在该类系统中信息的起点为视图,也说明了这种方式更实用于前面定义的“调用”。(事件机制可通过调用机制间接实现,比如隔一段时间View端发送一次请求)
【struts在MVC中的地位】控制器,作用如图中(控制器)所示。有很多可用框架实现了该模型,struts的较好之处,一方面在于其提供了较为完善的功能,另一个方面是因为它使用了一种简洁开发的体验模式,将业务的处理转化为书写简单函数处理的形式(简单规定了应有的形态),正如手机上的软件一样,每一步简化都会吸引大量的用户。(个人感觉,这是struts之所以如此成功之处)
基本配置使用
struts使用流程
引入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】)配置web.xml。在web.xml中引入struts的相关组件,使其可定位到struts相关的组件,进而对于请求处理的控制权转交给struts。(此处的核心过滤器为:StrutsPrepareAndExecuteFilter )
开发Action。动作类(Action)一般继承自ActionSupport类,用来处理请求。(PS:struts的 Action 取代了之前的servlet, 充当MVC模型中控制器的作用)
Action一般需继承ActionSupport类。
Action中响应 请求的业务方法,需要符合如下的规定:(1)返回String类型。(映射:根据返回的字符串,去查找相应的页面)
(2)方法无参数。(外界传入的信息可以通过ActionSupport内置的对象获得相应的请求)配置struts.xml。通过配置该文件,根据url中的信息将 请求分配给某个Action,并且配置Action执行相应的方法后返回的字符串对应的页面。
PS : 为什么这么做呢?为何要引入映射机制呢?
为何中间需要经过一个字符串作为中转,而不是直接定位到相应的页面呢。
【答】解耦,如果将页面的路径直接写在代码中,那么每次更改之后都需要重新编译(有些项目中编译的代价是很大的,尤其是大型的项目),而放在配置文件中,不需要更改原来java代码中的内容,从而使之更加灵活。
PS:
【关于web.xml的加载过程】(1)Tomcat启动;(2) 加载自身web.xml;(3)加载所有项目的web.xml;(4)通过在项目的web.xml中引入过滤器;(5)Struts的核心功能的初始化,通过过滤器完成。(通过过滤器,将控制权转移到了Struts中)
小的示例
配置web.xml
在web.xml中加入如下内容:(引入struts核心过滤器)
<!-- 引入struts核心控制器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class>
</filter>
<!-- 拦截符合url模式的请求 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
开发Action,处理请求
public class LoginAction extends ActionSupport {
// 处理请求的方法
public String execute() throws Exception {
System.out.println(“logining...”);
//登陆业务处理(省略)
return "success";
}
}
配置struts.xml,建立 Action与URL请求的关系
<?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" extends="struts-default">
<!--
【目的】:映射实体业务类中的方法 与 相应的URL间的关系。
【URL】Action中 name属性是URL的重要组成部分。
【实体类】Action中 class属性及method属性指明了对应的实体类中的方法,负责处理请求的业务。
【result标签】根据处理请求方法返回的字符串,定位相应的结果页面。
-->
<action name="loginCheck" class="wang.actions.UserAction"
method="execute">
<result name="success">/WEB-INF/jsp/loginSuccess.jsp</result>
</action>
</package>
</struts>
struts 的工作原理
基本原理图
解释:(摘自:Struts2的工作原理)
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3 接着FilterDispatcher(现已过时)被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6 ActionProxy 创建一个ActionInvocation 的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper。
细节解释
- 【HttpServletRequest】struts接受请求的数据主要存放在HttpServletRequest 中,而该类遵守的是serlet规范,为了适配需要利用web服务器中针对serlet的处理组件,使请求能较好的适配到struts上面。(这就是FilterDispatcher的作用,请求需要web服务器(如,tomcat)过滤器才能较好的委托给Action去处理)
- 【FilterDispatcher等过滤器】struts的核心控制器组件,作为servlet的过滤器形式出现。在web服务器内部,转发请求数据的作用。
PS:
【核心控制器】在 struts1.x 系列中 , 所有的请求是通过一个 servlet(ActionServlet) 来管理控制的 , 在 Struts2.X 而是经过一个 Filter 来处理请求的。
学习struts需要的技术包括:
【MVC】对于MVC模型的基本了解。
参考
【百度百科】struts
【CSDN】struts2的核心和工作原理
【CSDN】心控制器:FilterDispatcher (写的真心清晰)