springmvc概述
Springmvc是spring框架的一個模塊,spring和springmvc無需中間整合層整合。
Springmvc是一個基於mvc的web框架
表現層的三大任務:
URL到controller的映射http請求參數綁定http響應的生成和輸出MVC設計模式
MVC設計模式是一種通用的軟體編程思想。
在MVC設計模式中認為, 任何軟體都可以分為三部分組成:
(1)控制程序流轉的控制器(Controller)
(2)封裝數據處理數據的模型(Model)
(3)負責展示數據的視圖(view)
springmvc的實現原理
(1) .用戶發送請求 至 前端控制器(DispatcherServlet);
提示:DispatcherServlet的作用:接收請求,調用其它組件處理請求,響應結 果,相當於轉發器、中央處理器,是整個流程控制的中心
(2) .前端控制器(DispatcherServlet)收到請求後調用處理器映射器 (HandlerMapping)
處理器映射器(HandlerMapping)找到具體的Controller(可以根據xml配置、註解進 行查找),並將Controller返回給DispatcherServlet;
(3) .前端控制器(DispatcherServlet)調用處理器適配器(HandlerAdapter)。處理 器適配器經過適配調用具體的Controller;(Controller--> service --> Dao --> 資料庫)
Controller執行完成後返回ModelAndView,
提示:Model(模型數據,即Controller處理的結果,Map) View(邏輯視圖名,即 負責展示結果的JSP頁面的名字)
處理器適配器(HandlerAdapter)將controller執行的結果(ModelAndView)返回給前 端控制器(DispatcherServlet);
(4) .前端控制器(DispatcherServlet)將執行的結果(ModelAndView)傳給視圖解析 器(ViewReslover)
視圖解析器(ViewReslover)根據View(邏輯視圖名)解析後返回具體JSP頁面
(5) .前端控制器(DispatcherServlet)根據Model對View進行渲染(即將模型數據 填充至視圖中);
前端控制器(DispatcherServlet)將填充了數據的網頁響應給用戶
springmvc實現
第一步:創建maven項目springmvc
第二步:在pom文件中添加依賴
<dependencies> <!-- 單元測試 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <!-- SpringMVC的jar包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.1.3.RELEASE</version> </dependency> <!-- servlet 和 jsp的jar包 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <!-- java對象轉換json的工具類 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.1</version> </dependency> --></dependencies>第三步:web.xml中配置前端控制器
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <!-- 配置springmvc前端控制器, 將所有請求交給springmvc來處理 --> <servlet> <servlet-name>springmvc</servlet-name> <servletclass>org.springframework.web.servlet.DispatcherServlet</servletclass> <!-- 配置springmvc核心配置文件的位置,默認Springmvc的配置文件是在 WEB-INF目錄下,默認的名字為springmvc-servlet.xml,如果要放在其他目錄,則 需要指定如下配置: --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-config.xml</param-value> </init-param> </servlet> <!-- 其中的斜槓(/)表示攔截所有請求(除JSP以外), 所有請求都要經過 springmvc前端控制器 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping></web-app>第四步:創建並配置springmvc-config.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/springbeans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context4.0.xsd"> <!-- 1.配置前端控制器放行靜態資源(html/css/js等,否則靜態資源將無法訪問) --> <mvc:default-servlet-handler/> <!-- 2.配置註解驅動,用於識別註解(比如@Controller) --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 3.配置需要掃描的包:spring自動去掃描 base-package 下的類, 如果掃描到的類上有 @Controller、@Service、@Component等註解, 將會自動將類註冊為bean--> <context:component-scan base-package="com.tedu.controller"> </context:component-scan> <!-- 4.配置內部資源視圖解析器 prefix:配置路徑前綴 suffix:配置文件後綴 --> <bean> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/>第五步:創建HelloController
restController=controller+responsebody:
restController返回json對象
controller返回string:modelandview
controller+responsebody返回json對象
package com.tedu.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;/* @Controller,如果當前類所在的包配置了Spring容器包掃描,具有 * 該註解的類,就會作為bean註冊到spring容器中,由spring容器 * 創建實例。 */@Controllerpublic class HelloController { /* @RequestMapping為當前方法配置訪問路徑 * 當瀏覽器訪問http://localhost:8080/day20-springmvc/hello * 如果Controller類上沒有配置訪問路徑,當前項目中所有 * controller中方法上的訪問路徑都不同衝突! */ @RequestMapping("/hello") public String testHello() { System.out.println( "HelloController.testHello()" ); System.out.println( "hello springmvc..." ); //跳轉到 /WEB-INF/pages/home.jsp return "home"; }}第六步:創建並實現home.jsp
在WEB-INF/pages/目錄下,創建home.jsp頁面。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body> <h1>day20-springmvc...home.jsp...</h1></body></html>第七步:發送請求,進行測試
打開瀏覽器,輸入url地址: http://localhost :8080/day16-springmv/hello 地址。
重定向和轉發
重定向redirect和轉發forward的區別
1,重定向瀏覽器地址欄顯示新的地址,轉發地址欄不變
2,重定向可以重定向別的網站,轉發只能轉發到本網站中的方法。
redirect重定向
適用於原先的網頁不繼續提供服務了。
@Controllerpublic class UserController { //重定向,原先的登錄地址 @RequestMapping("/login") public String login() { return "redirect:https://passport.jd.com/new/login.aspx"; }}http://localhost:8080/login
轉發後瀏覽器的地址欄變為轉發後的地址。
在chrome的調試窗口中network中查看status code
forward轉發
轉發後瀏覽器地址欄還是原來的地址。所以轉發前請求的參數在轉發後仍然可以讀取到。
//第一輸入用戶名和密碼 @RequestMapping("/loginByName") @ResponseBody public String loginByNamePwd(String username,String password) { return "login"; } //再次登錄時,還要輸入驗證碼 @RequestMapping("/loginByCode") public String loginByCode(String username,String password,String code) { //判斷驗證碼是否正確 return "forward:/loginByName"; }
restful風格
@PathVariable用於將請求URL中的模板變量映射到功能處理方法的參數上
形成RUSTFul形式,這將是未來的發展趨勢。它更加簡潔,安全。強化URL GET訪問方式。
@RestControllerpublic class OrderCotroller { @RequestMapping("/order/{startTime}/{endTime}") public String searchByDate(@PathVariable String startTime, @PathVariable String endTime) { return "restful startTime="+startTime+",endtime="+endtime; }}瀏覽器訪問的URL
http://localhost :8080/order/2019-10-01/2020-10-10
自動將URL 中模板變量{startTime}和{endTime}綁定到@PathVariable註解的同名參數上,即入參後startTime=「2019-10-01」、endTime=「2020-10-10」。