javascript
【SpringMVC入门】SpringMVC环境搭建、接收参数的几种方式、视图解析器、@ResponseBody
一、SpringMVC 簡介
1.SpringMVC 中重要組件
1.1 DispatcherServlet: 前端控制器,接收所有請求(如果配置/不包含jsp)
1.2 HandlerMapping: 解析請求格式的.判斷希望要執行哪個具體的方法.
1.3 HandlerAdapter: 負責調用具體的方法.
1.4 ViewResovler:視圖解析器.解析結果,準備跳轉到具體的物理視圖
2.SpringMVC 運行原理圖
3.Spring 容器和SpringMVC 容器的關系
3.1 代碼
3.2 Spring 容器和 SpringMVC 容器是 父子容器.
3.2.1 SpringMVC 容器中能夠調用 Spring 容器的所有內容.
3.2.2 圖示
二、SpringMVC 環境搭建
在下面的鏈接中下載,里面包含jar包、doc文檔以及source源碼
Spring MVC 所需jar包 - 官方地址
1. 導入jar
2. 在web.xml 中配置前端控制器DispatcherServlet
2.1 如果不配置<init-param> 會在/WEB-INF/<servlet-name>-servlet.xml
3. 在 src 下新建 springmvc.xml
3.1 引入xmlns:mvc 命名空間
4. 編寫控制器類
@Controller public class DemoController {// DemoController被SpringMVC管理,是單例,但是線程是安全的(只要不在@RequestMapping里面操作全局變量)。// 線程安全是指:在多線程訪問的情況下,如果每一個線程訪問得到的值是相同的,則稱線程是安全的。@RequestMapping(value = "demo1")public String demo(People people) {// 參數可以同時寫people, name, age// Spring是你只要敢寫,它就會給你賦值。// 也可以寫HttpServletRequest、HttpSessionSystem.out.println("In DemoController, run demo");System.out.println("In DemoController, people = " + people);return "main";// 因為添加了自定義視圖解析器,所以不需要添加.jsp后綴和絕對路徑的/前綴}@RequestMapping(value = "demo2")public String demo2(@RequestParam(value = "name", defaultValue = "游客") String name1,@RequestParam(value = "age", defaultValue = "66") int age1) {// 此處使用注解添加默認值,避免因int類型無法賦值為Null導致的異常;或者還有一種方式是使用Integer對象,可以賦值為Null// required: true 和 defaultValue 不要一起使用,否則始終具有默認值,required檢驗恒通過,沒有意義。System.out.println("In DemoController demo2, name1 = " + name1 + ", age1 = " + age1);return "main2";}三、字符編碼過濾器
1.在 web.xml 中配置 Filter
<!-- 字符編碼過濾器 --><!-- 配置文件無關順序問題,加載時就被實例化,等待tomcat回調 --><filter><filter-name>encoding</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>encoding</filter-name><url-pattern>/*</url-pattern></filter-mapping>四、傳參
1. 把內容寫到方法(HandlerMethod)參數中,SpringMVC 只要有這個內容,就會注入內容.(Spring是你只要敢寫,它就會給你賦值)
2. 基本數據類型參數
2.1 默認保證參數名稱和請求中傳遞的參數名相同
2.2 如果請求參數名和方法參數名不對應使用@RequestParam()賦值
2.3 如果方法參數是基本數據類型( 不是封裝類) ,可以通過 @RequestParam 設置默認值.
2.3.1 defaultValue防止沒有參數時500
2.4 如果強制要求必須有某個參數
@RequestMapping("demo2")public String demo2(@RequestParam(required = true) String name) {System.out.println("name 是SQL 的查詢條件,必須要傳遞name 參數" + name);return "main.jsp";}3. HandlerMethod 中參數是對象類型
3.1 請求參數名和對象中屬性名對應(get/set 方法)
4. 請求參數中包含多個同名參數的獲取方式
4.1 復選框傳遞的參數就是多個同名參數
5. 請求參數中對象.屬性格式
5.1 jsp 中代碼
5.2 新建一個類DemoPeople
5.2.1 對象名和參數中點前面名稱對應
5.3 控制器
@RequestMapping(value = "demo4")public String demo4(DemoPeople demoPeople) { // 經測試,此處也可用DemoPeopleListSystem.out.println("In DemoController demo4, demoPeople = " + demoPeople);return "main2";}6. 在請求參數中傳遞集合對象類型參數
6.1 jsp 中格式
6.2 新建類 DemoPeopleList
package cn.hanquan.pojo;import java.util.List;public class DemoPeopleList {private List<People> peo;public List<People> getPeo() {return peo;}public void setPeo(List<People> peo) {this.peo = peo;}@Overridepublic String toString() {return "DemoPeopleList [peo=" + peo + "]";} }6.3 控制器
@RequestMapping(value = "demo5")public String demo5(DemoPeopleList demoPeopleList) {System.out.println("In DemoController demo5, demoPeopleList = " + demoPeopleList);return "main2";}7. restful 傳值方式.
7.1 簡化 jsp 中參數編寫格式
7.2 在 jsp 中設定特定的格式
7.3 在控制器中
7.3.1 在 @RequestMapping 中一定要和請求格式對應
7.3.2 {名稱} 中名稱自定義名稱
7.3.3 @PathVariable 獲取@RequestMapping 中內容,默認按照
方法參數名稱去尋找.
五、跳轉方式
1. 默認跳轉方式請求轉發.
2. 設置返回值字符串內容
2.1 添加redirect:資源路徑,重定向
2.2 添加forward:資源路徑或省略forward:,請求轉發
六、視圖解析器
1. SpringMVC 會提供默認視圖解析器.
2. 在springmvc.xml中,自定義視圖解析器
3. 如果希望不執行自定義視圖解析器, 在方法返回值前面添加
forward:或redirect:
七、@ResponseBody
1. 在方法上只有@RequestMapping 時,無論方法返回值是什么認為需要跳轉
2. 在方法上添加@ResponseBody(恒不跳轉)
2.1 如果返回值滿足key-value 形式(對象或map)
2.1.1 把響應頭設置為application/json;charset=utf-8
2.1.2 把轉換后的內容輸出流的形式響應給客戶端.
2.2 如果返回值不滿足key-value,例如返回值為String
2.2.1 把相應頭設置為text/html
2.2.2 把方法返回值以流的形式直接輸出.
2.2.3 如果返回值包含中文,出現中文亂碼
2.2.3.1 produces 表示響應頭中Content-Type 取值.
demo13運行效果:
demo14運行效果:
3. 底層使用Jackson 進行json 轉換,在項目中一定要導入jackson 的jar
需要導入的jar包如下圖:
可以從下面的鏈接中下載:
【mvn repository】所需jackson jar包地址 - 從Maven倉庫中下載
3.1 spring4.1.6 對 jackson 不支持較高版本, jackson 2.7 無效.
附:源代碼 + 運行效果
環境:Eclipse
1、整體目錄結構
2、代碼
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><!-- 配置前端控制器 --><servlet><servlet-name>abc</servlet-name><!-- servlet分發器 --><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>abc</servlet-name><!-- '/'表示除了jsp都攔截 --><url-pattern>/</url-pattern></servlet-mapping><!-- 字符編碼過濾器 --><!-- 無關順序問題,加載時就被實例化,等待tomcat回調 --><filter><filter-name>encoding</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>encoding</filter-name><url-pattern>/*</url-pattern></filter-mapping> </web-app>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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 掃描注解 --><context:component-scanbase-package="cn.hanquan.controller"></context:component-scan><!-- 注解驅動,相當于配置了以下兩個類 --><!-- org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping --><!-- org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter --><mvc:annotation-driven></mvc:annotation-driven><!-- 放行靜態資源 --><!-- 訪問示例:http://localhost:8080/springmvc_test/test/jquery.js --><mvc:resources location="/js/" mapping="/test/**"></mvc:resources><mvc:resources location="/js/" mapping="/js/**"></mvc:resources><mvc:resources location="/css/" mapping="/css/**"></mvc:resources><mvc:resources location="/images/" mapping="/images/**"></mvc:resources><!-- 自定義視圖解析器 --><!-- 當跳轉語句添加前綴(比如forward:)時,自定義視圖解析器無效,走默認視圖解析器 --><bean id="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 添加前綴后,寫相對路徑不用加/ --><property name="prefix" value="/"></property><!-- 后綴沒配,與不寫相同,可以配成jsp --><property name="suffix" value=".jsp"></property></bean> </beans>DemoController.java
package cn.hanquan.controller;import java.awt.PageAttributes.MediaType; import java.util.List;import org.springframework.beans.factory.annotation.Value; 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 org.springframework.web.bind.annotation.ResponseBody;import cn.hanquan.pojo.DemoPeople; import cn.hanquan.pojo.DemoPeopleList; import cn.hanquan.pojo.People;@Controller public class DemoController {// DemoController被SpringMVC管理,是單例,但是線程是安全的(只要不在@RequestMapping里面操作全局變量)。// 線程安全是指:在多線程訪問的情況下,如果每一個線程訪問得到的值是相同的,則稱線程是安全的。@RequestMapping(value = "demo1")public String demo(People people) {// 參數可以同時寫people, name, age// Spring是你只要敢寫,它就會給你賦值。// 也可以寫HttpServletRequest、HttpSessionSystem.out.println("In DemoController, run demo");System.out.println("In DemoController, people = " + people);return "main";// 因為添加了自定義視圖解析器,所以不需要添加.jsp后綴和絕對路徑的/前綴}@RequestMapping(value = "demo2")public String demo2(@RequestParam(value = "name", defaultValue = "游客") String name1,@RequestParam(value = "age", defaultValue = "66") int age1) {// 此處使用注解添加默認值,避免因int類型無法賦值為Null導致的異常;或者還有一種方式是使用Integer對象,可以賦值為Null// required: true 和 defaultValue 不要一起使用,否則始終具有默認值,required檢驗恒通過,沒有意義。System.out.println("In DemoController demo2, name1 = " + name1 + ", age1 = " + age1);return "main2";}// 在請求參數中傳遞集合對象類型參數@RequestMapping(value = "demo3")public String demo3(@RequestParam("hobby") List<String> hobyList) {System.out.println("In DemoController demo3, hobyList = " + hobyList);return "main2";}@RequestMapping(value = "demo4")public String demo4(DemoPeople demoPeople) { // 經測試,此處也可用DemoPeopleListSystem.out.println("In DemoController demo4, demoPeople = " + demoPeople);return "main2";}@RequestMapping(value = "demo5")public String demo5(DemoPeopleList demoPeopleList) {System.out.println("In DemoController demo5, demoPeopleList = " + demoPeopleList);return "main2";}// 普通url傳值@RequestMapping(value = "demo6")public String demo6(String name, int age) {System.out.println("In DemoController demo6, name = " + name + ", age=" + age);return "main2";}// restful傳值方式,可以簡化jsp中參數編寫格式@RequestMapping(value = "demo7/{name1}/{age1}") // 相當于虛擬路徑public String demo7(@PathVariable(value = "name1") String name, @PathVariable(value = "age1") int age) {System.out.println("In DemoController demo7, name = " + name + ", age=" + age);return "main2";}// 請求轉發和重定向// 默認使用請求轉發方式,也可以指定請求轉發,使用forward:@RequestMapping(value = "demo9")public String demo9() {System.out.println("demo9:以請求轉發的方式跳轉頁面");return "main2";}// 重定向使用redirect:@RequestMapping(value = "demo10")public String demo10() {System.out.println("demo10:以重定向的方式跳轉頁面");return "redirect:main2.jsp";}// 自定義視圖解析器@RequestMapping(value = "demo11")public String demo11() {System.out.println("demo11");return "redirect:demo12";}@RequestMapping(value = "demo12")public String demo12() {System.out.println("demo12");return "main2";}// ResponseBody做了兩件事情:// 1、依賴jackson包,把滿足key-value形式的對象返回值轉換成json字符串// 2、設置響應頭的類型為application/json;charset=utf-8// 3、把轉換后的內容以流形式輸出到客戶端,恒不跳轉。// 如果不添加@ResponseBody,無論方法返回值是什么,@RequestMapping都會自動跳轉到返回值的內容@RequestMapping(value = "demo13")@ResponseBodypublic People demo13() {System.out.println("demo13");People p = new People();p.setAge(12);p.setName("張三");return p;}// 如果無法轉成json,ResponseBody會直接以string形式返回,類型為text/html// 如果返回值包含中文,需要手動設置響應頭字符編碼,來避免中文亂碼問題。produces表示響應頭中Content-Type取值@RequestMapping(value = "demo14", produces = "text/html;charset=utf-8")@ResponseBodypublic String demo14() {System.out.println("demo14");return "如果jackson無法轉成json,直接以string形式返回";} }People.java
package cn.hanquan.pojo;public class People {public String name;public int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "People [name=" + name + ", age=" + age + "]";} }DemoPeople.java
package cn.hanquan.pojo;public class DemoPeople {private People peo;public People getPeo() {return peo;}public void setPeo(People peo) {this.peo = peo;}@Overridepublic String toString() {return "DemoPeople [peo=" + peo + "]";}}DemoPeopleList.java
package cn.hanquan.pojo;import java.util.List;public class DemoPeopleList {private List<People> peo;public List<People> getPeo() {return peo;}public void setPeo(List<People> peo) {this.peo = peo;}@Overridepublic String toString() {return "DemoPeopleList [peo=" + peo + "]";} }index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>測試Spring</title> </head> <body><h2>Spring各種類型參數的接收</h2><hr><form action="demo1" method="post"><br>以下age項不能為空<br>name:<input type="text" name="name"/><br>age:<input type="text" name="age"/><br><input type="submit" name="提交"/></form><hr><br>以下可不填直接提交,自動傳入默認值<form action="demo2" method="post"><br>name:<input type="text" name="name"/><br>age:<input type="text" name="age"/><br><input type="submit" name="提交"/></form><hr><br>以下測試List類型參數的使用<form action="demo3" method="post"><br>name:<input type="text" name="name"/><br>age:<input type="text" name="age"/><br>hobbby:<br>學習<input type="checkbox" name="hobby" value="學習"/><br>寫代碼<input type="checkbox" name="hobby" value="寫代碼"/><br>看視頻<input type="checkbox" name="hobby" value="看視頻"/><br>看筆記<input type="checkbox" name="hobby" value="看筆記"/><br><input type="submit" name="提交"/></form><hr><br>以下測試復雜類型參數(對象屬性調用)的使用<form action="demo4" method="post"><br>name:<input type="text" name="peo.name"/><br>age:<input type="text" name="peo.age"/><br><input type="submit" name="提交"/></form><hr><br>以下測試復雜類型參數(對象列表屬性調用)的使用<form action="demo5" method="post"><br>peo[0].name:<input type="text" name="peo[0].name"/><br>peo[0].age:<input type="text" name="peo[0].age"/><br>peo[1].name:<input type="text" name="peo[1].name"/><br>peo[1].age:<input type="text" name="peo[1].age"/><br><input type="submit" name="提交"/></form><hr><br>測試url傳值<br>原始url傳值:<a href="demo6?name=testname&age=123">跳轉至:demo6?name=testname&age=123</a> <br>restful類型參數:<a href="demo7/testname/123">跳轉至:demo7/testname/123</a> <hr><br>測試請求轉發和重定向<br><a href="demo9">請求轉發跳轉</a> <br><a href="demo10">重定向跳轉</a> </body> </html>總結
以上是生活随笔為你收集整理的【SpringMVC入门】SpringMVC环境搭建、接收参数的几种方式、视图解析器、@ResponseBody的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【REST】REST是什么
- 下一篇: 【Spring】JSP 九大内置对象、作