配置版
- 在web.xml文件中配置DispatchServlet, 注意配置时访问路径是所有的访问路径
<!--配置DispatchServlet, 这个是SpringMVC的核心, 请求分发器, 也叫核心控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--DispatchServlet使用的时候必须绑定Spring的配置文件, 因为需要在配置文件中配置mapper和exception-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--设置启动级别为1,也就是服务器一启动就执行-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- 在配置DispatchServlet的时候我们需要init一个Spring的配置文件, 在这个配置文件中,我们需要配置SpringMVC核心三大件 映射器, 适配器, 视图解析器, 还需要将我们自己写的处理器注册进来
<?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">
<!--处理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--视图解析器, 必须要有-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<!--设置前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--设置后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<!--使用的是BeanNameUrlHandlerMapping映射器, 所以必须配置id为所需控制器的名字, 这样映射器才能找到这个控制器-->
<bean id="/hello" class="controller.HelloController"/>
</beans>
- 编写控制器实现controller接口重写handleRequest方法, 返回的就是modelAndView对象
package 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 HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//ModelAndView 模型和视图
ModelAndView mv = new ModelAndView();
//封装对象,放在ModelAndView中。Model
mv.addObject("msg","你好我是,SpringMVC!");
//封装要跳转的视图,放在ModelAndView中
mv.setViewName("hello"); //: /WEB-INF/hello.jsp
return mv;
}
}
- 此时这个modelAndView会返回到DispatchServlet,然后再到视图解析器,因为我们设置了viewName再加上我们配置的前缀和后缀,就会自动去找对应的jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
- 测试, 启动tomcat,输入地址 (注意万一出现404去查看生成的war包中有没有导入依赖包,如果没有导入就会出现404)
- 执行流程图
注解版
- 因为SpringMVC是基于MVC架构上加了一层DispatchServlet,所以在web.xml中配置DispatchServlet还是少不了的
<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-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- 但在Spring配置文件中就大有不同,
- 首先我们需要增加mvc的约束, 开启context注解扫描,
- 为了稳妥规范起见还需要配置mvc不去处理静态资源文件,
- 然后来到核心开启mvc注解支持
- 配置视图解析器
使用SpringMVC的三大件, 映射器, 适配器, 视图解析器, 通常视图解析器需要我们手动配置实现, 但是映射器和适配器只要我们在Spring中开启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:aop="http://www.springframework.org/schema/aop"
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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--扫描指定包下面的注解-->
<context:component-scan base-package="com.controller"/>
<!--让SpringMVC不去处理静态资源 .css .js .html .mp3...-->
<mvc:default-servlet-handler/>
<!--
支持mvc注解驱动
在Spring中, 一般采用@RequestMapping注解来完成映射关系
想要使用就必须开启mvc注解支持
还必须向上下文注册DeductAnnotationHandlerMapping
和一个AnnotationMethodHandlerAdapter实例
这俩个实例分别在类级别和方法级别处理
而annotation-driven配置帮助我们自动完成上述俩个实例的注入
-->
<mvc:annotation-driven/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
- 使用注解实现SPringMVC,所以此时我们不需要在IOC中配置需要的控制器, 而是直接在控制器头上使用@Controller注解, 表明这是一个控制器, 然后在其方法上添加注解@RequestMapping(value="")表明具体适配的地方
package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model) {
//封装数据, 想模型中添加数据, 可以在jsp页面中加载出来
model.addAttribute("msg", "hello SpringMVC");
return "hello"; //会被视图解析器处理
}
}
- 没有用@RestController注解时return返回的数据会被视图解析器解析, 如果使用了@RestController返回的数据就是json数据, 不会被视图解析器解析
- 使用Model就可以实现数据的封装,所以返回的字符串就是view的name, 所以也就省去了setViewName()