spring-mvc和amp;RestFul风格
SpringMVC基本原理
Spring MVC属于Java Web框架,既然是MVC设计模式的实现,自然侧重点是在C(控制器)上,成功实践的MVC框架,基本上都不对M(模型)进行过多约束。在Java Web技术中,最适合胜任控制器角色的当属Servlet。Spring MVC的控制器正是由DispatcherServlet这个Servlet组件充当,当请求到达DispatcherServlet后,从宏观角度来看,会经历以下一些处理步骤:
- 第一步:用户发起请求到前端控制器(DispatcherServlet)。
- 第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者注解进行查找。
- 第三步:找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)。
- 第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)。
- 第五步:处理器适配器去执行Handler。
- 第六步:Handler执行完给处理器适配器返回ModelAndView。
- 第七步:处理器适配器向前端控制器返回ModelAndView。
- 第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析。
- 第九步:视图解析器像前端控制器返回View。 第十步:前端控制器对视图进行渲染。
- 第十一步:前端控制器向用户响应结果。
看到这些步骤我相信大家很感觉非常的乱,这是正常的,但是这里主要是要大家理解SpringMVC中的几个组件:
- 前端控制器(DispatcherServlet):接收请求,响应结果,相当于电脑的CPU。
- 处理器映射器(HandlerMapping):根据URL去查找处理器。
- 处理器(Handler):(需要程序员去写代码处理逻辑的)。
- 处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,类比笔记本的适配器(适配器模式的应用)。
- 视图解析器(ViewResovler):进行视图解析,多返回的字符串,进行处理,可以解析成对应的页面。
1、创建web项目并勾选自动创建web.xml文件
2、导入jar包
3、 创建com.ysd.entity包,并在其中创建User实体类。
package com.ysd.entity;
public class User {
private String name;
private String sex;
private Integer age;
//省略get、set、带参和无参构造方法、toString方法
}
4、 在src下创建spring-mvc.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
</beans>
5、在WEB-INF下的web.xml中配置前端控制器。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>springmvc01</display-name>
<!-- 配置前端控制器(DispatcherServlet):这是springmvc的核心:请求分发器, -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- DispatcherServlet要绑定spring的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 启动级别:1 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!--
在springmvc中,/ /*
/:只匹配所有的请求,不会去匹配jsp页面
/*:匹配所有的请求,包括jsp页面
-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
-
初始化参数标签中参数名为contextConfigLocation,值为classpath:springmvc.xml,意为加载springmvc的配置文件,注意配置文件的名称不能写错。
-
标签中的标签的“/”,表示该项目下的所有请求全部交由前端控制器进行接收。
6、在springmvc.xml中配置处理器适配器(HandlerAdapter)、处理器映射器(HandlerMapping)、视图解析器(ViewResolver)。
<!-- 处理器适配器:HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<!-- 处理器映射器:HandlerMapping -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 视图解析器:ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/"></property>
<!-- 后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
- 处理器适配器:我们使用了SimpleControllerHandlerAdapter,翻译过来就是简单的控制器处理器适配器,它支持所有实现了 Controller 接口的 Handler 控制器,如果开发中编写了实现 Controller 接口的控制器,则 SimpleControllerHandlerAdapter 适配器就会去执行。
- 处理器映射器:BeanNameUrlHandlerMapping,这个类的映射规则是将 bean 的 name 作为 url 进行查找,需要在配置 Handler 时指定 beanname。
- InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中,然后通过RequestDispatcher在服务器端把请求forword重定向到目标URL。视图解析器的前缀和后缀可以减少Controller中编写的代码。
7、编写处理器(Controller)
package com.tcc.contorller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import com.tcc.entity.User;
public class UserController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
//ModelAndView中包含了模型和视图信息
ModelAndView mv = new ModelAndView();
//此处应该调用service业务层的查询方法,因为本案例没有使用MyBatis,所以我们使用静态数据
List<User> userList = new ArrayList<User>();
userList.add(new User("张三", "男", 18));
userList.add(new User("李四", "女", 16));
userList.add(new User("王五", "未知", 20));
//相当于request的setAttribute方法,可以在JSP中获取 (1
mv.addObject("userList", userList);
//设置视图路径
//如果视图解析器中没有配置前缀和后缀,此处应该写为:/WEB-INF/userList.jsp (2
mv.setViewName("userList");
//返回modelAndView
return mv;
}
}
- Controller中编写着我们的核心业务代码,该类需要实现Controller接口。①处当于request的setAttribute方法,可以在JSP中通过EL表达式或者小脚本获取。
- 在第6步的视图解析器中配置了前缀和后缀,所以②处代码可以省略“/WEB-INF/”和“.jsp”,如果视图解析器中没有配置,应该写为“/WEB-INF/userList.jsp”
8、 将上一步的UserController配置为Bean。
<bean name="/user" class="com.tcc.controller.UserController"/>
- 该Bean中class属性为UserController类的全限定名,name属性为访问该类的路径,注意“/”必须保留,否则不能正常访问。
9、编写视图(JSP),在WEB-INF下创建userList.jsp,视图名称与路径应与第7步中的setViewName()中的值保持一致。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!-- (1) -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
td,th { border: 1px solid #ccc }
table { border-collapse: collapse; }
</style>
</head>
<body>
<table>
<tr>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
</tr>
<c:forEach items="${userList}" var="user"> <!-- (2) -->
<tr>
<td>${user.name}</td>
<td>${user.sex}</td>
<td>${user.age}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
- JSP中①处使用了jstl标签。②处使用了EL表达式,其中填写的“userList”应与第7步中addObject()方法的键保持一致。
10、项目结构如下:
11、 将项目部署至Tomcat 8中。
12、打开浏览器访问:http://localhost:8080/springmvc1/user
路径分析:
- localhost代表本机地址;
- 8080代表端口号;
- springmvc1代表项目名;
- user代表第8步中bean中“name”属性的值。
测试结果:
SpringMVC注解开发
步骤:
1、新建Web项目springmvc2。
2、添加相应的jar包,注意要添加webmvc和jstl。
3、 创建com.ysd.entity包,并在其中创建User实体类。
4、 在src下创建springmvc.xml配置文件,并添加如下代码。
5、在WEB-INF下的web.xml中配置前端控制器
6、在springmvc.xml中配置开启注解、视图解析器(ViewResolver)。
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
<context:component-scan base-package="com.tcc"/>
<!-- 让mvc不处理静态资源 .css .js .html .mp3 .mp4 -->
<mvc:default-servlet-handler/>
<!--
支持mvc注解驱动
在spring中一般采用@RequestMapping注解来完成映射关系
想要使用@RequestMapping注解生效
必须向上下文中注册DefaultAnnotationHandlerMapping
和一个AnnotationMethodHandlerAdapter实例
这两个实例分别在类级别和方法级别处理。
而annotation-driven配置帮助我们自动完成上述两个实例
-->
<mvc:annotation-driven/>
<!-- 视图解析器:ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/"></property>
<!-- 后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
- <context:component-scan base-package=“com.ysd” />意为开启注解扫描,开启之后可以使用Spring的注解进行配置Bean。
- mvc:annotation-driven/意为开启SpringMVC注解,当配置了mvc:annotation-driven/后,Spring就知道了我们启用注解驱动。然后Spring通过<context:component-scan />标签的配置,会自动为我们将扫描到的@Component,@Controller,@Service,@Repository等注解标记的组件注册到工厂中,来处理我们的请求。
7、编写Controller
package com.tcc.controller;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.tcc.entity.User;
@Controller
public class UserController {
@RequestMapping("/getUsers") //(1)
public ModelAndView getUsers(){ //(2)
ModelAndView mv = new ModelAndView();
//此处应该调用service业务层的查询方法,因为本案例没有使用MyBatis,所以我们使用静态数据
List<User> userList = new ArrayList<User>();
userList.add(new User("张三", "男", 18));
userList.add(new User("李四", "女", 16));
userList.add(new User("王五", "未知", 20));
//相当于request的setAttribute方法,可以在JSP中获取
mv.addObject("userList", userList);
//设置视图路径
//如果视图解析器中没有配置前缀和后缀,此处应该写为:/WEB-INF/userList.jsp
mv.setViewName("userList");
//返回modelAndView
return mv;
}
}
Controller变动比较大,相比较xml配置的方式,注解式开发不再需要实现Controller接口,但是需要在类上加@Controller注解。提示:@Component、@Controller、@Service、@Repository四个注解作用相同,但是因为Controller是控制层,所以此处应该使用@Controller注解。@Service应该用在业务层,@Repository应该用在持久层,@Component一般用在POJO类或别处。
- ①处注解@RequestMapping()意为请求映射,其中的参数为映射地址,推荐参数值和方法名相同。
- ②处返回值为ModelAndView,方法名自取,符合命名规范即可。
8、编写JSP
9、部署项目运行,在浏览器中输入:http://localhost:8080/springmvc2/getUsers。
@RequestMapping()
RequestMapping()也可以写在类上(不建议这样写)
package com.tcc.controller;
import com.tcc.entity.User;
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/getUsers")
public String getUsers(Model model){
//此处应该调用service业务层的查询方法,因为本案例没有使用MyBatis,所以我们使用静态数据
List<User> userList = new ArrayList<User>();
userList.add(new User("张三", "男", 18));
userList.add(new User("李四", "女", 16));
userList.add(new User("王五", "未知", 20));
//相当于request的setAttribute方法,可以在JSP中获取
model.addAttribute("userList", userList);
//设置视图路径
//如果视图解析器中没有配置前缀和后缀,此处应该写为:/WEB-INF/userList.jsp
//返回jsp页面
return "userList";
}
}
但是路径前面要加上:http://localhost:8080/springmvc2/user/getUsers。
或者(常用)
package com.tcc.controller;
import com.tcc.entity.User;
@Controller
public class UserController {
@RequestMapping("/user/getUsers")
public String getUsers(Model model){
//此处应该调用service业务层的查询方法,因为本案例没有使用MyBatis,所以我们使用静态数据
List<User> userList = new ArrayList<User>();
userList.add(new User("张三", "男", 18));
userList.add(new User("李四", "女", 16));
userList.add(new User("王五", "未知", 20));
//相当于request的setAttribute方法,可以在JSP中获取
model.addAttribute("userList", userList);
//设置视图路径
//如果视图解析器中没有配置前缀和后缀,此处应该写为:/WEB-INF/userList.jsp
//返回jsp页面
return "userList";
}
}
也可以在注解里添加参数来设置请求(方法一,不常用。方法二见下↓)
@RequestMapping(value="/user/getUsers",method=RequestMethod.POST)
RestFul风格
路径不用&和?传参统一全部用/
RESTful示例
- /account/1 HTTP GET:得到id=1的account
- /account/1 HTTP DELETE:删除id=1的account
- /account/1 HTTP PUT:更新id=1的account
路径一样,提交方法不一样走的comtroller不一样
@GetMapping("/user/getUsers2/{a}/{b}")
public String getUsers2(@PathVariable int a, @PathVariable int b,Model model){
int num = a b;
String msg = "get传入value的值为:" num;
model.addAttribute("value", msg);
return "a";
}
@PostMapping("/user/getUsers2/{a}/{b}")
public String getUsers3(@PathVariable int a, @PathVariable int b,Model model){
int num = a b;
String msg = "post传入value的值为:" num;
model.addAttribute("value", msg);
return "a";
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/springmvc02-annotation/user/getUsers2/1/3" method="get">
<input type="submit">
</form>
</body>
</html>
如果表单提交方法为get则走上面的controller方法,如果为post则走下面的
RestFul的CRUD
@RequestMapping:通过设置method属性的CRUD,可以将同一个URL映射到不同的HandlerMethod方法上。
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping注解同@RequestMapping注解的method属性设置。
方法一:正常
//正常:localhost:8080/springmvc02-annotation/user/getUsers2?a=1&b=2
@GetMapping("/user/getUsers2")
public String getUsers2(int a, int b, Model model){
int num = a b;
model.addAttribute("value", num);
return "a";
}
@PathVariable:可以解析出来URL中的模板变量({a}/{b})
//RestFul:localhost:8080/springmvc02-annotation/user/getUsers2/1/2
@GetMapping("/user/getUsers2/{a}/{b}")
public String getUsers2(@PathVariable int a, @PathVariable int b,Model model){
int num = a b;
model.addAttribute("value", num);
return "a";
}
重定向和转发
方法一:
//在SpringMVC中仍然可以使用传统方式实现转发和重定向
request.getRequestDispatcher(" ").forward(request,response);
//重定向
response.sendRedirect(" ");
方法二:
转发写【forward】的话是不走视图解析器的,不写的话是走视图解析器的。
//请求的转发,不能使用视图解析器
//使用视图解析器的话默认就是转发
return "forward:/WEB-INF/pages/success.jsp";
//重定向
return "redirect:index";
接收请求参数及数据回显
提交的域名和处理方法的参数名一致:
提交数据:localhost:8080/springmvc02-annotation/user/getUsers5/?name=大米&age=20
处理方法:
@GetMapping("/user/getUsers5")
public String getUsers5(String name, Integer age,Model model){
String msg = "大家好,我叫:" name "我今年" age "岁了";
model.addAttribute("value", msg);
return "a";
}
提交的域名和处理方法的参数名不一致:
提交数据:localhost:8080/springmvc02-annotation/user/getUsers6/?name=大米&age=20
处理方法:【@RequestParam("")】
@GetMapping("/user/getUsers6")
public String getUsers6(@RequestParam("name") String myName,@RequestParam("age") Integer myAge,Model model){
String msg = "大家好,我叫:" myName "我今年" myAge "岁了";
model.addAttribute("value", msg);
return "a";
}
提交的参数为对象
要求:提交的表单和对象的属性名一致
提交数据:localhost:8080/springmvc02-annotation/user/getUsers7/?name=大米&age=20&sex=男
处理方法:
@GetMapping("/user/getUsers7")
public String getUsers7(User user,Model model){
String msg = "大家好,我叫:" user.getName() ",性别:" user.getSex() ",我今年" user.getAge() "岁了";
model.addAttribute("value", msg);
return "a";
}
小结
- 当提交的域名和处理方法的参数名一样时,会自动匹配值
- 当提交的域名和处理方法的参数名不一样时,需要在参数前定义注解【@RequestParam("")】
- 当提交的参数为对象时,要求是:提交的表单和对象的属性名一致才会自动匹配值。
- 【@RequestParam】和mybatis中dao层的方法中参数前的【@Param】是一样的,是一种规范,所以不管域名和参数名是否一样,都需要添加【@RequestParam】注解。
JSON乱码问题
表单提交controller获得中文参数后乱码解决方案
注意: jsp页面编码设置为UTF-8
form表单提交方式为必须为post,get方式下面spring编码过滤器不起效果
方式一:通过设置@RequestMapping的produces属性。
@RequestMapping(value = "json1",produces = "application/json;charset=utf-8")
@ResponseBody
public String json() throws JsonProcessingException {
// 创建对象
User user = new User("张三",18,"男");
// 格式化对象
return new ObjectMapper().writeValueAsString(user);
}
方式二:设置springmvc.xml配置文件的mvc:annotation-driven
注意:先导入jackson的jar包:
<!-- JSON乱码问题配置 -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
JSON(用于前后端分离)
新建TestController
@ResponseBody:不走解析器,会返回一个字符串
@RestController:和上面一样,但是写在类上,表明这个类里的方法都不走,一劳永逸!(建议)
package com.tcc.controller;
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 com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tcc.entity.User;
//@Controller
@RestController
public class TestController {
@RequestMapping("/t/t1")
//@ResponseBody 它不会走视图解析器,会直接返回一个字符串
public String test1(Model model) throws JsonProcessingException{
ObjectMapper mapper = new ObjectMapper();
User user = new User("小黑","男",20);
String st = mapper.writeValueAsString(user);
return st;
}
}
日期转换json格式
直接转的话使用的是时间戳
@RestController
public class TestController {
@RequestMapping("/t/t1")
//@ResponseBody 它不会走视图解析器,会直接返回一个字符串
public String test1(Model model) throws JsonProcessingException{
ObjectMapper mapper = new ObjectMapper();
ArrayList<User> list = new ArrayList<User>();
Date date = new Date();
String st = mapper.writeValueAsString(date);
return st;
}
}
结果:
解决办法:使用SimpleDateFormat转换成能看懂的格式
@RestController
public class TestController {
@RequestMapping("/t/t1")
//@ResponseBody 它不会走视图解析器,会直接返回一个字符串
public String test1(Model model) throws JsonProcessingException{
ObjectMapper mapper = new ObjectMapper();
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
String s = sdf.format(date);
String st = mapper.writeValueAsString(s);
return st;
}
}
结果 :
或者创建工具类方便获取json格式的日期的复用
创建util包和类
package com.tcc.util;
import java.text.SimpleDateFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonUtil {
public static String getJsonDate(Object object,String dateFormat) throws JsonProcessingException{
ObjectMapper mapper = new ObjectMapper();
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
String format = sdf.format(object);
return mapper.writeValueAsString(format);
}
}
调用:
@RestController
public class TestController {
@RequestMapping("/t/t1")
//@ResponseBody 它不会走视图解析器,会直接返回一个字符串
public String test1(Model model) throws JsonProcessingException{
Date date = new Date();
return JsonUtil.getJsonDate(date, "yyyy-MM-dd HH-mm-ss");
}
}
或者工具类里重构方法(方法里面调用方法),修改util工具类(调用方法的时候只需要提供一个日期变量)
public class JsonUtil {
public static String getJsonDate(Object object) throws JsonProcessingException{
return getJsonDate(object, "yyyy-MM-dd HH-mm-ss");
}
public static String getJsonDate(Object object,String dateFormat) throws JsonProcessingException{
ObjectMapper mapper = new ObjectMapper();
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
String format = sdf.format(object);
return mapper.writeValueAsString(format);
}
}
修改测试类代码:
@RestController
public class TestController {
@RequestMapping("/t/t1")
//@ResponseBody 它不会走视图解析器,会直接返回一个字符串
public String test1(Model model) throws JsonProcessingException{
Date date = new Date();
return JsonUtil.getJsonDate(date);
}
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhhahcba
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13