SpringMVC
文章目录
前言
SpringMVC简介
SpringMVC概述
SpringMVC是Spring提供的一个轻量级Web框架,它实现了WebMVC设计模式
。它是一个开源的Java平台,为开发强大的基于Java的Web应用程序提供全面的基础架构支持非常容易和非常快速。它在使用和性能等方面比另一个框架Struts2更加优异。
SpringMVC特点
- 是Spring框架的一部分,可以方便的利用Spring所提供的其他功能
- 灵活性强,易于与其他框架集成
- 提供了一个前端控制器
DispatcherServlet
, 使开发人员无须额外开发控制器对象。 - 可自动绑定用户输入,并能正确地转换数据类型。
- 内置了常见的校验器,可以校验用户输入。如果校验不能通过,就会复位向到输入表单。
- 持国际化,可以根据用户区域显示多国语言
- 支持多种视图技术,如JSP、Velocity 和 FreeMarker 等视图技术。
- 使用基于
XML
的配置文件,在编辑后,不需要重新编译应用程序
SpringMVC入门案例
了解了SpringMVC的概念和特点之后,接下来我们做一个简单的入门案例
第一步:创建一个Maven项目
这样使用骨架创建出来的项目结构是不完整的
我们需要补全目录
第二步:在pom.xml中添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hzy</groupId>
<artifactId>springMvc_quickstart</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
</project>
第三步:配置前端控制器
在web.xml中配置SpringMVC的前端控制器DispatcherServlet。
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<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-config.xml</param-value>
</init-param>
<!--表示容器在加载时立刻加载Servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
web.xml中主要对<servlet>
和<servlet- mapping>
元素进行了配置。在<servlet>
中配置了 Spring MVC 的前端控制器 DispatcherServlet
,并通过其子元素<init-param>
配置了 Spring MVC 配置文件的位置, <load-on-startup>
元素中的'1'
表示容器在启动时立即加载这个 Servlet:在 <servlet-mapping>
中,通过<url-pattern>
元素的/
拦截所有 URL,并交由 DispatcherServlet 处理。
第四步:创建Controller类
在src下创建com.hzy.controller包,创建ControllerTest。
package com.hzy.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ControllerTest implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//创建ModelAndView对象
ModelAndView m = new ModelAndView();
//向模型中添加一个名称为msg的字符串对象
m.addObject("msg","这是第一个SpringMVC程序");
//设置返回路径
m.setViewName("/WEN-INF/welcome.jsp");
return m;
}
}
handleRequest()是 Controller 接口的实现方法,ControllerTest 类会调用该方法 处理请求,并返回一个包含视图名或包含视图名与模型的 ModelAndView 对象。本案例向模型对象 中添加了一个名称为 msg 的字符串对象,并设置返回的视图路径为 WEB-INF/welcome. jsp,这样 请求就会被转发到 welcome. jsp 页面。
第五步:创建springmvc-config.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置处理器Handle,映射“ControllerTest”请求-->
<bean name="/controllerTest" class="com.hzy.controller.ControllerTest"/>
<!--处理器映射,将处理器Handle的name作为url进行查找-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--处理器适配器,配置处理器中的handleRequest()方法调用-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>
首先定义了一个名称为 ControllerTest
的 Bean,该 Bean 会将控制器类 ControllerTest 映射到 /controllerTest
请求中:然后配置了处理器映射器 BeanNameUrIHandlerMapping
和处理器适配器 SimpleControllerHandlerAdapter
, 其中处理器映射器用 于将处理器 Bean 中的的 name (即 url)进行处理器查找,而处理器适配器用于完成对 ControllerTest 处理器中 handleRequesto方法的调用;最后配置了视图解析器 InternalResourceViewResolver
来解析结果视图,并将结果呈现给用户。
第六步:创建视图(View)页面
在WEB-INF目录下创建一个页面文件welcome.jsp,在该页面中使用EL表达式获取msg的信息
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
最后:配置Tomcat,启动项目
运行结果:
通过入门案例的学习,我们总结一下SpringMVC程序的执行流程:
- 用户通过浏览器向服务器发送请求,请求会被 SpringMVC 的前端控制器
DispatcherServiet
所拦截 DispatcherServlet
拦截到请求后,会调用HandlerMapping
处理器映射器。- 处理器映射器根据请求 URL找到具体的处理器,生成处理器对象及处理器拦截器(如果有就生成)一并返回给
DispatcherServlet
。 DispatcherServlet
会通过返回信息选择合适的HandlerAdapter
(处理器适配器)HandlerAdapter
会调用并执行 Handler(处理器),这里的处理器就是程序中编写的 Controller 类,也被称为后端控制器。- Controller 执行完成后,会返回一个
ModelAndView
对象,该对象中包含视图名或包含模 利与视图名。 HandlerAdapter
将ModelAndView
对象返回给DispatcherServlet
DispatcherServlet
会根据ModelAndView
对象选择一个合适的ViewResolver
(视图解析器)。ViewResolver
解析后,会向DispatcherServlet
中返回具体的 View(视图)。
10.DispatcherServlet
对 View 进行渲染(即将模型数据填充至视图中)- 视图渲染结果会返回给客户端浏览器显示。
在上述执行过程中,DispatcherServlet
、HandlerMapping
、HandlerAdapter
和 ViewResolver
对象的工作是在框架内部执行的,开发人员并不需要关心这些对象内部的实现过程,只需要配置前端控制器(DispatcherServlet),完成Controller中的业务处理,并在视图(View)中展示相应信息即可。
大家都发现了,这种方式实现整个程序还是比较麻烦的。
SpringMVC注解
在 Spring 2.5 之前,只能使用实现 Controller 接口的方式来开发一个控制器,我们的入门案例就是使用的这种方式。在 Spring 2.5 之后,新增加了基于注解的控制器以及其他一些常用注解,这些注解的使用极大地减少了程序员的开发工作。接下来我将详细的讲解 SpringMVC 中的常用核心类及其常用注解。
@Controller
org.springframework.stereotype.Controller
注解类型用于指示 Spring类的实例是一个控制器,其注解形式为@Controller
。该注解在使用时不需要再实现 Controller 接口,只需要将@Controller
注解加入控制器类上,然后通过 Spring的扫描机制找到标注了该注解的控制器即可。
package com.hzy.controller;
import org.springframework.stereotype.Controller;
......
//Controller注解
@Controller
public class ControllerTest{
...
}
为了保证 Spring
能够多找到控制器类,还需要在Spring MVC
的配置文件中添加相应的扫描配置信息,具体如下。
(1)在配置文件的声明中引入 spring-context
(2)使用<context: component-scan>
元素指定需要扫描的类包。
<?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.xsd
">
<!--指定要扫描的包-->
<context:component-scan base-package="com.hzy.controller"/>
</beans>
<context: component-scan>
元素的属性base-package指定了需要扫描的包为:com.hzy.controller。在运行时改包及子包下的所有标注了注解的类都会被Spring处理。
@RequestMapping
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller//注解
@RequestMapping("/book")//标注在类上
public class BookController {
@RequestMapping("/save")//标注在方法上
public String save(){
...
}
}
在类上标注了@RequestMapping("/book")
,则我们可以通过http://localhost:8080/book
进行访问,在方法上标注@RequestMapping("/save")
,我们可以用http://localhost:8080/book/save
访问。
@RequestMapping注解的属性
组合注解:
@ResponseBody
@Controller
@RequestMapping("/book")
public class BookController {
@RequestMapping("/save")
@ResponseBody
public String save(){
//System.out.println("book save ...");
return "{'module':'book save'}";
}
@RequestParam
@RequestParam主要用于数据绑定
应用实例
springmvc-config.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.xsd
">
<!--指定要扫描的包-->
<context:component-scan base-package="com.hzy.controller"/>
</beans>
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<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-config.xml</param-value>
</init-param>
<!--表示容器在加载时立刻加载Servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
BookController:
@Controller
@RequestMapping("/book")
public class BookController {
@RequestMapping("/save")
@ResponseBody
public String save(@RequestParam("name") String userName, int age){
System.out.println("普通参数传递name="+userName);
System.out.println("普通参数传递age="+age);
System.out.println("book save ...");
return "{'module':'book save'}";
}
}
启动程序:
结语
以上就是今天要讲的内容,涉及了SpringMVC的介绍、应用、数据绑定的内容,下篇中我会给大家讲到JSON数据交互和RESTFUL支持,以及拦截器的内容。