краткое содержание
SpringMVC использует конвертер сообщений для реализации автоматического преобразования между сообщениями запроса и объектами, объектами и ответными сообщениями.
В SpringMVC вы можете использовать две аннотации @Requestbody и @Responsebody, чтобы завершить преобразование сообщений запроса в объекты и объекты в сообщениях ответов соответственно. Основным механизмом гибкого преобразования сообщений является недавно введенный httpmessageconverter, механизм преобразователя сообщений, который является недавно введенным HttpmessageConverter в Spring 3.x.
Абстракция запроса #HTTP по-прежнему заключается в том, чтобы вернуться к запросу-ответ, то есть анализировать тело запроса, а затем вернуть ответное сообщение. Это самый основной процесс HTTP -запроса. Мы знаем, что в стандарте сервлета можно использовать следующие методы в интерфейсе javax.servlet.servletrequest:
public servletinptream getInputStream () бросает ioException;
Чтобы получить ServletInputStream. В этом ServletinptStream можно прочитать все содержимое сообщения о необработанном запросе. Точно так же в интерфейсе javax.servlet.servletresponse можно использовать следующие методы:
public ServletOutputStream getOutputStream () бросает ioException;
Чтобы получить ServletOutputStream, этот ServletOutput -Steam, унаследованный от outputStream в Java, позволяет выводить содержимое пакета ответов HTTP.
Давайте попробуем думать как дизайнер Springmvc. Мы знаем, что HTTP -запрос и пакеты ответов по сути являются строкой струн. Когда пакет запроса приходит в мир Java, он будет инкапсулирован в входной поток ServletInputStream для нас для чтения пакетов. Ответ -сообщение выводит через выходной поток сервис -аутистемы.
Мы можем прочитать только исходное строковое сообщение из потока, и аналогично, мы можем написать только исходные символы в выходной поток. В мире Java обработка бизнес-логики основана на бизнес-объектах в качестве аспектов обработки. Затем, когда сообщение прибывает в SpringMVC и выходит из SpringMVC, существует проблема импеданса между строками и объектами Java. Этот процесс не может быть преобразован вручную разработчиком. Мы знаем, что в Struts2 ognl используется для решения этой проблемы, в то время как в SpringMVC это механизм HTTPMessageConverter. Давайте сначала посмотрим на два интерфейса.
#Httpinputmessage Этот класс является абстракцией сообщения HTTP -запроса в Springmvc. В методе read () httpmessageconverter существует формальный параметр httpinputmessage, который является внутренней абстракцией сообщения запроса рецептора «используется для преобразователя сообщений Springmvc. Преобразователь сообщений извлекает сообщения из «Сообщения запроса» в соответствии с правилами и преобразует их в объекты, объявленные в формальном параметре метода.
Пакет org.springframework.http; импорт java.io.ioexception; import java.io.inputstream; public interface httpinputmessage extends httpmessage {inputstream getBody () бросает ioException;}#Httpoutputmessage Этот класс является абстракцией ответного сообщения HTTP в Springmvc. В методе write () httpmessageconverter существует формальный параметр httpoutputmessage, который является внутренней абстракцией рецептора «ответа», используемого конвертером сообщений Springmvc. Преобразователь сообщений записывает «сообщение ответа» в ответное сообщение в соответствии с определенными правилами.
пакет org.springframework.http; import java.io.ioexception; import java.io.outputstream; public interface httpoutputmessage extends httpmessage {outputstream getBody () бросает ioException;}#HttpmessageConverter Абстракция интерфейса самого высокого уровня преобразователя сообщений описывает общие характеристики конвертера сообщения. Мы можем понять процесс мышления дизайнеров Spring3.x по этому механизму из методов, определенных на этом графике.
пакет org.springframework.http.converter; import java.io.ioexception; импорт java.util.list; import org.springframework.http.httpinputmessage; импорт org.springframework.http.httpoutputmessage; Httpmessageconverter <t> {boolean canread (class <?> Clazz, mediaType MediaType); Boolean CanWrite (Class <?> Clazz, MediaType MediaType); Список <MediaType> getSupportedMediatypes (); T Read (Class <? Extends T> clazz, httpinputmessage inputmessage) бросает ioexception, httpmessagenotreadableexception; void write (t t, mediaType contentType, httpoutputmessage outputmessage) бросает ioexception, httpmessagenotwritexception;}Определение интерфейса httpmessageconverter имеет парный CanRead (), read () и canWrite (), write () методы. MediaType - это инкапсуляция запрошенного атрибута типа носителя. Например, когда мы объявляем следующий метод обработки.
@Requestmapping (value = "/string", method = requestMethod.post) public @Responsebody StringString (@Requestbody String String) {return "Read String '" + String + "'";}Прежде чем SpringMVC введет метод ReadString, он выберет соответствующий класс реализации httpmessageConverter в соответствии с аннотацией @Requestbody, чтобы анализировать параметры запроса в строковую переменную. В частности, используется класс StringhttpmessageConverter. Его метод canread () возвращает true, а затем его метод read () будет считывать параметры запроса из запроса и привязать к строковой переменной метода readstring ().
Когда SpringMVC выполняет метод ReadString, поскольку возвратное значение идентифицирует @ResponseBody, SpringMVC будет использовать метод write () stringhttpmessageConverter и написать результат в качестве строкового значения в сообщение ответа. Конечно, метод CanWrite () возвращается в настоящее время.
Мы можем использовать следующий рисунок, чтобы кратко описать этот процесс.
#Requestresponsebodymethodprocessor. Класс, описанный в приведенном выше наборе процессов, является org.springframework.web.servlet.mvc.method.annotation.requestresponsebodemethodprocessor. Этот класс реализует как интерфейсы HandlermethodargumentResolver, так и HandlermethodreturnValueHandler. Первый - это интерфейс политики, который связывает сообщение запроса с формальными параметрами метода обработки, а последний - это интерфейс политики, который обрабатывает возвратное значение метода обработки. Исходные коды двух интерфейсов следующие:
пакет org.springframework.web.method.support; import org.springframework.core.methodparameter; import org.springframework.web.bind.webdatabinder; импорт org.springframework.web.bind.support.webdatabinder; org.springframework.web.context.request.nativeWebRequest; открытый интерфейс handlermethodargumentResolver {boolean supportSparameter (параметр методапараметра); Object Resolveargument (параметр MethodParameter, ModelAndViewContainer MavContainer, NativeWebRequest WebRequest, WebDataBinderFactory BindFactory) Throws Exception;} пакет org.springframework.web.method.support; импорт org.spramework.core.methodparameter; org.springframework.web.context.request.nativeWebRequest; открытый интерфейс handlerMethodReturnValueHandler {boolean supportsreturntype (методпарамет returntype); void handlereturnvalue (returnvalue объекта, методпарамет returntype, modelandviewcontainer mavcontainer, NativeWebRequest WebRequest) Throws Exception;}Класс запроса requestResponsebodymethodProcessor также служит двумя ролями: анализ параметров метода и обработка возврата значения. Из его исходного кода мы можем найти реализацию метода двух вышеуказанных интерфейсов.
Внедрение интерфейса ручной работы рукнятодаргументирования:
public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(RequestBody.class);}public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory bindFactory) throws Exception { Object argument = readWithMessageConverters(webRequest, параметр, parameter.getGenericParameterType ()); String name = conventions.getvariablenameforparameter (параметр); Webdatabinder binder = bindfactory.createbinder (webRequest, аргумент, имя); if (аргумент! = null) {validate (binder, parameter); } mavcontainer.addattribute (bindingResult.model_key_prefix + name, binder.getBindingResult ()); вернуть аргумент;}Реализация интерфейса handlermethodreturnvaluehandler
public boolean supportsReturnType(MethodParameter returnType) { return returnType.getMethodAnnotation(ResponseBody.class) != null;} public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws IOException, Httpmediatypenotaceptableexception {mavcontainer.setRequestHandled (true); if (returnvalue! = null) {writewithmessageconverters (returnvalue, returntype, webRequest); }}После прочтения приведенного выше кода, весь контекст конвертации сообщений HTTPMessageConverter уже очень ясен. Поскольку реализация двух интерфейсов основана на том, есть ли @Requestbody и @Responsebody в качестве условия, а затем httpmessageConverter называется соответственно для чтения и записи сообщений.
Если вы хотите спросить, как отслеживать requestResponsebodymethodProcessor, пожалуйста, следуйте идеям предыдущих постов в блоге, а затем перейдите на Spring-MVC-Showcase, чтобы загрузить исходный код и отладки примерами, связанными с HTTPMessageConverter. Пока вы готовы усердно работать, я считаю, что вы определенно получите свой собственный.
#Наблюдая за Чжан Сяолонгом. Когда он говорит о сущности WeChat, он сказал: «WeChat - это просто платформа, а в нем циркулируют сообщения». В нашем процессе анализа исходного кода SpringMVC мы можем понять подобные истины из механизма HTTPMessageConverter. В глазах дизайнеров SpringMVC, сообщение запроса и ответное сообщение абстрагируются в сообщение о запросе httpinputmessage и ответное сообщение httpoutputmessage, соответственно.
При обработке запроса соответствующий преобразователь сообщения связывает сообщение запроса с формальным объектом параметра в методе. Здесь может быть несколько разных форм сообщений для одного и того же объекта, таких как JSON и XML. Аналогичным образом, при ответе на запрос возвратное значение метода также может быть возвращено в различные формы сообщений, такие как JSON и XML.
В SpringMVC у нас есть разные классы реализации HTTPMessageConverter для обработки различных форм сообщений для различных форм сообщений. Однако, пока «допустимая информация», содержащаяся в этих сообщениях, является последовательной, различные преобразователи сообщений будут генерировать тот же результат преобразования. Что касается различий в деталях анализа между различными сообщениями, они заблокированы в различных классах реализации HTTPMessageConverter.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.