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。
HandlerMapping:Handler映射器,将浏览器的请求映射给确定的controller处理。
Controller:处理请求,并返回ModelAndView。
ViewResolver:视图解析器,在web中应用中查找view对象并返回给用户。
View:视图,只负责展示数据。
下面是用户发起的请求在Spring MVC中的处理流程图:

现在我们就开始创建一个简单的采用Spring MVC的应用:
A、先来看看项目结构:

大家肯定会说这个项目也太简单了吧!只有一个java文件!
没错,这个项目确实很简单。因为这个毕竟是一个入门级的文章,我认为没必要弄得很复杂。只要把Spring MVC这个种设计思想和一些需要注意的地方讲清楚就行了,能学会才是最重要的。
B、web.xml作为一个web应用的配置的入口,我们就先从这里顺着思路开始讲起:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name> <!-- 配置DispatcherServlet,注意servlet-name,因为程序会去加载这个[springmvc-servlet.xml]配置文件 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 程序启动时就加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 映射路径,所有的用户请求都会通过这个servlet进行处理 -->
<url-pattern>/</url-pattern>
</servlet-mapping> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> </web-app>
这里的web.xml也很简单,只配置了一个servlet(DispatcherServlet),但是需要注意几个地方:
a.这个servlet会处理所有来自浏览器的请求。
b.要注意这个servlet-name这个配置项,因为程序会去默认加载名为[servlet名字]-servlet.xml这个配置文件。如本例的springmvc-servlet.xml。
C、程序启动后会加载了springmvc-servlet.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "> <!-- ViewResolver 视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="" />
<property name="suffix" value=".jsp" />
</bean> <!-- 处理器 -->
<bean name="/hello" class="com.tony.springmvc.controller.HelloWorldController" /> </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里面:
package com.tony.springmvc.controller; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller; public class HelloWorldController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception { ModelAndView mav = new ModelAndView();
mav.addObject("message", "Hello World!");
mav.setViewName("hello"); return mav;
}
}
controller的功能与servlet相似:都要传入request和response,然后进行一些程序逻辑处理,返回ModelAndView。
这里不需要处理表单所以就继承了Controller这个基类。如果有表单域,那么就要仔细地选择基类。
Spring MVC提供了AbstractController、UrlFilenameViewController、MultiActionController等controller。
返回的ViewResolver会通过ModelAndView中的view去查找web中的view对象,然后返回给浏览器。
E、返回hello.jsp给浏览器:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>HelloWorld</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page"> </head>
<body> <p align="center">${message}</p> </body>
</html>
F、效果如图所示:

至此,一个很简单的采用Spring MVC框架的web应用就搭建完成了。
最后有几点说明:
1、这篇文章主要讲的是如何配置一个简单的Spring MVC应用,所以就没有对配置文件中的所有配置项进行说明。
2、因为在代码文件中的注释写的比较详细,所以在文章中就没有用过多的篇幅去重复了。
3、这篇文章完全是笔者自己在学习Spring时总结的经验和笔记,不免有错误和疏漏的地方,还望大家指正。
4、本文是属于搭建Spring+Spring MVC+ myBatis(SSM)框架的一部分,会在后面持续更新。
相关博客:如何配置myBatis
Spring MVC - 配置Spring MVC的更多相关文章
- spring boot系列(五)spring boot 配置spring data jpa (查询方法)
接着上面spring boot系列(四)spring boot 配置spring data jpa 保存修改方法继续做查询的测试: 1 创建UserInfo实体类,代码和https://www.cnb ...
- spring boot系列(三)spring boot 配置spring data jpa
数据库使用MySQL,ORM使用spring data jpa 1 因此需要再pom.xml文件中添加相应jar包.如下: <!-- 引入jap --> <dependency> ...
- 使用import简化spring的配置 spring import 标签的解析 使用import或加载spring配置时,报错误There is no ID/IDREF 多个Spring配置文件import resource路径配置
spring-import 标签的解析.使用案例: 对于spring配置文件的编写,我想,对于经历过庞大项目的人,都有那种恐惧的心理,太多的配置文件.不过,分模块都是大多数人能想到的方法,但是,怎么分 ...
- spring boot系列(四)spring boot 配置spring data jpa (保存修改删除方法)
spring boot 使用jpa在pom.xml在上文中已经介绍过.在这里直接介绍各个类文件如何编写: 代码结构: domain(存放实体类文件): repository(存放数据库操作文件,相当于 ...
- 两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz
1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 import java.util.TimerTask; public class EmailReportT ...
- Spring.Net框架二:配置Spring.Net框架环境
一.下载DLL文件 去Spring的官方网站下载并解压,然后直接添加dll文件的引用就可以了.在上一篇文章中,已经介绍过Spring.Net框架中需要使用到的dll文件.这些程序集文件位于Spring ...
- 简述Spring及配置
简述Spring及配置 Spring最主要的思想就是IoC(Inversionof Control,控制反转),或者成为DI(Dependency Injection,依赖注入) 一.springMV ...
- Spring Boot与Spring Session集成
1. 参考资料 https://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot-redis.html ht ...
- 如何用Java类配置Spring MVC(不通过web.xml和XML方式)
DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...
随机推荐
- [moka同学笔记]Yii2.0循环查询并对结果累加求和
在控制器中查询好数据 $model 在视图中输入 <?php foreach($model as $key=>$r):?> <tr class="text-cent ...
- clicaptcha中文点击验证码开发经验总结
现在的验证码真是越来越高级了,12306 的找图验证码,极验的拖动式验证码,还有国外的一些黑科技,能智能判断你是不是机器人的验证码. 验证码的更新迭代让我突然对传统验证码一下子不满足了,出于挑战自我和 ...
- 总结的一些微信API接口
本文给大家介绍的是个人总结的一些微信API接口,包括微信支付.微信红包.微信卡券.微信小店等,十分的全面,有需要的小伙伴可以参考下. 1. [代码]index.php <?php include ...
- 【web前端面试题整理04】阿里一行之大神面对面
前言 这段时间我在河南一家公司当了一段时间的前端主管,最后可耻的匿了,原因各种各样,最主要的就是不想呆在郑州了. 其实这里的同事还是很不错的,面对老总最后的挽留我不是没有动心,而是这个地方确实不太好, ...
- sql搜索数据库中具有某列的表
在接口中明明有某个节点,但在数据库中却找不到,为此本人写了一个sql,以供快速查找. Select distinct syscolumns.name,sysobjects.name from sysc ...
- ArcGIS Server 标准版和高级版在Web3D的区别
- 交换两个变量的值swap(a,b)
方法一:使用第三方变量 , b = , temp; temp = a; a = b; b = temp; 方法二:变量加减法(即121,加减减) , b = ; a = a + b; b = a - ...
- Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作
前言:通常,我们写的公共的模块给别人用,但是这个模块又必须在特定的线程中执行. 比如,一个加载网络图片的的方法,需要在子线程中执行. /** * 加载网络图片 */ private void load ...
- Android C代码回调java方法
本文将讲述下列三种C代码回调java方法 1.c代码回调java空方法 2.c代码回调java int类型参数方法 3.c代码回调javaString类型参数方法 方法都差不多,先看c代码回调java ...
- IOS TextField伴随键盘移动
这篇文章介绍的是一个简单而又实用的小方法. 我想对于登陆时的一些效果大家应该都不会陌生. 今天就介绍一下,当开始输入TextField文本时键盘弹出TextField伴随键盘移动的实现. 先看一下演示 ...