【SSH2(理论篇)】--Struts2配置详解

来源:互联网 发布:pua倪 网络课程9.0 编辑:程序博客网 时间:2024/05/16 05:15

上篇博客讨论了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 的缺省配置。

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <struts>  
  2.     <!-- Struts 2的全局变量,该属性设置了去除请求过程中的"名称.action"后缀".action"-->   
  3.     <constant name="struts.action.extension" value=","></constant>  
  4.       
  5.     <!-- Struts 2的Action必须放在Package包中-->   
  6.     <package name="default" extends="struts-default">   
  7.         <!-- 定义一个login的Action,实现类为LoginAction -->   
  8.          <action name="login" class="com.action.LoginAction">   
  9.             <!-- 配置Action返回成功时,转入Success.jsp页面-->   
  10.              <result name="success">success.jsp</result>  
  11.               <!-- 配置Action返回cancel时重定向到Welcome的Action-->   
  12.              <result name="cancel" type="redirectAction">Welcome</result>   
  13.              <!-- 配置Action返回expired时重定向到ChangePassword的Action链 -->   
  14.              <result name="expired" type="chain">ChangePassword</result>     
  15.         </action>   
  16.           
  17.         <action name="Welcome" class="com.action.welcome">  
  18.             <result name="cancel">Welcome.jsp</result>  
  19.                </action>  
  20.           
  21.     </package>   
  22. </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页面更简洁,如下面的示例。

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <%@ page contentType="text/html; charset=UTF-8" %>   
  2. <%@ taglib prefix="s" uri="/struts-tags"%>   
  3. <html>  
  4. <head>  
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  6. <title>Insert title here</title>  
  7. </head>  
  8. <body>  
  9.     <s:form method="post" action="loginaction">  
  10.         <s:textfield label="名字" name="name"/>   
  11.         <s:textfield label="年纪" name="age"/>   
  12.         <s:textfield label="喜欢的颜色" name="answer"/>   
  13.         <s:submit/>  
  14.     </s:form>  
  15. </body>  
  16. </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,具体配置如下代码:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <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">  
  3.   <display-name>Web</display-name>  
  4.   <welcome-file-list>  
  5.     <welcome-file>index.html</welcome-file>  
  6.     <welcome-file>index.htm</welcome-file>  
  7.     <welcome-file>index.jsp</welcome-file>  
  8.     <welcome-file>default.html</welcome-file>  
  9.     <welcome-file>default.htm</welcome-file>  
  10.     <welcome-file>default.jsp</welcome-file>  
  11.   </welcome-file-list>  
  12.     
  13.   <!-- Struts的FilterDispatchor -->  
  14.   <filter>  
  15.     <filter-name>struts2</filter-name>  
  16.     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  17.   </filter>  
  18.     
  19.   <filter-mapping>  
  20.     <filter-name>struts2</filter-name>  
  21.     <url-pattern>/*</url-pattern>  
  22.   </filter-mapping>  
  23. </web-app>  

        filter元素用于指定Web容器中的过滤器。在请求和响应对象被servlet处理之前或之后,可以使用过滤器对这两个对象进行操作。

        filter-mapping元素用来声明Web应用中的过滤器映射。过滤器可被映射到一个servlet或一个URL模式。将过滤器映射到一个servlet中会造成过滤器作用于servlet上。将过滤器映射到一个URL模式中则可以将过滤器应用于任何资源,只要该资源的URLURL模式匹配。过滤是按照部署描述符的filter-mapping元素出现的顺序执行的。

     最后在项目的src文件夹内添加相应的struts.xml

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <!DOCTYPE struts PUBLIC  
  2.           "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  3.           "http://struts.apache.org/dtds/struts-2.0.dtd">  
  4. <struts>  
  5. <span style="font-family:SimSun;">    </span><constant name="struts.action.extension" value=","></constant>  
  6.     <package name="login" extends="struts-default">  
  7.         <action name="loginaction" class="com.action.loginAction">  
  8.             <result name="success">success.jsp</result>  
  9.             <result name="error">error.jsp</result>  
  10.             <result name="cancel" type="redirectAction">Welcome</result>  
  11.         </action>  
  12.           
  13.         <action name="Welcome" class="com.action.welcome">  
  14.             <result name="cancel">Welcome.jsp</result>  
  15.         </action>  
  16.     </package>  
  17.       
  18. </struts>  

         Struts的配置比较简单,经过上面的配置后可以实现基本的页面跳转的功能,其中的web.xml文件中的过滤器不仅可以struts同样可以配置其它的框架在使用的时候多多积累吧,另外struts.xml也是必不可少的,页面的action、interceptor等,使用方法将会在下篇文章中讨论。


结语

     

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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩孑高三总是玩手机怎么办 摩托车被收了怎么办 摩托车的手续都怎么办 摩托车罚单掉了怎么办 行人遇到黄灯该怎么办 长辈借钱不还怎么办 不绣刚电梯轿壁有凹槽怎么办 电梯下限位故障怎么办 卫生间夏天太热怎么办 07大檐帽变形了怎么办 税务局不批发票怎么办 进项发票太多了怎么办 发票报销联丢失怎么办 发票领用簿没有怎么办 发票购买本遗失怎么办 销售方遗失发票怎么办 增值税发票发票联丢失怎么办 苹果购买发票丢失怎么办 空白增值税发票发票丢失怎么办 网购发票 领购簿怎么办 购物发票丢了怎么办 饭店客人买单要少钱怎么办 发票备注栏写错怎么办 卖房子发票丢失怎么办 发票二维码蓝票怎么办 车祸伤者出院怎么办 微信付款失败怎么办 增值税电子发票没打税号怎么办 买假出租车发票怎么办 纳税号错了怎么办 发票抬头写错怎么办 增值税发票打错顺序怎么办 发票打错了怎么办 电子发票错了怎么办 税率开高了怎么办 增值发票折叠了怎么办 播放器格式不对怎么办 发票弄上油了怎么办 快手视频快进了怎么办? 三星手机没声音怎么办 mp4不是标准格式怎么办