歡迎大家回到《Java教程之Spring30天快速入門》,本教程所有示例均基于Maven實現(xiàn),如果您對Maven還很陌生,請移步本人的博文《如何在windows11下安裝Maven并配置以及 IDEA配置Maven環(huán)境》,本文的上一篇為《PostMan工具的安裝與使用技巧》前面我們已經(jīng)完成了入門案例相關的知識學習,接來了我們就需要針對SpringMVC相關的知識點進行系統(tǒng)的學習,之前我們提到過,SpringMVC是web層的框架,主要的作用是接收請求、接收數(shù)據(jù)、響應結果,所以這一章節(jié)是學習SpringMVC的重點內(nèi)容,我們主要會講解四部分內(nèi)容:
- 請求映射路徑
- 請求參數(shù)
- 日期類型參數(shù)傳遞
- 響應json數(shù)據(jù)
1 設置請求映射路徑
1.1 環(huán)境準備
- 創(chuàng)建一個Web的Maven項目
- pom.xml添加Spring依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itheima</groupId>
<artifactId>springmvc_03_request_mapping</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 創(chuàng)建對應的配置類
public class ServletContainersInitConfig extends
AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
}
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
- 編寫B(tài)ookController和UserController
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'module':'user save'}";
}
@RequestMapping("/delete")
@ResponseBody
public String save(){
System.out.println("user delete ...");
return "{'module':'user delete'}";
}
}
@Controller
public class BookController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("book save ...");
return "{'module':'book save'}";
}
}
最終創(chuàng)建好的項目結構如下:
把環(huán)境準備好后,啟動Tomcat服務器,后臺會報錯:
從錯誤信息可以看出:
- UserController有一個save方法,訪問路徑為http://localhost/save
- BookController也有一個save方法,訪問路徑為http://localhost/save
- 當訪問http://localhost/saved的時候,到底是訪問UserController還是BookController?
1.2 問題分析
團隊多人開發(fā),每人設置不同的請求路徑,沖突問題該如何解決?
解決思路:為不同模塊設置模塊名作為請求路徑前置
對于Book模塊的save,將其訪問路徑設置http://localhost/book/save
對于User模塊的save,將其訪問路徑設置http://localhost/user/save
這樣在同一個模塊中出現(xiàn)命名沖突的情況就比較少了。
1.3 設置映射路徑
步驟1:修改Controller
@Controller
public class UserController {
@RequestMapping("/user/save")
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'module':'user save'}";
}
@RequestMapping("/user/delete")
@ResponseBody
public String save(){
System.out.println("user delete ...");
return "{'module':'user delete'}";
}
}
@Controller
public class BookController {
@RequestMapping("/book/save")
@ResponseBody
public String save(){
System.out.println("book save ...");
return "{'module':'book save'}";
}
}
問題是解決了,但是每個方法前面都需要進行修改,寫起來比較麻煩而且還有很多重復代碼,如果/user后期發(fā)生變化,所有的方法都需要改,耦合度太高
步驟2:優(yōu)化路徑配置
優(yōu)化方案:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'module':'user save'}";
}
@RequestMapping("/delete")
@ResponseBody
public String save(){
System.out.println("user delete ...");
return "{'module':'user delete'}";
}
}
@Controller
@RequestMapping("/book")
public class BookController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("book save ...");
return "{'module':'book save'}";
}
}
注意:
- 當類上和方法上都添加了@RequestMapping注解,前端發(fā)送請求的時候,要和兩個注解的value值相加匹配才能訪問到。
- @RequestMapping注解value屬性前面加不加/都可以
擴展小知識:
對于PostMan如何覺得字小不好看,可以使用ctrl+=調(diào)大,ctrl±調(diào)小。
2 請求參數(shù)
請求路徑設置好后,只要確保頁面發(fā)送請求地址和后臺Controller類中配置的路徑一致,就可以接收到前端的請求,接收到請求后,如何接收頁面?zhèn)鬟f的參數(shù)?
關于請求參數(shù)的傳遞與接收是和請求方式有關系的,目前比較常見的兩種請求方式為:
- GET
- POST
針對于不同的請求前端如何發(fā)送,后端如何接收
2.1 環(huán)境準備
- 創(chuàng)建一個Web的Maven項目
- pom.xml添加Spring依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itheima</groupId>
<artifactId>springmvc_03_request_mapping</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 創(chuàng)建對應的配置類
public class ServletContainersInitConfig extends
AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
}
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
- 編寫UserController
@Controller
public class UserController {
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(){
return "{'module':'commonParam'}";
}
}
- 編寫模型類,User和Address
public class Address {
private String province;
private String city;
//setter...getter...略
}
public class User {
private String name;
private int age;
//setter...getter...略
}
最終創(chuàng)建好的項目結構如下:
2.2 參數(shù)傳遞
2.2.1 GET發(fā)送單個參數(shù)
發(fā)送請求與參數(shù):
http://localhost/commonParam?name=itcast
接收參數(shù):
@Controller
public class UserController {
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name){
System.out.println("普通參數(shù)傳遞 name ==> "+name);
return "{'module':'commonParam'}";
}
}
2.2.2 GET發(fā)送多個參數(shù)
發(fā)送請求與參數(shù):
http://localhost/commonParam?name=itcast&age=15
接收參數(shù):
@Controller
public class UserController {
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name,int age){
System.out.println("普通參數(shù)傳遞 name ==> "+name);
System.out.println("普通參數(shù)傳遞 age ==> "+age);
return "{'module':'commonParam'}";
}
}
2.2.3 GET請求中文亂碼
如果我們傳遞的參數(shù)中有中文,你會發(fā)現(xiàn)接收到的參數(shù)會出現(xiàn)中文亂碼問題。
發(fā)送請求: http://localhost/commonParam?name=張三&age=18
控制臺:
出現(xiàn)亂碼的原因相信大家都清楚,Tomcat8.5以后的版本已經(jīng)處理了中文亂碼的問題,但是IDEA中的Tomcat插件目前只到Tomcat7,所以需要修改pom.xml來解決GET請求中文亂碼問題
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port><!--tomcat端口號-->
<path>/</path> <!--虛擬目錄-->
<uriEncoding>UTF-8</uriEncoding><!--訪問路徑編解碼字符集-->
</configuration>
</plugin>
</plugins>
</build>
2.2.4 POST發(fā)送參數(shù)
發(fā)送請求與參數(shù)
接收參數(shù):
和GET一致,不用做任何修改
@Controller
public class UserController {
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name,int age){
System.out.println("普通參數(shù)傳遞 name ==> "+name);
System.out.println("普通參數(shù)傳遞 age ==> "+age);
return "{'module':'commonParam'}";
}
}
2.2.5 POST請求中文亂碼
發(fā)送請求與參數(shù):
接收參數(shù):
控制臺打印,會發(fā)現(xiàn)有中文亂碼問題。
解決方案:配置過濾器文章來源:http://www.zghlxwxcb.cn/news/detail-768359.html
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
//亂碼處理
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
}
CharacterEncodingFilter是在spring-web包中,所以用之前需要導入對應的jar包。文章來源地址http://www.zghlxwxcb.cn/news/detail-768359.html
到了這里,關于【Spring教程28】Spring框架實戰(zhàn):從零開始學習SpringMVC 之 請求與請求參數(shù)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!