- SpringWeb
- 1.SpringWeb特點
- 2.SpringWeb運行流程
- 3.SpringWeb組件
- 4.搭建
- 項目結構圖:
- 4.1導入jar包
- 4.2在Web.xml配置
- **4.2.1配置統一攔截分發器 DispatcherServlet**
- 4.2.2開啟SpringWeb注解(spring.xml)
- 5.處理類的搭建
- 6.SpringWeb請求流程(自己理解)
- 7.接受請求
- @RequestMapping
- 8.補充ApiPost7使用(不需要前端直接測試后端)
- 9.獲取請求數據
- 1.使用request對象接收
- 2.spring自動封裝
- 3.@RequestParam("")進行參數綁 定.
- 4.使用實體類對象接受
- 5.日期類轉換
- 10.中文亂碼處理
- 11.跨域訪問處理
- 12.返回json
- 13.攔截器
SpringWeb
SpringWeb是spring框架的一部分,是對web層進行封裝
在 web 層框架歷經 Strust1,WebWork,Strust2 等諸多產品的歷代更選之后, 目前業界普遍選擇了 springWeb 作為 Java EE 項目 web 層開發的首選方案
1.SpringWeb特點
pringWEB 是 spring 家族原生產品,與 IOC 容器等基礎設施無縫對接.
- ? 基于原生的 Servlet,提供了一個前端控制器 DispatcherServlet ,開發者
無須額外開發控制器對象. - ? 可以自動綁定用戶輸入,并正確地轉換數據類型.
- ? 代碼清新簡潔,大幅度提升開發效率.
- ? 內部組件化程度高,可插拔式組件即插即用.
- ? 性能卓著,尤其適合現代大型、超大型互聯網項目要求.
2.SpringWeb運行流程
-
用戶發送出請求到前端控制器
DispatcherServlet
。 -
?
DispatcherServlet
收到請求調用HandlerMapping
(處理器映射器)。 -
?
HandlerMapping
找到具體的處理器(可查找 xml 配置或注解配置),生成處 理器對象及處理器攔截器(如果有),再一起返回給DispatcherServlet
。 -
?
DispatcherServlet
調用HandlerAdapter
(處理器適配器)。 -
?
HandlerAdapter
經過適配調用具體的處理器(Handler/Controller)。 -
?
Controller
執行完成向前端響應結果
原理圖:
3.SpringWeb組件
前端控制器:
DispatcherServlet
,由框架提供,在web.xml配置**作用:**統一處理請求和響應。整個流程控制的中心,由它組件處理用戶的請求
**處理映射器:
HandlerMapping
**由框架提供作用:根據請求的url查找Handler
**處理器適配器
HandlerAdapter
**由框架提供。作用:按照特定規則(HandlerAdapter要求的規則)去執行Handler
處理器
Handler
也稱為Control需要自己開發注意:編寫Handler時按照HandlerAdapter的要求去做,這樣適配器才可 以去正確執行Handler。
作用:接受用戶請求信息,調用業務方法處理請求,也稱之為后端控制器。
4.搭建
創建ssm web!!!項目根據前面搭建IOC AOP 事務管理的項目
項目結構圖:
4.1導入jar包
<!-- springWeb -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.2.RELEASE</version>
</dependency>
完整的pom.xml配置
<?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.example</groupId><artifactId>ssm</artifactId><version>1.0-SNAPSHOT</version><name>ssm</name><packaging>war</packaging><properties><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.source>1.8</maven.compiler.source><junit.version>5.6.2</junit.version></properties><dependencies><!--spring-context--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.2.RELEASE</version></dependency><!--spring-jdbc--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.2.RELEASE</version></dependency><!--mybtais--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.2</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><!-- 阿里巴巴數據源 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><!--spring集成mybatis需要的依賴--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version></dependency><!--springweb層--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.2.RELEASE</version></dependency><!--servlet--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><!--jackson--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version></dependency><!--spring中提供的解決跨域問題的過過濾器--><dependency><groupId>com.thetransactioncompany</groupId><artifactId>cors-filter</artifactId><version>2.5</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.0</version></plugin></plugins></build>
</project>
4.2在Web.xml配置
必須是web項目
配置Web.xml文件
4.2.1配置統一攔截分發器 DispatcherServlet
<servlet><servlet-name>application</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></init-param><load-on-startup>0</load-on-startup></servlet><!-- 請求映射 --><servlet-mapping><servlet-name>application</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
4.2.2開啟SpringWeb注解(spring.xml)
<!-- 配置springmvc注解掃描--><mvc:annotation-driven/>
完整spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--開啟注解掃描 對指定包下面的類進行掃描, 檢查添加有spring注解標簽的類--><context:component-scan base-package="com.ffyc.ssm"> </context:component-scan><!--導入屬性文件--><context:property-placeholder location="classpath:config.properties"/><!--讓spring管理阿里巴巴數據庫連接對象--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${driverClassName}"></property><property name="url" value="${url}"></property><property name="username" value="${uname}"></property><property name="password" value="${pwd}"></property><property name="initialSize" value="${initialSize}"></property><property name="maxActive" value="${maxActive}"></property></bean><!--spring管理生成SqlSessionFactory--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><!--注入數據庫連接對象--><property name="configLocation" value="classpath:mybatis.xml"></property><!--指定配置文件--><property name="mapperLocations" value="classpath:mappers/*Mapper.xml"><!--指定映射文件地址--></property></bean><!--spring管理生成接口的代理對象--><bean id="mapperFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.ffyc.ssm.dao"></property><!--對指定包下的接口進行掃描,并生成接口的代理對象--><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property></bean><!-- 配置 spring 事務管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!-- 開啟注解事務管理 --><tx:annotation-driven transaction-manager="transactionManager"/><!--開啟web層的注解--><mvc:annotation-driven></mvc:annotation-driven><!--配置攔截器--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><!--定義哪些地址可以進入到攔截器中--><mvc:exclude-mapping path="/loginCtl/login"/><!--定義哪些地址不進入攔截器--><bean id="admintoken" class="com.ffyc.ssm.interceptor.AdminTokenInterceptor"></bean><!--配置攔截器的實現類--></mvc:interceptor></mvc:interceptors></beans>
注意:一定要檢查spring.xml的配置
<!--導入屬性文件--><context:property-placeholder location="classpath:config.properties"/>
5.處理類的搭建
package com.ffyc.ssm.web;import com.ffyc.ssm.model.Admin;
import com.ffyc.ssm.model.Result;
import com.ffyc.ssm.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import sun.management.Agent;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@RestController
//@RequestMapping 用來為類和方法定義訪問地址, 類上面的地址不能重復
@RequestMapping(path = "/loginCtl")
public class LoginController {@AutowiredLoginService loginService;@RequestMapping("/login")public String login() {System.out.println("hello Spring Web");return "login success";}}
@RestController
用于標記在一個類上,使用它標記的類就是一個 SpringWEB
控制器類.
Spring 配置中指定了自動掃描的 basepackage 后,Spring 會掃描這些包以及子包中的使用了@RestController 標識的類,然后將類加入到 Spring IOC 容器中,注入依賴。 @RequestMapping 注解是一個用來處理請求地址映射的注解,可用于類或方法上
@RequestMapping("/location")
注解是一個用來處理請求地址映射的注解,可用于類或方 法上。注:類上面的地址不允許重名,同一類內部方法的地址不允許重名
把項目部署在tomcat上運行,部署步驟
1.
2.
3.
注意:轉換web項目時
要添加Artifacs:如圖
4.
5.啟動服務器
啟動成功!!!
6.SpringWeb請求流程(自己理解)
- 用戶發送出請求到前端控制器DispatcherServlet。
- DispatcherServlet 收到請求調用HandlerMapping(處理器映射器)。
- HandlerMapping找到具體的處理器(可查找xml配置或注解配置),生成處
理器對象及處理器攔截器(如果有),再一起返回給DispatcherServlet。 - DispatcherServlet 調用 HandlerAdapter(處理器適配器)。
- HandlerAdapter經過適配調用具體的處理器(Handler/Controller)。
- Controller 執行完成向前端響應結果
7.接受請求
@RequestMapping
/*@RequestMapping 是一個用來為處理器地址映射的注解,可用于類或方法上.
作用在類上,在整個項目中不能重復,作用在方法上,整個類中不能重復.
常用屬性 path,value,method.
path 和value 用來定義地址
method 用來定義請求方式*/
@RequestMapping(value = "/hello",method = RequestMethod.GET)
@RequestMapping(path= "/hello",method = RequestMethod.POST)
案例:比如只允許post
@RequestMapping(path = "/login",method = RequestMethod.POST)public String login() {System.out.println("hello Spring Web");return "login success";}
8.補充ApiPost7使用(不需要前端直接測試后端)
1.安裝ApiPost7
2.開始配置,點擊API
2.配置接口
3.開始post、get測試
4.點擊發送得到響應
5.后端響應
當然后端也可以更簡單的接受前端post
@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name與age(前提必須name對應前端的name)public String login(String name, String age) {System.out.println("hello Spring Web");System.out.println(name +"and"+age);return "login success";}
也可以將前端數據封裝在類中,當然前端傳來的名稱要與后端內容一致
@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name與age(前提必須name對應前端的name)public String login(Admin admin) {System.out.println("hello Spring Web");System.out.println(admin.getAccount());System.out.println(admin.getPassword());return "login success";}
那我們對獲取請求數據來做具體介紹
9.獲取請求數據
SpringWeb支持多種類型的請求參數進行封裝
1.使用request對象接收
@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name與age(前提必須name對應前端的name)public String login(HttpServletRequest request) {System.out.println(request.getParameter("name"));return "login success";}
在處理中如果需要使用到HttpServletRequest 對象只需要定義即可
2.spring自動封裝
@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name與age(前提必須name對應前端的name)public String login(String account,String password) {System.out.println("account: "+account+" password: "+password);return "login success";}
Spring 會自定進行數據封裝,這里要注意的是,處理器接收參數的形參名稱必須 和表單的name屬性保持一致,否則會接收失敗!
3.@RequestParam(“”)進行參數綁 定.
當請求參數名與形參名不一致時,可以使用
@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name與age(前提必須name對應前端的name)public String login(@RequestParam("account") String Useraccount,@RequestParam("password") String Userpassword) {System.out.println("account: "+Useraccount+" password: "+Userpassword);return "login success";}
表單的name和控制器的形參并不一致,但是@RequestParam注解的value 值必須和表單的name保持一致。
- @RequestHeader(“”)用來接收請求中的數據.
- @RequestHeader(“user-agent”)可以用來接收請求頭中的數據
4.使用實體類對象接受
@RequestBody可以接收前端提交的json格式數據,將json格式封裝到對象 中.
@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name與age(前提必須name對應前端的name)public String login(Admin admin) {Admin admin1 = loginService.login(admin);System.out.println(admin1);return "login success";}
5.日期類轉換
屬性類型為Date類型需要指定轉換格式
@DateTimeFormat(pattern="yyyy-MM-dd")
privateDatebirthday
@DateTimeFormat(pattern = "yyyy-MM-dd")//給前端提交到后端的數據日期指定轉換格式@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")//后端把對象轉為json時,指定日期的格式private Date birthday;
如果前端是json格式的數據則需要在對象前添加如下標簽@RequestBody
@RequestMapping(path = "/login",method = RequestMethod.POST)
public String login(@RequestBody Admin admin) {Admin admin1 = loginService.login(admin);System.out.println(admin1);return "login success";
}
tips:記得在pom.xml添加json組件
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version>
</dependency>
10.中文亂碼處理
添加jar組件配置web.xml
<!--編碼過濾器--><filter><filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
11.跨域訪問處理
添加依賴pom.xml
<!--spring中提供的解決跨域問題的過過濾器--><dependency><groupId>com.thetransactioncompany</groupId><artifactId>cors-filter</artifactId><version>2.5</version></dependency>
web.xml配置
<!--跨域過濾器--><filter><filter-name>CORS</filter-name><filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class></filter><filter-mapping><filter-name>CORS</filter-name><url-pattern>/*</url-pattern></filter-mapping>
12.返回json
第一步添加依賴
<!--jackson-->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version>
</dependency>
Springweb 中 向 前 端 返 回數據為 json 時,只需要在方法上添加 @ResponseBody注解即可,
由于在類上面已經使用@RestController 注解,所以不需要再次添 加,@RestController 中已經包含
package com.ffyc.ssm.web;import com.ffyc.ssm.model.Admin;
import com.ffyc.ssm.model.Result;
import com.ffyc.ssm.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import sun.management.Agent;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@RestController
//@RequestMapping 用來為類和方法定義訪問地址, 類上面的地址不能重復
@RequestMapping(path = "/loginCtl")
public class LoginController {@AutowiredLoginService loginService;@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name與age(前提必須name對應前端的name)public Admin login(@RequestBody Admin admin) {Admin admin1 = loginService.login(admin);System.out.println(admin1);return admin;}}
運行tomcat 使用ApiPost測試
為了返回前端的代碼,那我們寫一個上面result.class
package com.ffyc.ssm.model;public class Result {private int code;private String message;private Object data;public Result() {}public Result(int code, String message, Object data) {this.code = code;this.message = message;this.data = data;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}
}
13.攔截器
Spring WEB中的攔截器(Interceptor)
類似于Servlet中的過濾器(Filter), 它主要用于攔截用戶請求并作相應的處理。 Spring 中的攔截器與過濾器有著本質的區別,過濾器是servlet規范中定義并實 現的,在進入到servlet之前截獲請求.而攔截器是spring中定義的一種攔截機制, 是對進入到處理器的請求進行攔截.
SpringWEB 定義了攔截器接口HandlerInterceptor
調用這個三個方法的時候,其參數的值也是從框架內部傳遞進來的。
boolean preHandle
? 預處理方法,實現處理器方法的預處理,就是在處理器方法執行之前這個方法會 被執行,相當于攔截了處理器方法,框架會傳遞請求和響應對象給該方法,第三 個參數為被攔截的處理器。如果preHandle方法返回true表示繼續流程(如調 用下一個攔截器或處理器方法),返回false表示流程中斷,不會繼續調用其他 的攔截器或處理器方法,此時我們需要通過response來產生響應;
1.添加**AdminTokenInterceptor
**類攔截器
package com.ffyc.ssm.interceptor;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;//定義攔截器
public class AdminTokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("進入到了攔截器");//獲得tokenString token = request.getHeader("token");if(token.equals("123456")){return true; //攔截器中返回true, 請求就會離開攔截器,繼續向后執行,到達處理器}else{response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.write("token驗證失敗");return false;//攔截器中返回false. 不會繼續向后執行. 可以在攔截器中向用戶做出響應}}
}
2.注冊攔截器(spring.xml)
<!--配置攔截器--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><!--定義哪些地址可以進入到攔截器中--><mvc:exclude-mapping path="/loginCtl/login"/><!--定義哪些地址不進入攔截器--><bean id="admintoken" class="com.ffyc.ssm.interceptor.AdminTokenInterceptor"></bean><!--配置攔截器的實現類--></mvc:interceptor></mvc:interceptors>