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中的前端控制器配置:

    <!--配置前端控制器-->
    <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

下面這個據說有用,但是我沒試過,先碼着:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章