helloworld(springmvc 非maven)

helloworld(springmvc 非maven)

环境准备

windows环境

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

开始

step1 初始项目结构
在这里插入图片描述

step2
在这里插入图片描述
finish即可

step3 项目结构大致如下
在这里插入图片描述

相对于原生servlet程序

  1. 多了两个配置文件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
选择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>

总结:

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

猜你喜欢

转载自blog.csdn.net/weixin_41548050/article/details/84956009