8.1 配置

  • Spring MVC的配置是通过继承WebMvcConfigurerAdapter类并重载其方法实现的;
  • 前几个教程已做了得配置包括
    • 01点睛Spring MVC 4.1-搭建环境 配置viewResolver
    • 03点睛Spring MVC 4.1-REST 静态资源映射
    • 04点睛Spring MVC 4.1-拦截器 配置拦截器
    • 06点睛Spring MVC 4.1-文件上传 配置multipartResolver
    • 07点睛Spring MVC4.1-ContentNegotiatingViewResolver 配置ContentNegotiatingViewResolver

8.2 演示

8.2.1 配置路径匹配参数

  • 在Spring MVC中路径参数如果带.的话,.后面的值将被忽略,本例演示配置configurePathMatch不忽略点后面的参数;

  • 演示控制器

@RequestMapping("/configPath/{test}")
public @ResponseBody String configPath(@PathVariable String test){
return "request value:"+test;
}
  • 运行:访问http://localhost:8080/testSpringMVC/configPath/xx.yy

  • 在继承WebMvcConfigurerAdapterDemoMVCConfig类中重载configurePathMatch
    @Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false);
}
  • 再次运行:访问访问http://localhost:8080/testSpringMVC/configPath/xx.yy

8.2.2 快捷定义ViewController

  • 我们经常涉及到页面转向,但没任何处理业务的时候,快捷的页面转向定义会节省好多代码;
  • 在views目录下建一个任意的test.jsp
  • 常规的方案是这样写的
@RequestMapping("/mytest")
public String test(){
return "test";
}
  • 在继承WebMvcConfigurerAdapterDemoMVCConfig类中重载addViewControllers
  @Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/mytest").setViewName("/test");
//添加更多
}
  • 以上效果等同,均会指向views下的test.jsp

8.2.3 配置HttpMessageConverter

  • HttpMessageConverter是对http的request和response进行自动转换
  • 配置HttpMessageConverter可重载下面两个方法任意一个

    • configureMessageConverters:重载会覆盖掉spring mvc默认注册的多个HttpMessageConverter
    • extendMessageConverters:仅添加一个自定义的HttpMessageConverter,不覆盖默认注册的HttpMessageConverter
  • 通过对上面的讲述,我们一般是重载extendMessageConverters方法;

  • 下面我们演示使用js向spring mvc发送自定义格式的字符串(属性用-隔开),通过自定义的HttpMessageConverter自动转换成对象,然后通过HttpMessageConverter输出指定格式到浏览器

  • 测试javabean

    • Person
package com.wisely.domain;

public class Person {

    private String firstName;
private String lastName;
public Person(String firstName, String lastName) {
super();
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
} }
  • 自定义HttpMessageConverterWiselyMessageConverter
package com.wisely.converters;

import java.io.IOException;
import java.nio.charset.Charset; import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.StreamUtils; import com.wisely.domain.Person; public class WiselyMessageConverter extends AbstractHttpMessageConverter<Person> { //自定义媒体类型
public WiselyMessageConverter(){
super(new MediaType("application", "x-wisely", Charset.forName("UTF-8")));
}
//从request里获得构造Person实例的数据
@Override
protected Person readInternal(Class<? extends Person> clazz,
HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
String temp = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"));
String[] tempArr = temp.split("-");
return new Person(tempArr[0],tempArr[1]);
} //只支持Person类
@Override
protected boolean supports(Class<?> clazz) {
return Person.class.isAssignableFrom(clazz);
} //将person实例转换成你想要的字符串格式
@Override
protected void writeInternal(Person person, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
String out = "hello:" +person.getFirstName() + "-" + person.getLastName();
outputMessage.getBody().write(out.getBytes());
} }
  • 配置WiselyMessageConverter
  @Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
WiselyMessageConverter converter = new WiselyMessageConverter();
converters.add(converter);
}

注释掉上例的configureContentNegotiation,这里会自动将媒体类型变为text/html

// 配置ContentNegotiationManager,在无后缀名情况下默认为jsp view resolver
// @Override
// public void configureContentNegotiation(
// ContentNegotiationConfigurer configurer) {
// //忽略请求的header信息,并将contentType置为text/html
// configurer.ignoreAcceptHeader(true).defaultContentType(
// MediaType.TEXT_HTML);
// }
  • 测试控制器
@RequestMapping(value = "/convert", produces = { "application/x-wisely" })
public @ResponseBody Person convert(@RequestBody Person person) {
return person;
}
  • 测试页面:test.jsp
<%@ 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>
<div id="resp"></div><input type="button" onclick="req();" value="请求"/>
<script src="js/jquery.js" type="text/javascript"></script>
<script>
function req(){
$.ajax({
url: "convert",
data: "wang-yunfei",//注意此处的格式
type:"POST",
contentType:"application/x-wisely",
success: function(data){
$("#resp").html(data);
}
});
} </script>
</body>
</html>
  • 运行效果

