helloworld(springmvc 非maven)

helloworld(springmvc 非maven)

    • 环境准备
    • 开始
    • restful api
    • 总结:

环境准备

windows环境

  1. intellij idea ultimate 2018.1
  2. jdk1.8
  3. springmvc 4.3.18
  4. fiddler(模拟发包)

开始

step1 初始项目结构
helloworld(springmvc 非maven)_第1张图片

step2
helloworld(springmvc 非maven)_第2张图片
finish即可

step3 项目结构大致如下
helloworld(springmvc 非maven)_第3张图片

相对于原生servlet程序

  1. 多了两个配置文件applicationContext.xml和dispatch-servlet.xml
  • applicationContext.xml负责ServletContext初始化配置
  • dispatch-servlet.xml负责指定的DispatchServlet初始化配置

step4 编码 编写对应的controller代码
部分代码截图如下,详情https://github.com/fqcheng220/HelloWorld2_SpringMVC
helloworld(springmvc 非maven)_第4张图片
step5 运行 部署到tomcat服务器上

Run->Edit configuration
helloworld(springmvc 非maven)_第5张图片
选择local

helloworld(springmvc 非maven)_第6张图片
点击+按钮 添加artifact

helloworld(springmvc 非maven)_第7张图片
apply后 start即可

这时候通常tomcat会启动报错
helloworld(springmvc 非maven)_第8张图片

原因是jar包没有导入
解决方法:
File->Project Structure->Artifacts

helloworld(springmvc 非maven)_第9张图片

点击fix,添加依赖jar包

restful api

遇到的问题
1.不能返回json

解决方案:需要增加json解析支持,默认的AnnotationMethodHandlerAdapter持有的HttpMessageConverter列表引用 中不包含json处理类(网上还有其他方案fastjson等,此处使用jackson)
helloworld(springmvc 非maven)_第10张图片
一开始死活不能导入jackson jar包,尝试添加到module library,也尝试添加到project library,tomcat启动都会报类找不到,索性尝试导入自己写的TestJar包 发现也是无法引用,是不是导入机制有什么特别的?
后来突然想到tomcat可能要部署jar包
于是首先添加到module library
helloworld(springmvc 非maven)_第11张图片
选择事先copy到lib文件夹下对应的三个jackson jar包

helloworld(springmvc 非maven)_第12张图片

之后
helloworld(springmvc 非maven)_第13张图片

切换到Artifacts标签,注意
helloworld(springmvc 非maven)_第14张图片

又是点击fix!!!!!!!!!!!!终于正常了

2.controller类中方法 不能正确的获取post请求入参
@RequestParam使用要求

  • 请求header必须有Content-Type:application/x-www-form-urlencoded
  • 请求body类似userName=123&pwd=1

helloworld(springmvc 非maven)_第15张图片

根源是原生的HttpServletRequest.getParameterXXX方法生效必须要求这两个条件
源码跟踪:
DispatchServlet.doDispatch(xxxx)<-------AnnotationMethodHandlerAdapter.invokeHandlerMethod(xxx)
<-------HandlerMethodInvoker.resolveRequestParam(xxx)

helloworld(springmvc 非maven)_第16张图片

@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配置了


            
                
                    text/html;charset=UTF-8
                    application/json;charset=UTF-8
                    application/xml;charset=UTF-8
                
            
        

总结:

  1. 后端使用的注解(请求参数/响应数据类型)和HttpMessageConverter 决定了前端需要发送指定格式的请求和可以接受指定格式的响应
  2. csdn扩展的markdown语法很强大,如表格、脚注、内嵌HTML等等

你可能感兴趣的:(Java,j2ee)