1. 程式人生 > >在用SSM做專案的時候遇到的一些小坑

在用SSM做專案的時候遇到的一些小坑

1.靜態資源的配置


如圖,靜態檔案.html放在webapp->WEB-INF->views下
那麼利用應該怎麼配置呢
一般給出的配置方式是這樣的

<mvc:resources location="/" mapping="/**"></mvc:resources>
  <mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
  <mvc:resources location="/css/" mapping="/css/**"></mvc:resources
>
<mvc:resources location="/images/" mapping="/images/**"></mvc:resources>

其中location是靜態檔案在本地的地址,mapping是需要對映到瀏覽器url的地址,也就是當我們請求127.0.0.1:8080/js/xxx.js時,伺服器會在location指定的本地目錄下尋找這個靜態檔案。
然而當我直接拷過來還是找不到,顯然是因為我的本地路徑不對。
先看在ecilpse中檔案結構目錄

WebContent下直接放的靜態檔案,那麼location的其實位置是什麼呢,看一下IDEA的 project structure


也就是說/是webapp這個路徑
所以正確的配置應該是

<!--config the static file
        location means filepath in project ,mapping means the url mapped
        'webapp' is the start path of location , which is '/'
    -->
    <mvc:resources location="/WEB-INF/views/" mapping="/*.html"/>
    <mvc:resources location
="/WEB-INF/views/js/" mapping="/js/**"/>
<mvc:resources location="/WEB-INF/views/css/" mapping="/css/**"/> <mvc:resources location="/WEB-INF/views/images/" mapping="/images/**"/>

2.配置mvc:resources後項目報404的問題

剛開始沒有配置mvc:resources,controller能夠正確訪問,但是由於web.xml使用/攔截了所有的請求,所以靜態資源訪問不上
增加mvc:resources之後,靜態資源是能訪問上了,但是註解配置的controller卻又找不到了

原因是少了 的配置,在沒有配置mvc:resources的時候沒有問題,一旦配置了mvc:resources,註解方式的url就沒有載入

補上 就可以解決問題

<!--if you use annotation you must configure following setting
        if not, when you config the static file use 'mvc:resource',
        the url define by annotation will not in operation
    -->
    <mvc:annotation-driven/>

[email protected]註解

@responseBody註解的作用是將controller的方法返回的物件通過適當的轉換器轉換為指定的格式之後,寫入到response物件的body區,通常用來返回JSON資料或者是XML資料,需要注意的呢,在使用此註解之後不會再走試圖處理器,而是直接將資料寫入到輸入流中,他的效果等同於通過response物件輸出指定格式的資料。

@RequestMapping("/login")
  @ResponseBody
  public User login(User user){
    return user;
  }

User欄位:userName pwd
那麼在前臺接收到的資料為:’{“userName”:”xxx”,”pwd”:”xxx”}’

效果等同於如下程式碼:

@RequestMapping("/login")
  public void login(User user, HttpServletResponse response){
    response.getWriter.write(JSONObject.fromObject(user).toString());
  }

4.Ajax請求含有@ResponseBody註解的請求報500


報錯程式碼如下

@RequestMapping(value = "/login", method = RequestMethod.POST)
    public @ResponseBody User user(@RequestParam("username") String username, @RequestParam("password") String password){
        System.out.println("post");
        User user = userService.findByName(username);
        System.out.println(user);
        return user;
    }

少了json的包
加入

<!--json 版本號-->
    <jackson.version>2.8.7</jackson.version>
<!--json-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>${jackson.version}</version>
    </dependency>

即可正常請求