SpringMVC Maven 項目創建配置
一、添加東西 (構建項目更快)
解決 maven 構建項目慢的問題
name: archetypeCatalog ,value: internal
name:archetypeCatalog
value:: internal
二、運行第一個 Spring MVC 程序
2.1 Maven 配置
<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 版本號 -->
<spring.version>5.2.3.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- spring start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<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>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
2.2 springmvc.xml 配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.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-3.0.xsd">
<!-- 使用註解開發時,要告知 spring在創建容器時要掃描的包-->
<context:component-scan base-package="cn.gorit"></context:component-scan>
<!-- 視圖解析器-->
<bean id="internalResourceViewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 開啓 SpringMVC 註解的支持 -->
<mvc:annotation-driven/>
</beans>
- 啓動服務器,加載一些配置文件
- DispatcherServlet對象創建
- springmvc.xml 被加載了
- HelloController 創建成對象
2.3 SpringMVC 中的組件控制器
- DispatcherServlet:前端控制器
用戶請求到達前端控制器,它就相當於 mvc 中的 c,dispatcherServlet 是整個流程控制中心,由它調用其他組件處理用戶的請求,dispatcherServlet 的存在降低了組件之間的耦合性
- HanderMapping:處理器映射器
HandlerMapping 負責根據用戶請求找到 Handler 即處理器,SpringMVC 提供了 不同的映射器實現不同的映射方式,例如配置文件方式,實現接口方式,註解方式等
- Handler:處理器
它就是我們開發中要編寫的具體業務控制器。由 DispatcherServlet把用戶請求轉發送到 Handler。由 Handler 對具體用戶請求進行處理
- HandlerAdapter:處理適配器
通過對 HandlerAdapter 對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器執行。
類比插座 和 接口
- View Resolver:視圖解析器
View Resolver 負責將處理結果生成 View 視圖, View Resolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成 View 視圖對象,最後對 View 進行渲染將處理結果通過頁面展現給用戶
- View:視圖
SpringMVC 框架提供很多 View 視圖類型的支持,包括 jstlView,freemarkerView,pdfView等,我們最常用的視圖就是 jsp。
一般情況下需要通過頁面標籤或頁面模板技術將模型數據通過頁面展示給用戶,需要由程序員根據業務需求開發頁面
2.3 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>
<!-- 配置前端控制器,使用 SpringMVC-->
<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>
2.4 RequestMapping 講解
作用:建立請求 URL 和處理請求方法之間對應的關係。
- path:指定請求路徑 url
- value:value 屬性和 path 屬性是一樣的
- method:指定該方法的請求方式
- params:指定限制請求參數的條件
- headers:發送請求中必須包含的請求頭
三、請求參數的綁定
3.1 綁定的機制
-
請求參數綁定說明
- 綁定機制
- 表單提交的數據都是 k=v 形式 user=hehe&pwd=123
- SpringMVC 的參數綁定過程是把表單提交的請求參數,作爲控制器中方法的參數進行綁定的
- 要求:提交表單的 name 和 參數名稱是相同的
- 支持的數據類型
- 基本數據類型和字符串類型
- 實體類型(JavaBean)
- 集合數據類型(List,map集合等)
- 綁定機制
-
基本數據類型和字符串類型
- 提交表單的 name 和參數的名稱是相同的
- 區分大小寫
-
實體類型(JavaBean)
-
提交表單的 name 和 javaBean 中的屬性名稱要一致
-
如果一個 JavaBean類中包含其他的引用類型,那麼表單的 name 屬性需要編寫成:對象 屬性:
eg:address name
-
-
給集合屬性數據封裝
- JSP 頁面編寫方式:list[0] 屬性, 封裝對象表達式,對 前端的表單頁面進行設置
-
請求參數中亂碼解決(解決 post 請求亂碼)
- 在 web.xml 中配置 Spring提供的過濾器類 (上面的 web.xml 已經修改)
3.2 獲得原生 Servlet API
// 獲取原生的 Servlet API
@RequestMapping("/testServlet")
public String testServlet(HttpServletRequest request, HttpServletResponse response) {
System.out.println("執行了");
System.out.println(request.getRemoteUser());
return "success";
}
四、常用註解
4.1 RequestParam
作用:
把請求中指定名稱的參數給控制器中的形參賦值
屬性:
value:請求參數的名稱
required:請求參數中是否必須提交此參數
// jsp 代碼
<a href="anno/testRequestParam?name=haha">常用註解</a>
@Controller
@RequestMapping("/anno")
public class AnnoController {
@RequestMapping(value = "/testRequestParam")
public String testAnno(@RequestParam(name="name") String username) {
// 這樣強制要求必須傳 name,否則就把報錯
System.out.println("執行了");
System.out.println("username:"+username);
return "success";
}
}
https://www.bilibili.com/video/BV1Sb411s7qa?p=18
4.2 RequestBody
作用:
用於獲取請求體內容,直接使用得到的是 key=value&key1=value1 … 結構的數據
不適合 get 請求方法
賦值
value:請求參數的名稱
required:是否必須有請求體,默認爲:true,當取值爲 get 時,請求方法會報錯,如果
// jsp 代碼
<form action="anno/testRequestBody" method="post">
用戶姓名:<input type="text" name="username"><br>
用戶年齡:<input type="text" name="age"><br>
<input type="submit" value="提交">
</form>
@Controller
@RequestMapping("/anno")
public class AnnoController {
/**
* 獲取到請求體的內容
* */
@RequestMapping(value = "/testRequestBody")
public String testRequestBody(@RequestBody String body) {
System.out.println("執行了。。。");
System.out.println(body);
return "success";
}
}
4.3 PathVariable
- 作用:擁有綁定 url 中的佔位符的,例如:url中有/delete/{id},id 是佔位符
- 屬性:
- value:指定 url 中的佔位符名稱
- Restful 風格的 URL
- 請求路徑一樣,可以根據不同的請求方式執行後臺的不同方法
- restful 風格的 URL 優點
- 結構清晰
- 符合標準
- 易於理解
- 擴展方便
// jsp 代碼
<a href="anno/testPathVariable/10">PathVariable</a>
@Controller
@RequestMapping("/anno")
public class AnnoController {
/**
* PathVariable 註解
* */
@RequestMapping("/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name = "sid") String id) {
System.out.println("執行了。。。");
System.out.println(id);
return "success";
}
}
4.4 RequestHeader
作用:
用於獲取請求頭消息
屬性:
value:提供消息頭名稱
value:請求參數的名稱
required:是否必須有此請求頭
// jsp 代碼
<a href="anno/testRequestHeader">RequestHeader</a>
@Controller
@RequestMapping("/anno")
public class AnnoController {
/**
* 獲取請求頭的值
* */
@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept") String header) {
System.out.println("執行了。。。");
System.out.println(header);
return "success";
}
}
4.5 CookieValue
作用:
用於把指定 cookie 名稱的值傳入控制器方法參數
屬性:
value:指定 cookie 的名稱
required:是否必須有此 cookie
// jsp 代碼
<a href="anno/testCookieValue">CookieValue</a>
@Controller
@RequestMapping("/anno")
public class AnnoController {
/**
* 獲取 Cookie 的值
* */
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue) {
System.out.println("執行了。。。");
System.out.println(cookieValue);
return "success";
}
}
4.6 ModelAttribute
// jsp 代碼
<form action="anno/testModelAttribute" method="post">
用戶姓名:<input type="text" name="username"><br>
用戶年齡:<input type="text" name="age"><br>
<input type="submit" value="提交">
</form>
@Controller
@RequestMapping("/anno")
public class AnnoController {
/**
* testModelAttribute 註解
* */
@RequestMapping("/testModelAttribute")
public String testModelAttribute() {
System.out.println("testModelAttribute 執行了。。。");
return "success";
}
// 該方法會先執行
@ModelAttribute
public void showUser(String username, int age) {
System.out.println("showUser 執行了");
System.out.println(username);
System.out.println(age);
// 這裏就可以進行數據庫的一些操作了
}
}
4.6 SessionAttribute
作用:
用於多次執行控制器方法間的參數共享。
屬性:
value:用於指定存入的屬性的名稱
type:用於指定存入的數據類型
// jsp 代碼
<a href="anno/testSessionAttributes">SessionAttributes</a>
// java 代碼 存到 request 域當中
@Controller
@RequestMapping("/anno")
public class AnnoController {
/**
* testSessionAttributes 註解
* */
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Model model) {
System.out.println("testSessionAttributes 執行了。。。");
// 底層會存儲到 request 域對象中
model.addAttribute("msg","World");
return "success";
}
}
// 存到 session 對象中
@Controller
@RequestMapping("/anno")
@SessionAttributes(value = {"msg"}) // 把 msg=World 存入到 session域中 (新增)
public class AnnoController {
/**
* testSessionAttributes 註解
* */
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Model model) {
System.out.println("testSessionAttributes 執行了。。。");
// 底層會存儲到 request 域對象中
model.addAttribute("msg","World");
return "success";
}
}
// pages/success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>跳轉成功了</h3>
${requestScope}
${sessionScope}
</body>
</html>
顯示 request 域
顯示 session 域