SpringMVC的执行流程
1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器
3、处理器映射器HandlerMapping找到具体的处理器(可以根据xml配置、注解进行查找) ,生成处理器对象及处理器拦截器,一并返回给DispatcherServlet
4、DispatcherServlet调用HandlerAdapter处理器适配器
5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
6、Controller执行完成返回ModelAndView
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatchServlet
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、viewReslover解析后返回具体View
10、DispatcherServlet根据View进行渲染视图,DispatcherServlet响应用户
配置内部资源视图解析器
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置前缀和后缀-->
<property name="prefix" value="/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
返回视图格式
如果在return出写明是转发模式还是重定向模式则需要写全路径
配置前后缀后可直接返回jsp文件名,自动加上配置的前后缀
@RequestMapping("/quickStart2")
public String test2(){
System.out.println("UserController save running ....");
// 如果写清楚转发模式还是重定向模式需要写全路径,此时已经配置了前后缀
return "forward:/jsp/test.jsp";
}
SpringMVC的数据响应
1、页面跳转:
直接返回字符串
通过ModelAndView对象返回
2、回写数据(需要配置ResponseBody指明直接返回数据而不是跳转路径)
直接返回字符串
返回对象或集合
UserController 类
import com.entity.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Controller
public class UserController {
@RequestMapping("/quickStart")
public String save() {
System.out.println("UserController save running ....");
// 注意是否配置有前缀和后缀
// 重定向要把路径名写全
return "redirect:/jsp/test.jsp";
}
@RequestMapping("/quickStart1")
public String test() {
System.out.println("UserController save running ....");
// 注意是否配置有前缀和后缀,此处配置了前缀 /jsp 后缀 .jsp 默认为转发模式
return "test";
}
@RequestMapping("/quickStart2")
public String test2() {
System.out.println("UserController save running ....");
// 如果写清楚转发模式还是重定向模式需要写全路径,此时已经配置了前后缀
return "forward:/jsp/test.jsp";
}
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView() {
ModelAndView modelAndView = new ModelAndView();
// 设置模型数据
modelAndView.addObject("username", "xiaoming");
// 设置视图名称
modelAndView.setViewName("test");
return modelAndView;
}
@RequestMapping("/testModelAndView2")
public ModelAndView testModelAndView2(ModelAndView modelAndView) {
// 设置模型数据
modelAndView.addObject("username", "xiaohong");
// 设置视图名称
modelAndView.setViewName("test");
return modelAndView;
}
@RequestMapping("/testModelAndView3")
public String testModelAndView3(Model model) {
// 设置模型数据
model.addAttribute("username", "testModelAndView3");
// 传值只能用forward方式,redirect方式不能传值,redirect方式传入的值会以get方式存在,在地址栏中可看到
// http://localhost:8080/jsp/test.jsp?username=testModelAndView3
// return "redirect:/jsp/test.jsp";
return "test";
}
// 原始方式 使用Servlet
@RequestMapping("/testHttpServletRequest")
public String testModelAndView3(HttpServletRequest request) {
request.setAttribute("username", "HttpServletRequest");
return "forward:/jsp/test.jsp";
// 不能用redirect方式,通过request方式不会在地址栏中显示
// return "redirect:/jsp/test.jsp";
}
// 回写数据
// 直接诙谐字符串
@RequestMapping("/writeBack")
public void writeBack(HttpServletResponse response) throws IOException {
response.getWriter().println("hello word!");
}
@RequestMapping("/writeBack2")
// 添加注释告诉SpringMVC 不进行视图跳转,直接返回数据响应
@ResponseBody
public String writeBack2() throws IOException {
return "hello writeBack2";
}
// 解决中文乱码 produces = "application/json;charset=UTF-8"
@RequestMapping(value = "/writeBackJSON", produces = "application/json;charset=UTF-8")
@ResponseBody
public String writeBackJSON() throws JsonProcessingException {
User user = new User();
user.setName("张三");
user.setAge(18);
user.setGender("男");
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(user);
return json;
}
// 返回对象或集合,需要配置转换工具类
// 方法一;
// 在Spring MVC核心配置中配置RequestMappingHandlerAdapter 传入json转换类
// <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
// <property name="messageConverters">
// <list>
// <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
// </list>
// </property>
// </bean>
// 方法二:
// 配置Spring MVC注解驱动器,内部集成Jackson转json类
// <mvc:annotation-driven/>
@RequestMapping(value = "/writeBackJSON2", produces = "application/json;charset=UTF-8")
@ResponseBody
public User writeBackJSON2() {
User user = new User();
user.setName("李四");
user.setAge(18);
user.setGender("男");
return user;
}
}
spring-mvc.xml 配置
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.controller"/>
<!-- 配置内部资源视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置前缀和后缀-->
<property name="prefix" value="/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 配置处理器映射器,给其添加json处理类,使其可自动转换对象为json-->
<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">-->
<!-- <property name="messageConverters">-->
<!-- <list>-->
<!-- <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>-->
<!-- </list>-->
<!-- </property>-->
<!-- </bean>-->
<!-- 配置Spring MVC的注解驱动,默认底层集成Jackson进行对象或集合的json格式字符转换-->
<!-- 此时需要引入jackson-core jackson-annotations jackson-databind -->
<mvc:annotation-driven/>
</beans>