javascript
JAVAEE框架之SpringMVC基础
JAVAEE框架之Spring
九.SpringMVC基礎
? 概念:SpringMVC 是類似于 Struts2 的一個 MVC 框架,在實際開發中,接收瀏覽器的請求響應,對數據進行處理,然后返回頁面進行顯示,但是上手難度卻比 Struts2 簡單多了。而且由于 Struts2 所暴露出來的安全問題,SpringMVC 已經成為了大多數企業優先選擇的框架。
在Spring框架體系中的位置
特點:
結構松散,幾乎可以在 Spring MVC 中使用各類視圖
松耦合,各個模塊分離
與 Spring 無縫集成
9.1HelloSpringMVC的步驟
9.1.1 jar包準備
在pom.xml文件增加
<!--springmvc,webmvc間接依賴于web包,使用這個即可--> <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.5.RELEASE</version> </dependency>9.1.2 web.xml增加配置
<web-app><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping> </web-app>9.1.3 spring-mvc.xml
這個文件和之前的beans.xml都在resources下
<?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:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"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"><!--掃描控制器包--><context:component-scan base-package="com.aaa.controller"></context:component-scan><mvc:annotation-driven/><!--配置spring mvc默認的jsp視圖解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--配置返回視圖的前綴--><property name="prefix" value="/WEB-INF/view/"></property><!--配置返回視圖的后綴--><property name="suffix" value=".jsp"></property></bean> </beans>mvc:annotation-driven會自動注冊RequestMappingHandlerMapping與RequestMappingHandlerAdapter兩個Bean
9.1.4 HelloController
java代碼在src下建立。
@Controller public class HelloController{@RequestMapping("/hello")public String hello(){System.out.println("----");return "hello";} }9.1.5測試
url地址欄輸入:http://localhost:8080/hello
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MVsjTitM-1595717345637)(E:\政通路\課堂筆記\S2\Spring\assets\image-20200723155930671.png)]
注意,我們這里報錯了:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MquZIemm-1595717345639)(E:\政通路\課堂筆記\S2\Spring\assets\image-20200724153647426.png)]
原因在于,需要在WEB-INF下,建立一個目錄view,在view目錄下建立一個hello.jsp文件。
9.2 SpringMVC流程
9.2.1 原理圖
9.2.2 步驟
工作流程概述:
1、客戶端向web服務器(如tomcat)發送一個http請求,web服務器對http請求進行解析,解析后的URL地址如果匹配了DispatcherServlet的映射路徑(通過web.xml中的servlet-mapping配置),web容器就將請求交給DispatcherServlet處理。
2、DispatcherServlet接收到這個請求后,再對URL進行解析,得到請求資源標識符(URI)。然后調用相應方法得到的HandlerMapping對象,再根據URI,調用這個對象的相應方法獲得Handler對象以及它對應的攔截器。(在這里只是獲得了Handler對象,并不會操作它,在SpringMVC中,是通過HandlerAdapter對Handler進行調用、控制的)
3、DispatcherServlet根據得到的Handler對象,選擇一個合適的HandlerAdapter,創建其實例對象,執行攔截器中的preHandler()方法。
4、在攔截器方法中,提取請求中的數據模型,填充Handler入參,所以所有準備工作都已做好,開始執行Handler(我們寫的controller代碼并不是能被直接執行,需要有剛才那些操作,才能轉變為Handler被執行)。
5、Handler執行完畢后返回一個ModelAndView對象給DispatcherServlet。
6、這個ModleAndView只是一個邏輯視圖,并不是真正的視圖,DispatcherServlet通過ViewResolver視圖解析器將邏輯視圖轉化為真正的視圖(通俗理解為將視圖名稱補全,如加上路徑前綴,加上.jsp后綴,能指向實際的視圖)。
7、DispatcherServlet通過Model將ModelAndView中得到的處數據解析后用于渲染視圖。將得到的最終視圖通過http響應返回客戶端。
9.2.3 連接畫圖
十. 注解和參數綁定
10.1@RequestMapping 注解
@RequestMapping 注解 配置請求的路徑,這個注解可以加到控制器的方法上,也可以加到類上,加到類上相當
于命名空間。
用戶保存的請求:
http://localhost:8080/spring_mvc/user/save.do
保存部門的請求:
http://localhost:8080/spring_mvc/dept/save.do
比較常用的有:
value(path)
指定請求的實際地址,指定的地址可以是 URI Template 模式
method
指定請求的 method 類型。例如 GET、POST、PUT、DELETE 等
10.2 @RequestParam
當請求參數和控制器參數不一致的情況
表單代碼
<form action="/login" method="post">賬戶:<input name="uname" id="username" ><br/>密碼:<input name="pwd" id="password"><br/><button type="submit">登錄</button> </form>Controller代碼
@RequestMapping("/login") public String login(@RequestParam("uname") String uu,@RequestParam("pwd") String password){System.out.println(""+uu+"");System.out.println(password);return "hello"; }10.3 請求參數
10.3.1 基本數據傳參
表單
<form action="/login" method="get">賬戶:<input name="username" id="username" ><br/>密碼:<input name="password" id="password"><br/><button type="submit">登錄</button> </form>控制器
@RequestMapping("/login") public String login(String username,String password){System.out.println(username);System.out.println(password);return "hello"; }? 表單中input的name值和Controller的參數變量名保持一致,就能完成數據綁定,如果不一致可以使用@RequestParam注解。需要注意的是,如果Controller方法參數中定義的是基本數據類型,但是從頁面提交過來的數據為null或者”“的話,會出現數據轉換的異常。也就是必須保證表單傳遞過來的數據不能為null或””,所以,在開發過程中,對可能為空的數據,最好將參數數據類型定義成包裝類型,具體參見下面的例子。
10.3.2 模型封裝傳參
聲明實體類
public class Users { private Long id; private String username; private String password; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { 第二步,在控制器中通過模型的方式傳遞參數 使用HttpServletRequest對象 在servlet時代,我們可以使用HttpServletRequest對象的getParameter方法獲取參數,在spring mvc中也可以獲 取到HttpServletRequest對象,獲取該對象后,就可以使用之前的方式接收參數了 return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }在控制器中使用封裝類模型來傳遞參數,注意表單name和實體類屬性一致。
10.3.3 使用原生API
pom.xml引入原生jar
<!--引入原生javax.--> <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version> </dependency>控制器代碼
10.3.4 后臺向前臺傳遞數據
1.使用Model
2.使用原生HttpServletRequest
3.使用Map
Servlet根據得到的Handler對象,選擇一個合適的HandlerAdapter,創建其實例對象,執行攔截器中的preHandler()方法。4、在攔截器方法中,提取請求中的數據模型,填充Handler入參,所以所有準備工作都已做好,開始執行Handler(我們寫的controller代碼并不是能被直接執行,需要有剛才那些操作,才能轉變為Handler被執行)。5、Handler執行完畢后返回一個ModelAndView對象給DispatcherServlet。6、這個ModleAndView只是一個邏輯視圖,并不是真正的視圖,DispatcherServlet通過ViewResolver視圖解析器將邏輯視圖轉化為真正的視圖(通俗理解為將視圖名稱補全,如加上路徑前綴,加上.jsp后綴,能指向實際的視圖)。7、DispatcherServlet通過Model將ModelAndView中得到的處數據解析后用于渲染視圖。將得到的最終視圖通過http響應返回客戶端。### 9.2.3 連接畫圖# 十. 注解和參數綁定## **10.1@RequestMapping** **注解**@RequestMapping 注解 配置請求的路徑,這個注解可以加到控制器的方法上,也可以加到類上,加到類上相當于命名空間。用戶保存的請求:http://localhost:8080/spring_mvc/user/save.do保存部門的請求:http://localhost:8080/spring_mvc/dept/save.do比較常用的有:#### value(path)指定請求的實際地址,指定的地址可以是 URI Template 模式#### method指定請求的 method 類型。例如 GET、POST、PUT、DELETE 等## 10.2 @RequestParam當請求參數和控制器參數不一致的情況表單代碼```html <form action="/login" method="post">賬戶:<input name="uname" id="username" ><br/>密碼:<input name="pwd" id="password"><br/><button type="submit">登錄</button> </form>Controller代碼
@RequestMapping("/login") public String login(@RequestParam("uname") String uu,@RequestParam("pwd") String password){System.out.println(""+uu+"");System.out.println(password);return "hello"; }10.3 請求參數
10.3.1 基本數據傳參
表單
<form action="/login" method="get">賬戶:<input name="username" id="username" ><br/>密碼:<input name="password" id="password"><br/><button type="submit">登錄</button> </form>控制器
@RequestMapping("/login") public String login(String username,String password){System.out.println(username);System.out.println(password);return "hello"; }? 表單中input的name值和Controller的參數變量名保持一致,就能完成數據綁定,如果不一致可以使用@RequestParam注解。需要注意的是,如果Controller方法參數中定義的是基本數據類型,但是從頁面提交過來的數據為null或者”“的話,會出現數據轉換的異常。也就是必須保證表單傳遞過來的數據不能為null或””,所以,在開發過程中,對可能為空的數據,最好將參數數據類型定義成包裝類型,具體參見下面的例子。
10.3.2 模型封裝傳參
聲明實體類
public class Users { private Long id; private String username; private String password; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { 第二步,在控制器中通過模型的方式傳遞參數 使用HttpServletRequest對象 在servlet時代,我們可以使用HttpServletRequest對象的getParameter方法獲取參數,在spring mvc中也可以獲 取到HttpServletRequest對象,獲取該對象后,就可以使用之前的方式接收參數了 return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }在控制器中使用封裝類模型來傳遞參數,注意表單name和實體類屬性一致。
10.3.3 使用原生API
pom.xml引入原生jar
<!--引入原生javax.--> <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version> </dependency>控制器代碼
10.3.4 后臺向前臺傳遞數據
1.使用Model
2.使用原生HttpServletRequest
3.使用Map
總結
以上是生活随笔為你收集整理的JAVAEE框架之SpringMVC基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式服务器客户端实验
- 下一篇: Node.js 极简笔记