【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作为系统的核心控制器。整个应用由client请求驱动。对于整个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。严重依赖于Webserver。一旦脱离了Webserver,測试就会非常困难。

由于Struts1的设计缺陷及使用年代的久远。所以产生了Struts2。
         Struts2相对于Struts1发生了巨大的改变。这样的改变主要表如今处理核心上。Struts2是以WebWork为核心(xwork-core-2.2.3.jar),採用拦截器的机制来处理用户请求。它整合了Struts1和WebWork,将两者合二为一。不仅拥有Struts1丰富的页面标签。并且还拥有WebWork的处理核心。从它的改变上也能够Struts2是WebWork的更新产品。              
            
                                                  图2 WebWork/Struts2的处理核心
    
    从图能够看出,一个请求在 Struts2 框架中的处理大概分为下面几个步骤:
        (1) client初始化一个指向 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=","></constant>
	
	<!-- Struts 2的Action必须放在Package包中--> 
	<package name="default" extends="struts-default"> 
		<!-- 定义一个login的Action,实现类为LoginAction --> 
		 <action name="login" class="com.action.LoginAction"> 
			<!-- 配置Action返回成功时。转入Success.jsp页面--> 
			 <result name="success">success.jsp</result>
			  <!-- 配置Action返回cancel时重定向到Welcome的Action--> 
			 <result name="cancel" type="redirectAction">Welcome</result> 
			 <!-- 配置Action返回expired时重定向到ChangePassword的Action链 --> 
			 <result name="expired" type="chain">ChangePassword</result>   
		</action> 
		
		<action name="Welcome" class="com.action.welcome">
    		<result name="cancel">Welcome.jsp</result>
    	       </action>
		
	</package> 
</struts>

    在上面的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=","></constant>
    <package name="login" extends="struts-default">
    	<action name="loginaction" class="com.action.loginAction">
    		<result name="success">success.jsp</result>
    		<result name="error">error.jsp</result>
    		<result name="cancel" type="redirectAction">Welcome</result>
    	</action>
    	
    	<action name="Welcome" class="com.action.welcome">
    		<result name="cancel">Welcome.jsp</result>
    	</action>
    </package>
    
</struts>

         Struts的配置比較简单,经过上面的配置后能够实现主要的页面跳转的功能,当中的web.xml文件里的过滤器不仅能够struts相同能够配置其他的框架在使用的时候多多积累吧。另外struts.xml也是不可缺少的,页面的action、interceptor等,用法将会在下篇文章中讨论。


结语

    

     文章讨论了struts的基本结构,从struts的发展历程了解了struts的内部执行机制,从执行机制看出struts2事实上是webwork增强版,它集成了webwork作为处理的核心,所以它属于重量级框架。想要使用struts必须经过配置,并通过使用映射来实现动态的功能。



posted @ 2017-05-08 08:31  yangykaifa  阅读(254)  评论(0编辑  收藏  举报