第一章 SpringMVC初体验

target

掌握MVC设计模式
了解SpringMVC是什么?优势有哪些
了解SpringMVC主要组件
掌握SpringMVC执行流程
掌握SpringMVC项目的编写

logo

Spring MVC 是 Spring 提供给 Web 应用的框架设计。Spring MVC 是一个典型的教科书式的 mvc 构架,不像 Struts 等都是变种或者不是完全基于 mvc 系统的框架。

Spring MVC 角色划分清晰,分工明细,并且和 Spring 框架无缝结合。作为当今业界最主流的 Web 开发框架,Spring MVC 已经成为当前最热门的开发技能,同时也广泛用于桌面开发领域。

1. MVC设计模式简介

MVC 设计不仅限于 Java Web 应用,还包括许多应用,比如前端、PHP、.NET 等语言。之所以那么做的根本原因在于解耦各个模块。

MVC 是 Model、View 和 Controller 的缩写,分别代表 Web 应用程序中的 3 种职责。

  • 模型:用于存储数据以及处理用户请求的业务逻辑。

  • 视图:向控制器提交数据,显示模型中的数据。

  • 控制器:根据视图提出的请求判断将请求和数据交给哪个模型处理,将处理后的有关结果交给哪个视图更新显示。

基于 Servlet 的 MVC 模式的具体实现如下:

  • 模型:一个或多个 JavaBean 对象,用于存储数据(实体模型,由 JavaBean 类创建)和处理业务逻辑(业务模型,由一般的 Java 类创建)。

  • 视图:一个或多个 JSP页面,向控制器提交数据和为模型提供数据显示,JSP 页面主要使用 HTML 标记和 JavaBean 标记来显示数据。

  • 控制器:一个或多个 Servlet 对象,根据视图提交的请求进行控制,即将请求转发给处理业务逻辑的 JavaBean,并将处理结果存放到实体模型 JavaBean 中,输出给视图显示。

基于 Servlet 的 MVC 模式的流程如图所示:


JSP 中的 MVC 模式

Spring MVC 框架是高度可配置的,包含多种视图技术,例如 JSP 技术、Velocity、Tiles、iText 和 POI。

Spring MVC 框架并不关心使用的视图技术,也不会强迫开发者只使用 JSP 技术。

2. SpringMVC是什么

  • 一种轻量级的、基于 MVC 的 Web 层应用框架。偏前端而不是基于业务逻辑层。Spring 框架的一个后续产品。

  • Spring 为展现层提供的基于 MVC 设计理念的优秀的 Web 框架,是目前最主流的 MVC 框架之一

    注意MVC是设计理念,不是设计模式。

  • Spring 框架结构图(新版本):


3. SpringMVC的优势

  • 天生与 Spring 框架集成,如:(IOC,AOP)

  • 支持 Restful ⻛格

  • 进行更简洁的 Web 层开发

  • 支持灵活的 URL 到⻚面控制器的映射

  • 非常容易与其他视图技术集成,如:Velocity、FreeMarker 等等

    为什么现在 的页面都是HTML,而不是jsp?

    因为jsp是页面包含HTML和Java代码,需要先编译解析完Java代码后,才会交给浏览器处理HTML页面,加载速度慢。

  • 模型数据不存放在特定的 API 里,而是放在一个 Model 里(Map 数据结构实现,因此很容易被其他框架使用)

  • 非常灵活的数据验证、格式化和数据绑定机制、能使用任何对象进行数据绑定,不必实现特定框架的 API

  • 更加简单、强大的异常处理

  • 对静态资源的支持

  • 支持灵活的本地化、主题等解析

4. SpringMVC的主要组件

SpringMVC是将Web层进行了职责解耦, 常用主要组件有:

  • DispatcherServlet:前端控制器

  • Controller:处理器/⻚面控制器,做的是 MVC 中的 C 的事情,控制逻辑转移到前端控制器,用于对请求进行处理

  • HandlerMapping :处理器映射器,负责找到能够处理该请求的控制器

  • View Resolver : 视图解析器,负责查找 View 对象,从而将相应结果渲染给客户。

  • LocalResolver:处理本地化、国际化资源

  • MultipartResolver:文件上传解析器,处理文件上传

  • HandlerExceptionResolver:异常处理器,对异常进行处理

5. 流程分析

