Spring MVC配置,springmvc配置
今天剛學習了Spring MVC,這裡把Spring MVC配置流程記錄下來,方便以後查閱,本人菜鳥一枚,學藝不精,如果內容有錯誤或表述不當,歡迎各位大神指正
一、搭建環境
1、匯入jar包:Spring常用jar包以及spring-web-3.2.7.RELEASE、spring-webmvc-3.2.7.RELEASE
2、修改web.xml檔案,引入映射
Spring MVC 是基於DispatcherServlet的MVC架構,每個請求最先訪問DispatcherServlet,所以先配置DispatcherServlet
<servlet> <servlet-name>hello</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 可以自訂servlet。xml設定檔的位置和路徑,預設為在WEB-INF目錄下,名稱為hello-servlet.xml --> <load-on-startup>1</load-on-startup> <!-- 優先順序 當值為0或者大於0時,表示容器在應用啟動時就載入並初始化這個servlet 當值小於0或者沒有指定時,則表示容器在該servlet被選擇時才會去載入 正數的值越小,該servlet的優先順序越高,應用啟動時就越先載入 當值相同時,容器就會自己選擇順序來載入 --> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/</url-pattern> <!-- 注意:不能掃描/*,會導致.jsp等檔案無法匯入 可以使用*.do或/,官方推薦使用/,但使用/,會使圖片無法顯示 --> </servlet-mapping>
3、在WEB-INF 目錄下建立一個與<servlet-name>同名的hello-servlet.xml檔案,
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" 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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <mvc:annotation-driven/> <!-- 啟用annotation註解, 也可以不使用annotation,但必須註明 Controller 所在的路徑,及request請求尾碼名,一般不使用 <bean name="/hello" class="com.sram.controller.HelloController"></bean> --> <!-- 使用註解的類所在的包 --> <context:component-scan base-package="com.xx.controller"/> <!-- 完成請求和註解的映射 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 對轉向頁面的路徑解析, prefix:首碼;suffix:尾碼 --> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <!-- /WEB-INF/jsp/xx.jsp --> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/></bean></beans>
hello-servlet.xml檔案
由於/會攔截靜態資源,在servlet.xml檔案中添加配置:<mvc:resources location="/resources/" mapping="/resources/**"/>
可以解決這個問題(推薦使用),可以包括圖片、css檔案、js檔案或引入其他資源,將這些資源檔存放在WebRoot目錄下的resources檔案夾下
DispatcherServlet會利用特殊bean處理request請求和產生相應的視圖返回
視圖傳回型別是由視圖解析器控制的,jsp中常用的視圖解析器是InternalResourceViewResolver,如上,通過首碼和尾碼拼接成jsp路徑:/WEB-INF/jsp/hello.jsp
4、Controller
使用@Controller標記的都是Controller類
package com.sram.controller;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.AbstractController;public class HelloController extends AbstractController{ @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("hello Spring-mvc!!!"); return new ModelAndView("hello"); }}通過Bean關聯到Controller類
package com.sram.controller;import javax.servlet.http.HttpServletRequest;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.servlet.ModelAndView;@Controller@RequestMapping("/hello")public class HelloController { //requesetMapping:請求映射,用來申明當前被指定的方法或類使用什麼URL可以進行訪問 @RequestMapping("/test") protected ModelAndView test() throws Exception { System.out.println("hello Spring-mvc!!!"); return new ModelAndView("hello"); } //value表示當前的url地址,method表示當前請求的請求方式(get、post、delete...) @RequestMapping(value="/xiake",method=RequestMethod.GET) protected ModelAndView xiake() throws Exception { System.out.println("無參的"); return new ModelAndView("hello"); } @RequestMapping(value="/xiake",method=RequestMethod.POST) protected ModelAndView xiake(HttpServletRequest request) throws Exception { System.out.println("有參的"); return new ModelAndView("hello"); }}通過annotation關聯到Controller類不同方法傳值(Model2View)
package com.sram.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping("/test")public class TestController { @RequestMapping//無參:預設執行該方法 public String test1(){ System.out.println("無參預設執行"); return "test"; } @RequestMapping("/test2") public String test2(){ return "test"; } //value屬性可以跟一個String類型的數組,數組中所有的字串(URL)都可以被映射到當前方法 @RequestMapping(value={"/test3_1", "test3_2"}) public String test3(){ System.out.println("url數組"); return "test"; } //下面的用法可以匹配正常URL之後跟一個/,/之後也可以在增加其他任一字元 //*表示/後的任一字元,但只能到下一級 @RequestMapping("/teset4/*") public String teset4(){ System.out.println("xx/*--下一級路徑任意值"); return "test"; } //任意以/test5開頭的請求都可以被匹配 //**表示test5之後的任一字元 //*表示出現0次或多次 @RequestMapping("/test5/**") public String addUser4(){ System.out.println("/xx/**--以/xx開頭的任意請求"); return "test"; } //?表示URL之後長度為1,可以用來控制長度 /?:/之後一位字元 /??:/之後兩位字元 @RequestMapping("/test6/?") public String test6(){ System.out.println("?控制長度"); return "test"; }}url2Controller
package com.sram.controller;import java.util.ArrayList;import java.util.Arrays;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import com.sram.beans.User;@Controller@RequestMapping("/test")public class TestController { @RequestMapping("/test0") public String test0(String str){ System.out.println(str); return "test"; } //此處參數的名字必須與頁面中的name屬性值相同 @RequestMapping("/test1") public String test1(int id, String userName,String password, String nickName){ User u = new User(id, userName, password, nickName); System.out.println(u); return "test"; } //參數可以直接寫頁面傳值對應的對象,spring mvc 會自動將頁面的參數傳入到指定的對象中, //若有級聯對象,則需要以級聯對象,屬性這樣的形式來進行傳值(group.id) @RequestMapping("/test2") public String test2(User u){ System.out.println(u); return "test"; } //從頁面傳遞的數組,在spring mvc 中只能以數組的形式進行傳值,不能用集合 @RequestMapping("/test3") public String test3(String[] intr){ System.out.println(Arrays.toString(intr)); return "test"; } /*@RequestMapping(value="/test3") public String test3(ArrayList<String> intr){ System.out.println(intr); return "test"; }*/ @RequestMapping("/test4") public String test4(@RequestParam(required=false, value="abc", defaultValue="hello") String str){ System.out.println(str); return "test"; } @RequestMapping("/test5/{userId}/{userName}") public String test5(@PathVariable(value="userId") int id,@PathVariable(value="userName") String userName){ System.out.println(id + "---" + userName); return "test"; }}view2Model
@RequestParam註解表示當前參數是由請求發送來的
required表示當前參數是否為必須的,若設為true,請求中若未包含相應參數,則會報400,設為false則無參的請求也可以訪問當前方法
defaultValue表示當前若沒有傳參,則使用的預設參數。defaultValue添加之後,請求中沒有傳遞參數並且required設為true也可以進行訪問
value表示傳參時,若請求中的參數名與方法中的參數名不匹配時,可以使用value制定請求中的參數名稱。
例如 test?abc=hello 方法中的參數為str,則可以使用value=abc用來將abc中的值傳遞給str