helloworld(springmvc 非maven)
环境准备
windows环境
- intellij idea ultimate 2018.1
- jdk1.8
- springmvc 4.3.18
- fiddler(模拟发包)
开始
step1 初始项目结构
step2
finish即可
step3 项目结构大致如下
相对于原生servlet程序
- 多了两个配置文件applicationContext.xml和dispatch-servlet.xml
- applicationContext.xml负责ServletContext初始化配置
- dispatch-servlet.xml负责指定的DispatchServlet初始化配置
step4 编码 编写对应的controller代码
部分代码截图如下,详情https://github.com/fqcheng220/HelloWorld2_SpringMVC
step5 运行 部署到tomcat服务器上
Run->Edit configuration
选择local
点击+按钮 添加artifact
apply后 start即可
这时候通常tomcat会启动报错
原因是jar包没有导入
解决方法:
File->Project Structure->Artifacts
点击fix,添加依赖jar包
restful api
遇到的问题
1.不能返回json
解决方案:需要增加json解析支持,默认的AnnotationMethodHandlerAdapter持有的HttpMessageConverter列表引用 中不包含json处理类(网上还有其他方案fastjson等,此处使用jackson)
一开始死活不能导入jackson jar包,尝试添加到module library,也尝试添加到project library,tomcat启动都会报类找不到,索性尝试导入自己写的TestJar包 发现也是无法引用,是不是导入机制有什么特别的?
后来突然想到tomcat可能要部署jar包
于是首先添加到module library
选择事先copy到lib文件夹下对应的三个jackson jar包
之后
切换到Artifacts标签,注意
又是点击fix!!!!!!!!!!!!终于正常了
2.controller类中方法 不能正确的获取post请求入参
@RequestParam使用要求
- 请求header必须有Content-Type:application/x-www-form-urlencoded
- 请求body类似userName=123&pwd=1
根源是原生的HttpServletRequest.getParameterXXX方法生效必须要求这两个条件
源码跟踪:
DispatchServlet.doDispatch(xxxx)<-------AnnotationMethodHandlerAdapter.invokeHandlerMethod(xxx)
<-------HandlerMethodInvoker.resolveRequestParam(xxx)
@RequestBody使用要求
- 请求header中Content-Type:必须不能为空,
通常为application/json或者application/xml等
HandlerMethodInvoker.resolveRequestBody(xxx)<-------取决于AnnotationMethodHandlerAdapter持有的HttpMessageConverter列表中是否有可以处理的实例
- 如果Content-Type请求为application/json,则body必须是json串 类似 { “userName”:
“123”, “pwd”: “1” },否则会报出
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error:xxxxxxxx
MappingJackson2HttpMessageConverter.read异常
3.请求过滤
AnnotationMethodHandlerAdapter持有的HttpMessageConverter列表引用 可以过滤请求决定是否响应
canRead canWrite方法会筛选关心的mediatypes(无论请求指定了什么Content-Type即请求正文格式和Accept即响应正文格式)
本例中 dispatcher-servlet.xml配置了
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
<value>application/xml;charset=UTF-8</value>
</list>
</property>
</bean>
总结:
- 后端使用的注解(请求参数/响应数据类型)和HttpMessageConverter 决定了前端需要发送指定格式的请求和可以接受指定格式的响应
- csdn扩展的markdown语法很强大,如表格、脚注、内嵌HTML等等