`
掌心童话
  • 浏览: 15173 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

探 Spring 3.1之无web.xml式 基于代码配置的servlet3.0应用

阅读更多
        前些天,spring framework 有了新版本3.1的 release。应该是在11年12月13日,由于springframework 的资源下载都得输入些个人信息,系统应该有纪录哪些用户对哪些资源感兴趣,所以我的邮箱有3.1版的release 信息,顺着邮箱点去的网页,有Juergen发的新版本的概述。扫了一眼,对The servlet 3.0 webapplicationInitializer mechanism很感兴趣,故而今天对此特别research了一番。

        穿越:之前在eclipse 里新建servlet3.0的webapp时,就会有创建 web.xml文件与否的选项,很明显这是表明servlet3.0有着不用创建web.xml的机制,自然也就想到了注解式的配置,于是很容易在eclipse的editor里利用代码辅助找到了@WebServlet,@WebFilter , @WebInitParam, @WebListener等注解。它在javax.servlet.annotation下,一般是存于服务器的lib中。如我的用vFabric tc server , 的lib下的serverlt-api.jar中。注解不用看源码,就在eclipse里看它的名字与方法就会用了。也就是说在所写的Servlet, Listener,  Filter代码中直接注解,服务器就可以找到它们,如此一来也就省去了web.xml。 当时的问题在于:所见web程序的大部分web.xml配置,全是第三方框架的类。下载框架的源码再更改后再编译,是一件很烦琐的事情,多人开发时,管理这个重新编译的框架,也是件令人头疼的事。这个不便让我没有去尝鲜.

        也许有人纳闷,我们已经熟于web.xml配置,为什么要弄一个新的配置方法,还得去与之磨合,而且xml文件的易理解与通用性,方便了程序的部署用户修改参数。不试不知道,这个原因你试试后就自然明白了。

       个人观点:首先,节省时间,提高效率。想想hibernate的hbm文件全部融合到实体类中时,我们不再需要时而看看.java文件,时而看看hbm文件。切换editor中的文件本来就是会浪费时间,有时大脑被别的东西打断时,还需要重新点回另一个文件去确保每一个mapping都正确;为了mapping正确,还需要从一个文件反复地切换到另一个文件来进行复制/粘贴,大大降低了开发效率。Spring framework的component-scan也做了同样的合二为一的效果。 那些@Component,@Controller, @Service, @Repository真的是大快人心。 再有就是方便用户的事情,我们完全可以做一个页面的安装程序,让部署用户去看xml文件本来就是一个没有很好UE的做法。

        回到当前:这回spring 3.1的基于代码的web程序初始化,让我假想到了spring将那些@WebXXXXX注解加到了已有的类中,迫不及待地看了一下。结果假想是错误的。

        Well, 首先简要扫盲一下它的用法:

        一句话:实现接口org.springframework.web.WebApplicationInitializer, 覆写public void onStartUp(ServletContext container)throw ServletException方法。
        如下:
public class MyWebAppInitializer implements WebApplicationInitializer {
    		@Override
    		public void onStartup(ServletContext container) {
      		XmlWebApplicationContext appContext = new XmlWebApplicationContext();
      		appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
                /*add self-defined servlet*/
      		ServletRegistration.Dynamic dispatcher =
        		container.addServlet("dispatcher", new DispatcherServlet(appContext));
      		dispatcher.setLoadOnStartup(1);
      		dispatcher.addMapping("/");
    }

 }  

        这个只是简单替代了web.xml文件,并附加了一个简单的添加了servlet配置的示例。ServletContext还可以addFilter,  addListener的 这两个方法的参数就是某个Filter,Listener的一个实例。
对比一下同样的代码在原来的web.xml中:

<servlet>
   <servlet-name>dispatcher</servlet-name>
   <servlet-class>
     org.springframework.web.servlet.DispatcherServlet
   </servlet-class>
   <init-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
   <servlet-name>dispatcher</servlet-name>
   <url-pattern>/</url-pattern>
 </servlet-mapping>

    
     总之, web.xml里的配置全部都可以在这个onStartup方法里。你不用写任何配置,附有servlet3.0支持的服务器会自动找到这个MyWebAppInitializer的onStartup方法从而启动应用。Spring 将applicationContext.xml的spring配置也注解化了,就是说上面代码段的dispatcher-config.xml可以换为:
AnnotationConfigWebApplicationContext rootContext =
		new AnnotationConfigWebApplicationContext();
		rootContext.register(AppConfig.class);
		container.addListener(new ContextLoaderListener(rootContext));



AppConfig是自定义的类,用@Configuration注解即可。


       不过问题来了:这样的设置并没有做到合二为一,只不过是把web.xml文件换成是自定义类,我们还是需要确保所写的Listener/Servlet/Filter是否mapping正确到onStartup方法中。


        其实充斥我脑海的疑问是,服务器到底是怎么找到onStartup方法的。没有任何注解。  Spring在玩儿魔术?再深度research一下,其实很简单。放在下一文章中吧。

  
        经过research,合二为一的事情也很好解决:不用特意写WebApplicationInitialize的实现类,直接在你写的每个Listener/Filter/Servlet中实现该接口并覆写onStartup方法,每个onStartup方法中只向container中添加自身。

        这是我想到的方法,没有尝试。读者们可以试一下,我确定行地通。因为我发现了spring的这个魔术,他们用了30行左右的有效代码,做了一个循环。并且这个短短30行说明这个魔术是我们都可以在10分钟内做到的,其实关键是servlet3.0的强大。我们没有去认真读过文档而已。


   对于实用性,这篇文章足以解决了。代码均复制自spring api: http://static.springsource.org/spring/docs/3.1.x/javadoc-api/中对WebApplicationInitializer的示例.  另外如果期望web.xml与基于代码的配置共存的话,需要将web.xml中版本配置到3.0以上,以下的web.xml都会被ignore掉.


   附:XmlWebApplicationContextAnnotationConfigWebApplicationContext在包org.springframework.web.support
               ContextLoaderListenerorg.springframework.web
               其它未提及包名的类均是javax.servlet中的


有兴趣的朋友可以读一下下一篇<< 究 Spring 3.1之无web.xml式 基于代码配置的servlet3.0应用>>
分享到:
评论

相关推荐

    org.springframework.web.servlet-3.1.0.RELEASE.jar.zip

    《Spring Web MVC框架详解——基于org.springframework.web.servlet-3.1.0.RELEASE.jar》 在Java Web开发领域,Spring框架无疑是最具影响力的框架之一,其中Spring Web MVC是其核心组件,专注于处理Web请求和响应。...

    Tomcat(二) Tomcat实现:Servlet与web.xml介绍 以及 源码分析Tomcat实现细节1

    web.xml是Web应用的部署描述符,它包含了应用的配置信息,如Servlet、Filter、Listener的定义,以及它们之间的映射关系。通过web.xml,Tomcat知道如何正确地初始化和管理Web应用的各个组件。 5. **Tomcat源码分析*...

    spring MVC配置详解

    -- 可以自定义 servlet.xml 配置文件的位置和名称,默认为 WEB-INF 目录下,名称为[&lt;servlet-name&gt;]-servlet.xml,如 spring-servlet.xml --&gt; &lt;param-name&gt;contextConfigLocation &lt;param-value&gt;/WEB-INF/spring-...

    SSH和SSI等框架常用基础配置web.xml

    对于使用SSH(Struts + Spring + Hibernate)和SSI(Struts + Spring + iBatis)等框架的应用程序而言,合理的`web.xml`配置至关重要。本文将详细介绍`web.xml`中的关键配置项,并解释其作用。 #### 一、`web.xml`...

    spring3.1包名解析

    18. `org.springframework.web.servlet-3.1.0.M1.jar`: 提供对Servlet 3.0规范的支持,是Spring MVC的主要组成部分,负责处理HTTP请求和响应。 19. `org.springframework.web.struts-3.1.0.M1.jar`: 与Struts框架的...

    struct2.3+spring3.1+mybits3.1 核心Jar包和配置文件

    "struct2.3+spring3.1+mybits3.1 核心Jar包和配置文件"的组合正是这样一个经典的应用架构,它将Struts2、Spring3.1和MyBatis3.1这三个流行框架整合在一起,为开发者提供了强大的MVC(Model-View-Controller)架构...

    web.xml文件的作用

    `web.xml`文件作为Java EE项目中的核心配置文件之一,对于应用程序的部署、配置和运行至关重要。通过对`web.xml`文件的学习和掌握,开发者能够更加灵活地管理和控制Web应用程序的各种行为,从而提高开发效率和应用...

    spring3.1+xfire1.26

    总的来说,"spring3.1+xfire1.26 全注解"项目展示了如何利用Spring 3.1和XFire 1.26的注解功能,实现无XML配置的Web服务开发,提高了开发效率,降低了维护成本。在实际应用中,这种组合可以方便地创建和部署复杂的...

    struts2.0+hibernate3.1+spring2.0.doc

    1. **web.xml**:定义了应用程序的初始化参数以及Servlet的映射规则。 ```xml &lt;servlet&gt; &lt;servlet-name&gt;action&lt;/servlet-name&gt; &lt;servlet-class&gt;org.apache.struts2.dispatcher.ng.filter....

    springmvc3.1+hibernate3环境搭建架包

    在实际开发中,你可能还需要添加其他的库,例如Spring的测试库(spring-test-3.1.x.jar)来进行单元测试,或者JSTL和EL库(如javax.servlet.jsp.jstl-*.jar和javax.el-*.jar)来实现动态视图。记得根据项目的具体...

    Spring MVC总结(一)

    Spring MVC架构与DispatcherServlet配置 Spring MVC是一种流行的基于Java的Web应用框架,它提供了一个灵活的架构来开发...了解Spring MVC的架构和DispatcherServlet的配置是开发基于Spring MVC的Web应用程序的基础。

    spring3.1MVC+mybatis3.1框架集成及事务,分页使用

    1. **Spring MVC 3.1**:Spring MVC是Spring框架的一个模块,主要处理Web应用中的请求和响应。它提供了模型-视图-控制器(MVC)架构,使得开发人员能够将业务逻辑、数据和用户界面分离。Spring MVC 3.1引入了更多的...

    Spring3.1整合FreeMarker2.3.19

    它通过`org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer`类来配置FreeMarker,并通过`org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver`类来解析视图。 **2. 配置...

    spring 3.1 mvc sample

    Spring MVC 是一个强大的基于Java的Web应用程序开发框架,它属于Spring框架的一部分,专注于处理Web请求和展示数据。在Spring 3.1版本中,引入了许多改进和新特性,旨在提高开发效率和应用性能。这个“spring 3.1 ...

    struts2.0+hibernate3.1+spring2.5的配置

    Struts2.0、Hibernate3.1和Spring2.5是经典的Java企业级开发框架组合,它们在2000年代末至2010年代初广泛用于构建Web应用程序。这个配置组合提供了模型-视图-控制器(MVC)架构、持久化管理和依赖注入等核心功能。 ...

    官方原版源码spring-framework-4.3.25.RELEASE.zip

    此外,它优化了对Servlet 3.1的支持,增强了对WebSocket和Spring Data的改进。 3. **源码结构分析** - **spring-framework-4.3.25.RELEASE-dist.zip**:包含Spring Framework的基础库和核心模块,如core-container...

    SPRING MVC配置过程

    -- 可以自定义 servlet.xml 配置文件的位置和名称,默认为 WEB-INF 目录下,名称为 [&lt;servlet-name&gt;]-servlet.xml,如 spring-servlet.xml --&gt; &lt;param-name&gt;contextConfigLocation &lt;param-value&gt;/WEB-INF/spring...

    集成Hibernate3.6.8+Spring3.0.6+struts2.2.3.1

    `web.xml`是Web应用的部署描述符,其中定义了Servlet、Filter、Listener等组件的配置。对于Struts而言,这里需要配置Struts的DispatcherServlet,它是处理HTTP请求的入口。 #### Struts配置文件:struts.xml `...

    SSH 配置实例: Spring 3.1 + Hibernate 4.2 + Struts 2.3

    开发人员需要编写XML配置文件,如Spring的`applicationContext.xml`和Struts 2的`struts.xml`,来定义框架的配置和应用的组件。 总之,SSH框架的集成使得开发者可以充分利用Spring的依赖注入和事务管理,Hibernate...

    spring-boot-reference.pdf

    27.1. The “Spring Web MVC Framework” 27.1.1. Spring MVC Auto-configuration 27.1.2. HttpMessageConverters 27.1.3. Custom JSON Serializers and Deserializers 27.1.4. MessageCodesResolver 27.1.5. Static...

Global site tag (gtag.js) - Google Analytics