一、靜態文件加載問題
剛開始學習SpringMVC,發現靜態文件無法加載
web.xml配置如下:
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name>Spring Web MVC Hello World Application</display-name> <servlet> <servlet-name>spring</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
該配置會將一切資源的請求都交給SpringMVC去處理,而SpringMVC會將URL映射到對應的控制器去處理,對靜態文件的請求會報 沒有對應映射 的錯誤。
解決方法我目前只查到以下兩種:
1.配置web.xml,在其中加入如下片段:
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping>
表示對於css、js、gif和jpg格式的圖片不使用spring的過濾器,這樣就可以找到對應的文件了。
2.修改spring-servlet.xml,這種情況下不需要修改web.xml的配置:
<mvc:resources mapping="/javascript/**" location="/static_resources/javascript/"/> <mvc:resources mapping="/styles/**" location="/static_resources/css/"/> <mvc:resources mapping="/images/**" location="/static_resources/images/"/> <mvc:default-servlet-handler />
當請求js文件時,就去網站目錄下的js文件夾下去尋找,其他類型的靜態文件也是類似的形式。當然,這里還必須加上mvc標簽的聲明:
xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=“http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd”
但是,配置到這里的確可以找到靜態文件,卻找不到控制器了,還需要加上一句:
<mvc:annotation-driven/>
至此方法2才算是配置完成。
二、向視圖傳值
從控制器向視圖傳值,大概有以下幾種方式:
1.HttpServletRequest.sertAttribute()方法
@RequestMapping("/pass1") public String pass1(HttpServletRequest request){ String name1 = request.getParameter("name"); System.out.println(name1); request.setAttribute("name", name1); return "user"; }
2.ModelAndView
@RequestMapping("/pass2") public ModelAndView pass2(){ ModelAndView mav=new ModelAndView("user"); mav.addObject("age", 24); return mav; }
3.使用Map
@RequestMapping("/pass3") public String pass3(Map map){ map.put("sex", "boy"); return "user"; }
4.Model
@RequestMapping("/pass4") public String pass4(Model model){ model.addAttribute("id", "111222333"); return "user"; }
但是遇到的問題是無論前台怎樣寫,都無法獲取到設定的值,例如${name}會輸出原樣的${name},而不是控制器對name屬性賦予的值,這是因為我使用的jsp版本默認關閉對EL表達式的支持,需要手動打開:
<%@ page isELIgnored="false"%>