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