为开发团队选择一款优秀的MVC框架是件难事儿,在众多可行的方案中决择需要很高的经验和水平。你的一个决定会影响团队未来的几年。要考虑方面太多:

1、简单易用,以提高开发效率。使小部分的精力在框架上,大部分的精力放在业务上。
2、性能优秀,这是一个最能吸引眼球的话题。
3、尽量使用大众的框架(避免使用小众的、私有的框架),新招聘来的开发人员有一些这方面技术积累,减低人员流动再适应的影响。

如果你还在为这件事件发愁,本文最适合你了。选择Spring MVC吧。

Spring MVC是当前最优秀的MVC框架,自从Spring 2.5版本发布后,由于支持注解配置,易用性有了大幅度的提高。Spring 3.0更加完善,实现了对Struts 2的超越。现在越来越多的开发团队选择了Spring MVC。

Struts2也是非常优秀的MVC构架,优点非常多比如良好的结构,拦截器的思想,丰富的功能。但这里想说的是缺点,Struts2由于采用了值栈、OGNL表达式、struts2标签库等,会导致应用的性能下降,应避免使用这些功能。而Struts2的多层拦截器、多实例action性能都很好。可以参考我写的一篇关于Spring MVC与Struts2与Servlet比较的文章《Struts2、SpringMVC、Servlet(Jsp)性能对比 测试》

Spring3 MVC的优点:
Spring3 MVC使用简单,学习成本低。学习难度小于Struts2,Struts2用不上的多余功能太多。呵呵,当然这不是决定因素。
Spring3 MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序(指MVC部分)
Spring3 MVC的灵活是你无法想像的,Spring框架的扩展性有口皆碑,Spring3 MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制。

让我们能非常简单的设计出干净的Web层和薄薄的Web层;
进行更简洁的Web层的开发;
天生与Spring框架集成(如IoC容器、AOP等);
提供强大的约定大于配置的契约式编程支持;
能简单的进行Web层的单元测试;
支持灵活的URL到页面控制器的映射;
非常容易与其他视图技术集成,如Velocity、FreeMarker等等,因为模型数据不放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用)
非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API;
提供一套强大的JSP标签库,简化JSP开发;
支持灵活的本地化、主题等解析;
更加简单的异常处理;
对静态资源的支持;
支持Restful风格。

1.web.xml文件的配置

典型配置

配置一

<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:springmvc-servlet.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>

配置二

