1.SpringMVC介紹
SpringMVC是Spring框架中的一個組件,是一個輕量級的web的MVC框架,充當controller,其本質就是一個Servlet。
1.1 傳統Servlet的不足
每個請求,都需要定義一個Servlet。雖然可以在service方法中,根據業務標識進行業務分發,但是每個Servlet中的service方法的實現是重復。如果想要對service進行更高層次的封裝,就可以解決service的重復代碼問題。
每個請求的參數,都需要根據request對象,從Map逐一的獲取,單調且含量低。將所有的參數,自動封裝映射,簡化開發。
request.getParameter(“”)
每個Servlet,向客戶端返回數據時,需要單獨的處理。
request.getRequestDispatcher(“/路徑”).forward(request,response)
Response.sendRedirect(“/路徑”)
針對于Servlet在實際使用中的不便,Spring中提供了組件,SpringMVC,更進一步的簡化了Servlet的開發。
1.2 SpringMVC的架構
1.2.1 DispatcherServlet
核心控制器,本質上就是一個Servlet,處理所有的客戶端的請求。根據請求的資源路徑,在處理器映射器中查找對應的處理器。
1.2.2 HandlerMapping
處理器映射器,存儲所有當前程序中的處理器,如果在處理器映射器中查找不到資源路徑,直接返回404。
1.2.3 HandlerAdapter
處理器適配器,用于適配各種處理器,調用具體的處理器程序。
1.2.4 Handler
具體處理器,開發者實現相應接口或者使用注解聲明的程序。用于處理具體的請求。
1.2.5 ViewResolver
視圖解析器,根據處理器返回的數據,進行數據處理,將數據處理成相應的格式。
JSP/JSON等等。
2.SpringMVC使用
2.1 SpringMVC入門使用
2.1.1 導入SpringMVC相關jar包
<?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>org.example</groupId><artifactId>01-mvc01</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><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></properties><dependencies><!-- 引入springmvc 相關jar包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.0.RELEASE</version></dependency></dependencies>
</project>
2.1.2 編寫SpringMVC配置文件
<?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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 配置了一個自定義的處理器 --><bean id="controller01" name="/controller01.do" class="com.bjpowernode.controller.Controller01"></bean><bean id="controller02" name="/controller02.do" class="com.bjpowernode.controller.Controller02"></bean><!-- 開啟springmvc 注解 --><!-- 開啟組件掃描 --><context:component-scan base-package="com.*" /><!-- 開啟springmvc 相關注解 --><mvc:annotation-driven />
</beans>
2.1.3 編寫相關類
package com.bjpowernode.controller;import org.springframework.web.HttpRequestHandler;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class Controller01 implements HttpRequestHandler {@Overridepublic void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {System.out.println("你好啊 springmvc");}
}package com.bjpowernode.controller;import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class Controller02 implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {System.out.println("Hello SpringMVC 02");//模型視圖//模型就是數據//視圖 界面ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("name","Hello SpringMVC");modelAndView.setViewName("/index.html");//springmvc中 /表示當前項目return modelAndView;}
}package com.bjpowernode.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping
public class Controller03 {@RequestMapping("hello1.do")public String hello(String name){System.out.println("name:"+name);System.out.println("你好springmvc");return "/index.html";}@RequestMapping("hello2.do")public String hello1(String name){System.out.println("name:"+name);System.out.println("你好springmvc");return "/index.html";}
}
2.1.4 在web.xml中配置SpringMVC
<!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>springmvc</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><!-- 配置服務器啟動時 就初始化DispatcherServlet --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
</web-app>
2.1.5 進行測試
使用bean標簽的name屬性進行訪問。注意,每個名字必須有個/,如果多個名字,之間使用逗號。
2.2 SpringMVC的數據綁定
在SpringMVC中為了簡化開發,SpringMVC對請求的參數進行預處理,SpringMVC支持按照參數名稱,直接將請求參數封裝傳遞給處理器中的方法,處理無需單獨的獲取。
2.2.1 請求參數
請求參數,是指基本數據類型和字符串、對象、數組、Map等。
2.2.2 獲取請求參數
package com.bjpowernode.controller;import com.bjpowernode.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.util.Arrays;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/param")
public class ParamController {/*** 處理簡單的參數* @return*/@RequestMapping("/simple.do")public String doSimpleParam(Integer id,boolean flag,String name,@RequestParam("City") String city){System.out.println("id: "+id);System.out.println("flag: "+flag);System.out.println("name: "+name);System.out.println("city: "+city);return "/success.html";//默認當做內部轉發處理 默認當做視圖路徑}/*** 使用對象接收請求參數* 請求參數的名稱 必須 和 對象中屬性名一致 類型要支持轉換* @param user* @return*/@RequestMapping("/obj.do")public String objParam(User user){System.out.println("id: "+user.getId());System.out.println("flag: "+user.getFlag());System.out.println("name: "+user.getName());return "/success.html";//默認當做內部轉發處理 默認當做視圖路徑}/*** 使用map接收請求參數* 默認是不支持使用map集合接收數據 需要使用注解@RequestParam* RequestParam :* name/value : 綁定請求參數 ,默認根據名稱注入值,當名稱不一致,可以使用RequestParam設置對應的參數的名稱,進行綁定* required : 是否需要這個參數 默認true 如果有使用了RequestParam這個注解,默認必須傳這個參數 如果不是必傳 設置為 false* defaultValue : 如果沒有這個請求參數時或者請求參數值為null 設置默認值* @param param* @return*/@RequestMapping("/map.do")public String mapParam(@RequestParam Map<String,Object> param){System.out.println("id: "+param.get("id"));System.out.println("flag: "+param.get("flag"));System.out.println("name: "+param.get("name"));return "/success.html";//默認當做內部轉發處理 默認當做視圖路徑}@RequestMapping("/arr.do")public String arr(Integer id,boolean flag,String name,String[] likes){System.out.println("id: "+id);System.out.println("flag: "+flag);System.out.println("name: "+name);List<String> strings = Arrays.asList(likes);System.out.println(strings);return "/success.html";//默認當做內部轉發處理 默認當做視圖路徑}@RequestMapping("/list.do")public String arr(Integer id,boolean flag,String name,@RequestParam("likes") List<String> likes){System.out.println("id: "+id);System.out.println("flag: "+flag);System.out.println("name: "+name);System.out.println(likes);return "/success.html";//默認當做內部轉發處理 默認當做視圖路徑}
}
2.2.3 頁面代碼
<html>
<head><title>Title</title>
</head>
<body>
<h1>簡單的數據</h1>
<form action="param/simple.do" method="get"><p>ID:<input name="id" /></p><p>boolean:<input name="flag" type="radio" value="true" />男<input name="flag" type="radio" value="false" />女</p><p>String:<input name="name" /></p><p>city:<input name="City" /></p><input type="submit" value="提交" />
</form>
<h1>對象的數據</h1>
<form action="param/obj.do" method="get"><p>ID:<input name="id" /></p><p>boolean:<input name="flag" type="radio" value="true" />男<input name="flag" type="radio" value="false" />女</p><p>String:<input name="name" /></p><input type="submit" value="提交" />
</form>
<h1>map的數據</h1>
<form action="param/map.do" method="get"><p>ID:<input name="id" /></p><p>boolean:<input name="flag" type="radio" value="true" />男<input name="flag" type="radio" value="false" />女</p><p>String:<input name="name" /></p><input type="submit" value="提交" />
</form>
<h1>數組的數據</h1>
<form action="param/arr.do" method="get"><p>ID:<input name="id" /></p><p>boolean:<input name="flag" type="radio" value="true" />男<input name="flag" type="radio" value="false" />女</p><p>String:<input name="name" /></p><p>likes:<input name="likes" type="checkbox" value="籃球" />籃球<input name="likes" type="checkbox" value="足球" />足球</p><input type="submit" value="提交" />
</form>
<h1>list的數據</h1>
<form action="param/list.do" method="get"><p>ID:<input name="id" /></p><p>boolean:<input name="flag" type="radio" value="true" />男<input name="flag" type="radio" value="false" />女</p><p>String:<input name="name" /></p><p>likes:<input name="likes" type="checkbox" value="籃球" />籃球<input name="likes" type="checkbox" value="足球" />足球</p><input type="submit" value="提交" />
</form>
</body>
</html>
2.3 SpringMVC的跳轉
在SpringMVC中,默認的跳轉方式內部轉發,,每個URL前面默認有forward:
,默認會將方法的返回值當做視圖的路徑處理。并且,在SpringMVC中,/表示當前項目根目錄。如果想要使用重定向,則使用關鍵字:redirect:/路徑。
2.3.1 代碼示例
package com.bjpowernode.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("jump")
public class JumpController {@RequestMapping("forward.do")public String forward(){System.out.println("內部轉發跳轉!");return "forward:/success.html";}@RequestMapping("forward1.do")public String forward1(){System.out.println("內部轉發跳轉!");return "/success.html";}@RequestMapping("redirect.do")public String redirect(){System.out.println("重定向跳轉!");return "redirect:/success.html";}
}
2.4 SpringMVC支持內置的對象
在SpringMVC中,支持為處理器中的方法注入內置的對象,如:HttpServletRequest、HttpServletResponse、HttpSession、Model等。
/**** @param request* @param resp* @param session* @param model 是springmvc中 推薦使用參數傳遞的容器 當參數發生覆蓋 優先使用model中的參數* @throws IOException*/
@RequestMapping("servletParam.do")
public void servletParam(HttpServletRequest request, HttpServletResponse resp, HttpSession session, Model model) throws IOException {String name = request.getParameter("name");System.out.println(name);System.out.println(request);System.out.println(resp);System.out.println(session);System.out.println(model);resp.sendRedirect("success.html");//return "/success.html";
}
2.5 Spring+SpringMVC+Mybatis整合
2.5.1 創建項目導入jar包
<?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>org.example</groupId><artifactId>02-mvc01</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><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.2.0.RELEASE</spring.version>
</properties>
<dependencies><!--servlet-api--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency><!-- jsp-api --><dependency><groupId>javax.servlet.html</groupId><artifactId>jsp-api</artifactId><version>2.2</version></dependency><!-- jstl jar --><dependency><groupId>org.glassfish.web</groupId><artifactId>jstl-impl</artifactId><version>1.2</version></dependency><!-- spring相關jar --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><!-- spring相關jar 結束 --><!-- mysql 數據庫 jar --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><!-- mysql 數據庫 end --><!-- mybatis 開始 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><!-- mybatis 結束 --><!-- mybatis 和 spring的整合包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.4</version></dependency><!-- mybatis 和 spring的整合包 end --><!-- 日志 開始 --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.13.3</version></dependency><!-- 日志 結束 --><!--pagehelper分頁--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.0</version></dependency><!-- 分頁插件 結束 --><!-- lombok 開始 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version></dependency><!-- lombok 結束 -->
</dependencies><build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources>
</build></project>
2.5.2 定義相關類
2.5.2.1 domain
package com.bjpowernode.domain;import lombok.Data;
/*** @Description: 用戶類*/
@Data
public class User {private Integer id;private String username;private String password;private String realname;
}
2.5.2.2 mapper
package com.bjpowernode.mapper;import com.bjpowernode.domain.User;import java.util.List;/*** @Description: 用戶數據操作類*/
public interface UserMapper {/*** 查詢所有 用戶信息* @return*/List<User> selectAll();
}
2.5.2.3 service
package com.bjpowernode.service;import com.github.pagehelper.PageInfo;
import com.bjpowernode.domain.User;public interface IUserService {/*** 分頁查詢數據* @param page* @param limit* @return*/PageInfo<User> queryPage(Integer page,Integer limit);
}package com.bjpowernode.service.impl;import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.bjpowernode.domain.User;
import com.bjpowernode.mapper.UserMapper;
import com.bjpowernode.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @Description: 用戶業務實現類*/
@Service
public class UserServiceImpl implements IUserService {@Autowiredprivate UserMapper userMapper;/*** 分頁查詢數據* @param page* @param limit* @return*/@Overridepublic PageInfo<User> queryPage(Integer page, Integer limit) {Page<User> pageObj = PageHelper.startPage(page, limit);userMapper.selectAll();return pageObj.toPageInfo();}
}
2.5.2.4 controller
package com.bjpowernode.controller;import com.github.pagehelper.PageInfo;
import com.bjpowernode.domain.User;
import com.bjpowernode.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;/*** @Description: 用戶控制類*/
@Controller
@RequestMapping("user")
public class UserController {@Autowiredprivate IUserService userService;@RequestMapping("page.do")public ModelAndView page(@RequestParam(name = "page",required = false,defaultValue = "1") Integer page, @RequestParam(name = "limit",required = false,defaultValue = "10") Integer limit){PageInfo<User> pageInfo = userService.queryPage(page, limit);ModelAndView modelAndView = new ModelAndView();//設置視圖路徑modelAndView.setViewName("/list.html");//設置數據modelAndView.addObject("pageInfo",pageInfo);return modelAndView;}
}
2.5.2.5 頁面
<html>
<head><title>Title</title>
</head>
<body><table ><thead><th>ID</th><th>username</th><th>password</th><th>realname</th></thead></table>
</body>
</html>
2.5.3 配置文件
2.5.3.1 數據庫配置文件
#數據庫連接信息
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/stmng?useUnicode=true&characterEncoding=utf8&useSSL=false
jdbc.username=root
jdbc.password=root
2.5.3.2 日志配置文件
# 全局日志配置
log4j.rootLogger=DEBUG, stdout
# MyBatis 日志配置
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# 控制臺輸出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
2.5.3.3 spring核心配置文件
<?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:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 整合mybatis --><!--1. 引入數據庫配置文件 因為創建數據源 --><context:property-placeholder location="classpath:jdbc.properties" system-properties-mode="FALLBACK" /><!--2. 創建數據源--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${jdbc.driver}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean><!--3. 創建SqlSessionFactoryBean --><!-- configuration 指 mybatis的核心配制信息 --><bean id="configuration" class="org.apache.ibatis.session.Configuration"><property name="logImpl" value="org.apache.ibatis.logging.log4j.Log4jImpl"/><property name="cacheEnabled" value="true" /></bean><bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 數據源 --><property name="dataSource" ref="dataSource"/><!-- 使用 configuration 取代了 mybatis的核心配置文件--><property name="configuration" ref="configuration"/><!-- 配置mapper 映射 文件--><property name="mapperLocations" value="classpath:mapper/**Mapper.xml" /><!-- 配置類別名 --><property name="typeAliasesPackage" value="com.bjpowernode.domain" /><!-- 配制插件 --><property name="plugins"><array><!-- 分頁插件 --><bean class="com.github.pagehelper.PageInterceptor" /></array></property></bean><!--4. Mapper接口的掃描 自動創建代理類 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 被掃描的mapper接口 產生接口的實現類 對象 使用SqlSession.getMapper(接口.class) --><property name="basePackage" value="com.bjpowernode.mapper" /><!-- 注入一個SqlSessionFactoryBean 為了產生 SqlSession --><property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean" /></bean><!-- 5. 配置事務 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!-- 指定被管理事務的數據源 --><property name="dataSource" ref="dataSource" /></bean><!-- 配置聲明式事務 XML 注解 --><!-- 開啟事務注解 --><tx:annotation-driven transaction-manager="transactionManager" /><!-- 開啟組件掃描 創建 對象 --><context:component-scan base-package="com.bjpowernode" />
</beans>
2.5.3.4 springmvc配置文件
<?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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 開啟組件掃描 --><!-- 掃描的目的是為了將 處理器放入到HandlerMapping中 --><context:component-scan base-package="com.bjpowernode.controller" /><!-- 開啟springmvc注解 --><mvc:annotation-driven />
</beans>
2.5.3.5 Mapper配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.bjpowernode.mapper.UserMapper"><select id="selectAll" resultType="User">select * from user</select>
</mapper>
2.5.3.6 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><!-- 配置監聽器需要加載的配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-context.xml</param-value></context-param><!-- 加載初始化spring核心配置文件配置監聽器 啟動時就加載 spring核心配置文件 IOC容器相關初始化--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 配置 springmvc --><servlet><servlet-name>springmvc</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>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
</web-app>
2.6 SpringMVC獲取Servlet作用域
package com.bjpowernode.util;import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;/*** @Description: 獲取Servlet 作用域對象工具類* HttpServletRequest* HttpSession* ServletContext*/
public class WebScopeUtil {/*** 獲取當前 HttpServletRequest 對象* @return*/public static HttpServletRequest getRequest(){ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();return requestAttributes.getRequest();}/*** 獲取當前請求綁定的session* @return*/public static HttpSession getSession(){return getRequest().getSession();}/*** 獲取全局容器對象* @return*/public static ServletContext getContext(){//getRequest().getServletContext(); // ServletContext 的生命周期 是早于 HttpServletRequest//所以不能通過 HttpServletRequest 獲取ServletContext 可能發生 NullpointExceptionreturn ContextLoader.getCurrentWebApplicationContext().getServletContext();}
}
2.7 SpringMVC內置的編碼過濾器
在springmvc中,為了解決亂碼問題,springmvc提供了內置的編碼過濾器。在使用時,只需要在web.xml中進行配置即可。
<!-- 編碼過濾器 -->
<filter><filter-name>charsetFilter</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>charsetFilter</filter-name><!-- 只對springmvc處理的請求進行編碼過濾 --><servlet-name>springmvc</servlet-name>
</filter-mapping>
2.8 SpringMVC返回JSON
{key1:value1,key2:value2}:key為String,value為Object
[{},{},{}…]
實體類對象、Map<String,Object>、List<實體類>、List<Map<String,Object>>
fastjson.jar: JSON.toJSONString(Object)
在springmvc中,默認返回的數據不論是什么格式,都當做視圖進行解析。會根據返回值的toString的結果,當做路徑去查找視圖的模板,如果想要返回JSON,則需要使用注解,標識該方法返回的是JSON數據,不要當做視圖路徑進行路徑的查找.該注解為:@ResponseBody.因為springmvc有內置的消息轉換器,如果想要特殊設置,需要進行XML配置.
2.8.1 XML配置的形式
XML配置形式,是修改了默認結果處理,全局生效的。使用注解@ResponseBody,標識該方法返回的內容不是URL地址,而是一個消息,使用輸出對象輸出給客戶端。
@RequestMapping
name : 方法映射名稱
value/path : 方法訪問路徑
method : 支持的請求的方法類型:
GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE
params : 請求必須有的參數
headers : 請求必須有的頭信息
consumes : 指定請求的數據格式類型 : 普通文本、表單格式、JSON
produces : 指定返回數據的格式類型 :JSON 、HTML
<!-- 配置JSON轉換器 -->
<!--<bean id="config" class="com.alibaba.fastjson.support.config.FastJsonConfig">-->
<!--</bean>-->
<mvc:annotation-driven ><mvc:message-converters register-defaults="true"><!--將內容轉化為字符串消息 使用 IO發送給客戶端此時只支持字符串--><!--<bean class="org.springframework.http.converter.StringHttpMessageConverter" />--><!-- 將內容轉化為JSON字符串 發送客戶端 能夠處理對象--><!-- date 年-月-日 時:分:秒 --><bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter" /></mvc:message-converters>
</mvc:annotation-driven>
2.8.2 注解
SpringMVC中,有內置的轉換器,但是SpringMVC內置的轉換器需要相關jar包,需要jackson的jar包。只需要導入jar包后,使用@ResponseBody標識返回的數據是消息即可。SpringMVC自動將返回數據當做JSON字符串處理,并且消息按照UTF-8進行編碼。如果@ResponseBody放在類上,類中所有的方法都返回的是消息,不是視圖資源。
注意:
@RestController
是 @ResponseBody, @Controller 結合,標識該類是一個處理器,并且處理器中所有的方法都返回的是消息。
<!-- 導入jackson的jar包 -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.11.2</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.11.2</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.11.2</version>
</dependency>
2.9 文件上傳下載
在springmvc中,也對文件上傳進行了封裝。更進一步的簡化的文件上傳,只需導入文件上傳相關的jar包和處理文件上傳的解析器即可。
2.9.1 文件上傳
2.9.1.1 導入jar包
<!-- 文件上傳相關依賴jar -->
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version>
</dependency>
2.9.1.2 配置文件上傳的解析器
在SpringMVC的核心配置文件中,新增文件上傳解析器配置:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--文件格式編碼--><property name="defaultEncoding" value="UTF-8"></property><!--配置單個文件上傳大小:1M--><property name="maxUploadSizePerFile" value="1048576"></property><!--配置所有文件上傳總大小:10M--><property name="maxUploadSize" value="10485760"></property></bean>
2.9.1.3 處理文件上傳請求
頁面
<html>
<head><title>文件上傳</title>
</head>
<body>
<form action="file/upload2.do" method="post" enctype="multipart/form-data"><p>普通的文本數據:<input name="name" type="text" /></p><p>文件數據:<input name="userImg" type="file" /></p><p>文件數據:<input name="userImg" type="file" /></p><input type="submit" value="提交">
</form>
</body>
</html>
處理器
package com.bjpowernode.controller;
import cn.hutool.core.img.Img;
import cn.hutool.core.img.ImgUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import java.awt.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;@Controller
@RequestMapping("file")
public class FileUploadController {/*** 如果是單個文件,則直接使用MultipartFile 對象進行接收* 普通的文本數據 則直接使用相應的類型進行接收* 如果名字不一致 @RequestParam 注解 處理名稱* @param name* @param file* @return*/@RequestMapping("upload1.do")public String upload1(String name,@RequestParam("userImg") MultipartFile file){System.out.println("文本數據為:"+name);System.out.println("文件數據為:"+file.getName());//input name 屬性值System.out.println("文件數據為:"+file.getSize()); // 文件的字節大小System.out.println("文件數據為:"+file.getOriginalFilename()); //文件的真實名稱return "/success.html";}/*** 如果是多個文件 則使用MultipartFile[] 數組進行接收* @param name* @param files* @return*/@RequestMapping("upload2.do")public String upload2(String name,@RequestParam("userImg") MultipartFile[] files){System.out.println("文本數據為:"+name);for (MultipartFile file : files) {System.out.println("文件數據為:"+file.getName());//input name 屬性值System.out.println("文件數據為:"+file.getSize()); // 文件的字節大小System.out.println("文件數據為:"+file.getOriginalFilename()); //文件的真實名稱//將文件進行保存File newFile = new File("d://"+file.getOriginalFilename());try {Font font = new Font("微軟雅黑",Font.BOLD,15);ImgUtil.pressText(file.getInputStream(),new FileOutputStream(newFile),"我是水印", Color.RED,font,1,1,0.5f);//將文件保存在磁盤上//file.transferTo(newFile);} catch (IOException e) {e.printStackTrace();}}return "/success.html";}
}/*** 一個file控件同時上傳多個* MultipartFile代表一個文件 MultipartRequest:封裝了多個MultipartFile對象*/
@RequestMapping("/uploadMany2.do")
public void uploadMany2(MultipartRequest mr) throws IOException {List<MultipartFile> fileList = mr.getFiles("f");for (int i = 0;fileList!=null && i < fileList.size(); i++) {MultipartFile tempFile = fileList.get(i);//將上傳的文件保存到D:\\uploads\\String name = tempFile.getOriginalFilename();//獲取上傳文件的名字 1.2.3.jpg 1.jpg 1.avi C:\\users\\desktop\\1.jpg//獲取上傳文件的拓展名int index = name.lastIndexOf(".");String ext = name.substring(index);//.jpg .avi .pptx//將上傳的文件保存到指定目錄String fileName = UUID.randomUUID().toString();File file = new File("D:\\uploads\\"+fileName+ext);tempFile.transferTo(file);}
}
2.9.2 文件下載
2.9.2.1 方案一(推薦):
文件下載的本質,就是獲取服務器的文件數據信息,使用字節流將數據傳遞給客戶端。
-
使用輸入流,將磁盤文件讀到內存中。
-
使用網絡輸出流,將數據輸出給客戶端。
package com.bjpowernode.controller;import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URLEncoder;/*** @Description: 文件下載示例*/
@Controller
@RequestMapping("download")
public class DownLoadController {/*** 文件下載的方法*/@RequestMapping("download.do")public void download(HttpServletResponse response) throws Exception {File file = new File("E:\\豬圖片.jpg");//本地磁盤文件//使用輸入流 將文件讀入內存中FileInputStream fis = new FileInputStream(file); // 找參照物 將程序運行的內存當做參照物byte[] b = new byte[1024];int len = -1;ServletOutputStream out = response.getOutputStream();//輸出流 輸出客戶端//瀏覽器 默認打開了這個文件//設置響應類型 通知瀏覽器 不要打開response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);//文件的名稱 不對//設置響應的文件的名稱//如果響應的數據的名稱是中文,在設置文件的名稱時 要先將文件的名稱進行編碼 再進行傳輸String name = URLEncoder.encode("豬圖片.jpg", "UTF-8");System.out.println("編碼后的名字:"+name);response.setHeader("Content-Disposition", "attachment; filename="+name);//循環讀 循環寫while((len = fis.read(b)) != -1) {out.write(b,0,len);out.flush();}out.close();fis.close();}
}
2.9.2.2 方案二:
springMVC中為了簡化文件的下載,封裝了實體類:ResponseEntity,可以將文件數據封裝在ResponseEntity中。
package com.bjpowernode.controller;import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URLEncoder;/*** @Description: 文件下載示例*/
@Controller
@RequestMapping("/download")
public class DownLoadController {@RequestMapping("/download2.do")public ResponseEntity<Byte[]> download() throws Exception {File file = new File("E:\\豬圖片.jpg");//本地磁盤文件//使用輸入流 將文件讀入內存中FileInputStream fis = new FileInputStream(file); // 找參照物 將程序運行的內存當做參照物//文件的大小long length = file.length();//創建一個和文件一樣大小的字節數組 一次性將數據讀入到內存中 如果文件量過大,請求比較頻繁 存在 崩潰的風險byte[] fileByte = new byte[(int) length];//一個G 的 byte 數組 64 G 65個人下載 1分鐘//一次性將文件數據讀入到數組中fis.read(fileByte);// springmvc 中封裝的 響應實體 ://設置響應碼//設置響應的數據頭信息//設置響應數據HttpHeaders headers = new HttpHeaders(); //響應頭信息//設置響應的數據為流數據 告訴瀏覽器 不要解析headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);//設置下載的文件的名稱 中文字符串要進行編碼headers.setContentDispositionFormData("filename","豬圖片.jpg");ResponseEntity responseEntity = new ResponseEntity(fileByte,headers, HttpStatus.OK);return responseEntity;}
}
2.10 SpringMVC中的攔截器
SpringMVC提供HandlerInteceptor接口,這個接口用于攔截處理具體的Handler中的方法,在具體的Handler中的方法執行前后及返回視圖之間都可以進行相關擴展操作。
2.10.1 如何使用攔截器
2.10.1.1 創建類實現HandlerInteceptor接口
package com.bjpowernode.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** @Description: 自定義攔截器*/
public class MyInterceptor implements HandlerInterceptor {/*** 在執行具體的Handler中的方法前執行* @param request 當前的請求對象* @param response 當前的響應對象* @param handler 具體的處理器中將要執行的方法* @return boolean 如果 返回 true 則執行Handler中的方法 false 則 不執行handler中的方法* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("我是攔截器中preHandle 方法");return true;}/*** 在具體的Handler中的方法執行完成 但是沒有做具體的視圖解析操作* @param request 當前 請求對象* @param response 當前響應對象* @param handler 具體的處理器中將要執行的方法* @param modelAndView 具體的處理器中將要執行的方法 返回的結果* @throws Exception*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("我是攔截器中postHandle 方法");//在具體的解析之前 修改視圖模型中數據modelAndView.addObject("name","韓梅梅");}/*** 完成了視圖解析后 整個方法執行完成調用的方法 在finally中調用 或者出現異常也會調用* @param request 當前請求對象* @param response 當前響應對象* @param handler 具體的處理器中將要執行的方法* @param ex 具體的處理器中拋出的異常* @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("我是攔截器中afterCompletion 方法");System.out.println(ex.getMessage());request.setAttribute("msg","網管去火星了!");request.getRequestDispatcher("/500.html").forward(request,response);}
}
2.10.1.2 配置攔截器
<?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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 開啟組件掃描 --><!-- 掃描所有處理器 放入到處理器映射器中 --><context:component-scan base-package="com.bjpowernode.controller" /><!-- 開啟 mvc注解 --><mvc:annotation-driven></mvc:annotation-driven><!-- 文件上傳的解析器 --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" ><!--<property name="maxUploadSize" value="1"></property>--></bean><!-- 配置springmvc的攔截器 --><mvc:interceptors><mvc:interceptor><!-- 攔截器的資源路徑 /** 攔截所有 ** 表示多層目錄 --><mvc:mapping path="/**"/><!-- 不攔截的資源路徑 --><mvc:exclude-mapping path="/user/page.do"/><!-- 自定義的攔截器 --><bean id="myInterceptor" class="com.bjpowernode.interceptor.MyInterceptor" /></mvc:interceptor></mvc:interceptors>
</beans>
注意:
-
在攔截器中,最先執行preHandle,然后執行Handler中具體的方法,再然后執行postHandle和afterCompletion。preHandle就是前置的攔截的方法,返回如果為true,則執行處理器中的方法,如果為false則不執行處理器中的方法。postHandle是在Handler中具體的方法執行完成,但是沒有交給視圖解析器之前執行,afterCompletion在視圖解析器完成了視圖解析之后執行的。
-
攔截器是攔截器的方法,被DispatcherServlet代理調用的方法,如果請求的不是Handler,攔截器是不會攔截的。index.html由于是由tomcat默認的servlet進行返回的,不會執行DispatcherServlet中的doDispatch,那么攔截器無法進行攔截。
2.10.2 Interceptor和Filter的區別
Filter是Java Web的規范,攔截的是請求,任何JavaWeb項目都可以有Filter,但是Interceptor是SpringMVC提供的一套規范HandlerInterceptor,只適用SpringMVC自身,并且只能對DispatherServlet處理器的請求生效,攔截的方法。從范圍上說,任何JavaWeb項目都有Filter,但是未必有Interceptor。
1、filter可以應用于任何的javaweb項目;inteceptor應用于springmvc框架
2、Filter可以過濾所有請求資源(不限于html、css、js、images等);Interceptor只能攔截所有的controller方法
3、Filter過濾路徑時,沒有排除選項;Interceptor可以排除攔截路徑
2.11 異常處理器
在spring中,相對完善的異常處理器機制,spring可以自己定義處理異常的規則,這種處理異常規則的程序,就被稱之為異常處理器。其實,異常處理器就是對controller的增強,因為異常是向上拋,controller調用service,service調用mapper,controller屬于最上層,所以最終異常都會匯集到controller。因此,spring提供了@ControllerAdvice注解,表示對controller增強類。并且還提供了@ExceptionHandler這個注解,當發生異常時,該注解修飾的方法就會執行。
在實際開發中,異常主要分為兩類:
-
系統異常,JDK中定義的異常
-
業務異常,開發者自己定義的異常
一般是將系統異常轉化為業務異常,開發者只處理業務異常。使用try…catch…將代碼包裹起來,在catch中拋出自定義的異常,這種方案就是將系統異常轉化為業務異常。因為很多數據操作,事務需要異常進行數據回滾。
package com.bjpowernode.handler;import com.bjpowernode.exception.BussiException;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;/*** @Description: 全局異常處理器*/
@ControllerAdvice
public class GlobalExceptionHandler {/*** 具體的異常處理方法* @param exception*/@ExceptionHandlerpublic void doException(Exception exception){//exception FileNotFound indexOutof xxxx//判斷 異常類型是不是自定義異常if (exception instanceof BussiException){BussiException ex = (BussiException) exception;Integer code = ex.getCode();//獲取異常碼String msg = ex.getMsg();//獲取異常消息System.out.println(code +":"+msg);//Result 轉化為JSON字符串 將JSON字符串返回給客戶端}}
}package com.bjpowernode.exception;/*** @Description: 自定義異常*/
public class BussiException extends RuntimeException {private Integer code;//異常碼private String msg;//異常消息public BussiException(){}public BussiException(Integer code,String msg){super(msg);this.code = code;this.msg = msg;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}package com.bjpowernode.controller;import com.bjpowernode.exception.BussiException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("/test")
public class TestController {@RequestMapping("/test.do")public String test(){//數據校驗 可能發生的情況 很多種int m = 0;try {System.out.println(100/m);}catch (Exception e){e.printStackTrace();//打印異常//自己拋出了異常throw new BussiException(1001,"被除數不能為0");}return "/success.html";}
}
2.12 springmvc中數據校驗
springmvc中的數據校驗時通過hibernate-validator實現,對實體類中的字符串有效。
1、引入hibernate-validator依賴
2、在實體類中的字符串(正則表達式)屬性上添加相關注解
3、可以用hibernate-validor提供的特有注解對Long、Integer、Float做校驗
4、在被校驗的實體類前添加@Valid注解
5、當實體類中的數據格式發生錯誤時,錯誤信息被封裝到了BindResult對象中去,BindResult必須和實體類緊緊挨在一起
2.13 Restful風格
Restful風格適合參數少、參數不敏感的請求地址。使用了restful風格的請求地址,就不能使用.do的方式請求
Resustful風格:
-
請求地址問題
-
請求方式問題
http://localhost:8080/getBooksByFenye.do?pageNum=1&pageSize=5
http://localhost:8080/getBooksByFenye/1/5
2.13.1 Http協議設計的初衷
HTTP協議在設計時,期望使用一個URL表示一個資源。然后,根據不同的動作:GET、POST、PUT、DELETE等等表示對一個資源的各種操作。
如:
獲取這個資源就使用GET, @GetMapping(“/”)
修改這個資源PUT, @PutMapping()
刪除這個資源用DELETE,@DeleteMapping()
創建這個資源使用POST。 @PostMapping()
但是在實際使用中,多個URL表示一個資源,例如:新增用戶: addUser.do,修改用戶:updateUser.do,刪除用戶:deleteUser.do,查詢一個用戶:getUser.do。這時候,出現一個資源存在多個URL。在一定程度聲,違背了HTTP協議的設計初衷,并且命名也是個問題。
2.13.2 Restful設計思想
-
使用一個URL表示一種資源
-
客戶端使用GET、POST、PUT、DELETE4個表示操作方式的動詞對服務端資源進行操作:GET用來獲取資源,POST用來新建資源(也可以用于更新資源),PUT用來更新資源,DELETE用來刪除資源
-
通過操作資源的表現形式來操作資源
2.13.3 在SpringMVC中使用Restful
SpringMVC也支持Restful風格,但是目前存在一些問題。主要不是很好支持PUT請求,沒有辦法獲取到PUT請求的數據。
2.13.3.1 將DispatherServlet的映射地址改為
由于將DispatherServlet的映射路徑,改為了/,則所有的請求都由DispatherServlet處理,靜態的資源文件不在處理器映射器中,會出現404。并攔截器攔截DispatherServlet中調用Handler中的方法,改為/,則所有的請求都會被攔截。
則需要在SpringMVC的核心配置文件中,新增啟用默認的Servlet的處理器。
<!-- 啟用默認Servlet -->
<mvc:default-servlet-handler/>
并且注意,配置攔截器時,將靜態資源不進行攔截,要排除:
<mvc:exclude-mapping path="/resouces/**"/>
2.13.3.2 配置處理PUT請求的攔截器
<!-- 處理put請求的攔截器 -->
<filter><filter-name>restful</filter-name><filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping><filter-name>restful</filter-name><servlet-name>springmvc</servlet-name>
</filter-mapping>
2.13.3.3 處理器代碼
package com.bjpowernode.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("user")
public class UserController {// @RequestMapping(method = RequestMethod.GET)
// //@GetMapping
// public Object get(Integer id){
// System.out.println("get請求");
// Map<String,Object> data = new HashMap<>();
// data.put("code",200);
// data.put("msg","get請求");
// return data;
// }@GetMapping("{id}/{name}") //后臺的獲取方式 使用 {} 進行包裹 并且 在方法參數中 使用@PathVariable// 這種將參數拼接在URL上的方式 只支持 GET 請求和 DELETE請求public Object get1(@PathVariable("id") Integer id,@PathVariable("name") String name){System.out.println("get請求");System.out.println(id);System.out.println(name);Map<String,Object> data = new HashMap<>();data.put("code",200);data.put("msg","get請求");return data;}//@RequestMapping(method = RequestMethod.PUT)@PutMappingpublic Object put(Integer id){System.out.println("PUT請求");Map<String,Object> data = new HashMap<>();data.put("code",200);data.put("msg","PUT請求");return data;}@RequestMapping(method = RequestMethod.POST)@PostMappingpublic Object post(Integer id){System.out.println("post請求");Map<String,Object> data = new HashMap<>();data.put("code",200);data.put("msg","post請求");return data;}//@RequestMapping(method = RequestMethod.DELETE)@DeleteMappingpublic Object delete(Integer id){System.out.println("delete請求");Map<String,Object> data = new HashMap<>();data.put("code",200);data.put("msg","delete請求");return data;}
}
2.13.3.4 頁面代碼
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><button id="btn1">get</button><button id="btn2">put</button><button id="btn3">delete</button><button id="btn4">post</button><button id="btn5">get-1111</button><script src="resources/jquery.js"></script><script>$("#btn1").click(function () {$.get("user",{id:1001},function (rs) {console.log(rs);})});$("#btn2").click(function () {$.ajax({url:"user",type:"PUT",data:{id:1001},success:function (rs) {console.log(rs);}})});$("#btn3").click(function () {$.ajax({url:"user",type:"DELETE",data:{id:1001},success:function (rs) {console.log(rs);}})});$("#btn4").click(function () {$.post("user",{id:1001},function (rs) {console.log(rs);})});$("#btn5").click(function () {//將參數 拼接在URL上面$.get("user/11111/lucy",function (rs) {console.log(rs);})});</script>
</body>
</html>