• springmvc和structs2的区别


    1、从安全性角度分析spring mvc和struts2的区别:

    spring mvc:controller

    1.spring mvc 默认controller是单实例(通过注解@Scope(“prototype”)变了多实例);
    2.单实例时非线程安全,不要在controller中定义成员变量(实例变量);
    3.单实例时,web容器启动时便开始实例化controller,全局唯此实例,每次访问都使用此实例响应;
    4.多实例时,每一次访问,基本&多数(发现偶尔也会重复使用实例)会产出新实例对应响应;
    5.单实例时,并发请求,访问synchronized同步方法时,彼此阻塞影响(synchronized方法实例锁);
    6.多实例时,并发请求,访问synchronized同步方法时,彼此不影响(synchronized方法实例锁);

    struts2:action

    1.struts2为每个线程提供一个action实例,多线程访问时不会出现问题。当使用spring管理struts2的action实例对象时,scope必须配置为prototype或者session;若配置为singleton则多线程访问时会出现问题,例如actionMessage,fieldError等信息会累加,多用户访问时有的用户访问到的是另一个用户的数据。
    2.scope=“prototype”是为每个请求提供一个action实例(与struts2的机制是一样的)。
    scope=“session”是为每个会话提供一个action实例。
    3.通常使用prototype,即让spring容器为每个请求提供一个action实例,好处是服务器端不用维护用户状态信息,否则使用session服务器端必须存储状态信息,用户多时占用服务器端内存过多。使用prototype时,必须自己在客户端维护用户的状态,每次访问服务端时将相应状态信息提交给服务器。
    例如scope=“prototype”时,页面一般< input name="id" type="hidden" value="${id}"/>用来存储用户的id信息,访问action时提交到server端供action中函数使用。而使用scope=“session”时,页面不必使用hidden的对象隐藏id信息,只要服务端获取过用户的id,action中的id属性即会保存这个信息。

    2、从整体上分析springmvc和struts2的区别 

    1、springmvc基于方法开发的,struts2基于类开发的。
    springmvc将url和controller方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括了一个method。方法执行结束,形参数据销毁。
    struts2的action类中的所有方法用的都是action类中的成员变量,一旦方法变得很多的时候,我们就会不知道action类中那么多成员变量是给那个方法去使用的。十分混乱。
    但是springmvc的所有参数都是定义为方法的形参,这样使用什么方法就将参数注入至对应方法的形参,所以springmvc的controller开发类似service开发。
    2、springmvc可以进行单例开发,并且建议使用单例开发,struts2通过类的成员变量接收参数,无法使用单例,只能使用多例。
    3、经过实际测试,struts2速度慢,在于使用struts标签,如果使用struts建议使用jstl。
      最后我们无法实际定义springmvc与struts到底谁好谁坏,只能说struts早期由于用的比较多,它的漏洞就比较多。建议如果使用struts,就使用最新的包,因为以前的可能会有漏洞。但springmv目前几乎没有漏洞,这就是springmvc最近几年开始流行起来的原因,再有一个springmvc是基于方法开发的,更接近于service开发。


    springmvc总结
    springmvc框架:
    DispatcherServlet前端控制器:接收request,进行response
    HandlerMapping处理器映射器:根据url查找Handler。(可以通过xml配置方式,注解方式)
    HandlerAdapter处理器适配器:根据特定规则去执行Handler,编写Handler时需要按照HandlerAdapter的要求去编写。
    Handler处理器(后端控制器):需要程序员去编写,常用注解开发方式。
    Handler处理器执行后结果 是ModelAndView,具体开发时Handler返回方法值类型包括 :ModelAndView、String(逻辑视图名)、void(通过在Handler形参中添加request和response,类似原始 servlet开发方式,注意:可以通过指定response响应的结果类型实现json数据输出)
    View resolver视图解析器:根据逻辑视图名生成真正的视图(在springmvc中使用View对象表示)
    View视图:jsp页面,仅是数据展示,没有业务逻辑。

    注解开发:
    使用注解方式的处理器映射器和适配器:

    <!--注解映射器 -->
             <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    
    <!--注解适配器 -->
             <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

    在实际开发,使用<mvc:annotation-driven>代替上边处理器映射器和适配器配置。


    @controller注解必须要加,作用标识类是一个Handler处理器。
    @requestMapping注解必须要加,作用:
    1、对url和Handler的方法进行映射。
    2、可以窄化请求映射,设置Handler的根路径,url就是根路径+子路径请求方式
    3、可以限制http请求的方法
    映射成功后,springmvc框架生成一个Handler对象,对象中只包括 一个映射成功的method。


    注解开发中参数绑定:
    将request请求过来的key/value的数据(理解一个串),通过转换(参数绑定的一部分),将key/value串转成形参,将转换后的结果传给形参(整个参数绑定过程)。
    springmvc所支持参数绑定:
    1、默认支持很多类型,HttpServletRequest、response、session、
    model/modelMap(将模型数据填充到request域)
    2、支持简单数据类型,整型、字符串、日期。。
    只要保证request请求的参数名和形参名称一致,自动绑定成功
    如果request请求的参数名和形参名称不一致,可以使用@RequestParam(指定request请求的参数名),@RequestParam加在形参的前边。
    3、支持pojo类型
    只要保证request请求的参数名称和pojo中的属性名一致,自动将request请求的参数设置到pojo的属性中。
    注意:形参中即有pojo类型又有简单类型,参数绑定互不影响。
    自定义参数绑定:
    日期类型绑定自定义:
    定义的Converter<源类型,目标类型>接口实现类,比如:
    Converter<String,Date>表示:将请求的日期数据串转成java中的日期类型。
    注意:要转换的目标类型一定和接收的pojo中的属性类型一致。
    将定义的Converter实现类注入到处理器适配器中。

    <mvc:annotation-driven conversion-service="conversionService">
    </mvc:annotation-driven>
    <!-- conversionService -->
    <bean id="conversionService"  class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <!-- 转换器 -->
    <property name="converters">
             <list>
                     <bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>
             </list>
    </property>
    </bean>

    springmvc和struts2区别:
    springmvc面向方法开发的(更接近service接口的开发方式),struts2面向类开发。

    springmvc可以单例开发,struts2只能是多例开发。

  • 相关阅读:
    排序算法(2)-冒泡排序及优化
    [转]Java泛型详解
    [转]Java泛型详解
    02-机器学习_(knn分类算法与应用)
    01-机器学习_(python数据类型详解)
    流量运营项目说明
    数据仓库星型模型vs雪花模型
    数据仓库命名规范
    数据仓库建模
    数据仓库
  • 原文地址:https://www.cnblogs.com/mmzs/p/8185100.html
Copyright © 2020-2023  润新知