<servlet>
  <servlet-name>dispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <init-param>
    <description>加载/WEB-INF/spring-mvc/目录下的所有XML作为Spring MVC的配置文件
    </description>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-mvc/*.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>  

1.1.init-param

(1)、如果不指定spring配置文件路径,也就是不写init-param,那么应用约定大于配置原则,默认为web-inf/[servlet名称]-servlet.xml配置文件.

(2)、部署之后,classes目录就在web-inf目录下.<param-value>/WEB-INF/classes/springMVC.xml</param-value>

(3)、替代方法2的更好的方式<param-value>classpath:springMVC.xml</param-value>

(4)、多个值用逗号分隔

(5),支持模糊匹配,*代表任意文件,**代表可以跨越目录的通配符.

最佳实践是使用<init-param>,把配置文件放在classpath下,即<param-value>classpath:任意名称.xml</param-value>

    <init-param>
        <description>
        加载/WEB-INF/spring-mvc/目录下的所有XML作为Spring MVC的配置文件
        </description>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-mvc/*.xml</param-value>
      </init-param>

1.2.url-pattern

servlet路径常见有如下两种
(1)./拦截全部
(2).*.do 或者*.action或者*.htm等,后缀是任意的,只要与Controller的映射一致即可,例如写作/user/add.do,/user/add.htm.这是最传统的方式,最简单也最实用,不会导致静态文件(jpg,js,css)被拦截。
直接写'*'是会报错的,直接写/*也是错误的.Servlet跟Listener不一样,Servlet像文件一样,Listener像文件夹一样.所以'/*'不能作为Servlet的地址.Servlet的地址必须像一个文件一样.

最佳实践是使用'/'拦截全部.

1.3 ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别

一个应用程序可以有多个ApplicationContext上下文,通过ContextLoader和DispatcherServlet两种配置可以得到两个ApplicationContext对象,这两个对象所在的位置不同,用途也不一样.其中DispatcherServlet的ApplicationContext是必需的.

ContextLoaderListener方式

<servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath*:applicationContext*.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
      <url-pattern>*.do</url-pattern>
  </servlet-mapping>

DispatcherServlet方式

<servlet>
    <servlet-name>mvcServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:/spring/config/applicationContextMVC.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>  

ContextLoaderListener中加载的context成功后,spring 将 applicationContext存放在ServletContext中key值为"org.springframework.web.context.WebApplicationContext.ROOT"的attribute中.(servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context));可以通过WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext)或WebApplicationContextUtils.getWebApplicationContext(servletContext)方法来获取对应的applicationContext。

网上许多地方写得很不清楚,具体怎么初始化的还需要研究研究.

1.4.编码过滤器

编码过滤器的作用是把请求的编码类型编程utf-8

<filter>
    <filter-name>encodingFilter </filter-name>
        <filter-class>
            org.springframework.web.filter.CharacterEncodingFilter
        </filter-class>
    <init-param>
        <param-name>encoding </param-name>
        <param-value>UTF-8 </param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding </param-name>
        <param-value>true </param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter </filter-name>
    <url-pattern>*.do </url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern> 

2.spring第一步:从配置文件里读取spring配置

ApplicationContext context = new ClassPathXmlApplicationContext("SpringHelloWorld.xml");
会报错资源泄漏,因为ClassPathXmlApplicationContext这个类加载了文件资源,一直没有释放。ClassPathXmlApplicationContext这个类有close()方法,而ApplicationContext这个类却没有close()方法,ApplicationContext是ClassPathXmlApplicationContext的父类。
写法有如下三种:
写法一:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("SpringHelloWorld.xml");
context.close();
写法二:
try(ApplicationContext context = new ClassPathXmlApplicationContext("SpringHelloWorld.xml")){
......
}

写法三:

把ApplicationContext context = new ClassPathXmlApplicationContext("SpringHelloWorld.xml");这个context变量设置为类的成员变量,这样就不需要管理啥时候释放了.

3.springmvc-servlet.xml的配置

3.1根节点引入命名空间

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd
 http://www.springframework.org/schema/mvc
 http://www.springframework.org/schema/mvc/spring-mvc.xsd">

根节点是beans,它默认的命名空间是beans命名空间,其他命名空间包括xsi,context,mvc,util,aop,tx等,其中xsi是XML标准中自带的,其余是spring的.通过xsi:schemaLocation来定义命名空间的定义位置.

如果schemaLocation不写版本号,那么默认就是最新的.所以最好不要写版本号.

3.2属性的两种写法(以视图解析器为例)

p:属性名和子标签效果是一样的.

  <!-- scan the package and the sub package -->
  <context:component-scan base-package="test.SpringMVC"/>
  <!-- don't handle the static resource -->
  <mvc:default-servlet-handler />
  <!-- configure the InternalResourceViewResolver -->
  视图解析器写法一
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      id="internalResourceViewResolver">
    <!-- 前缀 -->
    <property name="prefix" value="/WEB-INF/jsp/" />
    <!-- 后缀 -->
    <property name="suffix" value=".jsp" />

  </bean>
  视图解析器写法二
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/jsp/" p:suffix=".jsp" />

3.3通过xml进行映射

注解方式比XML方式更好,但是需要了解XML方式

    <bean id="urlMapping"
       class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
       <property name="mappings">
           <props>
              <prop key="index.htm">indexController</prop>
              <prop key="test.htm">testController</prop>
           </props>
       </property>
    </bean>
     <!-- 指定了表现层资源的前缀和后缀 -->
    <bean id="viewResolver"
       class="org.springframework.web.servlet.view.InternalResourceViewResolver"
       p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />

    <!--请求/处理单元关系映射-->
    <bean name="indexController"
       class="org.springframework.web.servlet.mvc.ParameterizableViewController"
       p:viewName="index" />
    <bean name="testController" class="com.zhkj.cms.controller.TestController"
       p:commandClass="com.zhkj.cms.controller.TestFrom"
       p:fail_view="fail"
       p:success_view="success" />

3.4文件上传

 <!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -->
 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding" value="utf-8" />
       <property name="maxUploadSize" value="10485760000" />
       <property name="maxInMemorySize" value="40960" />
 </bean>

解析时有两种写法:方法一,手动解析

 @RequestMapping(value="upload2")
 public String upLoad2(HttpServletRequest request, HttpServletResponse response)
   throws IllegalStateException, IOException{
  //解析器解析request的上下文
  CommonsMultipartResolver multipartResolver =
    new CommonsMultipartResolver(request.getSession().getServletContext());
  //先判断request中是否包涵multipart类型的数据,
  if(multipartResolver.isMultipart(request)){
   //再将request中的数据转化成multipart类型的数据
   MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
   Iterator iter = multiRequest.getFileNames();
   while(iter.hasNext()){
    MultipartFile file = multiRequest.getFile((String)iter.next());
    if(file != null){
     String fileName = file.getOriginalFilename();
     String path = "D:/" + fileName;
     File localFile = new File(path);
     //写文件到本地
     file.transferTo(localFile);
    }
   }
  }
  return "/success";
 }

方法二:

    public String login(@Valid UserInfo userInfo, BindingResult result, @RequestParam MultipartFile[] files, Model model) {
         ......
 }

3.5处理静态资源

不需要使用<mvc:resources>说明那些文件是资源

<mvc:default-servlet-handler />

spring MVC学习笔记的更多相关文章

  1. Spring MVC 学习笔记一 HelloWorld

    Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...

  2. Spring MVC 学习笔记(整理)

    SpringMVC学习 1.概述 Spring MVC是一种基于Java实现MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行解耦,基于请求-响应模型帮助我们 ...

  3. Spring mvc 学习笔记

    记录下学习spring-mvc的技术要点,项目结构路径如下: 1. 首先要在web.xml中添加Servlet和filter的配置: <!-- 转码,防止乱码--> <filter& ...

  4. Spring MVC学习笔记——SiteMesh的使用(转)

    转自 SiteMesh的使用 SiteMesh的介绍就不多说了,主要是用来统一页面风格,减少重复编码的. 它定义了一个过滤器,然后把页面都加上统一的头部和底部. 需要先在WEB-INF/lib下引入s ...

  5. Spring MVC学习笔记--认识SpringMVC

    Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框 ...

  6. Spring MVC 学习笔记 json格式的输入和输出

    Spring mvc处理json需要使用jackson的类库,因此为支持json格式的输入输出需要先修改pom.xml增加jackson包的引用 <!-- json --> <dep ...

  7. spring mvc学习笔记一:hello world

    下面是创建springmvc简单案例的步骤: 项目的目录结构如下: 此案例使用maven构建. 第一步:创建动态web工程,然后项目->configure->convert to mave ...

  8. Spring MVC学习笔记——用户增删该查和服务器端验证

    建立一个动态web项目,起名为SpringMVC_crud 导包,其中包括jstl的一些包等 1.先写一个User.java,是用户类 文件User.java文件 package org.common ...

  9. Spring MVC学习笔记——Welcome

    参考: http://blog.csdn.net/hehexiaoyou/article/details/23747617 http://www.codingyun.com/article/47.ht ...

随机推荐

  1. 前端工程师技能之photoshop巧用系列第一篇——准备篇

    × 目录 [1]作用 [2]初始化 [3]常用工具[4]快捷键 前面的话 photoshop是前端工程师无法回避的一个软件,这个软件本身很强大,但我们仅仅需要通过这个工具来完成基本的切图工作即可.本文 ...

  2. mysql去重

    select a.id,a.ssmz,(select count(ssmz) from shop_tourist_key b where b.ssmz=a.ssmz) as count        ...

  3. Python之路----------生成器

    一.列表生成式 想想如何创建一个列表[0,1,2,3,4,5] l = [0,1,2,3,4,5] 如果上面的列表元素足够多的话,是不是会写很多代码?看看列表生成式怎么写 #列表生成式 l = [x ...

  4. m.jd.com首页中的js效果

    m.jd.com中的部分js效果 昨天把m.jd.com的首页布局写好了,今天写一下首页中部分js效果.头部背景色透明度的改变,焦点图轮播,京东快报的小轮播,以及秒杀倒计时.这里html,css样式就 ...

  5. QBus 关注并推送实时公交信息

                                            后台服务器定时根据关注列表,查询最近车辆,发送邮件进行推送                

  6. bat

    1.输出系统时间,利用系统时间做文件名 @echo offset filename=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%ti ...

  7. Java:String和Date、Timestamp之间的转

    Java:String和Date.Timestamp之间的转 一.String与Date(java.util.Date)互转 1.1 String -> Date String dateStr  ...

  8. 《SQL Server企业级平台管理实践》读书笔记——当我们的备份都已经损坏的时候该怎么办

    作为数据库管理员最最痛苦的莫过于,当数据库宕机的时候需要找备份,但在这个时候突然发现备份文件也是坏的,这就意味着数据会丢失,为此可能会丢掉职位,饭碗不保,所以为此,我们一定要保证好备份的完整性,一般发 ...

  9. Codeforces Round #366 (Div. 2) B

    Description Peter Parker wants to play a game with Dr. Octopus. The game is about cycles. Cycle is a ...

  10. poj1472[模拟题]

    Instant Complexity Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2017   Accepted: 698 ...