Struts——开源MVC框架

来源:互联网 发布:淘宝swot分析矩阵图 编辑:程序博客网 时间:2024/06/06 02:35

  【简介】   

   Struts是Apache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller〔MVC〕设计模式的应用框架〔Web Framework〕,是MVC经典设计模式中的一个经典产品。struts是一个基于javaee平台的mvc框架,他是属于一个表现层的开发框架,框架是一个模板,模板是一个半成品,自己本身是不能正常运行的。

   Struts最早是作为Apache Jakarta项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高JavaServer Pages 、Servlet、标签库以及面向对象的技术水准。Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架。这个框架之所以叫"Struts",是为了提醒我们记住那些支撑我们房屋,建筑,桥梁,甚至我们踩高跷时候的基础支撑。这也是一个解释Struts在开发Web应用程序中所扮演的角色的精彩描述。当建立一个物理建筑时,建筑工程师使用支柱为建筑的每一层提供支持。同样,软件工程师使用Struts为业务应用的每一层提供支持。它的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。我们仍然需要学习和应用该架构,不过它将可以完成其中一些繁重的工作。如果想混合使用Servlets和JSP的优点来建立可扩展的应用,Struts是一个不错的选择。

   Struts是Apache 基金会Jakarta 项目组的一个Open Source 项目,它采用MVC模式,能够很好地帮助java 开发者利用J2EE开发Web应用。和其他的java架构一样,Struts 也是面向对象设计,将MVC模式"分离显示逻辑和业务逻辑"的能力发挥得淋漓尽致。Structs 框架的核心是一个弹性的控制层,基于如 Java Servlets,JavaBeans,ResourceBundles与XML等标准技术,以及 Jakarta Commons 的一些类库。Struts由一组相互协作的类(组件)、Servlet以及jsp tag lib组成。基于struts构架的web应用程序基本上符合JSP Model2的设计标准,可以说是一个传统 MVC设计模式的一种变化类型。

   【框架】

   struts是在jsp Model2的基础上实现的一个MVC框架,具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发。struts可以清晰地区分控制,事务逻辑和外观,从而简化了开发应用程序的过程。

   Struts对Model,View和Controller都提供了对应的组件。

   模型:JavaBean,EJB组件。

   视图:Jsp,struts客户化标签。

   控制器:ActionServlet,Action。

      

   流程:web客户端发出请求(request),ActionServlet系统核心(中央)控制器截取相关URL,通过struts-config.xml配置文件分发(dispatch)给不同的Action进行处理,Action调用model返回,将转向的信息转给ActionServlet,再转给视图(jsp)显示到客户端。

  具体流程:

   1、服务器启动,Web应用启动时就会加载web.xml初始化actionServlet和记载struts配置文件(struts-config.xml),读配置信息到内存中,供以后action调用
   2、用户通过客户端向服务器发出一个请求,http://localhost:8080/struts_login/login.do 
   3、tomcat会创建出HttpRequest和HttpResponse实例,并根据用户的Method请求方式,调用中央控制器的doGet或者doPost方法;
   我们已经在web.xml配置了所有符合某特定格式的请求都将由struts指定的Servlet来处理。比如:只要是以.do结尾的请求(*.do)都由 org.apache.struts.action.ActionServlet来对其进行处理.ActionServlet会拿到用户的请求,并且去分析这个URL,ActionServlet中央控制器会截下 /login. 截下来之后,它是为了去struts-config.xml这个配置文件里面找<action>标签path属性的值等于所截部分的那个 Action,将Action标签里面的信息放在ActionMapping里面。
   4、根据ActionMapping中的name名称查找ActionForm,如果配置了ActionForm,那么就到request或session中查找,如果在request或session中存在已经创建的ActionForm,那么将返回;如果不存在,那么会根据ActionForm的完成路径采用反射进行创建,再将创建好的ActionForm放到reqeust或session中
   5、首先执行ActionForm中的reset方法进行重置,然后得到表单中所有输入域的name名称,再调用request.getParameterValues(),根据name名称得到相应的值,最后将表单中的数据全部放到一个map中,map中的key为表单输入域的名称,map的value位表单输入域的值(字符串数组),接下来调用一个第三方组件BeanUtils,将Map中的值,根据ActionForm中的setter方法设置到ActionForm上。
   6、根据Action的完成类名称到Map中查找,如果存在就在返回Action对象,否则根据Action类的完整名称采用反射去创建,再将创建好的Action放到Map中。所以struts1的Action是单实例的,存在线程安全问题。找到对应的action之后,ActionServlet会把表单提交的数据给存放(生成对应调用 set/get方法)到struts-config中相应的action标签的name属性值指定的actionform类中(若有, [actionform的子类,并且在form-bean标签中配置了,若要进行数据验证可以在actionform中覆盖validate方法,推荐使用js,减轻服务器负担]).同时把actionform和当前HttpServletrequest 对象注入到代调用的action方法中.
   7、执行用户自定义的Action中的Execute方法,将ActionMapping,ActionForm,request,response传递过去,将ActionForward返回给ActionServlet。
   8、根据返回的ActionForward完成转向,ActionForward对象根据此action配置的<forward>匹配name进而调转到对应path的jsp页面上。

   Model部分

 由JavaBean组成,ActionForm用于封装用户的请求参数,封装成ActionForm对象,该对象被ActionServlet转发给Action,Action根据ActionForm里面的请求参数处理用户的请求。JavaBean则封装了底层的业务逻辑,包括数据库访问等。

   View部分

   该部分采用JSP实现,对应上图的JSP部分。Struts提供了丰富的标签库,通过标签库可以减少脚本的使用,自定义的标签库可以实现与Model的有效交互,并增加了现实功能。

   Controller组件有两个部分组成——系统核心控制器(ActionServlet),业务逻辑控制器(Action)。

   系统核心控制器,对应上图的ActionServlet。该控制器由Struts框架提供,继承HttpServlet类,因此可以配置成标注的Servlet。该控制器负责拦截所有的HTTP请求,然后根据用户请求决定是否要转给业务逻辑控制器。

   业务逻辑控制器,对应上图的Action部分。负责处理用户请求,本身不具备处理能力,而是调用Model来完成处理。

   【实现】

   1、Struts只能应用于web项目,建立Web projcet项目

   2、配置Struts

     a.拷贝struts相关的jar到WEB-INF/lib下

     b.在web.xml文件中配置ActionServlet

     c.提供struts-config.xml(核心配置文件),需要放到WEB-INF下

     

    具体配置过程:

     a.找到相关jar,直接拷贝到WEB-INF/lib下即可。

     b.在web.xml文件中配置ActionServlet

<welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list>  <servlet>      <servlet-name>action</servlet-name>      <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>      <init-param>          <param-name>config</param-name>          <param-value>/WEB-INF/struts-config.xml</param-value>      </init-param>      <init-param>          <param-name>debug</param-name>          <param-value>2</param-value>      </init-param>      <init-param>          <param-name>detail</param-name>          <param-value>2</param-value>      </init-param>      <load-on-startup>2</load-on-startup>  </servlet>    <servlet-mapping>      <servlet-name>action</servlet-name>      <url-pattern>*.action</url-pattern>  </servlet-mapping></web-app>
     c.提供struts-config.xml文件,放到WEB-INF下

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts-config PUBLIC         "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"         "http://struts.apache.org/dtds/struts-config_1_2.dtd"><struts-config></struts-config>   
   3、新建jsp页面,设置页面信息

   4、在src下建立包和相关类(要继承struts相关类)

     a.ActionForm类:定义页面值,get,set方法(这个类需要继承struts.action)

        注意: * 表单的属性必须和ActionForm中的get和set的属性一样
     b.建立一个action类(必须继承struts.action),需要重写(override)execute方法()

       注意:Action中的代码:这些值如何在前台获取

   

     前台jsp通过EL表达式可以获取后台数值

   

   5、通过配置struts-config.xml文件将所有流程串起来

  

   【小结】

    Struts1、Struts2、SpringMVC都是对MVC模式的实现,下次要一起研究一下。Struts1的Action与SpringMVC的Controller一样,都是单例的,不是线程安全的。这就意味着,每个Request请求,系统都会用原有的instance去处理。这虽然减少了对象的创建和垃圾收集的时间,但是处理多线程调用时,Controller不是线程安全的,而Struts2是线程安全的。

0 0
原创粉丝点击