Struts2基础知识

Posted dream_sky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2基础知识相关的知识,希望对你有一定的参考价值。

struts2 操作 action servlet,是通过在web.xml中配置一个filter实现的 

1
2
3
4
5
6
7
8
9
10
11
12
13
<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>
注:现在新版本的struts2已经改成StrutsPrepareAndExecuteFilter,但原理大同小异,我们还按FilterDispatcher讲解
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>


SpringMvc和Struts区别:

一、框架机制

1、Struts2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。
2、Filter在容器启动之后即初始化;服务停止以后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。

二、拦截机制

1、Struts2

a、Struts2框架是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype(否则会出现线程并发问题),然后通过setter,getter吧request数据注入到属性。
b、Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。
c、Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了

        根据action name隐射到对应的处理类,执行处理类中rejectByReviewer的方法调用不同的业务逻辑,返回不同的结果展现不同的页面。

        以action结尾,该请求就会被转入struts2框架来处理

        修改后缀名:<constant name="struts.action.extension" value="do"/> //value中就是你修改的后缀名。比如修改为.do

1
2
3
4
5
6
7
8
9
10
11
12
13
document.frmsubmit.action="supplierInput!rejectByReviewer.action";
 
<action name="supplierInput" class="com.je.imds.handler.ItemHandler">
            <result name="ok">
                /jsp/mailfrmsupplier.jsp
            </result>
            <result name="logInfo">
                /jsp/itemLogMsg.jsp
            </result>
            <result name="success">
                /common/success.jsp
            </result>
        </action>

 
2、SpringMVC
a、SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架。
b、在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。

安全性:

 

  •     spring mvc的action线程安全与否可以通过配置文件指定,在配置实体时,可以指定当前实体为单例还是原型,默认为单例,可以通过scope="prototype"来指定为原型
  • 1、在Controller中使用ThreadLocal变量
  • 2、在spring配置文件Controller中声明 scope="prototype",每次都创建新的controller
  • dao层共用一个成员变量jdbctemplate,而不会出现线程安全的问题,其实spring内部为jdbctemplate这个模板类实现了线程安全,就是使用了ThreadLocal这个Java类来实现
  • struts1 action是单例模式并且必须是线程安全的,因为仅有action的一个实例来处理所有的请求。而strut2 action对面为每一个请求产生一个实例,因为没有线程安全问题。
  • struts2会为每一个请求单独创建一个实例,其内部实际是使用了ThreadLoacl这个对象,将前端来了每个请求生成一个单独的本地线程,各个线程之间互不影响,从而使struts2为线程安全的。

 


三、性能方面
SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。而Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,所以,SpringMVC开发效率和性能高于Struts2。

四、拦截机制
Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大。

五、配置方面
spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。
SpringMVC可以认为已经100%零配置。

六、设计思想
Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。

七、集成方面
SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

 

 

以上是关于Struts2基础知识的主要内容,如果未能解决你的问题,请参考以下文章

android小知识点代码片段

struts2 基础4

struts2请求过程源代码分析

[vscode]--HTML代码片段(基础版,reactvuejquery)

Struts2 s2-032远程代码执行分析

和Struts2框架的初体验