------------------------------- 一、Web开发:Servlet 3开发技术 -------------------------------
1、什么是SERVLET?
Servlet就是一个运行在Web容器中的Java程序,Servlet用来接收和响应从客户端发送过来的请求,通常使用HTTP协议。
Servlet是一个特殊的Java程序,一个基于Java的Web应用通常包含一个或多个Servlet类。Servlet不能够自行创建并执行,它是在Servlet容器中运行的,容器将用户的请求传递给Servlet程序,并将Servlet的响应回传给用户。
Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁。
2、SERVLET的生命周期
Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;请求到达时调用Servlet的service()方法,service()方法会根据需要调用与请求对应的doGet或doPost等方法;当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy()方法。
- (1)用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,此时Servlet中init方法就会被执行。
- (2)之后,用户的每一次请求,服务器都会在新的线程中,来调用Servlet实例的service()方法。在service()方法内部根据请求的方式的不同,来调用对应的doXXX的方法.(get请求调用doGet,post请求调用doPost).
- (3)当Servlet被服务器移除掉,或服务器被关闭时,Servlet的实例就会被销毁,在销毁前destroy方法就会被执行.
3、SERVLET中FORWARD和REDIRECT的区别
重定向(redirect):其实是两次request,第一次,客户端request,A服务器响应,并response回来,告诉浏览器,你应该去B,然后客户端再次向B发出请求。此时可以看到浏览器地址栏中的url变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
请求转发(forward):是服务器内部把对一个request/response的处理权,移交给另外一个.对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。请求转发过程中,传输的信息不会丢失。
请求转发(forward)是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个URL 的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
重定向(redirect)就是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,因此从浏览器的地址栏中可以看到跳转后的链接地址,很明显redirect无法访问到服务器保护起来资源,但是可以从一个网站redirect到其他网站。forward更加高效,所以在满足需要时尽量使用forward(通过调用RequestDispatcher对象的forward()方法,该对象可以通过ServletRequest对象的getRequestDispatcher()方法获得),并且这样也有助于隐藏实际的链接;在有些情况下,比如需要访问一个其它服务器上的资源,则必须使用重定向(通过HttpServletResponse对象调用其sendRedirect()方法实现)。
4、Servlet 3中的异步处理指的是什么?
在Servlet 3中引入了一项新的技术可以让Servlet异步处理请求。该方式非常适合那些执行时间很长,但用户并不需要立即得到结果的请求。
有了异步处理的支持,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。
Servlet异步处理的工作流程:
第一步,需要把你的servlet声明为syncSupport,servlet3 提供了注解的方式,也可以使用web.xml配置的方式。
第二步,实现你的Servlet 的service方法。(1)调用request.startAsync()开启异步模式,该方法将返回AsyncContext对象用于后台线程异步处理该请求。后台线程可使用AsyncContext的getRequest()和getResponse()方法来读取请求和写Response,处理完成后调用AsyncContext.complete()结束请求处理。(2)service方法可以退出了。(servlet 3还支持你将请求异步的dispatch到另一个请求地址)。
像Tomcat这样的Servlet容器,每个请求需要占用它一个线程,直到该请求被处理完才释放。对于那些处理时间长,而且大部分是IO类操作的请求,这样做会很浪费,因为处理它们的容器线程会花很长时间进行等待,却不能为其他请求服务。如果有大量这样的请求,容器的线程就会很快被占满,导致其他请求被迫等待甚至超时。
于是Servlet3 添加了异步请求处理(asynchronous request processing)的新特性,有了它我们就可以把那些处理时间长的IO类请求丢给后台线程去执行,从而可以快速释放容器线程用以服务更多的新请求。这样做可以大大提升我们服务的性能(吞吐、时延和并发上都有改进)。下面将详细介绍怎么使用这个新特性。
有人可能会质疑,既然都有多线程了,还需要异步处理请求吗?答案是肯定的,因为如果一个任务处理时间相当长,那么Servlet或Filter会一直占用着请求处理线程直到任务结束,随着并发用户的增加,容器将会遭遇线程超出的风险,这这种情况下很多的请求将会被堆积起来而后续的请求可能会遭遇拒绝服务,直到有资源可以处理请求为止。
异步特性可以帮助应用节省容器中的线程,特别适合执行时间长而且用户不需要得到结果的任务,如果用户不需要得到结果则直接将一个Runnable对象交给Executor并立即返回即可。
推荐阅读: Servlet3.0 新特性:新的注解支持、异步处理支持、可插拔组件支持
推荐阅读:异步请求:原生Servlet实现、SpringMVC实现、SpringBoot实现
5、Servlet中如何获取用户提交的查询参数或表单数据?
答:可以调用请求对象HttpServletRequest的getParameter()方法,通过参数名获得参数值。如果有包含多个值的参数(例如复选框),可以通过请求对象的getParameterValues()方法获得。当然也可以通过请求对象的getParameterMap()获得一个参数名和参数值的映射(Map)。
6、Servlet中如何获取用户配置的初始化参数以及服务器上下文参数?
答:可以通过重写Servlet接口的init(ServletConfig)方法,并通过ServletConfig对象的getInitParameter()方法来获取Servlet的初始化参数。
可以通过ServletConfig对象的getServletContext()方法获取ServletContext对象,并通过该对象的getInitParameter()方法来获取服务器上下文参数。
当然,ServletContext对象也可通过请求对象的getServletContext()方法来获得。
7、如何设置请求的编码以及响应内容的类型?
答:(1)通过请求对象ServletRequest的 setCharacterEncoding(String)方法可以设置请求的编码,其实要彻底解决乱码问题就应该让页面、服务器、请求和响应、Java程序都使用统一的编码,最好的选择当然是UTF-8;
(2)通过响应对象ServletResponse的 setContentType(String)方法可以设置响应内容的类型,当然也可以通过HttpServletResponsed对象的setHeader(String, String)方法来设置。
8、过滤器有哪些作用和用法?
答:(1)作用:对Web应用来说,过滤器是一个驻留在服务器端的Web组件,它可以截取客户端和服务器之间的请求与响应信息,并对这些信息进行过滤。
(2)过滤流程:当Web容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源相关联。如果有,那么容器将把请求交给过滤器进行处理。在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源。当目标资源对请求作出响应时候,容器同样会将响应先转发给过滤器,在过滤器中你可以对响应的内容进行转换,然后再将响应发送到客户端。
(3)常见用途:对请求进行统一认证、对请求进行记录和审核、对请求的参数数据进行过滤或替换、转换图象格式、对响应内容进行压缩以减少传输量、对请求或响应进行加解密处理、触发资源访问事件、对XML的输出应用XSLT等。
和过滤器相关的接口主要有:Filter、FilterConfig和FilterChain。
Java Web开发中的过滤器(filter)是从Servlet 2.3规范开始增加的功能,并在Servlet 2.4规范中得到增强
9、监听器有哪些作用和用法?
答:(1)监听器的作用:在创建和销毁 application、session、request对象时,或向 application、session、request对象中添加、修改、删除属性时,监听器listener负责监听以上的状态变化,然后自动执行预定义代码的。
(2)监听器分类:
- ServletContextListener:对Servlet上下文的创建和销毁进行监听。
- ServletContextAttributeListener:监听Servlet上下文属性的添加、删除和替换。
- HttpSessionListener:对Session的创建和销毁进行监听。
- HttpSessionAttributeListener:对Session对象中属性的添加、删除和替换进行监听。
- ServletRequestListener:对请求对象的初始化和销毁进行监听。
- ServletRequestAttributeListener:对请求对象属性的添加、删除和替换进行监听。
session的销毁有两种情况:
(1)session超时;
(2)通过调用session对象的 invalidate()方法,使session失效。
10、web.xml文件中,可以配置哪些内容?
web.xml文件,用于配置Web应用的相关信息,如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验证方式、错误页面等。下面是一些开发中常见的配置:
(1)配置Spring上下文加载监听器:加载Spring配置文件并创建IoC容器
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
(2)配置Spring编码过滤器,防止中文乱码
<filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
(3)配置SpringMVC前端控制器DispatcherServlet,匹配所有的请求
<!-- 配置前端控制器DispatcherServlet,并匹配所有的请求 --> <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
(4)配置会话超时时间为10分钟:
<session-config> <session-timeout>10</session-timeout> </session-config>
(5)配置404和Exception的错误页面:
<error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page> <error-page> <exception-type>java.lang.Exception</exception-type> <location>/error.jsp</location> </error-page>
(6)配置安全认证方式:
<security-constraint> <web-resource-collection> <web-resource-name>ProtectedArea</web-resource-name> <url-pattern>/admin/*</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> </login-config> <security-role> <role-name>admin</role-name> </security-role>
补充:如果Web提供了有价值的商业信息或者是敏感数据,那么站点的安全性就是必须考虑的问题。安全认证是实现安全性的重要手段,认证就是要解决 “Are you who you say you are?”的问题。认证的方式非常多,简单说来可以分为三类:
A. What you know? — 口令
B. What you have? — 数字证书(U盾、密保卡)
C. Who you are? — 指纹识别、虹膜识别
在Tomcat中可以通过建立安全套接字层(Secure Socket Layer, SSL)以及通过基本验证或表单验证来实现对安全性的支持。
说明:Servlet3 提供了基于注解的配置方式,可以分别使用@WebServlet、@WebListener、@WebFilter注解,进行Servlet、Listener、Filter组件的配置。
------------------------------- 二、Spring 框架 -------------------------------
1、什么是框架?
框架(Framework):IT语境中的框架,特指为解决一个开放性问题而设计的具有一定约束性的支撑架构,在此结构上可以根据具体问题扩展.安插更多的组成部分.从而更迅速和更方便的构建完整的解决问题的方案.
框架的特点:
- 框架本身一般不完整到可以解决特定问题,但是可以帮助我们快速解决特定问题
- 框架天生就是为了扩展而设计的
- 框架里面可以为后续扩展的组件提供很多辅助性、支撑性的、方便易用的使用工具。框架时常配套提供一些帮助解决某类问题的库或工具.
2、选择使用Spring框架的原因(Spring框架为企业级开发带来的好处有哪些)?
答:
- 非侵入式:支持基于POJO的编程模式的轻量级框架,不强制要求实现Spring框架中的接口或继承Spring框架中的类。
- IoC容器(控制反转、依赖注入):IoC容器帮助应用程序管理对象以及对象之间的依赖关系;对象之间的依赖关系如果发生了改变,只需要修改配置文件而不是修改代码,因为代码的修改可能意味着项目的重新构建和完整的回归测试。
- AOP(面向切面编程):将所有的横切关注功能封装到切面(aspect)中,通过配置的方式将横切关注功能动态添加到目标代码上,进一步实现了业务逻辑和系统服务之间的分离。另一方面,有了AOP程序员可以省去很多自己写代理类的工作。
- MVC支持:Spring的MVC框架是非常优秀的,为Web表示层提供了更好的解决方案。
- 事务管理:Spring以宽广的胸怀接纳多种持久层技术,并为其提供了声明式的事务管理,在不需要一行代码的情况下就能完成事务管理。
- 其他:选择Spring框架的原因还远不止于此,Spring为Java企业级开发提供了一站式选择,你可以在需要的时候使用它的部分和全部,更重要的是,你甚至可以在感觉不到Spring存在的情况下,在你的项目中使用Spring提供的各种优秀的功能。
Spring 是轻量级的J2EE框架,Spring提供了IOC和AOP的支持,主要针对javabean的生命周期进行管理;Spring可以单独使用,也可以跟其它框架组合使用。
3、在Web项目中如何获得Spring的IoC容器?
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
4、介绍一下Spring的两大核心功能
答:(1)控制反转和依赖注入:对象创建的控制权交给Spring容器进行管理。核心原理:工厂模式+反射+配置文件
(2)面向切面编程: 使用动态代理的方式,在方法执行前后或出现异常后做相关逻辑。我们主要使用AOP来做: 事务处理、权限判断、日志记录。
5、什么是IoC和DI?DI是如何实现的?
答:IOC也叫做控制反转,是Inversion of Control的缩写,DI(Dependency Injection)叫依赖注入,是对IoC更简单的诠释。
控制反转是把传统上由程序直接操控的对象的调用权交给Spring容器,通过Spring容器来实现对象组件的装配和管理。所谓的"控制反转"就是对组件对象控制权的转移,从程序代码本身转移到了外部容器,由容器来创建对象并管理对象之间的依赖关系。IoC体现了好莱坞原则 - "Don’t call me, we will call you"。
依赖注入的基本原则:应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由容器负责,查找资源的逻辑应该从应用组件的代码中抽取出来,交给容器来完成。DI是对IoC更准确的描述,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。
6、Spring中自动装配的方式有哪些?
- no:不进行自动装配,手动设置Bean的依赖关系。
- byName:根据Bean的名字进行自动装配。
- byType:根据Bean的类型进行自动装配。
- constructor:类似于byType,不过是应用于构造器的参数,如果有一个Bean与构造器的参数类型相同则可以自动装配,否则会导致错误。
- autodetect:如果有默认的构造器,则通过constructor的方式进行自动装配,否则使用byType的方式进行自动装配。
说明:自动装配没有自定义装配方式那么精确,而且不能自动装配简单属性(基本类型、字符串等),在使用时应注意。
7、Spring中的自动装配有哪些限制?
- 如果使用了构造器注入或者setter注入,那么将覆盖自动装配的依赖关系。
- 基本数据类型的值、字符串字面量、类字面量无法使用自动装配来注入。
- 优先考虑使用显式的装配来进行更精确的依赖注入,而不是使用自动装配。
8、依赖注入时如何注入集合属性?
可以在定义Bean属性时,通过<list> 、<set> 、 <map> 、 <props> 分别为其注入列表、集合、映射和键值对(都是字符串的映射属性)。
9、Spring IoC容器配置Bean的方式?
- 基于XML文件进行配置。
- 基于注解进行配置
- 基于Java程序进行配置(Spring 3+)
10、阐述Spring框架中Bean的生命周期?
答:Spring框架中,一旦把一个Bean纳入Spring IOC容器之中,这个Bean的生命周期就会交由容器进行管理,一般担当管理角色的是BeanFactory或者ApplicationContext,认识一下Bean的生命周期活动,对更好的利用它有很大的帮助。
下面以BeanFactory为例,说明一个Bean的生命周期活动
- Bean的建立, 由BeanFactory读取Bean定义文件,并生成各个实例
- Setter注入,执行Bean的属性 的 DI依赖注入
- BeanNameAware的setBeanName(), 如果实现该接口,则执行其setBeanName方法
- BeanFactoryAware的setBeanFactory(),如果实现该接口,则执行其setBeanFactory方法
- BeanPostProcessor的processBeforeInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processBeforeInitialization()方法
- InitializingBean的afterPropertiesSet(),如果实现了该接口,则执行其afterPropertiesSet()方法
- Bean定义文件中定义init-method
- BeanPostProcessors的processAfterInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processAfterInitialization()方法
- DisposableBean的destroy(),在容器关闭时,如果Bean类实现了该接口,则执行它的destroy()方法
- Bean定义文件中定义destroy-method,在容器关闭时,可以在Bean定义文件中使用“destory-method”定义的方法
推荐阅读:Spring Bean生命周期详解
11、BeanFactory 和 ApplicationContext 对bean的管理上,有什么区别?
- BeanFactory:BeanFactory采用了工厂设计模式,负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期。
- ApplicationContext:提供上述BeanFactory所能提供的功能,除此之外,还提供了更完整的功能支持,如:国际化支持、aop支持、事务支持等。
- BeanFactory在解析配置文件时,并不会初始化对象,只有在使用getBean()时,才会给实例化该对象。而ApplicationContext在解析配置文件时,会将所有对象都进行实例化,调用getBean()方法只是获取对象的过程。
12、Spring中Bean的作用域有哪些?
在Spring的早期版本中,仅有两个作用域:singleton 和 prototype。singleton单例模式下,Bean以单例存在;prototype原型模式下,每次从容器中调用Bean,都会返回一个新的实例。
Spring 2.x中针对WebApplicationContext新增了3个作用域,分别是:
- request(每次HTTP请求都会创建一个新的Bean)
- session(同一个HttpSession共享同一个Bean,不同的HttpSession使用不同的Bean)
- globalSession(同一个全局Session共享一个Bean)。
说明:单例模式和原型模式都是重要的设计模式。一般情况下,无状态或状态不可变的类适合使用单例模式。
在传统开发中,由于DAO持有Connection这个非线程安全对象因而没有使用单例模式;但在Spring环境下,所有DAO类对可以采用单例模式,因为Spring利用AOP和Java API中的ThreadLocal对非线程安全的对象进行了特殊处理。
13、Spring中如何使用注解来配置Bean?有哪些相关的注解?
首先需要在Spring配置文件中增加注解自动扫描配置;然后用@Component、@Controller、@Service、@Repository注解来标注类,由Spring IoC容器来控制类对象的创建。
以上四个注解没有本质区别,只不过@Controller通常用于控制器、@Service通常用于业务逻辑类、@Repository通常用于持久层类(如:DAO)、@Component通常用于普通的类。
14、解释一下什么叫AOP(面向切面编程)?
AOP(Aspect-Oriented Programming)指一种程序设计范型,该范型以一种称为切面(aspect)的语言构造为基础,切面是一种新的模块化机制,用来描述分散在对象、类或方法中的横切关注点(crosscutting concern)。
15、你是如何理解"横切关注"这个概念的?
"横切关注"是会影响到整个应用程序的关注功能,它跟正常的业务逻辑是正交的,没有必然的联系,但是几乎所有的业务逻辑都会涉及到这些关注功能。通常,事务、日志、安全性等关注就是应用中的横切关注功能。
16、你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?
- a. 连接点(Joinpoint):程序执行的某个特定位置(如:某个方法调用前、调用后,方法抛出异常后)。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就是连接点。Spring仅支持方法的连接点。
- b. 切点(Pointcut):如果连接点相当于数据中的记录,那么切点相当于查询条件,一个切点可以匹配多个连接点。Spring AOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。
- c. 增强(Advice):增强是织入到目标类连接点上的一段程序代码。Spring提供的增强接口都是带方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。很多资料上将增强译为“通知”,这明显是个词不达意的翻译,让很多程序员困惑了许久。
- d. 引介(Introduction):引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过引介功能,可以动态的未该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。
- e. 织入(Weaving):织入是将增强添加到目标类具体连接点上的过程,AOP有三种织入方式:①编译期织入:需要特殊的Java编译期(例如AspectJ的ajc);②装载期织入:要求使用特殊的类加载器,在装载类的时候对类进行增强;③运行时织入:在运行时为目标类生成代理实现增强。Spring采用了动态代理的方式实现了运行时织入,而AspectJ采用了编译期织入和装载期织入的方式。
- f. 切面(Aspect):切面是由切点和增强(引介)组成的,它包括了对横切关注功能的定义,也包括了对连接点的定义。
说明: Advice在国内的很多书面资料中都被翻译成"通知",但是很显然这个翻译无法表达其本质,有少量的读物上将这个词翻译为"增强",这个翻译是对Advice较为准确的诠释,我们通过AOP将横切关注功能加到原有的业务逻辑上,这就是对原有业务逻辑的一种增强,这种增强可以是前置增强、后置增强、返回后增强、抛异常时增强和包围型增强。
------------------------------- 三、SpringMVC 框架 -------------------------------
1、什么是MVC模式?
MVC全名是model view Controller,是模型(model)—视图(view)—控制器(Controller)的缩写,是一种软件设计典范.
最简单的实现,就是:jsp(view) + servlet(Controller) + javabean(model)
2、说一下对MVC框架的理解
常用的MVC框架有Struts2、SpringMVC,是为了解决传统的MVC模式(jsp+servlet+javabean)问题而出现的框架.
传统MVC模式存在以下四种问题:
- 1.所有的servlet和servlet映射,都要配置在web.xml中,如果项目太大,web.xml就太庞大,并且不能实现模块化管理.
- 2.Servlet的主要功能就是接受参数,调用逻辑,跳转页面,比如像其他字符编码,文件上传等功能也要写在servlet中,不能让servlet功能单一.
- 3.接受参数比较麻烦,不能通过model接收,只能单个接收,接收完成后转换封装进model.
- 4.跳转页面方式比较单一(forward,redirect),并且当页面名称发生变化时,需要修改servlet源代码.
3、SpringMVC的执行流程
- 1.用户发送请求,被前端控制器(DispatcherServlet)捕获(捕获请求)
- 2.前端控制器进行解析,得到URI,通过URI调用HandlerMapping并获得该Handler配置的所有相关对象(查找Handler)
- 3.前端控制器根据得到的Handler,选择合适的HandlerAdapter,提取Request中的模型数据,填入Handler入参,开始执行Handler,最后返回一个ModelAndView对象.(执行Handler)
- 4.前端控制器根据返回的ModelAndViewm,选择合适的ViewResolver(选择ViewResolver)
- 5.通过ViewResolver结合Model和View来渲染视图,前端控制器将渲染结果返回给客户端(渲染并返回)
4、SpringMVC和Struts2有什么不同?
SpringMVC 和 Struts2有以下六点不同,如下:
- 核心控制器:springmvc是servlet,struts2是filter
- 控制器实例模式:springmvc是单例,strust2是多例。springmvc是基于方法设计,springmvc只有一个实例,每次请求执行对应的方法即可;而struts是基于对象,每发一次请求都会实例一个action对象。所以,理论上,springmvc会比struts2要快。
- 参数传递方式:springmvc通过方法参数,来接收请求参数;而struts2中自身提供多种参数接收,通过valuestack进行传递和赋值。
- interceptor实现机制:springmvc采用独立的aop方式实现;struts2有自己的interceptor机制。
- 异步请求实现方式:Springmvc在方法中使用注解@ResponseBody,自动将数据转成json数据;而struts2是通过插件的方式实现。
- 框架集成方式:springmvc是spring的一个模块,所以spring对于springmvc的控制管理更加简单方便;而struts需要使用xml配置来管理。