Java零基礎——SpringMVC篇

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 方案一(推薦):
文件下載的本質,就是獲取服務器的文件數據信息,使用字節流將數據傳遞給客戶端。

  1. 使用輸入流,將磁盤文件讀到內存中。

  2. 使用網絡輸出流,將數據輸出給客戶端。

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>

注意:

  1. 在攔截器中,最先執行preHandle,然后執行Handler中具體的方法,再然后執行postHandle和afterCompletion。preHandle就是前置的攔截的方法,返回如果為true,則執行處理器中的方法,如果為false則不執行處理器中的方法。postHandle是在Handler中具體的方法執行完成,但是沒有交給視圖解析器之前執行,afterCompletion在視圖解析器完成了視圖解析之后執行的。

  2. 攔截器是攔截器的方法,被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這個注解,當發生異常時,該注解修飾的方法就會執行。

在實際開發中,異常主要分為兩類:

  1. 系統異常,JDK中定義的異常

  2. 業務異常,開發者自己定義的異常

一般是將系統異常轉化為業務異常,開發者只處理業務異常。使用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風格:

  1. 請求地址問題

  2. 請求方式問題

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設計思想

  1. 使用一個URL表示一種資源

  2. 客戶端使用GET、POST、PUT、DELETE4個表示操作方式的動詞對服務端資源進行操作:GET用來獲取資源,POST用來新建資源(也可以用于更新資源),PUT用來更新資源,DELETE用來刪除資源

  3. 通過操作資源的表現形式來操作資源

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> 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165304.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165304.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165304.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux 帶寬限速】trickle,限制docker 上傳速度

限制docker 上傳速度 然而&#xff0c;你可以使用第三方工具來實現這個目的。一個常用的工具是 trickle&#xff0c;它可以模擬網絡帶寬。 首先&#xff0c;你需要安裝 trickle。在 Ubuntu 上&#xff0c;可以使用以下命令安裝&#xff1a; sudo apt-get install trickle然后…

deepxde 源碼閱讀筆記(長期更新)

2023.11.23 閱讀的deepxde version: 1.9.0 1. train_aux_vars &#xff0c;即pde當中的第三個參數 這個變量的含義困惑很久。最后發現就是operator learning的PDEs方程parameters。 脈絡&#xff1a;def pde aux_vars-> deepxde目前支持tf1最多&#xff0c;但是對其他框架…

系列二、Spring整合單元測試

一、概述 Spring中獲取bean最常見的方式是通過ClassPathXmlApplicationContext 或者 AnnotationConfigApplicationContext的getBean()方式獲取bean&#xff0c;那么在Spring中如何像在SpringBoot中直接一個類上添加個SpringBootTest注解&#xff0c;即可在類中注入自己想要測試…

優秀的企業協同OA系統如何促進團隊協作?

優秀的企業協同OA系統可以幫助團隊協同工作變得更簡單、更高效。 一、以下是一些優秀的企業協同OA系統可以幫助團隊協作的方法&#xff1a; 1、提高工作效率 優秀的企業協同OA系統可以提高工作效率&#xff0c;減少工作的重復性和低效率。例如&#xff0c;可以使用共享日歷和…

vue2生命周期

前言 vue的生命周期其實可以分為兩塊,一個是vue實例的生命周期,一個是組件的生命周期。 vue實例的生命周期方法共有4個:$mout,$forceUpdate,$nextTick,$destroy vue組件的生命周期鉤子共有8個:beforeCreate,created,beforeMount,mounted,beforeUpdate, updated,beforeDestr…

C/C++小寫字母的判斷 2022年3月電子學會中小學生軟件編程(C/C++)等級考試一級真題答案解析

目錄 C/C小寫字母的判斷 一、題目要求 1、編程實現 2、輸入輸出 二、算法分析 三、程序編寫 四、程序說明 五、運行結果 六、考點分析 C/C小寫字母的判斷 2022年3月 C/C編程等級考試一級編程題 一、題目要求 1、編程實現 輸入一個字符&#xff0c;判斷是否是英文小…

iframe內部子頁面與外部主頁面通訊

文章目錄 一、問題二、解決2.1、子頁面2.2、主頁面 三、知識點3.1、[瀏覽器兼容性](https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%85%BC%E5%AE%B9%E6%80%A7)3.2、詳解3.2.1、發送方3.2.2、接收方 一、問題 如上所示&a…

被刪數據庫+勒索

被刪數據庫勒索 – WhiteNights Site 標簽&#xff1a;日志 快照在手&#xff0c;天下我有 服務器又給人黑了。這次是給人黑了數據庫&#xff0c;被人刪庫勒索&#xff0c;先放圖吧。我還花了今天一個下午的時間查修這個漏洞&#xff0c;導致網站有接近6個小時都沒法訪問。 …

編程示例: Session Id的生成

