@
目錄
- springmvc
- 1. 搭建開發環境
- 1.1 建立項目
- 1.2 配置maven
- 1.3 前端控制器配置
- 1.4 建立springmvc配置檔案
- 2. 執行過程
- 2.1 入門案例的執行流程
- 2.2 SpringMVC官方提供圖形
- 2.3 入門案例中的元件分析
- 2.4 @RequestMapping注解
- 3. 請求參數的綁定
- 3.1 請求參數的綁定說明
- 3.1.1 綁定機制
- 3.1.2 支援的資料類型
- 3.2 基本資料類型和字元串類型
- 3.3 實體類型(JavaBean)
- 3.4 給集合屬性資料封裝
- 3.5 請求參數中文亂碼的解決
- 3.6 自定義類型轉換器
- 3.7 在控制器中使用原生的ServletAPI對象
- 3.1 請求參數的綁定說明
- 4. 常用的注解
- 4.1 @RequestParam注解
- 4.2 @RequestBody注解
- 4.3 @PathVariable注解
- 4.4 @RequestHeader注解
- 4.5 @CookieValue注解
- 4.5 @ModelAttribute注解
- 4.5 @SessionAttributes注解
- 1. 搭建開發環境

- 添加鍵值對,加快建構時間
-
key: archetypeCatalog
-
value: internal
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- 版本鎖定 -->
<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>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
- web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--配置前端控制器-->
<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>
<!--配置解決中文亂碼的過濾器-->
<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>
</web-app>
<?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">
<!-- 開啟注解掃描 -->
<context:component-scan base-package="xyz.slienceme"/>
</beans>
- 當啟動
伺服器的時候,因為配置了Tomcat
标簽,是以會建立load-on-startup
對象,就會加載DispatcherServlet
配置檔案springmvc.xml
- 開啟了注解掃描,那麼
對象就會被建立HelloController
- 從
發送請求,請求會先到達index.jsp
核心控制器,根據配置DispatcherServlet
注解找到執行的具體方法@RequestMapping
- 根據執行方法的傳回值,再根據配置的視圖解析器,去指定的目錄下查找指定名稱的
檔案JSP
-
伺服器渲染頁面,做出響應Tomcat
- 前端控制器(
)DispatcherServlet
- 處理器映射器(
HandlerMapping
- 處理器(
Handler
- 處理器擴充卡(
HandlAdapter
- 視圖解析器(
View Resolver
- 視圖(
View
2.4 @RequestMapping
注解
@RequestMapping
- 作用:建立請求
和處理方法之間的對應關系URL
- 範圍:可以作用在方法和類上
- 作用在類上:第一級的通路目錄
- 作用在方法上:第二級的通路目錄
- 細節:路徑可以不編寫
表示應用的根目錄開始/
- 細節:
也可以省略不寫,但是路徑上不能寫${ pageContext.request.contextPath }
/
- 屬性
-
指定請求路徑的path
url
-
value屬性和path屬性是一樣的value
-
指定該方法的請求方式method
-
指定限制請求參數的條件 要求key和value必須一緻params
-
發送的請求中必須包含的請求頭headers
-
/**
* RequestMapping注解
* @return
*/
@RequestMapping(value="/testRequestMapping",method = {RequestMethod.POST},params = {"username=heihei"},headers = {"Accept"})
public String testRequestMapping(){
System.out.println("測試RequestMapping注解...");
return "success";
}
- 表單送出的資料都是
格式的k=v
username=haha&password=123
-
的參數綁定過程是把表單送出的請求參數,作為控制器中方法的參數進行綁定的SpringMVC
- 要求:送出表單的name和參數的名稱是相同的
- 基本資料類型和字元串類型
- 實體類型(
JavaBean
- 集合資料類型(
、List
集合等)map
- 送出表單的name和參數的名稱是相同的
- 區分大小寫
- 送出表單的name和JavaBean中的屬性名稱需要一緻
- 如果一個
類中包含其他的引用類型,那麼表單的JavaBean
屬性需要編寫成:name
例如:對象.屬性
address.name
- 把資料封裝Account類中
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username" /><br/>
密碼:<input type="text" name="password" /><br/>
金額:<input type="text" name="money" /><br/>
使用者姓名:<input type="text" name="user.uname" /><br/>
使用者年齡:<input type="text" name="user.age" /><br/>
<input type="submit" value="送出" />
</form>
-
頁面編寫方式:list[0].屬性JSP
- 把資料封裝Account類中,類中存在list和map的集合
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username" /><br/>
密碼:<input type="text" name="password" /><br/>
金額:<input type="text" name="money" /><br/>
使用者姓名:<input type="text" name="list[0].uname" /><br/>
使用者年齡:<input type="text" name="list[0].age" /><br/>
使用者姓名:<input type="text" name="map['one'].uname" /><br/>
使用者年齡:<input type="text" name="map['one'].age" /><br/>
<input type="submit" value="送出" />
</form>
- 實體類添加屬性
private List<User> list;
private Map<String,User> map;
- 在
中配置Spring提供的過濾器類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>
- 表單送出的任何資料類型全部都是字元串類型,但是背景定義
類型,資料也可以封裝上,說明Integer
架構内部會預設進行資料類型轉換。Spring
- 如果想自定義資料類型轉換,可以實作
的接口Converter
- 自定義類型轉換器
package xyz.slienceme.utils;
import org.springframework.core.convert.converter.Converter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 把字元串轉換日期
*/
public class StringToDateConverter implements Converter<String,Date>{
/**
* String source 傳入進來字元串
* @param source
* @return
*/
public Date convert(String source) {
// 判斷
if(source == null){
throw new RuntimeException("請您傳入資料");
}
try {
// 把字元串轉換日期 解析字元串
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date date = df.parse(source);
return date;
} catch (Exception e) {
throw new RuntimeException("資料類型轉換出現錯誤");
}
}
}
- 注冊自定義類型轉換器,在
配置檔案中編寫配置springmvc.xml
<!--配置自定義類型轉換器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="xyz.slienceme.utils.StringToDateConverter"/>
</set>
</property>
</bean>
<!-- 開啟SpringMVC架構注解的支援 -->
<mvc:annotation-driven conversion-service="conversionService"/>
- 隻需要在控制器的方法參數定義
和HttpServletRequest
對象HttpServletResponse
4.1 @RequestParam
@RequestParam
- 作用:把請求中的指定名稱的參數傳遞給控制器中的形參指派
-
-
:請求參數中的名稱value
-
:請求參數中是否必須提供此參數,預設值是required
,必須提供的是name,必須與true
中的參數name相同,否則報錯<a href="anno/testRequestParam?name=哈哈">RequestParam</a>
-
- 代碼如下
<a href="anno/testRequestParam?name=哈哈">RequestParam</a>
/**
* 接收請求
* @return
*/
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name="name",required=false) String username){
System.out.println("執行了...");
System.out.println(username);
return "success";
}
- 單純拿到
參數name
4.2 @RequestBody
@RequestBody
- 作用:用于擷取請求體的内容(
注意:get方法不可以
-
-
:是否必須有請求體,預設值是required
true
-
<form action="anno/testRequestBody" method="post">
使用者姓名:<input type="text" name="username" /><br/>
使用者年齡:<input type="text" name="age" /><br/>
<input type="submit" value="送出" />
</form>
/**
* 擷取到請求體的内容
* @return
*/
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
System.out.println("執行了...");
System.out.println(body);
return "success";
}
- 得到
username=zhangsan&age=123
4.3 @PathVariable
@PathVariable
- 作用:擁有綁定
中的占位符的。例如:url
中有url
,/delete/{id}
就是占位符{id}
-
-
:指定value
中的占位符名稱url
-
- Restful風格的URL
- 請求路徑一樣,可以根據不同的請求方式去執行背景的不同方法
- restful風格的URL優點
- 結構清晰
- 符合标準
- 易于了解
- 擴充友善
<a href="anno/testPathVariable/10">testPathVariable</a>
<a href="user/hello/1">入門案例</a>
/**
* PathVariable注解
* @return
*/
@RequestMapping(value="/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name="sid") String id){
System.out.println("執行了...");
System.out.println(id);
return "success";
}
4.4 @RequestHeader
@RequestHeader
- 作用:擷取指定請求頭的值
-
-
:請求頭的名稱value
-
<a href="anno/testRequestHeader">RequestHeader</a>
/**
* 擷取請求頭的值
* @param header
* @return
*/
@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept") String header, HttpServletRequest request,HttpServletResponse response) throws IOException {
System.out.println("執行了...");
System.out.println(header);
// return "success";
// response.sendRedirect(request.getContextPath()+"/anno/testCookieValue");
return "redirect:/param.jsp";
}
4.5 @CookieValue
@CookieValue
- 作用:用于擷取指定
的名稱的值cookie
-
-
:value
的名稱cookie
-
- 代碼
<a href="anno/testCookieValue">CookieValue</a>
/**
* 擷取Cookie的值
* @return
*/
@RequestMapping(value="/testCookieValue")
public String testCookieValue(@CookieValue(value="JSESSIONID") String cookieValue){
System.out.println("執行了...");
System.out.println(cookieValue);
return "success";
}
@ModelAttribute
@ModelAttribute
- 作用
- 出現在方法上:表示目前方法會在控制器方法執行前先執行。
- 出現在參數上:擷取指定的資料給參數指派。
- 應用場景
- 當送出表單資料不是完整的實體資料時,保證沒有送出的字段使用資料庫原來的資料。
- 具體的代碼
<form action="anno/testModelAttribute" method="post">
使用者姓名:<input type="text" name="uname" /><br/>
使用者年齡:<input type="text" name="age" /><br/>
<input type="submit" value="送出" />
</form>
- 修飾的方法有傳回值
/**
* 作用在方法,先執行
* @param name
* @return
*/
@ModelAttribute
public User showUser(String uname) {
System.out.println("showUser執行了...");
// 模拟從資料庫中查詢對象
User user = new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
return user;
}
/**
* 修改使用者的方法
* @param cookieValue
* @return
*/
@RequestMapping(path="/testModelAttribute")
public String updateUser(User user) {
System.out.println(user);
return "success";
}
- 修飾的方法沒有傳回值
/**
* 作用在方法,先執行
* @param name
* @return
*/
@ModelAttribute
public void showUser(String uname,Map<String, User> map) {
System.out.println("showUser執行了...");
// 模拟從資料庫中查詢對象
User user = new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
map.put("abc", user);
}
/**
* 修改使用者的方法
* @param cookieValue
* @return
*/
@RequestMapping(path="/testModelAttribute")
public String updateUser(@ModelAttribute(value="abc") User user) {
System.out.println(user);
return "success";
}
@SessionAttributes
@SessionAttributes
- 作用:用于多次執行控制器方法間的參數共享
-
-
:指定存入屬性的名稱value
-
<a href="anno/testSessionAttributes">testSessionAttributes</a>
<a href="anno/getSessionAttributes">getSessionAttributes</a>
<a href="anno/delSessionAttributes">delSessionAttributes</a>
@Controller
@RequestMapping(path="/user")
@SessionAttributes(value={"msg"}) // 把msg=美美資料存入到session域對中
public class HelloController {
/**
* 向session中存入值
* @return
*/
@RequestMapping(value="/testSessionAttributes")
public String saveSessionAttributes(Model model){
System.out.println("saveSessionAttributes...");
// 底層會存儲到request域對象中
model.addAttribute("msg","美美");
return "success";
}
/**
* 從session中擷取值
* @param modelMap
* @return
*/
@RequestMapping(value="/getSessionAttributes")
public String getSessionAttributes(ModelMap modelMap){
System.out.println("getSessionAttributes...");
String msg = (String) modelMap.get("msg");
System.out.println(msg);
return "success";
}
/**
* 從session中清除值
* @param status
* @return
*/
@RequestMapping(value="/delSessionAttributes")
public String delSessionAttributes(SessionStatus status){
System.out.println("getSessionAttributes...");
status.setComplete();
return "success";
}
}
注:(之前的前端筆記傳送門)
1. HTML初學
2. CSS初學
3. JavaScript初學
4. JQuery初學
5. HTML複學
6. CSS複學
7. JavaScript基礎 複學
8. JavaScript進階 複學
9. BootStrap簡單了解