• Spring MVC


    Spring MVC - 配置Spring MVC

     

    写在前面的话:

      现在开始一段新的学习历程:Spring MVC。还是按照原来的三步走学习模式(what、why、how)进行讲解。

    1、Spring MVC是什么(what) 

      Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。

      Spring MVC通过实现Model-View-Controller模式来很好地将数据、业务与展现进行分离。Spring MVC框架围绕DispatcherServlet设计。

      DispatcherServlet的作用是将请求分发到不同的处理器。 Spring MVC框架包括可配置的处理器(handler)映射、视图(view)解析、本地化(local)解析、主题(theme)解析以及对文件上传的支持。

    2、为什么要学Spring MVC(why)

      初学者可能会奇怪可以用Servlet同样可以解决相同的问题,为什么还要使用Spring MVC 框架?它有什么优点?

      没错,从功能上来说servlet完全可以满足我们的需求。如果项目比较小,没有很多的功能需求和页面,直接用servlet更加简单、简洁,Spring MVC反而显得比较麻烦。

      但是当项目变得越来越大,要添加新的需求时,你会发现你要改动许多的地方,而且在改动的时候你要相当清楚你的改动对其它功能有没有副作用。这个时候你会感到很烦躁,逻辑也不再那么清晰。这个时候也是最容易出bug的地方。

      这个时候MVC框架的优点就显现出来了:MVC框架强制性的把业务逻辑层(model)、视图层(view)和程序逻辑层(controller)分开。这样你在扩展新的需求的时候至少你的逻辑是非常清晰的,明白哪些地方是干啥的。这样做也符合了“对扩展开放,对修改关闭”的设计原则(OCP原则)。

    3、怎么使用Spring MVC(how)

      多说不如多做,下面我们就动手准备配置一个简单的采用Spring MVC框架的程序。

      在动手配置之前我们先来了解一下Spring MVC 几个核心的东西:

      DispatchServlet:Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。

      HandlerMappingHandler映射器,将浏览器的请求映射给确定的controller处理。

      Controller:处理请求,并返回ModelAndView

      ViewResolver:视图解析器,在web中应用中查找view对象并返回给用户

      View:视图,只负责展示数据。

      下面是用户发起的请求在Spring MVC中的处理流程图:

      

      

      现在我们就开始创建一个简单的采用Spring MVC的应用:

      A、先来看看项目结构:

      

      大家肯定会说这个项目也太简单了吧!只有一个java文件!

      没错,这个项目确实很简单。因为这个毕竟是一个入门级的文章,我认为没必要弄得很复杂。只要把Spring MVC这个种设计思想和一些需要注意的地方讲清楚就行了,能学会才是最重要的。

      

      B、web.xml作为一个web应用的配置的入口,我们就先从这里顺着思路开始讲起:

      

    复制代码
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     5     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
     6     <display-name></display-name>
     7     
     8     <!-- 配置DispatcherServlet,注意servlet-name,因为程序会去加载这个[springmvc-servlet.xml]配置文件 -->
     9     <servlet>
    10         <servlet-name>springmvc</servlet-name>
    11         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    12         <!-- 程序启动时就加载 -->
    13         <load-on-startup>1</load-on-startup>
    14     </servlet>
    15     <servlet-mapping>
    16         <servlet-name>springmvc</servlet-name>
    17         <!-- 映射路径,所有的用户请求都会通过这个servlet进行处理 -->
    18         <url-pattern>/</url-pattern>
    19     </servlet-mapping>
    20     
    21     <welcome-file-list>
    22         <welcome-file>index.jsp</welcome-file>
    23     </welcome-file-list>
    24     
    25 </web-app>
    复制代码

        

      这里的web.xml也很简单,只配置了一个servlet(DispatcherServlet),但是需要注意几个地方:

        a.这个servlet会处理所有来自浏览器的请求。

        b.要注意这个servlet-name这个配置项,因为程序会去默认加载名为[servlet名字]-servlet.xml这个配置文件。如本例的springmvc-servlet.xml。

      C、程序启动后会加载了springmvc-servlet.xml这个配置文件:

      

    复制代码
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     4     xmlns:mvc="http://www.springframework.org/schema/mvc"
     5     xmlns:context="http://www.springframework.org/schema/context"
     6     xmlns:aop="http://www.springframework.org/schema/aop" 
     7     xmlns:tx="http://www.springframework.org/schema/tx"
     8     xmlns:p="http://www.springframework.org/schema/p"
     9     xsi:schemaLocation="http://www.springframework.org/schema/beans 
    10         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
    11         http://www.springframework.org/schema/mvc 
    12         http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
    13         http://www.springframework.org/schema/context 
    14         http://www.springframework.org/schema/context/spring-context-3.2.xsd 
    15         http://www.springframework.org/schema/aop 
    16         http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
    17         http://www.springframework.org/schema/tx 
    18         http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
    19         
    20 
    21     <!-- ViewResolver 视图解析器-->
    22     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    23         <property name="viewClass"
    24             value="org.springframework.web.servlet.view.JstlView" />
    25         <property name="prefix" value="" />
    26         <property name="suffix" value=".jsp" />
    27     </bean>
    28 
    29     <!-- 处理器 -->
    30     <bean name="/hello"    class="com.tony.springmvc.controller.HelloWorldController" />
    31     
    32 
    33 </beans>
    复制代码

      这个配置文件里面配置了两个东西:

        a.视图解析器(viewresolver)。主要是配置视图的前缀和后缀。这里配置的后缀为.jsp,没有配置前缀。如果controller返回的view  为“/hello”,那么经过这一步以后会变成"/hello.jsp"。

        b.将处理器(controller)注册为bean。例如在这个项目中,如果浏览器发来的请求是"/hello",那么将会映射给com.tony.springmvc.controller.HelloWorldController进行处理。

      该配置文件除了配置这些东西以外,还可以配置拦截器,IoC容器等等,应为Spring MVC 本来就属于Spring Framework的一部分。

      D、现在进入到HelloController里面:

      

    复制代码
     1 package com.tony.springmvc.controller;
     2 
     3 import javax.servlet.http.HttpServletRequest;
     4 import javax.servlet.http.HttpServletResponse;
     5 
     6 import org.springframework.web.servlet.ModelAndView;
     7 import org.springframework.web.servlet.mvc.Controller;
     8 
     9 public class HelloWorldController implements Controller {
    10     @Override
    11     public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {
    12         
    13         ModelAndView mav = new ModelAndView();
    14         mav.addObject("message", "Hello World!");
    15         mav.setViewName("hello");
    16         
    17         return mav;
    18     }
    19 }
    复制代码

      controller的功能与servlet相似:都要传入request和response,然后进行一些程序逻辑处理,返回ModelAndView。

      这里不需要处理表单所以就继承了Controller这个基类。如果有表单域,那么就要仔细地选择基类。

      Spring MVC提供了AbstractController、UrlFilenameViewController、MultiActionController等controller。

        

      返回的ViewResolver会通过ModelAndView中的view去查找web中的view对象,然后返回给浏览器。

      E、返回hello.jsp给浏览器:

      

    复制代码
     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
     2 
     3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     4 <html>
     5   <head>    
     6     <title>HelloWorld</title>
     7     
     8     <meta http-equiv="pragma" content="no-cache">
     9     <meta http-equiv="cache-control" content="no-cache">
    10     <meta http-equiv="expires" content="0">    
    11     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    12     <meta http-equiv="description" content="This is my page">
    13 
    14   </head>
    15   <body>
    16   
    17    <p align="center">${message}</p>  
    18  
    19   </body>
    20 </html>
    复制代码

       F、效果如图所示:

       

        至此,一个很简单的采用Spring MVC框架的web应用就搭建完成了。

      

      最后有几点说明:

      1、这篇文章主要讲的是如何配置一个简单的Spring MVC应用,所以就没有对配置文件中的所有配置项进行说明。

      2、因为在代码文件中的注释写的比较详细,所以在文章中就没有用过多的篇幅去重复了。

      3、这篇文章完全是笔者自己在学习Spring时总结的经验和笔记,不免有错误和疏漏的地方,还望大家指正。

      4、本文是属于搭建Spring+Spring MVC+ myBatis(SSM)框架的一部分,会在后面持续更新。

       相关博客:如何配置myBatis

      

    欢迎转载! 除非经过作者本人同意,转载请注明出处!
     
    分类: 开源框架
    标签: Spring MVC
  • 相关阅读:
    wex5 实战 框架拓展之2 事件派发与data刷新
    wex5 实战 框架拓展之1 公共data组件(Data)
    wex5 实战 HeidiSQL 导入Excel数据
    wex5 实战 手指触屏插件 hammer的集成与优劣
    wex5 实战 登陆帐号更换与用户id一致性
    wex5 实战 用户点评与提交设计技巧
    wex5 实战 省市县三级联动与地址薄同步
    wex5 实战 wex5与js的组件关系与执行顺序(父子与先后)
    wex5 实战 单页模式下的多页面数据同步
    [BZOJ]4237: 稻草人
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4830922.html
Copyright © 2020-2023  润新知