SpringMVC入门踩坑集合

一、java.lang.ClassNotFoundException: org.slf4j.event.LoggingEvent

原因:没有导入相关jar包。

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.6.6</version>
    </dependency>

如果不加日志信息,会产生warning

log4j.rootLogger = debug,stdout,D,E
# 控制输入的级别
log4j.category.org.springframework = ERROR
# 向控制台直接打印
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
# 写入控制台
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%m%n
# 每天收集
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
# 写入文件
log4j.appender.D.File = D://logs/springmvc.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =D://logs/springmvc.log
log4j.appender.E.Append = true
# 收集error及其以上信息
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] %m%n

二、错误400-The request sent by the client was syntactically incorrect

错误原因,前台传入的参数name和后台controller中接收参数名称不一致或模型格式不一致。比如日期类型,我在前台传入2000-5-16就会导致该问题。

解决办法:

/**
 * 自定义类型转换,把字符串转换成日期
 * @author Summerday
 */
public class StringToDateConverter implements Converter<String, Date> {
    /**
     * 字符串--> 日期
     * @param source 传进来的字符串
     * @return
     */
    @Override
    public Date convert(String source) {
        if (source == null){
            throw new RuntimeException("请您传入数据!");
        }
        //解决2000/1/11格式问题
        source = source.replace('/', '-');
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        //把字符串转换为日期
        try {
            return df.parse(source);
        } catch (Exception e) {
            throw new RuntimeException("类型转换出现错误!");
        }
    }
}
    <!--配置自定义类型转换器-->
    <bean id="conversionService2" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.smday.utils.StringToDateConverter"></bean>
            </set>
        </property>
    </bean>

三、解决@RequestParam注解传入中文乱码。

之前写过一篇文章提到tomcat服务器编码的问题:必须理清Tomcat编解码问题,对于post请求,我们只需要在web.xml中配置中文乱码过滤器即可。

    <!--配置中文乱码过滤器-->
    <filter>
        <filter-name>characterEncodingFilter</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>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

这个过滤器相当于给request和response都加上了适合的编码信息,但这仅仅适用于post请求(输出响应的时候需要加上个response.setContentType("text/html;charset=utf-8");

	@Override
	protected void doFilterInternal(
			HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {

		String encoding = getEncoding();
		if (encoding != null) {
			if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {
				request.setCharacterEncoding(encoding);
			}
			if (isForceResponseEncoding()) {
				response.setCharacterEncoding(encoding);
			}
		}
		filterChain.doFilter(request, response);
	}

但是对于get方法,还需要考虑其他的因素:比如tomcat的版本,tomcat8之后的版本默认是utf-8的编码,所以get方式是不会乱码的,但这之前的版本,默认的是iso8859-1,我们解决的方法也很多:

  • 修改tomcat的版本,可以在配置文件中修改。
  • pom.xml修改tomcat7插件的编码。
        <!--tomcat插件-->
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.2</version>

          <configuration>
            <!-- 通过maven tomcat8:run运行项目时,访问项目的端口号 -->
            <port>80</port>
            <!-- 项目访问路径-->
            <path>/springmvc</path>
            <uriEncoding>UTF-8</uriEncoding>
          </configuration>

        </plugin>
  • 或者在取值的时候,进行转换。
    @RequestMapping("/testRequestParam")
    public String testRequestParam(@RequestParam(name="name") String username) throws UnsupportedEncodingException {
        System.out.println("执行了");
        username = new String(username.getBytes("iso8859-1"), StandardCharsets.UTF_8);
        System.out.println(username);
        return "success";
    }

四、解决地址栏中文参数乱码

    @RequestMapping("/testRequestBody")
    public String testRequestBody(@RequestBody String body) throws UnsupportedEncodingException {
        //uname=%E5%93%88%E5%93%88&age=11 --> uname=哈哈&age=11

        System.out.println("执行了");
        System.out.println(URLDecoder.decode(body, "utf-8"));
        return "success";
    }

可能地址栏中参数拼接的时候,值为中文时,后台接收到的是一串经过编码的uicode字符。uname=%E5%93%88%E5%93%88&age=11。这个也是比较容易解决的,因为之前也遇到过,使用URLEncoder和URLDecoder两个类可以实现编解码。

五、在springmvc.xml中配置前端控制器哪些静态资源不被拦截

我们在web.xml中的前端控制器配置:

扫描二维码关注公众号,回复: 11133963 查看本文章
    <!--配置前端控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!--加载类路径下的springmvc.xml配置文件-->
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

在类路径下springmvc.xml中的配置:

    <!--配置前端控制器哪些静态资源不拦截-->
    <mvc:resources mapping="/js/**" location="/js/"></mvc:resources>
    <mvc:resources mapping="/css/**" location="/css/"></mvc:resources>
    <mvc:resources mapping="/images/**" location="/images/"></mvc:resources>

springmvc3.0之后可以直接使用下面的方法:

    <mvc:default-servlet-handler></mvc:default-servlet-handler>

参考:

https://blog.csdn.net/caokang1314/article/details/47750267

https://www.cnblogs.com/dflmg/p/6393416.html

六、解决idea创建的maven项目右键new XMLconfiguration File没有Spring config选项

问题产生的原因应该有许多,我这边参考https://www.cnblogs.com/chenmingjun/p/10920813.html就成功解决:在pom.xml中引入支持:

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

七、 Content type ‘application/json;charset=UTF-8’ not supported

在这里插入图片描述

说实话这个问题到最后都没有解决,最后重新建了一个项目,步骤都一样,结果成功了,也搞不清楚为啥。但是这一路上倒是看到各种可能出现该情况的问题。在这里列举一下:

  • 使用post协议提交时,如果希望用@RequestBody注解将json字符串自动绑定到pojo入参,类型需要是:contentType: "application/json;charset=UTF-8",
  • 缺少jackson-databind包,导入坐标即可。
  • 没有使用@RequestBody注解,此时无法获取请求体里的参数信息,后台接收的参数为null。

八、Spring配置提示: File is included in 4 contexts

问题产生原因,配置文件没有放在同一个ApplicationContext中。

解决办法:参考https://blog.csdn.net/BFInWR/article/details/81015637

下面这个据说有用,但是我没试过,先码着:

在这里插入图片描述

发布了144 篇原创文章 · 获赞 121 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Sky_QiaoBa_Sum/article/details/105726171
今日推荐