SpringMVC的流程如下:


  • 浏览器发起请求(比如是:/hello请求),首先会被DispatcherServlet拦截。

  • 拦截后,交给Handler Mapping(处理器映射器),处理器映射器拿到/hello请求后,会去IOC容器里寻找能够处理他的控制器,然后将找到的具体控制器告诉 DispatcherServlet

  • DispatcherServlet拿到具体的控制器后,会去访问这个Controller,比如HelloController。控制器内部会调用业务逻辑相关,然后将数据封装到ModelAndView中,返回给DispatcherServlet。其中ModelAndView中包含携带的数据和跳转的视图信息。

  • DispatcherServlet拿到ModelAndView后,会把它传递给View Resolver(视图解析器),视图解析器进行解析后,再次传递给DispatcherServlet

  • 一旦确定视图,DispatcherServlet 将把模型数据传递给View,最后呈现在浏览器中。

6. 第一个SpringMVC程序

创建动态web项目:SpringMVC-01

项目结构:


6.1 导入jar

将以下jar复制到lib目录下:

commons-logging-1.2.jar
spring-aop-4.3.9.RELEASE.jar
spring-beans-4.3.9.RELEASE.jar
spring-context-4.3.9.RELEASE.jar
spring-core-4.3.9.RELEASE.jar
spring-expression-4.3.9.RELEASE.jar
spring-web-4.3.9.RELEASE.jar
spring-webmvc-4.3.9.RELEASE.jar

6.2 配置前端控制器

在开发 Spring MVC 应用时需要在 web.xml 中部署 DispatcherServlet,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>SpringMVC-01</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <!-- 部署 DispatcherServlet -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置 DispatcherServlet 的初始化參數:设置文件的路径和文件名称 -->
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!-- 表示容器再启动时立即加载servlet -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- 处理所有URL -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

解释:

contextConfigLocation 是用来配置 SpringMVC 的配置文件的路径的,也可以不配置contextConfigLocation,会使用默认路径。

默认的配置文件路径为: /WEB-INF/

默认配置文件名称为:[dispatcherServlet名字]-servlet.xml

6.3 创建 Web 应用首页

在 WebContent 目录下有个应用首页 index.jsp。index.jsp 的代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <a href="${pageContext.request.contextPath }/helloworld">Hello World</a>
</body>
</html>

也可以直接写成:

<a href="helloworld">Hello World</a>

6.4 创建 Controller 类

在 src 目录下创建 com.lee.springmvc.controller 包,并在该包中创建 HelloController ,用来处理首页中"Hello World"超链接的请求。

package com.lee.springmvc.controller;

@Controller
public class HelloController {
    @RequestMapping(value = "/helloworld", method = RequestMethod.GET)
    public String helloworld() {
        System.out.println("hello,world");
        return "success"; 
    }
}

6.5 Spring MVC 的配置文件

在 Src 目录下创建名为 springmvc.xml 的配置文件,具体代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    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-4.3.xsd">

<!-- 设置扫描组件的包: -->
<context:component-scan base-package="com.lee.springmvc.controller" />

<!-- 配置映射解析器:如何将控制器返回的结果字符串,转换为一个物理的视图文件 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/views/" />
  <property name="suffix" value=".jsp" />
</bean>
</beans>

SpringMVC中需要配置控制器相关包扫描和视图解析器。

6.6 应用的其他页面

HelloController 控制器处理成功后跳转到 /WEB-INF/views 下的 success.jsp 视图,因此在应用的 /WEB-INF/views 目录下应有 success.jsp :

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>springmvc</title>
</head>
<body>
    你好,SpringMVC!
</body>
</html>

6.7 发布并运行 Spring MVC 应用

将 SpringMVC-01 发布到 tomcat服务器:

访问"http://localhost:8080/SpringMVC-01/",如图:

点击 Hello World,会跳转到 success.jsp 页面:

7. HelloWorld请求流程图解

首先客户端发出请求helloworld,会被 dispatchServlet拦截(由于dispatchServlet设置的url-pattern是"/",所以会拦截所有请求)。

然后dispatchServlet会去控制器中寻找一个可以映射到该请求的方法,这个方法就会来处理客户端的请求。

最后处理请求的方法会返回一个字符串,这个字符串就会和 视图解析器中的前缀、后缀拼接,拼接后的路径就是响应的视图页面路径。

注意两个点:

① 映射路径名称:

一般请求的映射路径名称和处理请求的方法名称最好一致(实质上方法名称任意)

@RequestMapping(value="/helloworld",method=RequestMethod.GET) 
public String helloworld(){
//public String abc123(){
  
  System.out.println("hello,world");
  return "success"; 
}

② 一个错误:

经常有同学在配置视图解析器的时候出现错误,把/WEB-INF/views/配置成了 /WEB-INF/views,正确写法如下:

<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/views/"/>
  <property name="suffix" value=".jsp"/>
</bean>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容