成为我能成为的人 SpringMVC 踩坑

在路上 · 2019年05月15日 · 1175 次阅读

1、SpringMVC+Tomcat 中文乱码

在 web 项目中可能需要传递一些中文的参数,这时如果不进行处理,后台接收到的参数是乱码导致不能获得预期的效果。

(1)对于 post 请求,我们可以在 web.xml 配置文件中添加过滤器:

<filter>
    <description>字符编码过滤器</description>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

(2)对于 get 请求,在 tomcat 的 server.xml 配置文件中配置:

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

添加URIEncoding="utf-8"
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8"/>

2、严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.listenerStart Skipped installing application listeners due to previous error(s)

严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.listenerStart Error configuring application listener of class [org.springframework.web.context.ContextLoaderListener]
 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1363)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1186)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:540)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:521)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:150)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4604)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5150)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:713)

(1)原因:ContextLoaderListener 所在的 jar 包:spring-web-xxx.jar 没有被找到

(2)解决方法:

  • 首先检查 lib 下有没有 spring-web-xxx.jar,如果没有,添加后重试,如果有,继续下一步;
  • 如果有 spring-web-xxx.jar,但是还是报错:问题根源可能是:
Java虚拟机是根据Java ClassLoader(类加载器)决定如何加载Class  
系统默认提供了3个ClassLoader    
Root ClassLoaderClassPath LoaderExt ClassLoader  
我们也可以编写自己的ClassLoader去加载特定环境下的Jar文件    
能不能加载Jar加载哪里的Jar是由ClassLoader决定的    

楼主的问题可能是 导入的仅仅是jar包的引用例如在eclipse中通过build path加进user lib……(类似快捷方式  
这种在Java Application中没问题但在web Application中可能会出现找不到类的异常  
在WEB Application中jar包最好放在webroot或webcontent下的lib文件夹内特别是xml中用到的jar包
  • 解决方法:删除原来的 Artifact,并重新创建,并检查 WEB-INF 下 lib 文件夹中是否有相关资源

3、cvc-complex-type.2.4.c: 通配符的匹配很全面, 但无法找到元素 'mvc:annotation-driven' 的声明

The matching wildcard is strict, but no declaration can be found for element 'tx:annotation-driven'

(1)原因

  • 添加,否则已经添加的注解,不起作用
  • 其次使用 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter 适配器,而不是原先的 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 适配器,大概是从 SpringMvc3.1 开始改变的

(2)解决方法:

修改前:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/tool"
       xsi:schemaLocation="
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tool
       http://www.springframework.org/schema/tool/spring-tool.xsd
">

    <context:component-scan base-package="com.yiibai.springmvc"/>

    <mvc:annotation-driven/>

修改后:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tool
       http://www.springframework.org/schema/tool/spring-tool.xsd
">

    <context:component-scan base-package="com.yiibai.springmvc"/>

    <mvc:annotation-driven/>

4、idea 创建 maven 项目没有 webapp 目录

在学习 spring 时,创建的 maven 项目没有 webapp 目录。
由于 maven 是最基本的项目,只包含 pom.xml,我们若想创建的是 web 项目
须选择 maven 基本的 web 包

这里选中 maven 基本的 webapp 包即可

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册