SpringBoot相关配置的更多相关文章

  1. 【持续更新】springboot相关配置

    @Configuration public class MyWebMvcConfig implements WebMvcConfigurer { //注册了新的访问路径 @Override publi ...

  2. springboot配置server相关配置&整合模板引擎Freemarker、thymeleaf&thymeleaf基本用法&thymeleaf 获取项目路径 contextPath 与取session中信息

    1.Springboot配置server相关配置(包括默认tomcat的相关配置) 下面的配置也都是模板,需要的时候在application.properties配置即可 ############## ...

  3. SpringBoot数据源相关配置

    数据源配置 单数据源 配置步骤 引入依赖:H2数据库驱动.JDBC依赖.acturator(运维).web模块(用于测试).lambok(使用@Slf4j打印日志). 直接配置所需的Bean,注入容器 ...

  4. SpringBoot cache-control 配置静态资源缓存 (以及其中的思考经历)

    昨天在部署项目时遇到一个问题,因为服务要部署到外网使用,中间经过了较多的网络传输限制,而且要加载arcgis等较大的文件,所以在部署后,发现页面loading需要很长时间,而且刷新也要重新从服务器下载 ...

  5. 补习系列(10)-springboot 之配置读取

    目录 简介 一.配置样例 二.如何注入配置 1. 缺省配置文件 2. 使用注解 3. 启动参数 还有.. 三.如何读取配置 @Value 注解 Environment 接口 @Configuratio ...

  6. SpringBoot自动配置源码调试

    之前对SpringBoot的自动配置原理进行了较为详细的介绍(https://www.cnblogs.com/stm32stm32/p/10560933.html),接下来就对自动配置进行源码调试,探 ...

  7. SpringBoot自定义属性配置以及@ConfigurationProperties注解与@Value注解区别

    我们可以在application.properties中配置自定义的属性值,为了获取这些值,我们可以使用spring提供的@value注解,还可以使用springboot提供的@Configurati ...

  8. springboot日志配置

    默认情况下,spring boot使用的是LogBack日志系统.在spring-boot-starter-web和spring-boot-starter中都已经默认依赖了logging的工具包. 如 ...

  9. SpringBoot 核心配置

    1. 入口类和 @SpringBootApplication Spring Boot的项目一般都会有*Application的入口类,入口类中会有main方法,这是一个标准的Java应用程序的入口方法 ...

随机推荐

  1. 在TFS中使用Git Tags(标签或标记),实现代码的版本管理

    一.概述: 与TFVC中标记(Label)一样,Git的标签(Tag)也是TFS系统的代码管理中非常重要的一个版本管理工具.使用标签,我们可以每个时间点的代码注上一个通俗.并且容易记忆的名称(例如标签 ...

  2. spring mvc配置ObjectMapper忽略无法识别的字段,以及一些博客推荐

    通过Spring的MethodInvokingFactoryBean类实现的调用configure方法,此方法返回调用该方法的本身实例. 配置完毕后,可以在spring mvc的消息处理器中使用,为了 ...

  3. C# winform 记住密码实现代码

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. .Net Core + NGINX跳转登录时端口丢失

    使用.Net Core + NGINX部署到服务器的时候,如果端口不是使用默认的80端口,在跳转到登录页面时,URL中的端口丢失. NGINX的配置如下: server { listen ; loca ...

  5. 关于在C++中调用R函数以及RCpp使用

    最近因为项目要用到,所以在想办法把R语言用到C++中. 网上查了看到有一个Rcpp的工具.所以在这里总结一下. 现在能想到的几种在C++中调用R语言的方法如下: 1. 使用Rcpp R高级编程技巧及R ...

  6. linux 基本操作笔记

        linux文件系统的实现 linux有一个树状结构来组织文件,数的顶端为根目录/,节点为目录,而末节点为所包含的数据文件.我们可以对文件进行多种操作,比如打开和读写.   存储设备分区   文 ...

  7. 前端分享----JS异步编程+ES6箭头函数

    前端分享----JS异步编程+ES6箭头函数 ##概述Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只 ...

  8. Java基础学习篇---------多态

    一.多态性的理解 1.向上转型:子类为父类对象实例化,调用的一定是子类覆写的方法,他们之间找的是共性 2.向下转型:子类扩充了父类的某些功能,而父类中没有该功能,他们之间找的是特性 案例: Numbe ...

  9. java 中 enum 枚举的使用

    package test3; public final class Program {    public static void main(String[] args) {       // Sys ...

  10. 将一个List拆分为n份的方法

    public static void main(String[] args) { List<Integer> taskList = new ArrayList<>(); for ...