文章预览:
一 .SpringMVC入门(重点)
1.需求
浏览器请求服务器(SpringMVC)里面HelloController,会打印一句话, 然后响应跳转到成功页面
- HelloController中的某一个方法,可以接收处理请求
- 使用SpringMVC的方式进行跳转
2.分析
- 创建Maven工程(war),导入坐标
- 创建HelloController类, 添加注解, 定义方法
- 创建springmvc.xml(开启包扫描,视图解析器)
- 配置web.xml
3.实现
3.1 编写HelloController
@Controller
public class HelloController {
@RequestMapping(value="/hello/sayHello")
public String sayHello(){
System.out.println("HelloController 的 sayHello 方法执行了。。。。 ");
return "success";
}
}
3.2 编写SpringMVC的配置文件
- 在classpath目录下创建applicationContext.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:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--1. 配置spring创建容器时要扫描的包 -->
<context:component-scan base-package="com.wjs"></context:component-scan>
<!--2. 加载mvc注解驱动-->
<mvc:annotation-driven />
<!--3. 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
3.3 在web.xml里面配置核心控制器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置初始化参数,用于读取 SpringMVC 的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<!-- 配置 servlet 的对象的创建时间点:应用加载时创建。取值只能是非 0 正整数,表示启动顺序 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
在web.xml中必须要配置加载核心配置文件,因为需要根据类名调用方法,类必须要Ioc,所以要加载核心配置文件
3.4 入门案例加载流程
1、服务器启动,应用被加载。 读取到 web.xml 中的配置创建 spring 容器并且初始化容器中的对象。
2、浏览器发送请求,被 DispatherServlet 捕获,该 Servlet 并不处理请求,而是把请求转发出去。转发的路径是根据请求 URL,匹配@RequestMapping 中的内容。
3、匹配到了后,执行对应方法。该方法有一个返回值。
4、根据方法的返回值,借助 InternalResourceViewResolver 找到对应的结果视图。
5、渲染结果视图,响应浏览器
二. SpringMVC 的请求响应流程 【面试】
1. 入门案例中涉及的组件(了解)
-
DispatcherServlet:前端控制器**(最重要最关键**)
用户请求到达前端控制器,它就相当于 mvc 模式中的 c, dispatcherServlet 是整个流程控制的中心,由
它调用其它组件处理用户的请求, dispatcherServlet 的存在降低了组件之间的耦合性(符合面向对象设计的"迪米特法则")。 -
HandlerMapping:处理器映射器
HandlerMapping 负责根据用户请求找到 Handler 即处理器, SpringMVC 提供了不同的映射器实现不同的
映射方式,例如:配置文件方式,实现接口方式,注解方式等。 -
Handler:处理器 (自己写的Controller类)
它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由
Handler 对具体的用户请求进行处理。 -
HandlAdapter:处理器适配器
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理
器进行执行。 -
View Resolver:视图解析器:将Controller返回的字符串,解析成具体的视图对象
View Resolver 负责将处理结果生成 View 视图, View Resolver 首先根据逻辑视图名解析成物理视图名
即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。 -
View:视图
SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jsp , jstlView、 freemarkerView、 pdfView等。我们最常用的视图就是 jsp。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
<mvc:annotation-driven>
注解说明 :
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。使 用 <mvc:annotation-driven>
自 动 加 载 RequestMappingHandlerMapping ( 处 理 映 射 器 )RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用
<mvc:annotation-driven/>
替代注解处理器和适配器的配置。
三. RequestMapping注解
1.RequestMapping注解,用于配置请求的映射路径
1. 使用位置
Controller类上,以及方法上
1.1 类上的RequestMapping注解的值其实就是该模块(类)的标识,
这里就要求每一个Controller类上的RequestMapping的值不同
1.2 同一个类中的各个方法的RequestMapping的值就是该方法的标识,
这里就要求同一个类的每个方法的RequestMapping的值不同
2. RequestMapping的属性
2.1 path或者value,指定请求映射路径
2.2 method,指定该方法支持的请求方式
以下注解代表意思一样,都代表该方法支持Post方式,get等方式同理
@RequestMapping(value = "/say/wei",method = RequestMethod.POST)
@PostMapping("/say/wei")
2.3 其他不重要的属性:params指定请求参数的规则和headers指定请求头的规则
四 .获取请求参数
1. (name=value&name=value)类型
1.1 . 一个一个参数进行获取
在处理请求的方法中,添加和请求参数同名的参数即可
如果请求参数名和方法的参数名不一致,我们可以通过@RequestParam注解,指定获取的请求参数名
1.2 .封装请求参数
1.pojo类型
在方法中加入一个pojo类型的参数,要求pojo中的属性和请求参数名一致,pojo的属性一定要有set方法和无参构造
2.Map类型
在方法中加入一个map类型的参数,此时map中接收的参数的key就是参数名,value就是参数值,一定要在Map类型的参数前添加RequestParam注解
3.多个同名参数(例如删除ids=1,ids=2…)
我们可以使用List或者数组进行封装,比如说"批量删除"
1.添加RequestParam注解
2.方法的参数名要和接收的请求参数名一致
4.一个参数名对应多个参数值(例如List hobbies)
如果接收的请求参数是:既有一个name对应一个value,也有一个name对应多个value
比如注册的时候:username、password、nickname、birthday、hobbies那么我们就将请求参数封装到POJO中,一个参数名对应一个参数值的情况我们就使用简单类型,一个参数名对应多个参数值的情况我们就使用List类型
2. Json类型
2.1 格式
{参数名:参数值,参数名:参数值}json类型的请求参数,vue的post方式提交请求参数
2.2 @RequestBody
json类型的请求参数,例如使用axios发送异步的post请求携带的请求参数,而RequestBody注解的作用就是将json类型的请求参数封装到POJO对象或者Map中
2.3 具体使用
1.JackSon依赖
添加jackson的依赖,因为Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要添加jackson依赖。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
2.@RequestBody注解
@RequestMapping("/useJson")
public String useJson(@RequestBody User user){
//目标: 使用body参数来获取请求体的内容----->从请求体中获取参数
System.out.println("请求体的内容是:" + user);
return "success";
}
3. 前端可以使用postman发送post请求测试
五.乱码问题和自定义类型转换器(掌握)
4. 在springmvc.xml中开启
<!-- 支持mvc注解驱动 -->
<mvc:annotation-driven enable-matrix-variables="true" />
5.1 请求参数乱码处理
- 在web.xml里面配置编码过滤器
1.post请求方式提交参数时候的中文乱码问题: 使用过滤器(使用spring提供的过滤器),我们需要做的就是在web.xml中配置过滤器
1.1 在web.xml中配置过滤器的拦截路径
1.2 在web.xml中通过过滤器的初始化参数配置,告诉过滤器我们想要使用什么编码
<!--
配置解决全局乱码的过滤器
-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5.2 自定义类型转换器(了解)
默认情况下,SpringMVC已经实现一些数据类型自动转换。 内置转换器全都在: org.springframework.core.convert.support
包下 ,如遇特殊类型转换要求,需要我们自己编写自定义类型转换器。
5.2.1 使用DateTimeFormate注解进行局部类型转换
在要进行转换的变量上添加DateTimeFormate注解,指定转换的格式
@Data
public class User implements Serializable {
private String username;
private String password;
private String nickname;
@DateTimeFormate("yyyy-MM-dd")
private Date birthday;
private List<String> hobbies;
}
这种方式有局限性,只能是添加了DateTimeFormate注解的变量能够进行转换,没有添加的变量还是会使用SpringMVC默认的转换规则
5.2.2 自定义类型转换器 (了解)
其实SpringMVC中内置有类型转换器,它可以进行一些基本类型的转换,比如说String转成int等等操作
步骤:
- 创建一个类实现Converter 接口
- 配置类型转换器
实现:
-
定义一个类,实现 Converter 接口
该接口有两个泛型,S:表示接受的类型, T:表示目标类型(需要转的类型)
package com.wjs.convert;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateConverter implements Converter<String, Date>{
@Override
public Date convert(String source) {
//source就是要进行类型转换的那个字符串,比如"1998-08-03"
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
//返回值就是转换成的Date
try {
return simpleDateFormat.parse(source);
} catch (ParseException e) {
e.printStackTrace();
throw new RuntimeException("Date转换异常!!!");
}
}
}
-
在springmvc.xml里面配置转换器
spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去
<!-- 配置类型转换器 -->
<bean id="converterService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<!-- 给工厂注入一个新的类型转换器 -->
<property name="converters">
<array>
<!-- 配置自定义类型转换器 -->
<bean class="com.wjs.convert.DateConverter"></bean>
</array>
</property>
</bean>
- 在 annotation-driven 标签中引用配置的类型转换服务
<!--配置Spring开启mvc注解-->
<mvc:annotation-driven conversion-service="converterService"></mvc:annotation-driven>
5.3 使用 ServletAPI 对象作为方法参数(了解)
SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。我们可以把它们直接写在控制的方法参数中使用。 支持原始 ServletAPI 对象有 :
HttpServletRequest
HttpServletResponse
HttpSession
java.security.Principal
Locale
InputStream
OutputStream
Reader
Writer
- 页面
<a href="account/testServletAPI?name=zs">使用 ServletAPI 对象作为方法参数</a>
- AccountController.java
@RequestMapping("/useServletApi")
public String userServletApi(HttpSession session, HttpServletRequest request){
String header = request.getHeader("User-Agent");
System.out.println(header);
//向使用session对象存值
session.setAttribute("username","奥巴马");
return "success";
}
六.RestFul(重点)
6.1 PathVariable【重点】
该注解的作用是,获取RestFul风格的url上的参数
@RequestMapping("/go/{name}/{id}")
public String restfulStyle(@PathVariable String name,@PathVariable String id){
System.out.println("name"+name+"id"+id);
return "success";
}
6.2 RESTFul 风格 URL
REST(英文: Representational State Transfer,简称 REST)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。在目前主流的三种 Web 服务交互方案中, REST 相比于 SOAP(Simple Object Access protocol,简单对象访问协议)以及 XML-RPC 更加简单明了,无论是对 URL 的处理还是对 Payload 的编码, REST 都倾向于用更加简单轻量的方法设计和实现。值得注意的是 REST 并没有一个明确的标准,而更像是一种设计的风格。它本身并没有什么实用性,其核心价值在于如何设计出符合 REST 风格的网络接口。
-
restful 的优点
它结构清晰、符合标准、易于理解、 扩展方便,所以正得到越来越多网站的采用。
-
restful 的特性:
资源(Resources) : 网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个 URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的 URI 就可以,因此 URI 即为每一个资源的独一无二的识别符。表现层(Representation) : 把资源具体呈现出来的形式,叫做它的表现层 (Representation)。比如,文本可以用 txt 格式表现,也可以用 HTML 格式、 XML 格式、 JSON 格式表现,甚至可以采用二进制格式。状态转化(State Transfer) : 每 发出一个请求,就代表了客户端和服务器的一次交互过程。HTTP 协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段, 让服务器端发生“ 状态转化” (State Transfer)。而这种转化是建立在表现层之上的,所以就是 “ 表现层状态转化” 。具体说,就是 HTTP 协议里面,四个表示操作方式的动词: GET 、 POST 、 PUT、DELETE。它们分别对应四种基本操作: GET 用来获取资源, POST 用来新建资源, PUT 用来更新资源, DELETE 用来删除资源 .
-
实例
保存
传统:http://localhost:8080/user/save
REST:http://localhost:8080/user POST方式 执行保存
更新
传统:http://localhost:8080/user/update?id=1
REST:http://localhost:8080/user/1 PUT方式 执行更新 1代表id
删除
传统:http://localhost:8080/user/delete?id=1
REST:http://localhost:8080/user/1 DELETE方式 执行删除 1代表id
查询
传统:http://localhost:8080/user/findAll
REST:http://localhost:8080/user GET方式 查所有
传统:http://localhost:8080/user/findById?id=1
REST:http://localhost:8080/user/1 GET方式 根据id查1个
6.3 使用说明
-
作用:
用于绑定 url 中的占位符。 例如:请求 url 中 /delete/{id}, 这个{id}就是 url 占位符。
url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。 -
属性:
value: 用于指定 url 中占位符名称。
required:是否必须提供占位符。
6.4 使用实例
- UserController.java
/**
* .../findCheckItem?mealId=1&groupId=3&itemId=10
* 目标: /套餐id/检查组的id/检查项的id ----> .../1/3/10
* @return
*/
@RequestMapping(method = RequestMethod.GET,path = "/{mealId}/{groupId}/{itemId}")
public String findCheckItem(@PathVariable("mealId") int mealId,@PathVariable("groupId") int groupId,@PathVariable("itemId") int itemId){
System.out.println("根据id查询:mealId=" + mealId + ",groupId=" + groupId + ",itemId=" + itemId);
return "success";
}
@RequestMapping(method = RequestMethod.DELETE,path = "/{mealId}/{groupId}/{itemId}")
public String deleteCheckItem(@PathVariable("mealId") int mealId,@PathVariable("groupId") int groupId,@PathVariable("itemId") int itemId){
System.out.println("根据id删除:mealId=" + mealId + ",groupId=" + groupId + ",itemId=" + itemId);
return "success";
}
七.一些不太重要的注解
7.1. RequestHeader【了解】 ,也有使用场景
7.1.1使用说明
- 作用:
用于获取请求消息头。 - 属性:
value:提供消息头名称
required:是否必须有此消息头
7.1.2使用实例
- UserController.java
/**
* 获取userAgent请求头的信息
* @return
*/
@RequestMapping("/getUserAgent")
public String getUserAgent(@RequestHeader(value="user-Agent") String userAgent){
System.out.println("请求头userAgent的信息:" + userAgent);
return "success";
}
7.2. CookieValue【了解】
7.2.1使用说明
-
作用:
用于把指定 cookie 名称的值传入控制器方法参数。
-
属性:
value:指定 cookie 的名称。
required:是否必须有此 cookie。
7.2.2使用实例
- UserController.java
/**
* 获取名字叫做JSESSIONID的cookie的值
* @param cookieValue
* @return
*/
@RequestMapping("/getCookieValue")
public String getCookieValue(@CookieValue("JSESSIONID") String cookieValue){
System.out.println("获取的cookie的值为:" + cookieValue);
return "success";
}
7.3. ModelAttribute (了解)
7.3.1使用说明
-
作用:
该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
-
属性:
value:用于获取数据的 key。 key 可以是 POJO 的属性名称,也可以是 map 结构的 key。 -
应用场景:
当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
例如:
我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数
据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。 (例如我们修改学科的时候前端传入的值没有学科的id,但是我们又需要,我们可以提前设置好)
7.3.2使用实例
- 页面
<form action="user/testModelAttribute" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
<input type="submit" value="testModelAttribute"/>
</form>
- UserController.java(用在方法上面)
@ModelAttribute
public Account getAccountById(int id){
System.out.println("根据id查询账户信息:" + id);
Account account = new Account();
account.setName("张三");
account.setMoney(1000.0);
return account;
}
@RequestMapping("/updateAccount")
public String updateAccount(Account account){
System.out.println("要修改的用账户的数据是:" + account);
return "success";
}
7.3. SessionAttributes (了解)
7.3.1使用说明
-
作用:
用于多次执行(多次请求)控制器方法间的数据共享。(该注解定义在类上)
-
属性:
value:用于指定存入的属性名称
type:用于指定存入的数据类型。
7.3.2使用实例
- SessionController.java
@Controller
@RequestMapping("/user")
@SessionAttributes(value = {"msg"})
public class UserController {
/**
* 调用该方法:往域对象中存放一个msg的值
* @return
*/
@RequestMapping("/msg")
public String msg(Model model){
//SpringMVC中model表示数据模型,其实也就是往域对象中存放数据
model.addAttribute("msg","我是域对象中msg信息");
return "success";
}
}
八.响应数据和结果视图(了解)
1.目标
- 掌握Controller的返回值使用
2.路径
- 字符串
- ModelAndView
3.讲解
3.1 字符串
controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
- 页面
<a href="response/testReturnString">返回String</a><br>
- Controller
@Controller
@RequestMapping("/response")
public class ResponseController {
//指定逻辑视图名,经过视图解析器解析为 jsp 物理路径: /WEB-INF/pages/success.jsp
@RequestMapping("/testReturnString")
public String testReturnString(){
System.out.println("testReturnString");
return "success";
}
}
3.2 ModelAndView
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
- 页面
<a href="response/testReturnModelAndView">ModelAndView类型返回值</a><br>
- Controller
@RequestMapping("testReturnModelAndView")
public ModelAndView testReturnModelAndView() {
ModelAndView mv = new ModelAndView();//数据模型和视图
//ModelAndView对象既能够绑定视图名字,又能够绑定数据(将数据存储到request域对象)
mv.addObject("name","张三");
mv.addObject("age",18);
mv.setViewName("success");
//去找视图解析器,解析viewName,使用请求转发跳转到对应的视图
return mv;
}
4.小结
- 返回String. 返回值是逻辑视图, 通过视图解析器解析成物理视图
- 返回ModelAndView
- 设置数据 向request存
- 设置视图 逻辑视图
知识点-请求转发和重定向(了解)
1.目标
- 掌握Controller中的转发和重定向使用
2.路径
- forward 转发
- Redirect 重定向
3.讲解
3.1forward 转发
controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。我们也可以加上 forward:
可以转发到页面,也可以转发到其它的controller方法
-
转发到页面
需要注意的是,如果用了 formward: 则路径必须写成实际视图 url,不能写逻辑视图。它相当于“request.getRequestDispatcher(“url”).forward(request,response)”
//转发到页面
@RequestMapping("forwardToPage")
public String forwardToPage(){
System.out.println("forwardToPage...");
//请求转发,不需要视图解析器
return "forward:/WEB-INF/pages/success.jsp";
}
-
转发到其它的controller方法
语法:
forward:/类上的RequestMapping/方法上的RequestMapping
//转发到其它controller
@RequestMapping("forwardToOtherController")
public String forwardToOtherController(){
System.out.println("forwardToOtherController...");
return "forward:/response/testReturnModelAndView";
}
3.2Redirect 重定向
contrller 方法提供了一个 String 类型返回值之后, 它需要在返回值里使用: redirect:
同样可以重定向到页面,也可以重定向到其它controller
-
重定向到页面
它相当于“response.sendRedirect(url)” 。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。
//重定向到页面
@RequestMapping("redirectToPage")
public String redirectToPage(){
System.out.println("redirectToPage...");
return "redirect:/redirect.jsp";
}
-
重定向到其它的controller方法
语法:
redirect:/类上的RequestMapping/方法上的RequestMapping
//重定向到其它Controller
@RequestMapping("redirectToOtherController")
public String redirectToOtherController(){
System.out.println("redirectToOtherController...");
return "redirect:/response/testReturnModelAndView";
}
4.小结
4.1转发和重定向区别
- 转发是一次请求, 重定向是两次请求
- 转发路径不会变化, 重定向的路径会改变
- 转发只能转发到内部的资源,重定向可以重定向到内部的(当前项目里面的)也可以是外部的(项目以外的)
- 转发可以转发到web-inf里面的资源, 重定向不可以重定向到web-inf里面的资
4.2 转发和重定向(返回String)
- 转发到页面
forward:/页面的路径
- 转发到Controller
forward:/类上面的RequestMapping/方法上面的RequestMapping
- 重定向到页面
redirect:/页面的路径
- 重定向到Controller
redirect:/类上面的RequestMapping/方法上面的RequestMapping
九.ResponseBody响应 json数据【重点】
1.目标
- 掌握SpringMVC与json交互
2.路径
- 使用说明
- 使用示例
3.讲解
3.1使用说明
该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据如: json,xml 等,通过 Response 响应给客户端
3.2使用示例
需求: 发送Ajax请求, 使用@ResponseBody 注解实现将 controller 方法返回对象转换为 json 响应给客户端
步骤:
- 导入jackson坐标
- 把什么对象转json, 方法返回值就定义什么类型
- 添加@ResponseBody注解
实现:
- Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要添加jackson依赖。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
- JsonController.java
@RequestMapping("/responseJson")
@ResponseBody
public User responseJson(){
//模拟从数据库查询数据
User user = new User();
user.setUsername("");
user.setPassword("");
//将user转换成json响应给客户端
return user;
}
4.小结
- 可以在方法上添加ResponseBody注解
- 可以在类上添加ResponseBody注解
- 可以将Controller注解改成RestController注解
4.1实现步骤
- 添加jackson坐标
- 把什么对象转成json, 方法的返回值就是什么类型
- 在方法上面或者方法的返回值前面添加@ResponseBody
解决DispatcherServlet拦截静态资源的问题(重要)
方式一(不常用): DispatcherServlet如果配置映射路径为"/"会拦截到所有的资源(除了JSP),导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能被使用。解决问题就是需要配置静态资源不进行拦截.
语法: <mvc:resources location="/css/" mapping="/css/**"/>
, location:webapp目录下的包,mapping:匹配请求路径的格式
在springmvc.xml配置文件添加如下配置
<!-- 设置静态资源不过滤 -->
<mvc:resources location="/css/" mapping="/css/**"/> <!-- 样式 -->
<mvc:resources location="/images/" mapping="/images/**"/> <!-- 图片 -->
<mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript -->
方式二:让DefaultServlet去处理静态资源,DispatcherServlet就不处理静态资源了
<mvc:default-servlet-handler />(推荐)
方式三:改变DispatcherServlet的映射路径,改成"*.do"
综合案例
####步骤
- 引入相关依赖
- spring相关的依赖
- spring-webmvc
- spring-jdbc
- mysql驱动
- mybatis
- mybatis-spring
- lombok
- 日志相关的依赖
- jackson
- spring相关的依赖
- 编写包结构、接口、类
- 编写mybatis的映射配置文件
- 编写springmvc的配置文件
- 包扫描
- 加载mvc的注解驱动
- 整合mybatis
- 编写web.xml配置文件,进行DispatcherServlet、CharacterEncodingFilter的配置
- 给类添加IOC、DI的注解
- 前端代码