该篇博客主要阐述SpringMVC框架概述以及一个hello world小程序,主要需要了解SpringMVC开发的简单过程
该篇博客主要阐述
1、什么是SpringMVC
2、SpringMVC处理请求过程解析
3、采用SpringMVC好处
4、SpringMVC之hello world
一、什么是SpringMVC
Spring MVC 是Spring框架最重要的的模块之一。 它以强大的Spring IoC容器为基础,并充分利用容器的特性来简化它的配置
是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的是使用请求-响应模型,SpringMVC框架的目的就是帮助我们简化开发
二、SpringMVC处理请求过程解析
1:请求离开浏览器,将用户所请求的内容、请求的URL发送给了web.xml中的DispatcherServlet(前端控制器)处理这是SpringMVC好处之一:不需要编写Dispatcher Servlet,SpringMVC自带,而DispatcherServlet的任务是将请求发送给SpringMVC控制器(controller)中的某个方法,当然在实际应用中可能会有多个控制器,所以DispatcherServlet需要知道应该将请求发送给哪个控制器,这就需要第2步了
2、DispatcherServlet会查询一个或多个处理器映射(handler mapping)来确定下一站在哪。现在常用@RequestMapping(“/helloworld”)来设定某个方法,让DispatcherServlet来找到该方法即可,其中@RequestMapping(“/helloworld”)中的helloworld需要与请求的URL相同。当然必须清楚的一点是/helloworld映射地址为http://localhost:8080/Springmvc_01_helloworld/helloworld。既然通过@RequestMapping(“/helloworld”)确定了控制器,那么就进行第3步了
3、在控制器中,请求会卸下其负载(用户提交的信息)并处理这些信息(不过经常不用控制器来处理,而是委托给服务对象来处理), 控制器所做的最后一件事是将模型数据打包(模型数据指返回给用户的信息),并标示出用于渲染输出的试图名(即逻辑视图名称)
4、将模型和逻辑视图名称返回给DispatcherServlet
5、DispatcherServlet使用视图解析器(view resolver)将逻辑视图名添加前缀和后缀,然后查找视图模板(最常用的是InternalResourceViewResolver)转化成物理视图,注意:这个物理视图因为后缀的不确定,所以不一定是jsp页面,最后得到了视图渲染结果,以下是SpringMVC可以使用视图解析器来选择合适的视图
6、请求的任务基本就完成了,第6步就是视图的实现
7、视图将使用模型数据渲染输出,这个输出会通过响应对象传递给客户端
以上就是SpringMVC处理请求全过程解析了
当然在视图解析器中你需要明白以下几点
- 物理视图名:prefix+逻辑视图名+suffix,即能够显示内容的
逻辑视图名:以下代码的hello就是逻辑视图名,改名将应用于物理视图名
public String showHomePage() { System.out.println("hello world"); return "hello"; }
三、采用SpringMVC好处
- 与Spring框架集成(IoC、AOP)
- 提供强大的约定大于配置的契约式编程
- 支持灵活的URL到页面控制器的映射
- 有一套强大的JSP标签库,简化jsp开发
- RESTful风格支持
- 简单的文件上传
- 基于注解的零配置支持等等
四、SpringMVC之hello world
首先总结一下实现请求过程开发步骤
1、导入jar包(包括Spring的jar、jsp、jstl、standard、servlet的jar)
2、在web.xml中配置前端控制器DispatcherServlet
3、编写处理请求的控制器,并为某方法标识为让DispatcherServlet知道请求应该发送到哪
4、创建SpringMVC配置文件,如果不在web.xml中设置init-param,默认的SpringMVC配置文件名为-servlet.xml,注意:位置是在WEB-INF下
5、配置SpringMVC配置文件——将控制器这个类注册到IoC容器中
6、配置SpringMVC配置文件——编写视图解析器(并创建prefix目录)
1.导入jar包
2、配置web.xml,加入前端控制器
web.xml
<?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_2_5.xsd" id="WebApp_ID" version="2.5">
<!-- 配合前端控制器 -->
<!-- <load-on-startup>表示启动容器时初始化该servlet -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- <url-pattern>代表哪些请求交给SpringMVC处理,"/"代表默认servlet映射的,也可是如"*.html"表示拦截所有html为扩展名的请求-->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3、编写处理请求的控制器
HomeController.java
package linjie.springmvc.handler;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author LinJie E-mail:xulinjie0105@gmail.com
* @version 创建时间:2018年5月13日 下午2:09:31
* 处理请求的控制器
*/
@Controller
public class HomeController {
//处理对首页的请求
//@RequestMapping("/helloworld")两个作用
//1、表明showHomePage()是一个请求处理方法
//2、指明这个方法要处理"/helloworld"路径的请求
@RequestMapping("/helloworld")
public String showHomePage() {
System.out.println("hello world");
return "hello";
}
}
4、WEB-INF下创建SpringMVC配置文件
- 将控制器这个类注册到IoC容器中
- 编写视图解析器(并创建prefix目录)
springDispatcherServlet-servlet.xml(需要有bean、context、mvc三个约束)
<?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"
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-4.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
<!-- 扫描linjie.springmvc.handler包及其子包下的所有文件,通过注解注册到IoC容器中 -->
<context:component-scan base-package="linjie.springmvc.handler"></context:component-scan>
<!-- 配置视图解析器 -->
<!-- 注意:prefix中有views文件夹,所有需要创建该文件夹 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
5、应用根目录下创建index.jsp发送请求(注意发送的请求URL必须和控制器中@RequestMapping(“/helloworld”)的URL是一样的,即为helloworld)
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="helloworld">通往SpringMVC hello world神奇之旅</a>
</body>
</html>
6、WEB-INF/views下创建hello.jsp(根据视图解析器和控制器返回的逻辑视图得出该地址、该页面名)
hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
hello world
</body>
</html>
7、客户端浏览器演示
请求
响应
8、最后看下这个简单请求响应小程序的目录框架
jar包目录
必要的jar包
- spring-aop的jar
- spring-beans的jar
- spring-context的jar
- spring-core的jar
- spring-expression的jar
- spring-webmvc的jar
- spring-web的jar
工程下载
参考
《Spring IN ACTION》
《Spring MVC学习指南》
《跟开涛学SpringMVC》开源电子书