SpringMVC是一種基於java實現MVC設計模式的請求驅動類型的輕量級Web框架。是Spring FrameWord的後續產品,Spring框架提供了構建Web應用程序的全功能MVC模塊,使用Spring可插入MVC架構。從而在使用Spring進行Web開發時,可以選用Spring的SpringMVC框架或者其他MVC開發框架等。
SpringMVC程序入門
1.工程創建
通過IDEA創建SpringMVC工程,創建工程時,選用了骨架,如下圖所示
當創建項目完成後,發現項目目錄不完整,需要進行補充,添加如下圖目錄
2.代碼編寫
- 編寫index.jsp頁面
<%@page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<head>
</head>
<body>
<h2>SpringMVC入門案例</h2><br/>
<a href="hello">入門程序</a><br/>
</body>
</html>
- 引入項目所需jar包(pom.xml)
<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.1.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
此處引入jar包,我只引入了spring-webmvc的jar包,但是有的人同時也引入了spring-web這個jar包,其實spring-webmvc依賴於spring-web,這樣引入spring-webmvc的jar包會間接的添加了spring-web,而不必顯式的去添加spring-web。
- 配置核心控制器——DispatcherServlet(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>
<!--配置SpringMVC的核心控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置初始化參數,用於讀取SpringMVC的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--配置servlet對象創建時間點:應用啓動時加載這個Servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- 創建springmvc.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置SpringMVC創建容器時需要掃描的包-->
<context:component-scan base-package="com.liang"></context:component-scan>
<!--配置視圖解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
- 編寫控制器並使用註解配置
package com.liang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping(path = "/hello")
public String sayHello(){
System.out.println("HelloController控制器的syaHello方法執行了...");
return "success";
}
}
- 編寫success.jsp頁面(WEB-INF/pages/success.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>入門程序</title>
</head>
<body>
入門程序執行成功
</body>
</html>
完成後的工程目錄如下圖
入門程序執行過程圖
從入門程序執行過程圖中可以看出:瀏覽器發送請求,被DispatcherServlet捕獲,該Servlet不處理請求,而是將請求進行轉發,轉發的路徑是根據請求URL匹配@RequestMapping中的內容;匹配成功後,執行對應方法,該方法存在返回值;根據該返回是,藉助InternalResourceViewResolver找到對應的結果視圖;渲染結果視圖,響應到瀏覽器。
SpringMVC組件瞭解
DispatcherServlet
DispatcherServlet是整個流程控制的中心,由它調用其他組件處理用戶請求,DispatcherServlet的存在降低了組件之間的耦合性。其主要職責是調度工作。
通過HandlerMapping,將請求映射到處理器。
通過HandlerAdapter支持多種類型的處理器。
通過視圖解析器解析邏輯視圖名到對應的視圖。
文件上傳解析,如果請求類型是multipart將通過MultipartResolver進行文件上傳解析;
HandlerMapping
負責根據用戶請求找到對應的Handler,SpringMVC提供了不用的映射器實現不同的映射方式。
Handler
開發中編寫的棘突業務控制器,由DispatcherServlet把用戶請求轉發到Handler,由Handler對具體的用戶請求做處理。
HandlerAdapter
用於對handler進行執行,通過擴展handlerAdapter可以對更多類型的handler進行處理
ViewResolver
負責將處理結果生成View視圖,ViewResolver根據邏輯視圖名解析成具體的頁面地址(物理視圖名),再生成View視圖對象,最後將View視圖進行渲染將處理結果通過頁面展示給用戶。
@Controller 註解
此註解用於標記在一個類上,使用此標記的類將成爲一個SpringMVC Controller對象。基於註解的控制器不需要在配置文件中部署映射,僅需要使用@RequestMapping註解方法進行請求處理;在SpringMVC的配置文件中,用context:component-scan/啓動包掃描功能,以便註冊帶有@Controller,@Service,@repository,@Component等註解的類成爲Spring的Bean。
@RequestMapping註解
用於建立請求URL和處理請求方法之間的對應關係。次註解可以標記在類或者方法上,當標記在類上時,表示請求URL的一級訪問目錄,此處若不寫,則相當於應用的根目錄,寫的話必須以/開頭,主要目的是爲了使我們的URL可以按照模塊化管理;當標記出現在方法上,表示請求URL的第二級訪問目錄
屬性 | 功能 |
---|---|
path | 用於指定請求的URL,和value屬性作用一樣 |
method | 用於指定請求方式 |
params | 用於指定限制請求參數的條件,支持簡單的表達式 |
@RequestMapping註解使用示例
編寫JSP代碼
<%@page contentType="text/html; charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>requestMapping的使用</title>
</head>
<body>
<!--第一種訪問方式-->
<a href="${pageContext.request.contextPath}/account/findAccount">查詢賬戶</a><br/>
<!--第二種訪問方式-->
<a href="account/findAccount">查詢賬戶</a><br/><br/>
<!--請求方式不同-->
<a href="account/saveAccount">保存賬戶,get請求</a><br/>
<form action="account/saveAccount" method="post">
<input type="submit" value="保存賬戶,post請求"/>
</form>
<!--params屬性示例-->
<a href="account/deleteAccount?accountName=zhangshan&money=100">刪除賬戶,金額100</a><br/>
<a href="account/deleteAccount?accountName=zhangshan&money=1000">刪除賬戶,金額1000</a><br/>
</body>
</html>
編寫Controller的代碼
package com.liang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller("accountController")
@RequestMapping(path = "/account")
public class AccountController {
/**
* 查詢所有賬戶
* @return
*/
@RequestMapping(path = "/findAccount")
public String findAccount(){
System.out.println("查詢了賬戶...");
return "success";
}
/**
* 保存賬戶 只接受 post 方式請求
* @return
*/
@RequestMapping(path = "/saveAccount", method = RequestMethod.POST)
public String saveAccount()
{
System.out.println("保存賬戶");
return "success";
}
/**
* 刪除用戶 用於測試 params 參數
* @return
*/
@RequestMapping(path = "/deleteAccount", params = {"accountName","money!=100"})
public String deleteAccount()
{
System.out.println("刪除用戶");
return "success";
}
}
上述代碼需要注意的是: 1.保存賬戶使用get請求的超鏈接點擊後會出現如下頁面
這是由於保存賬戶的方法設置了請求方式,只允許post請求方式。
2.刪除用戶,金額100的超鏈接點擊後會出現以下頁面
這是由於刪除賬戶需要傳遞滿足條件的參數。