springweb 详解。
spring web架构图

从图中可以看出,
如果要对输出的内容进行重构,不需要视图的话,在handlerMethodReturnValueHandler里进行操作,可以重构这个对象,以达到自定义输出的结果。
需要视图的话,在viewResolver 进行处理,
servletInvocableHandlerMethod 对请求参数进行封装。
如果参数封装有问题,就去 servletInvocableHandlerMethod 打断点寻找。
问题1.想让输出 为json,xml,protobuf 怎么处理?
根据上图 当然是在HandlerMethodReturnValueHandler 中查找,
第一种,理所当然找到RequestResponseBodyMethodProcessor 它里面有一个messageConvert 所以增加一个 对应处理json,xml,protobuf的类即可。
第二种,可以自定义注解,自定义一个HandlerMethodReturnValueHandler 的实现类,来处理对应的注解,直接进行参数转换,或是用messageConvert进行转换即可。当然第一种有现成的方法,没必要用第二种
问题2.@RequestParam 注解什么意思
这个注解,默认是true,必须需要这个参数,如果你不传递,就报错给你看, 可以把参数改为false。
问题3,怎么确定一个输出使用什么MediaType
答:第一根据请求参数里的.accept(mediaTypes) 和 produces 里的mediatype 来求并集。.contentType(ProtobufHttpMessageConverter.PROTOBUF) 请求参数类型是这个,需要用对应的mediaType来解析参数。
一、filter 详解
1.HiddenHttpMethodFilter 将 post请求,转化为,请求参数里指定的方法
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException { HttpServletRequest requestToUse = request; if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
String paramValue = request.getParameter(this.methodParam);
if (StringUtils.hasLength(paramValue)) {
requestToUse = new HttpMethodRequestWrapper(request, paramValue);
}
} filterChain.doFilter(requestToUse, response);
}
界面用法 th:method将post 转换为delete方法。
<td><form class="form-inline" th:action="@{'/' + ${message.id}}" th:method="delete" method="delete">
<input type="submit" value="Delete1"/></form></td>

后台处理类。
@RequestMapping(value = "{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable("id") Message message, RedirectAttributes redirect) {
messageRepository.delete(message);
redirect.addFlashAttribute("globalMessage", "Message removed successfully");
return "redirect:/";
}
2.HttpPutFormContentFilter 如果请求是PUT或pach,将form里的参数提取到request的parameter里面。
protected void doFilterInternal(final HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException { if (("PUT".equals(request.getMethod()) || "PATCH".equals(request.getMethod())) && isFormContentType(request)) {
HttpInputMessage inputMessage = new ServletServerHttpRequest(request) {
@Override
public InputStream getBody() throws IOException {
return request.getInputStream();
}
};
MultiValueMap<String, String> formParameters = formConverter.read(null, inputMessage);
HttpServletRequest wrapper = new HttpPutFormContentRequestWrapper(request, formParameters);
filterChain.doFilter(wrapper, response);
}
else {
filterChain.doFilter(request, response);
}
}
会把form里的参数放入到request的parameters里面
<form action="/springmvc/testRest/3" method="post">
<input type="hidden" name="_method" value="put"/>
<input type="submit"value="Test Rest PUT"/>
</form>
现在一般的spring web应用里都会添加这两个过滤器。 OrderedHiddenHttpMethodFilter ,OrderedHttpPutFormContentFilter
springweb 详解。的更多相关文章
- (十)Maven依赖详解
1.何为依赖? 比如你是个男的,你要生孩子,呸呸呸...男的怎么生孩子,所以你得依赖你老婆,不过也不一定咯,你也可以依赖其她妹子. 我们在平时的项目开发中也是同理,你需要依赖一些东西才能实现相应的功能 ...
- @RequestMapping 用法详解之地址映射
@RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ...
- Spring jar包详解
Spring jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spri ...
- Spring——jar包详解(转)
Spring——jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spr ...
- 常见 jar包详解
常见 jar包详解 jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期 ...
- Dubbo配置方式详解
Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是阿里巴巴 SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次 ...
- SpringMVC RequestMapping 详解
SpringMVC RequestMapping 详解 RequestMapping这个注解在SpringMVC扮演着非常重要的角色,可以说是随处可见.它的知识点很简单.今天我们就一起学习Spring ...
- Spring MVC 详解之废话少说
<陈翔六点半之废话少说>.... Spring WEB MVC 的请求流程: Spring WEB MVC架构: 开始创建.配置gradle项目 1.在gralde项目中,选择SDK 和框 ...
- maven生命周期和插件详解
生命周期 什么是生命周期? maven的生命周期就是对所有的构建过程进行抽象和统一.maven从大量项目和构建工具中总结了一套高度完善的.易扩展的生命周期.这个生命周期包含项目的清理.初始化.编译.测 ...
随机推荐
- mac visual stdio 2019 自动格式化代码的选项
1 打开Visual Stdio >点开菜单的visual stdio 的选项卡>首选项>文本编辑>行为>保存时格式化文档 (将这个选项 勾上)>确定 2 以后代码 ...
- 【游戏体验】FlyGuy(小飞人)
关于FlyGuy这款游戏:https://en.wikipedia.org/wiki/Fly_Guy_(video_game) 这款游戏可以说是古董了 游戏的自由度比较高,玩法简单. 个人测评 游戏性 ...
- C语言编译和链接详解(通俗易懂,深入本质)
我们平时所说的程序,是指双击后就可以直接运行的程序,这样的程序被称为可执行程序(Executable Program).在 Windows 下,可执行程序的后缀有.exe和.com(其中.exe比较常 ...
- 一文复习JSP内容
概念: JSP 全名为 Java Server Pages, 中文名叫 java 服务器页面, 其根 本是一个简化的 Servlet 设计, 它是由 Sun Microsystems 公司 倡导. 许 ...
- mysql5.7导出数据提示--secure-file-priv选项问题的解决方法
mysql可使用 into outfile 参数把表中数据导出到csv,例如可用以下命令把user表的数据导出到user.csv select * from user into outfile '/t ...
- P2141珠心算测验题解
先来看一下题目:某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法.他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和? 这 ...
- execute command denied to user 'maintain'@'%' for routine
GRANT ALL PRIVILEGES ON *.* TO 'maintain'@'%' ; FLUSH PRIVILEGES;
- 简单docker示例
创建spring boot工程 工程目录 Controller.java 类说明 主要是接收界面请求,直接返回传入的参数 在启动工程,查看工程运行效果 右键SampleApplication.java ...
- 【网易官方】极客战记(codecombat)攻略-地牢-攻破突袭
关卡连接: https://codecombat.163.com/play/level/hack-and-dash 通过加速药来逃离地牢精灵 简介: 空气中弥漫着危险的气息.你应该从地牢里逃出来. 但 ...
- Gym安装ubuntu16.04
Step1:将gym克隆到计算机上: git clone https://github.com/openai/gym.git 如果你的电脑没有安装git,那么键入 sudo apt install g ...