SSH框架——走进Struts2

       今天我们来学习java中比较流行的框架SSH。
    所谓框架,其实就像我们盖房子一样,需要先搭建支架,然后再进行添砖加瓦,使之达到完美。而在软件开发中,框架也是一样的:就是将通用的代码进行封装,使我们可以重复利用,达到了高效开发的效果。当然既然已经搭建好的框架,用到我们的系统中,我们就需要学习它,怎么使我们自己独有的代码和框架进行完美的结合。因为大家都在用这些优秀的框架,所以框架的学习,其实就是框架规范的学习。有了规范,有个约束,有了统一,才能更加有利于合作的开发。
      那么SSH又是什么呢?

SSH框架——走进Struts2_第1张图片

关注数据流程的MVC框架 (Struts1/2, WebWork, Spring MVC……)
关注数据关系的容器框架 (Spring, GUICE……)
关注数据操作的持久层框架(Hibernate,IBatis……)

      当然,每个公司用到的框架可能都不太一样,但是他们的原理是相通的,我们只要学习会一套框架,然后能够举一反三,构建出自己的知识网,然后就会很快的适应新的知识了。
      首先,今天我们来一起学习一下Structs2。之后会继续介绍Hibernate和spring的学习。

一、概念

      Struts2框架是一个轻量级的MVC流程框架,轻量级是指程序的代码不是很多,运行时占用的资源不是很多,MVC流程框架就是说它是支持分层开发,控制数据的流程,从哪里来,到那里去,怎么来,怎么去的这样一个框架

二、原理

SSH框架——走进Struts2_第2张图片

一个请求在Struts2框架中的处理大概分为以下几个步骤

客户端初始化一个指向Servlet容器(例如Tomcat)的请求
这个请求经过一系列的过滤器(Filter)
(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
接着FilterDispatcher被调用, 它是控制器的核心,就是mvc中c控制层的核心,通过询问ActionMapper来决定这个请是否需要调用某个Action 。
如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 
ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取。
同时ActionProxy创建一个ActionInvocation的实例。ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper。

三、使用

1.导入六个lib包

commons-fileupload-1.2.1.jar
commons-logging-1.0.4.jar
freemarker-2.3.15.jar
ognl-2.7.3.jar
struts2-core-2.1.8.jar
xwork-core-2.1.6.jar

2.配置web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns=" http://java.sun.com/xml/ns/javaee" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
  <welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
  </welcome-file-list> 
  <display-name>Struts2.1 Hello World</display-name> 
  <filter> 
   <filter-name>struts2</filter-name> 
   <filter-class> org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 
  </filter> 
  <filter-mapping> 
   <filter-name>struts2</filter-name> 
   <url-pattern>/*</url-pattern> 
  </filter-mapping> 
</web-app>

3.在src下创建struts.xml,并配置

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" " http://struts.apache.org/dtds/struts-2.1.dtd"> 
    <struts>
     <!-- 基本的配置内容 -->
     <!-- package元素的name属性指的是包名, extends属性表示继承 struts-default这个包 --> 
     <package name="struts2" extends="struts-default">
     <!-- action元素的name属性值对应Form表单的action属性值,class属性表示要处理的那个action类,这里是提交给LoginAction处理 --> 
      <action name="login" class="com.test.action.LoginAction">
       <!-- result元素的name属性值对应LoginAction中被调用的那个方法的返回值,根据返回值去匹配name属性,然后跳转到相应的JSP页面 --> 
        <result name="success">/success.jsp</result>
       <result name="error">/error.jsp</result>
      </action> 
     </package> 
    </struts>

4.创建实体类model

实体类是一个普通的POJO类

5.创建dao包

创建dao.impl包

6.创建service包

7.创建action包

action类继承ActionSupport 默认重写execute()或者自定义实现方法

8.根据struts.xml配置文件内的result元素创建相应的JSP页面

四、比较

      struts2相对于struts1来说简单了很多,并且功能强大了很多,我们可以从几个方面来看:

  • 从体系结构来看

      struts2大量使用拦截器来出来请求,从而允许与业务逻辑控制器 与 servlet-api分离,避免了侵入性;而struts1.x在action中明显的侵入了servlet-api.

  • 从线程安全分析

      struts2.x是线程安全的,每一个对象产生一个实例,避免了线程安全问题;而struts1.x在action中属于单线程。

  • 性能方面

      struts2.x测试可以脱离web容器,而struts1.x依赖servlet-api,测试需要依赖web容器。

  • 请求参数封装对比

      struts2.x使用ModelDriven模式,这样我们 直接 封装model对象,无需要继承任何struts2的基类,避免了侵入性。

  • 标签的优势

      标签库几乎可以完全替代JSTL的标签库,并且 struts2.x支持强大的ognl表达式。

总结:

      一个比较优秀的框架可以帮着我们更高效,稳定的开发合格的产品,不过我们也不要依赖框架,我们只要知道了原理,理解了思想,我们就可以在这个基础上创造出属于我们自己的框架!让我们站在巨人身上,去发现,去创新。

你可能感兴趣的:(java,框架,struts,ssh)