首页 > 代码库 > 【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的标签使用方法类似于HTMLJSP标签,不同的是头文件的注册方法,而且Struts2的标签页面代码相较于JSPHTML页面更简洁,如下面的示例。

<%@ 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模式中则可以将过滤器应用于任何资源,只要该资源的URLURL模式匹配。过滤是按照部署描述符的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必须经过配置,并通过使用映射来实现动态的功能。