zoukankan      html  css  js  c++  java
  • Struts详解

    1.什么是MVC?

      MVC是Model,View,Controller的缩写,MVC是Application开发的设计模式,

    也就是大家所知道的Model2.在MVC的设计模式中,它包括三类对象:(1)模型(Model)对象:是应用程序的主体部分。

    (2)视图(View)对象:是应用程序中负责生成用户界面的部分。(3)控制器(Control)对象:是根据用户的输入,

    控制用户界面数据显示及更新Model对象状态的部分。即要求在Application开发中你把商业逻辑,界面显示,数据分离。

    2.MVC有哪些优缺点?

       优点:

    1)视图控制模型分离, 提高代码重用性。

    2)提高开发效率。

    3)便于后期维护, 降低维护成本。

    4)方便多开发人员间的分工。

      缺点:

    1)清晰的构架以代码的复杂性为代价, 对小项目优可能反而降低开发效率。

    2)运行效率相对较低

    3)目前没有比较好的rich 客户端的解决方案

    4) 控制层和表现层有时会过于紧密,导致没有真正分离和重用

    3. 请简述struts1的工作流程

       

        工作机制: 
    Struts的工作流程: 
    在web应用启动时就会加载初始化ActionServlet,ActionServlet从 
    struts-config.xml文件中读取配置信息,把它们存放到各种配置对象 
    当ActionServlet接收到一个客户请求时,将执行如下流程. 
    -(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息; 
    -(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中; 
    -(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法; 
    -(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象, 就表示表单验证成功; 
    -(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的 Action实例不存在,就先创建这个实例,然后调用Action的execute()方法; 
    -(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件; 
    -(7)ActionForward对象指向JSP组件生成动态网页,返回给客户; 

    4. Action和ActionForm是单例的吗?Action是线程安全的吗?

      

       Action是单例的,不是线程安全的

       每当有一次用户的请求,ActionFrom就会被创建一次

    5。struts1和struts2的区别和对比?

    Action 类:

    • Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。

    • Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去 实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

    线程模式:

    • Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。

    • Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

    Servlet 依赖:

    • Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。

    • Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。

    可测性:

    • 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。

    • Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。

    捕获输入:

    • Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经 常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有冗余的javabean)。

    • Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。

    表达式语言:

    • Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。

    • Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL).

    绑定值到页面(view):

    • Struts 1使用标准JSP机制把对象绑定到页面中来访问。

    • Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。

    类型转换:

    • Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。

    • Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。

    校验:

    • Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。

    • Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性

    Action执行的控制:

    • Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

    • Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

    6.简述Struts Form Bean的表单验证流程
       

        1、当用户提交了HTML表单,Struts框架自动把表单数据组装到ActionForm Bean中。
        2、接下来Struts框架会调用ActionForm Bean的validate()方法进行表单验证。
        3、如果validate()方法返回的ActionErrors 对象为null,或者不包含任何ActionMessage对象,就表示没有错误,数据验证通过。
        4、如果ActionErrors中包含ActionMessage对象,就表示发生了验证错误,Struts框架会把ActionErrors对象保存到request范围内,然后把请求转发到恰当的视图组件,视图组件通过<html:errors>标签把request范围内的ActionErrors对象中包含的错误消息显示出来,提示用户修改错误。
    对于以上流程的步骤4 。如果ActionForm的validate()方法返回一个包含一个或多个ActionError的ActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含客户提交表单的JSP组件。在这种情况下,不会再创建Action对象并调用Action的execute方法。

    7. Action是不是线程安全的?如果不是 有什么方式可以保证Action的线程安全?如果是,说明原因


    不是

    声明局部变量,或者扩展RequestProcessor,让每次都创建一个Action,或者在spring中用scope="prototype"来管理

  • 相关阅读:
    谎言,
    happy,
    架构,
    休闲游戏随想,
    IOS响应者链
    application 几个方法
    ios block 循环引用
    洛谷 P 1133 教主的花园
    Codevs 1148 == 洛谷 P1057 传球游戏
    Codevs 1169 == 洛谷 P1006 传纸条
  • 原文地址:https://www.cnblogs.com/exe19/p/5382206.html
Copyright © 2011-2022 走看看