文章目錄
三層架構與MVC
三層架構
- 表現層(web層):和客戶端進行數據交互,表現層一般會採用
MVC設計模型
。 - 業務層(service層):處理公司具體的業務邏輯。
- 持久層(dao層):操作數據庫。
MVC模型
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不需要重新編寫業務邏輯。
- Model:數據模型,JavaBean的類,用來進行數據封裝。
- View:指JSP、HTML用來展示數據給用戶。
- Controller:用來接收用戶的請求,是整個流程的控制器,用來進行數據校驗等。
SpringMVC概述
SpringMVC是一種基於Java實現的MVC設計模型的請求驅動類型的輕量級WEB框架。SpringMVC屬於表現層框架(在三層架構中的位置)。
回顧:Servlet總結
在不使用框架之前,前端發送一個請求就對應寫一個Servlet,通過網頁驅動服務器端的Java程序,在網頁上顯示Java程序返回的數據。
如web3.0以前的版本,使用web.xml配置Servlet:
定義一個類,繼承HttpServlet 重寫doGet 和 doPost,註冊配置該Servlet
- DemoXMLServlet
public class DemoXMLServlet extends javax.servlet.http.HttpServlet {
@Override
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
response.getWriter().print("hello-DemoXMLServlet");
System.out.println("訪問了DemoXMLServlet");
}
@Override
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
this.doPost(request,response);
}
}
- 註冊配置Servlet :告訴服務器,我們的應用有這個servlet
<!-- 【使用web.xml配置一個Servlet】
聲明一個Servlet,向tomcat聲明, 這個應用裏面有這個servlet,
名字叫做HelloServlet , 具體的路徑是com.mycode01.servlet.HelloServlet-->
<servlet>
<!-- 爲Servlet指定一個名稱,以便於引用 -->
<servlet-name>DemoXMLServlet</servlet-name>
<!-- 註冊Servlet實現類的全類名 -->
<servlet-class>com.mycode.servlet.DemoXMLServlet</servlet-class>
</servlet>
<!-- 建立一個從虛擬路徑到Servlet之間的映射關係 -->
<servlet-mapping>
<!-- 引用Servlet名稱 -->
<servlet-name>DemoXMLServlet</servlet-name>
<!-- 映射到Servlet的虛擬路徑:“/HelloServlet” -->
<url-pattern>/xMLServlet</url-pattern>
</servlet-mapping>
大概執行過程是這樣的:
0.用戶發送請求,根據url找到Tomcat應用下的該項目
1.找web.xml
, 查找是否有url-pattern
的內容是/xMLServlet
2. 如果有url-pattern的內容是/xMLServlet,便找到對應servlet-mapping
中的那個servlet-name
(DemoXMLServlet)
3.再找到servlet元素
中的servlet-name
(DemoXMLServlet),找到下面定義了的servlet-class
,然後反射創建該類的對象,並執行該類的相應方法。
SpringMVC快速入門案例
1.引入依賴
<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.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<!--Spring依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--SpringMVC依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--ServletAPI依賴-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
2.在web.xml
配置文件中配置SpringMVC核心控制器(DispatcherServlet
)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- SpringMVC的核心控制器 -->
<servlet>
<!-- 爲Servlet指定一個名稱,以便於引用 -->
<servlet-name>dispatcherServlet</servlet-name>
<!-- 註冊Servlet實現類的全類名 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置Servlet的初始化參數,讀取springmvc的配置文件,創建spring容器 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 配置servlet啓動時加載對象
啓動加載優先級,讓Servlet 提前創建實例
Tomcat一啓動,立刻調用dispatcherServlet的init方法,創建WebApplicationContext(SpringMVCIOC容器)
-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 映射攔截配置
/:表示所有請求都將被dispatcherServlet(SpringMVC核心控制器)攔截
-->
<servlet-mapping>
<!-- 引用Servlet名稱 -->
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.提供SpringMVC核心控制器初始化參數時讀取的springmvc.xml
配置文件
SpringMVC核心配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置spring創建容器時要掃描的包 :識別對應註解,如使用@Controller等創建對象的註解,則就會給對象生成一個實例,並給SpringMVCIOC容器管理-->
<context:component-scan base-package="com.mycode.controller"></context:component-scan>
<!-- 配置spring開啓註解mvc的支持 (註解驅動)-->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置視圖解析器 -->
<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>
4.測試配置
- HelloController控制器類(相當於以前的寫的Servlet)
/*@Controller 創建HelloController對象實例,並將實例對象交給SpringMVCIOC容器管理。
web.xml配置了load-on-startup程序啓動就創建了SpringMVCIOC容器,
springmvc.xml配置了包掃描,使用@Controller等創建對象的註解,則就會給對象(控制器)生成一個實例,並給SpringMVCIOC容器管理
*/
@Controller
public class HelloController {
//接收請求 http://localhost:8080/hello
@RequestMapping(path="/hello") //建立請求URL和處理方法之間的對應關係
public String sayHello() {
System.out.println("Hello SpringMVC");
//跳轉頁面
return "login";
}
}
- 在
WEB-INF
目錄下創建pages文件夾,編寫login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>你已入門啦</h3>
</body>
</html>
- 訪問:
http://localhost:8080/hello
大概執行過程:
- 當啓動Tomcat服務器的時候,因爲配置了
load-on-startup
標籤,所以會提前創建DispatcherServlet
對象,並加載springmvc.xml
配置文件, 配置開啓了註解掃描
,那麼HelloController對象就會被創建。 - 前端發送請求,請求會先到達
DispatcherServlet
核心控制器,根據配置@RequestMapping
註解找到執行的具體方法。 - 根據
執行方法的返回值
,再根據配置的視圖解析器
,去指定的目錄下查找指定名稱的JSP文件
,再通過Tomcat服務器渲染頁面,做出響應
。
RequestMapping註解詳解
- 作用:建立請求URL和處理方法之間的對應關係。如RequestMapping的value與請求URL相對應,則執行當前註解標註的方法。
- 作用位置:
- 類上:請求 URL 的第一級訪問目錄,需要以/開頭。如不寫,默認是
應用的根目錄
。目的是爲了使我們的 URL 可以按照模塊化管理 - 方法上:請求 URL 的第二級訪問目錄。
- 類上:請求 URL 的第一級訪問目錄,需要以/開頭。如不寫,默認是
如:處理請求路徑 http://localhost:8080/ssm/springmvc
@Controller
@RequestMapping(value = "/ssm")
public class HelloController {
@RequestMapping(value = "/springmvc")
public String sayHello() {
System.out.println("Hello SpringMVC!!");
return "login";
}
}
注: http://localhost:8080
可以省略不寫
- 屬性
path
與value
屬性:value屬性和path屬性是一樣的,用來指定請求路徑的url。mthod
屬性:指定該方法的請求方式。當請求路徑相同,而method屬性的值不一樣,如果是RequestMethod.GET
,則只能以get方式請求(即請求路徑相同,請求方式爲get方式,則執行的是mthod屬性是RequestMethod.GET註解下的方法),如果是RequestMethod.POST
,則只能以post方式請求。 擴展,RESTful
編程風格的規範之一:一個路徑代表一個資源,通過不同提交方式識別不同操作。params
屬性:指定 限制請求參數 的條件。headers
屬性:發送的請求中必須包含的請求頭
/*params參數:
"name":表示請求必須包含name參數
"!sex":表示請求不能包含sex參數
"age=18":表示請求參數中的age參數必須爲18
......
.....
*/
@RequestMapping(params = {"name","!sex","age=18"},value = "/ssm")
public String helloParams() {
return "index";
}
/* headers參數:
"Accept":表示請求頭必須包含Accept頭信息
"Accept-Encoding!=zh-CN":表示請求頭中Accept-Encoding頭信息的值不能爲zh-CN
...
...
*/
@RequestMapping(headers = {"Accept","Accept-Encoding!=zh-CN"},value = "/ssm")
public String helloHeaders() {
return "index";
}
springmvc.xml配置文件中配置 視圖解析器
的作用
配置視圖解析器後,可以直接返回 邏輯視圖名 即可跳轉到相應頁面。
<!-- 配置視圖解析器 -->
<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>
@Controller
public class UserController {
@RequestMapping(value = "/ssm")
public String hello(){
/*配置視圖解析器後,可以直接返回 邏輯視圖名(頁面名稱)
本來要寫的返回值
"/WEB-INF/pages/login.jsp"
配置的視圖解析器中
prefix="/WEB-INF/pages/"
suffix=".jsp"
去掉前綴 後綴 直接返回邏輯視圖名
*/
return "login";
}
}