什麼是MVC MVC : 模型、視圖、控制器 , 是一種軟體設計規範,說明不是設計模式; 本質:將業務邏輯 , 數據 , 顯示 分離的方式來編寫代碼; 前後端分離; Model:數據模型,提供要展示的數據,一般我們都會把這兩個分離開來 , 數據Dao,服務層Service。 View :負責進行數據 ...
MVC : 模型、視圖、控制器 , 是一種軟體設計規範,說明不是設計模式;
本質:將業務邏輯 , 數據 , 顯示 分離的方式來編寫代碼; 前後端分離;
Model:數據模型,提供要展示的數據,一般我們都會把這兩個分離開來 , 數據Dao,服務層Service。
View :負責進行數據的渲染和展示;客戶端想要看到的東西
SpringMVC的執行原理
1、DispatcherServlet表示前置控制器,是整個SpringMVC的控制中心。用戶發出請求,DispatcherServlet接收請求並攔截請求。
我們假設請求的url為:
http://localhost:8080/SpringMVC/hello
如上url拆分成三部分:
http://localhost:8080伺服器功能變數名稱
SpringMVC部署在伺服器上的web站點
hello表示控制器
通過分析,如上url表示為:請求位於伺服器localhost:8080上的SpringMVC站點的hello控制器。
2、HandlerMapping為處理器映射。DispatcherServlet調用HandlerMapping,HandlerMapping根據請求url查找Handler。
3、HandlerExecution表示具體的Handler,其主要作用是根據url查找控制器,如上url被查找控制器為:hello。
4、HandlerExecution將解析後的信息傳遞給DispatcherServlet,如解析控制器映射等。
5、HandlerAdapter表示處理器適配器,其按照特定的規則去執行Handler。
6、Handler讓具體的Controller執行。
7、Controller將具體的執行信息返回給HandlerAdapter,如ModelAndView。
8、HandlerAdapter將視圖邏輯名或模型傳遞給DispatcherServlet。
9、DispatcherServlet調用視圖解析器(ViewResolver)來解析HandlerAdapter傳遞的邏輯視圖名。
10、視圖解析器將解析的邏輯視圖名傳給DispatcherServlet。
11、DispatcherServlet根據視圖解析器解析的視圖結果,調用具體的視圖。
12.最終視圖呈現給用戶。
hello,SpringMVC
1.導包
配置tomcat
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- Spring MVC 及 Spring系列包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.24.RELEASE</version> </dependency> <!--Servlet核心--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <!-- JSTL --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies>
註意資源導出問題:
<!--解決資源導出問題--> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources>
2.編寫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_3_0.xsd" id="WebApp_ID" version="3.0"> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--關聯springMVC配置文件--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- /和/*的區別: < url-pattern > / </ url-pattern > 不會匹配到.jsp, 只針對我們編寫的請求; 即:.jsp不會進入spring的 DispatcherServlet類 。 < url-pattern > /* </ url-pattern > 會匹配*.jsp, 會出現返回jsp視圖時再次進入spring的DispatcherServlet 類,導致找不到對應的controller所以報404錯。 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
註意點:
servlet-mapping 中的url-pattern
/和/*的
區別: / 只針對我們編寫的請求,即.jsp不會進入spring的dispatcherservlet類中.
/* 會匹配*.jsp會出現返回jsp視圖時再次進入spring的dispatcherservlet類,導致找不到對應的controller所以報404的錯誤.
3.編寫SpringMVC的核心配置文件
在springmvc的核心配置文件中只用編寫4個部分:
1.掃描指定包的註解
2.配置資源過濾
3.支持註解驅動
4.配置視圖解析器
<?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/beans https://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"> <!--掃描指定包下的註解,讓指定的類能夠被IOC容器管理--> <context:component-scan base-package="org.west.controller"/> <!--靜態資源過濾--> <mvc:default-servlet-handler/> <!--支持註解驅動--> <mvc:annotation-driven/> <!--配置視圖解析器--> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
註意點:要導入對應的文件約束.
4.編寫Controller類
package org.west.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("h1") public class HelloController { @RequestMapping("hello") public String hello(Model model){ model.addAttribute("msg","hello,springMVC"); return "hello"; } }
5.編寫.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>SpringMVC</title> </head> <body> ${msg} </body> </html>
6.運行結果