SpringMVC入門丶請求引數繫結丶常用註解
阿新 • • 發佈:2018-11-06
SpringMVC入門
-
建立WEB工程,引入依賴
<!-- 版本鎖定 --> <properties> <spring.version>5.0.2.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> </dependencies>
-
在web.xml中配置一個核心前端控制器(DispatcherServlet)
<!--配置一個核心前端控制器--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:Springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
-
編寫springmvc.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:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置spring建立容器時要掃描的包 --> <context:component-scan base-package="com.qin"></context:component-scan> <!-- 配置檢視解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--字首--> <property name="prefix" value="/WEB-INF/pages/"></property> <!--字尾--> <property name="suffix" value=".jsp"></property> </bean> <!-- 配置spring開啟註解mvc的支援--> <mvc:annotation-driven></mvc:annotation-driven> </beans>
-
編寫Controller
//表示此類是一個controller @Controller public class HelloController { /** * 測試path * @return */ @RequestMapping(path = "/hello") public String hello(){ System.out.println("hello SpringMVC!"); return "success"; } }
-
在WEB-INF目錄下建立pages資料夾,編寫success.jsp的成功頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>hello</title> </head> <body> <h3>Success!!!</h3> </body> </html>
- 入門案例的分析
- 當啟動Tomcat伺服器的時候,因為配置了load-on-startup標籤,所以會建立DispatcherServlet物件,
就會載入springmvc.xml配置檔案 - 開啟了註解掃描,那麼HelloController物件就會被建立
- 從index.jsp傳送請求,請求會先到達DispatcherServlet核心控制器,根據配置@RequestMapping註解
找到執行的具體方法 - 根據執行方法的返回值,再根據配置的檢視解析器,去指定的目錄下查詢指定名稱的JSP檔案
- Tomcat伺服器渲染頁面,做出響應
- 當啟動Tomcat伺服器的時候,因為配置了load-on-startup標籤,所以會建立DispatcherServlet物件,
SpringMVC的一次完整的執行
RequestMapping註解
1. RequestMapping註解的作用是建立請求URL和處理方法之間的對應關係
2. RequestMapping註解可以作用在方法和類上
1. 作用在類上:第一級的訪問目錄
2. 作用在方法上:第二級的訪問目錄
3. 細節:路徑可以不編寫 / 表示應用的根目錄開始
3. RequestMapping的屬性
1. path 指定請求路徑的url
2. value value屬性和path屬性是一樣的
3. mthod 指定該方法的請求方式,不寫代表匹配所有 method = {RequestMethod.POST}
4. params 指定限制請求引數的條件 params = {"username"}
5. headers 傳送的請求中必須包含的請求頭
請求引數的繫結
- 請求引數的繫結說明
- 繫結機制
- 表單提交的資料都是k=v格式的 username=haha&password=123
- SpringMVC的引數繫結過程是把表單提交的請求引數,作為控制器中方法的引數進行繫結的
- 要求:提交表單的name和引數的名稱是相同的
- 支援的資料型別
- 基本資料型別和字串型別
- 實體型別(JavaBean)
- 集合資料型別(List、map集合等)
- 繫結機制
- 基本資料型別和字串型別
- 提交表單的name和引數的名稱是相同的
- 區分大小寫
- 實體型別(JavaBean)
- 提交表單的name和JavaBean中的屬性名稱需要一致
- 如果一個JavaBean類中包含其他的引用型別,那麼表單的name屬性需要編寫成:物件.屬性 例如:
address.name
- 給集合屬性資料封裝
- 在jsp中
姓名:<input type="text" name="list[0].name" >
- 在jsp中
- 請求引數中文亂碼的問題
<!--在web.xml中配置過濾器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
6.自定義型別轉換器
java為我們提供了一個介面,我們可以通過實現Converter介面來自定義轉換器
1.自定義型別轉換器
//自定義型別轉換器(String->Date)
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
if (source == null){
throw new RuntimeException("字串不能為空");
}
try {
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(source);
return date;
} catch (ParseException e) {
throw new RuntimeException("字串異常");
}
}
}
2. 註冊自定義型別轉換器,在SpringMvc.xml中編寫配置
<!-- 註冊自定義型別轉換器 -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.itcast.utils.StringToDateConverter"/>
</set>
</property>
</bean>
<!-- 在Spring對MVC註解的支援中配置conversion-service -->
<mvc:annotation-driven conversion-service="conversionService"/>
常用的註解
-
RequestParam註解
- 作用: 把請求中指定的引數傳遞給控制器中的形參
- 屬性 :
- value: 請求引數中的名稱
- required: 請求引數中是否必須有此引數,預設值是true,即必須提供
- 例:
@RequestMapping(path="/hello") public String sayHello(@RequestParam(value="username",required=false)String name) { System.out.println(name); return "success"; }
-
RequestBody註解
- 作用: 用於獲取請求體的內容(ps:get方法不行)
- 屬性
- required: 是否必須有請求體,預設是true
- 例:
@RequestMapping(path="/hello") public String sayHello(@RequestBody String body) { System.out.println(body); return "success"; }
-
PathVariable註解
- 作用: 用於繫結url中的佔位符.(如/delete/{id},{id}就是佔位符)
- 屬性
- value: 指定url中佔位符的名稱
- Restful風格的url
- 請求路徑一樣,可以根據不同的請求方式來執行後臺的不同方法
- restful風格的url的優點
- 結構清晰
- 易於理解
- 符合標準
- 擴充套件方便
- 例:
@RequestMapping(path="/hello/{id}") public String sayHello(@PathVariable(value="id") String id) { System.out.println(id); return "success"; }
-
RequestHeader註解
- 作用:獲取指定請求頭的值
- 屬性
- value:請求頭的名稱
- 例:
@RequestMapping(path="/hello") public String sayHello(@RequestHeader(value="Accept") String header) { System.out.println(header); return "success"; }
-
CookieValue註解
- 作用: 用於獲取指定cookie的名稱的值
- 屬性
- value: cookie的名稱
- 例:
@RequestMapping(path="/hello") public String sayHello(@CookieValue(value="JSESSIONID") String cookieValue) { System.out.println(cookieValue); return "success"; }
-
ModelAttribute註解
- 作用
- 出現在方法上:表示當前方法會在控制器方法執行前線執行。
- 出現在引數上:獲取指定的資料給引數賦值。
- 應用場景
- 當提交表單資料不是完整的實體資料時,保證沒有提交的欄位使用資料庫原來的資料。
- 作用