想建立一个网站怎么做,网站优化指标,网站备案域名需要解析到备案服务器吗,上海 网站建在这篇文章中#xff0c;我想对Spring MVC进行一些深入的探讨#xff0c;以揭示将请求转换为参数对象后在幕后发生的情况#xff0c;反之亦然。 在开始之前#xff0c;我想解释这些注释的目的。 RequestBody和ResponseBody是做什么用的#xff1f; 它们是spring mvc框架的… 在这篇文章中我想对Spring MVC进行一些深入的探讨以揭示将请求转换为参数对象后在幕后发生的情况反之亦然。 在开始之前我想解释这些注释的目的。 RequestBody和ResponseBody是做什么用的 它们是spring mvc框架的注释可用于控制器中以实现智能对象序列化和反序列化。 通过提取消息转换的逻辑并将其作为一个方面它们可帮助您避免样板代码。 除此之外它们还帮助您为单个REST资源支持多种格式而无需重复代码。 如果您使用ResponseBody注释方法spring将尝试转换其返回值并将其自动写入http响应。 如果使用RequestBody注释方法参数spring会尝试将传入请求主体的内容即时转换为参数对象。 这是一个例子 Controller
RequestMapping(value /bookcase)
public class BookCaseController {private BookCase bookCase;RequestMapping(method RequestMethod.GET)ResponseBodypublic BookCase getBookCase() {return this.bookCase;}RequestMapping(method RequestMethod.PUT)ResponseStatus(HttpStatus.NO_CONTENT)public void setBookCase(RequestBody BookCase bookCase) {this.bookCase bookCase;}}那么当我们使用这些注释时Spring在后台做了什么 根据您的配置spring在后台注册了HttpMessageConverters列表。 HttpMessageConverters的职责是根据预定义的mime类型将请求正文转换为特定类然后再次转换为响应正文。 每当发出的请求命中RequestBody或ResponseBody批注时spring都会循环遍历所有已注册的HttpMessageConverters以寻找适合给定mime类型和类的第一个然后将其用于实际转换。 如何添加自定义HttpMessageConverter 通过分别添加EnableWebMvc mvcannotation-driven /spring为JSON / XML注册了一堆预定义的消息转换器等等。 您可以添加如下的自定义转换器 Configuration
EnableWebMvc
ComponentScan
public class WebConfiguration extends WebMvcConfigurerAdapter {Overridepublic void configureMessageConverters(ListHttpMessageConverter? httpMessageConverters) {httpMessageConverters.add(new BookCaseMessageConverter(new MediaType(text, csv)));}
} 在此示例中我编写了一个转换器用于处理BookCase的转换而BookCase基本上是一本Books List。 转换器能够将csv内容转换为BookCase反之亦然。 我使用opencsv解析文本。 这是模型 public class Book {private String isbn;private String title;public Book(String isbn, String title) {this.isbn isbn;this.title title;}// ...
}public class BookCase extends ArrayListBook {public BookCase() {}public BookCase(Collection? extends Book c) {super(c);}
} 和实际的转换器 public class BookCaseMessageConverter extends AbstractHttpMessageConverterBookCase {public BookCaseMessageConverter() {}public BookCaseMessageConverter(MediaType supportedMediaType) {super(supportedMediaType);}public BookCaseMessageConverter(MediaType... supportedMediaTypes) {super(supportedMediaTypes);}Overrideprotected boolean supports(Class? clazz) {return BookCase.class.equals(clazz);}Overrideprotected BookCase readInternal(Class? extends BookCase clazz, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException {CSVReader reader new CSVReader(new InputStreamReader(httpInputMessage.getBody()));ListString[] rows reader.readAll();BookCase bookCase new BookCase();for (String[] row : rows) {bookCase.add(new Book(row[0], row[1]));}return bookCase;}Overrideprotected void writeInternal(BookCase books, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {CSVWriter writer new CSVWriter(new OutputStreamWriter(httpOutputMessage.getBody()));for (Book book : books) {writer.writeNext(new String[]{book.getIsbn(), book.getTitle()});}writer.close();}
}结果 现在我们可以将text / csv请求以及application / json和xml发出给我们的资源而这些请求基本上是开箱即用的。 PUT /bookcase
Content-Type: text/csv
123,Spring in Action
456,Clean CodeResponse
204 No ContentGET /bookcase
Accept: text/csvResponse
200 OK
123,Spring in Action
456,Clean Code 得益于遵循单责任原则的spring mvc设计我们的控制器保持纤薄。 如果我们要支持新的媒体类型则不必添加一行。 完整的示例可以在我的github上找到 参考 Spring MVC –在Be Be a Better Developer博客上 JCG合作伙伴 Gregor Riegler 揭露了RequestBody和ResponseBody的神秘面纱 。 翻译自: https://www.javacodegeeks.com/2013/07/spring-mvc-requestbody-and-responsebody-demystified.html