<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
bean>
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/27
* @description 控制器
*/
@Controller
@RequestMapping("/demo")
public class DemoController {
@GetMapping("/get")
public String get() {
return "success";
}
}
视图解析器会自动给我们请求方法中返回的字符串加上前缀和后缀组成完整的转发地址,直接返回资源名称 success
的等同于返回 forward:/WEB-INF/views/success.jsp
即请求转发,如果想要重定向需要返回 redirect:/index.jsp
,加了前缀之后不会经过视图解析器。注意,外部是无法直接访问 WEB-INF
下的页面,只有通过服务器转发才可以,所以重定向不要指到 WEB-INF
下。
另外,如果转发的页面是 HTML,并且 DispatcherServlet 拦截配置为 /
,为了实现 REST 风格,拦截了所有的请求,*.js
、*.html
等静态文件的访问也就被拦截了,需要放行静态资源。
使用 ModelAndView 类用来存储处理完后的结果数据,以及显示该数据的视图。顾名思义 ModelAndView 中的 Model 代表模型,View 代表视图。业务处理器调用模型层处理完用户请求后,把结果数据存储在该类的 model 中,把要返回的视图信息存储在 view 中,然后将 ModelAndView 返回。框架通过调用配置文件中定义的视图解析器,对该对象进行解析,最终把数据显示在指定的页面上。
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/27
* @description 控制器
*/
@Controller
@RequestMapping("/demo")
public class DemoController {
@GetMapping("/get")
public ModelAndView get() {
// 也可以在方法形参上直接声明 ModelAndView, 无需自己创建
ModelAndView modelAndView = new ModelAndView();
// 设置数据
modelAndView.addObject("name", "张三");
// 设置视图名称
modelAndView.setViewName("success");
return modelAndView;
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false"%>
<html>
<head>
<title>successtitle>
head>
<body>
${name}
body>
html>
当请求方法返回为空时,MVC 会自动将请求资源路径 demo/success
拼接上前缀和后缀做为请求转发的地址。
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/27
* @description 返回 void
*/
@Controller
@RequestMapping("/demo")
public class DemoController {
@GetMapping("/success")
public void get() {
System.out.println("我来了");
}
}
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/27
* @description 返回 String
*/
@Controller
@RequestMapping("/demo")
public class DemoController {
@GetMapping("/get")
@ResponseBody
public String get() {
return "Hello";
}
}
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/27
* @description 返回 JSON
*/
@Controller
@RequestMapping("/demo")
public class DemoController {
@GetMapping("/get")
@ResponseBody
public String get() {
Map<String, String> map = new HashMap<>();
map.put("name", "jack");
map.put("age", "20");
String json = JSONObject.toJSONString(map);
return json;
}
}
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/27
* @description 返回对象
*/
@Controller
@RequestMapping("/demo")
public class DemoController {
@GetMapping("/get")
@ResponseBody
public Student get() {
Student student = new Student();
student.setName("Tom");
student.setAge(23);
return student;
}
}
这里直接报错了,这个错误的原因是 Spring Web MVC 会帮我们将对象转为 JSON 然后返回,而 Spring Web MVC 底层默认使用的 jackjson,我们并没有引入 jackjson 所以就报错了,引入之后就 OK 了。
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.9.5version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-annotationsartifactId>
<version>2.9.5version>
dependency>
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/27
* @description @RestController 注解
*/
@RestController // @RestController 这个注解其实就是 @ResponseBody 和 @Controller 注解的组合
@RequestMapping("/demo")
public class DemoController {
@GetMapping("/get")
public String get() {
return "10086";
}
}
在 Spring Web MVC 中 StringHttpMessageConverter 这个转换器,父类AbstractHttpMessageConverter 的 supportedMediaTypes 属性默认是 iso-8895-1
导致中文乱码。有两种解决方案,第一个是在配置文件中指定转换器使用的字符集,第二个是在 @RequestMapping 中指定 produces 属性。
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=utf-8">property>
bean>
mvc:message-converters>
mvc:annotation-driven>
@ResponseBody
@GetMapping(value = "/get", produces = "application/json;charset=utf-8")
public String get() {}