實現思路 Session的實現方式如下&#xff1a;在用戶第一次登錄的時候&#xff0c;系統為它分配一個唯一Id(被稱為Session Id)作為標識&#xff0c;并且 記錄下這個用戶的用戶名、要登錄的賬套名、用戶擁有的權限等&#xff0c;以Id為鍵&#xff0c;用戶名、賬套名等信息為值保…

云原生Kubernetes系列 | Kubernetes靜態Pod的使用

云原生Kubernetes系列 | Kubernetes靜態Pod的使用 靜態pod不建議在master上操作,因為master上跑的是集群核心靜態pod,如果配置失敗,會導致集群故障。建議在knode1或knode2上去做。 kubernetes master節點上的核心組件pod其實都是靜態pod: [root@k8s-master ~]# ls /etc/ku…

java中鎖的使用-實戰

技術主題 技術原理 在實際的業務中,為了保證線程安全,會進行對一些邏輯進行加鎖,保證當前只有一個線程在操作。在代碼中,我們經常使用兩種方式進行加鎖,來保證線程安全。一種是synchronized關鍵字,另一種是ReentrantLock加鎖。寫這一份的博客,就是為了記錄下鎖的基本使…

五分鐘,Docker安裝flink,并使用flinksql消費kafka數據

1、拉取flink鏡像&#xff0c;創建網絡 docker pull flink docker network create flink-network2、創建 jobmanager # 創建 JobManager docker run \-itd \--namejobmanager \--publish 8081:8081 \--network flink-network \--env FLINK_PROPERTIES"jobmanager.rpc.ad…

Redis 命令行 redis-cli 介紹

文章目錄 前言1. 連接 Redis 服務2. 從其他程序獲取輸入3. 連續執行相同的命令4. CSV 輸出5. 輸出幫助信息6. 清空屏幕7. 連續監控統計信息8. 輸出大 key 報告9. 監控 Redis 執行的命令 前言 redis-cli 是 Redis 自帶的命令行工具&#xff0c;是運維和開發人員常用的工具&…

【C++干貨鋪】適配器 | stack | queue

個人主頁點擊直達&#xff1a;小白不是程序媛 C系列學習專欄&#xff1a;C干貨鋪 代碼倉庫&#xff1a;Gitee 目錄 stack的介紹和使用 stack的介紹 stack的使用 queue的介紹和使用 queue的介紹 queue的使用 容器適配器 什么是適配器 STL中stack和queue的底層結構 d…

Doris擴容和縮容(六)

Doris 可以很方便的擴容和縮容 FE、BE、Broker 實例。 FE 擴容和縮容 可以通過將 FE 擴容至 3 個以上節點來實現 FE 的高可用。 1&#xff09;使用 MySQL 登錄客戶端后&#xff0c;可以使用 sql 命令查看 FE 狀態&#xff0c;目前就一臺 FE mysql -h hadoop1 -P 9030 -uroo…

Python——基于YOLOV8的車牌識別(源碼+教程)

目錄 一、前言 二 、完成效果 三、 項目包 四、運行項目 &#xff08;教程&#xff09; 一、前言 YOLOv8LPRNet車牌定位與識別https://www.bilibili.com/video/BV1vk4y1E7MZ/ 最近做了有一個車牌識別的小需求&#xff0c;今天完成了&#xff0c;在此記錄和分享 首先&#x…

辦公技巧:Word中插入圖片、形狀、文本框排版技巧

目錄 一、插入圖片排版技巧 二、添加形狀排版技巧 三、插入“文本框”排版技巧 我們平常在制作word時候經常會遇到插入選項卡下的圖片、形狀和文本框這三種情況下&#xff0c;那么如何使得Word文檔當中添加這三個元素的同時&#xff0c;又能保證樣式美觀呢&#xff0c;今天小…

ComfyUI搭建使用教程

ComfyUI 是一個基于節點流程式的stable diffusion AI 繪圖工具WebUI&#xff0c; 你可以把它想象成集成了stable diffusion功能的substance designer&#xff0c; 通過將stable diffusion的流程拆分成節點&#xff0c;實現了更加精準的工作流定制和完善的可復現性。但節點式的工…

【分布式】分布式事務及其解決方案

目錄 一、分布式事務二、分布式事務的解決方案1. 全局事務&#xff08;1&#xff09;DTP模型&#xff08;2&#xff09; 兩階段提交協議&#xff08;2PC&#xff09;原理二階段提交的缺點 &#xff08;3&#xff09;三階段提交協議&#xff08;3PC&#xff09;原理 2. 基于可靠…

【算法】搭配購買(01背包,加權并查集)

題目 Joe覺得云朵很美&#xff0c;決定去山上的商店買一些云朵。 商店里有 n 朵云&#xff0c;云朵被編號為 1,2,…,n&#xff0c;并且每朵云都有一個價值。 但是商店老板跟他說&#xff0c;一些云朵要搭配來買才好&#xff0c;所以買一朵云則與這朵云有搭配的云都要買。 …