今天剛學習了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