首页 > 代码库 > 【SSH2(理论篇)】--Struts2配置详解
【SSH2(理论篇)】--Struts2配置详解
上篇博客讨论了SSH2框架模型,在开发过程中发现SSH2的开发模型其实类似于经典的三层模式,在每一层中分别添加了不同的框架,显示层使用的是Struts2进行配置的,业务逻辑层使用的是Spring配置,数据持久层则采用的是Hibernate,开发模式简单易懂,接下来将会分别从三层着手讨论每一层的运行内容。
一、Struts体系简介
struts,是Apache软件基金会(ASF)赞助的一个开源项目,它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller〔MVC〕设计模式的应用框架〔WebFramework〕,是MVC经典设计模式中的一个经典产品。
1、Struts1
Struts1是Struts最早的版本,该框架以ActionServlet作为系统的核心控制器,整个应用由客户端请求驱动。对于整个Struts1而言,控制器是它的核心,Struts1的控制器由两部分组成:核心控制器和业务逻辑控制器。其中的业务逻辑控制器就是用户自定义的Action,它是由开发者提供的。
图1 Struts1程序运行流程图
当用户发送一个HTTP请求时,该请求会被ActionServlet拦截到,ActionServlet对请求进行解析,解析完成后会ActionServlet会有两种不同的回应方式,如果用户请求的只是URL,则ActionServlet将会直接将请求转发给用户,否则的话将该请求转发给对应的业务逻辑控制器,业务逻辑控制器调用相应的模型处理用户请求。
2、Struts2
Struts1虽然功能强大,但是遗留下了很多问题,其中最主要的是Struts1和JSP/Servlet的耦合性过高,在它的处理流程中都是直接在JSP/Servlet之间转发、处理请求,这就限制了Struts1的发展。因为Struts1的显示层使用的是JSP,如果遇到了其它的处理页面,Struts1就显得无能为力,另外一方面Struts1同样受制于Servlet API,严重依赖于Web服务器,一旦脱离了Web服务器,测试就会很困难。由于Struts1的设计缺陷及使用年代的久远,所以产生了Struts2。
Struts2相对于Struts1发生了巨大的改变,这种改变主要表现在处理核心上,Struts2是以WebWork为核心(xwork-core-2.2.3.jar),采用拦截器的机制来处理用户请求。它整合了Struts1和WebWork,将两者合二为一,不仅拥有Struts1丰富的页面标签,而且还拥有WebWork的处理核心。从它的改变上也可以Struts2是WebWork的更新产品。
图2 WebWork/Struts2的处理核心
从图可以看出,一个请求在 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。
学过设计模式的程序员能够看出,在这个处理核心中使用了设计模式,在请求访问Action的过程中使用了代理模式和工厂模式,FilterDispatcher没有直接来调用相应的Action而是通过代理,另外在ActionProxy工厂中创建ActionInvocation实例来调用相应的Action,设计的很巧妙。
二、Struts2的配置文件
Struts2 相关的配置文件有 web.xml,struts.xml,struts.properties,struts-default.xml,velocity.properties,struts-default.vm。其中 web.xml,struts.xml 是必须的,其它的配置文件可选择。它们在 web 应用中的功能如下:
web.xml:包含所有必须的框架组件的 web 部署描述符。
Struts.xml:配置包含 result/view 类型、action 映射、拦截器等的 Struts2 的主要配置文件。
Struts.properties:配置 struts2 的框架属性。
Struts-default.xml:在文件在 struts-action-x.x.jar 中,该文件是应该被包含在 struts.xml中的缺省配置。
Welocity.properties:重写了 velocity 的配置文件。
Struts-default.vm:相对于 velocity 的缺省配置。
<struts> <!-- Struts 2的全局变量,该属性设置了去除请求过程中的"名称.action"后缀".action"--> <constant name="struts.action.extension" value=http://www.mamicode.com/",">>在上面的Struts2.xml文件中,定义了两个action,并使用constant设置了全局变量,其中struts.action.extension属性设置文件的action显示与否,值“,”表示所有action的名称后面可以不加action作为后缀。
标签中的type能够指定转向的资源类型,转向的资源多样既可以是JSP,也可以是其它类型的文件。另外在package标签中可以添加属性namespace,学习过xml的应该知道它指的是命名空间,它的作用是将标签进行分类,放到不同的空间内。
三、Struts2的标签库
Struts2的标签库也是Struts的重要组成部分,这些标签内容是在Struts1开始就有的,标签库提供了丰富的功能,基本上可以替代HTML标签。Struts2的标签使用方法类似于HTML及JSP标签,不同的是头文件的注册方法,而且Struts2的标签页面代码相较于JSP及HTML页面更简洁,如下面的示例。
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <s:form method="post" action="loginaction"> <s:textfield label="名字" name="name"/> <s:textfield label="年纪" name="age"/> <s:textfield label="喜欢的颜色" name="answer"/> <s:submit/> </s:form> </body> </html>四、Struts2配置
在开发的web项目中想要使用Struts2就必须要事先配置好相应的Struts环境,需要去官方网站下载相应的Struts2压缩包,然后把相应的jar包引入WebContent/WEB-INF/lib文件夹内,接下来还要在目录WebContent/WEB-INF下的web.xml文件中添加Struts2的FilterDispatcher,最后在项目的src文件夹内添加相应的struts.xml将action等内容写入该配置文件内。
Struts2官方下载地址:http://struts.apache.org/downloads.html。
lib库中引入的jar包需要根据项目需求确定,不同的功能引入的jar也不相同,如果基本的应用的话只需要引入下面的四个jar包:
common-logging-版本号.jar:Jakarta的通用日志记录包,用于通用日志处理。log4j是最好用的;
freemarker-版本号.jar
ognl-版本号.jar:OGNL表达式语言,struts2支持该EL;
struts2-core-版本号.jar:struts2的核心库;
xwork-core-版本号.jar:webwork的核心库,由于Struts2是由xwork的延伸,有些类依然关联着xwork的类
引入jar包后还需要在web.xml中添加struts的FilterDispatcher,具体配置如下代码:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>Web</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- Struts的FilterDispatchor --> <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> </web-app>filter元素用于指定Web容器中的过滤器。在请求和响应对象被servlet处理之前或之后,可以使用过滤器对这两个对象进行操作。
filter-mapping元素用来声明Web应用中的过滤器映射。过滤器可被映射到一个servlet或一个URL模式。将过滤器映射到一个servlet中会造成过滤器作用于servlet上。将过滤器映射到一个URL模式中则可以将过滤器应用于任何资源,只要该资源的URL与URL模式匹配。过滤是按照部署描述符的filter-mapping元素出现的顺序执行的。
最后在项目的src文件夹内添加相应的struts.xml
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.action.extension" value=http://www.mamicode.com/",">>Struts的配置比较简单,经过上面的配置后可以实现基本的页面跳转的功能,其中的web.xml文件中的过滤器不仅可以struts同样可以配置其它的框架在使用的时候多多积累吧,另外struts.xml也是必不可少的,页面的action、interceptor等,使用方法将会在下篇文章中讨论。
结语
文章讨论了struts的基本结构,从struts的发展历程了解了struts的内部运行机制,从运行机制看出struts2其实是webwork增强版,它集成了webwork作为处理的核心,所以它属于重量级框架。想要使用struts必须经过配置,并通过使用映射来实现动态的功能。