一、案例——第一个SpringMVC应用
1. 创建项目,引入jar包
2.配置前端控制器
在web.xml中配置SpringMVC的前端控制器DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<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>
在<servlet>
中配置SpringMVC的前端控制器DispatcherServlet,并通过其子元素<initparam>
配置了SpringMVC配置文件的位置,<load-on-startup>
元素中的1表示容器在启动时立即加载这个servlet。
在<servlet-mapping>
中,通过<url-pattern>
元素的“/”拦截所有url,并交由DispatcherServlet处理。
3.创建Controller类
创建com.ssm.controller,创建控制器类ControllerTest,实现Controller接口
package com.ssm.controller;
import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;
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("/WEB-INF/jsp/welcome.jsp");
return m;
}
}
4.创建SpringMVC配置文件
创建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.ssm.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映射到请求中。
然后配置了处理器映射器BeanNameUrlHandlerMapping和处理器适配器SimpleControllerHandlerAdapter,其中处理器映射器用于将处理器Bean中的name进行处理器查找,而处理器适配器用于完成对ControllerTest处理器中handleRequest()方法的调用。
最后配置了视图解析器来解析结果视图。
5.创建视图页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>入门程序</title>
</head>
<body>
${msg}
</body>
</html>
6.启动项目
SpringMVC程序执行流程:
(1)用户通过浏览器向服务器发送请求,请求会被Spring MVC的前端控制器DispatcherServlet所拦截。
(2)DispatcherServlet拦截到请求后,会调用HandlerMapping处理器映射器。
(3)处理器映射器根据请求URL找到具体的处理器,生成处理器对象及处理器拦截器(如果有就生成)一并返回给DispatcherServlet。
(4)DispatcherServlet会通过返回信息选择合适的HandlerAdapter(处理器适配器)。
(5)HandlerAdapter会调用并执行Handler(处理器),这里的处理器就是程序中编写的Controller类,也被称为后端控制器。
(6)Controller执行完成后,会返回一个ModelAndView对象,该对象中包含视图名或包含模型与视图名。
(7)HandlerAdapter将ModelAndView对象返回给DispatcherServlet。
(8)DispatcherServlet会根据ModelAndView对象选择一个合适的ViewResolver(视图解析器)。
(9)ViewResolver解析后,会向DispatcherServlet中返回具体的View(视图)。
(10)DispatcherServlet对View进行渲染(即将模型数据填充至视图中)。
(11)视图渲染结果会返回给客户端浏览器显示。
2.SpringMVC的注解
1.DispatcherServlet
2.Controller
该注解在使用时不需要再实现Controller接口,只需要将@Controller注解加入控制器类上,然后将Spring的扫描机制找到了标注了该注解的控制器即可。
3.RequestMapping注解类型
1.@RequestMapping注解
Spring通过@Controller注解找到相应控制器类,还需要知道控制器内部对每一个请求是如何处理的。
RequestMapping用于映射一个请求或一个方法,其注解形式为@RequestMapping,可以使用该注解标注在一个方法或一个类上。
- 标注在方法上
当标注在一个方法上,该方法将成为一个请求处理方法,它会在程序接收到对应URL请求时被调用。 - 标注在类上
该类中的所有方法都将映射为相对于类级别的请求,表示该控制器所处理的所有请求都被映射到value属性值所指定的路径下。
2.@RequestMapping注解的属性
当value是唯一属性值时可以省略属性名。
3.组合注解
- @GetMapping:匹配GET方式的请求。
- @PostMapping:匹配POST方式的请求。
- @PutMapping:匹配PUT方式的请求。
- @DeleteMapping:匹配DELETE方式的请求。
- @PatchMapping:匹配PATCH方式的请求。
4.请求处理方法的参数类型和返回类型
4. ViewResolve(视图解析器)
3.应用案例——基于注解的SpringMVC应用
3.1 搭建项目环境
创建项目、导包
3.2 修改配置文件
在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.ssm.controller"/>
<!-- 定义视图解析器-->
<bean id="ViewResoler" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 设置前缀-->
<property name="prefix" value="/WEB_INF/jsp/"/>
<!-- 设置后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
首先通过组件扫描器指定了需要扫描的包,然后定义了视图解析器,并在视图解析器中设置了视图文件的路径前缀和文件后缀名。
3.3 修改Controller类
package com.ssm.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller
@RequestMapping(value = "/controll")
public class ControllerTest {
@RequestMapping(value = "/annotationController")
public String handleRequest(HttpServletRequest arg0, HttpServletResponse arg1, Model model) throws Exception{
model.addAttribute("msg","第一个SpringMVC程序");
return "welcome";
}
}