SpringMVC(一)SpringMVC的處理流程、元件說明、搭建

z1340954953發表於2018-06-07

SpringMVC的架構流程


1. 使用者請求到達前端控制器DispatcherServlet,DispatcherServlet將請求傳送到處理器對映器

2. 處理器對映器HandlerMapping,根據請求url查詢到具體的處理器handller以及攔截器,並返回會前端控制器

3. 前端控制器不是直接呼叫controller,而是請求處理器介面卡執行處理器handler

4. 處理器handler將處理請求,並返回Modeview(檢視名和資料),將ModelView送會給前端控制器

5. 前端控制器將ModelView發給檢視解析器ViewResolver生成檢視view,返回給前端控制器

6. 前端控制器渲染檢視,返回給客戶端

元件說明

* DispatcherServlet:前端控制器

是spring MVC的核心,將處理請求傳送到各個元件。

* HandlerMapping:處理器對映器

處理器對映器的作用根據請求的URL找到對應的處理器

* Handler:處理器

具體對請求處理的地方,返回檢視名和資料。

* HandlAdapter:處理器介面卡

通過HandlerAdapter對處理器進行執行,這是介面卡模式的應用,通過擴充套件介面卡可以對更多型別的處理器進行執行。

* viewResolve:檢視解析器

將處理結果ModelAndView ,生成View檢視物件,並對檢視渲染 將結果展示給使用者

* 檢視view

一般指的就是jsp頁面,也有其他,比如freemarkerview

關於DispatcherServlet的說明

DispatcherServlet主要完成了兩件事情

* 初始化Spring 的Web上下文容器,並且可能設定父容器的上下文

* 初始化Spring MVC的元件,如handlermapping,handleradaptor

註解對映器和介面卡

1. 配置處理器對映器

註解式對映器對類中標記了@RequestMapping的方法進行對映,根據請求的url匹配到對應的@RequestMapping註解標記的方法。也就是註解@RequestMapping定義了請求URL到處理器的對映

匹配成功返回HandlerMethod物件給前端控制器。

SpringMVC.xml中配置如下:

<!-- 配置註解處理器對映器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>

2. 配置註解是處理器介面卡

對@RequestMapping標記的方法的進行呼叫

<!-- 配置註解處理器介面卡 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>

3.註解驅動載入介面卡和對映器

前面直接配置介面卡和對映器比較麻煩,可以直接使用註解驅動,預設載入介面卡和對映器替換。

<!-- 註解驅動 -->
<mvc:annotation-driven></mvc:annotation-driven>

檢視解析器配置

使用預設的檢視解析器,可以在xml中配置檢視解析器的屬性,指定檢視的字首和字尾

<!-- 配置檢視解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/WEB-INF/jsp"></property>
	<property name="suffix" value=".jsp"></property>
</bean>

最後,返回的實體地址:字首+檢視名+字尾

控制器配置

用註解@Controller表示一個類是處理器,這個註解是基於@Component的,因而在xml中可以使用

元素<component-scan>將它例項化到容器內

@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller
{
  String value() default "";
}
<!-- 配置controller掃描包 -->
<context:component-scan base-package="cn.bing.controller" />

最後,一個小案例實現一個簡單的demo

package cn.bing.controller;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import cn.bing.pojo.Item;

@Controller
public class ItemController {
	@RequestMapping("/itemList.action")
	public ModelAndView itemList(){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
		List<Item> list = new ArrayList<Item>();
		list.add(new Item(1, "小米1", sdf.format(new Date()), "千元神機!"));
		list.add(new Item(2, "小米2", sdf.format(new Date()), "千元神機!"));
		list.add(new Item(3, "小米3", sdf.format(new Date()), "千元神機!"));
		list.add(new Item(4, "小米4", sdf.format(new Date()), "千元神機!"));
		list.add(new Item(5, "小米5", sdf.format(new Date()), "千元神機!"));
		ModelAndView mav = new ModelAndView();
		mav.setViewName("itemList");
		mav.addObject("list", list);
		return mav;
	}
}

itemList.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
	<table cellpadding="0" border="1" cellspacing="0">
		<c:if test="${not empty list }">
			<c:forEach items="${list }" var="obj">
				<tr>
					<td>${obj['id']}</td>
					<td>${obj.name }</td>
					<td>${obj.time }</td>
					<td>${obj.remark }</td>
					<td><a style="color: red;" href="">修改</a></td>
				</tr>
			</c:forEach>
		</c:if>
	</table>
</body>
</html>

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">
  <display-name>goldSpringDemo</display-name>
  <servlet>
  	<servlet-name>dispatcherServlet</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 	<init-param>
 		<param-name>contextConfigLocation</param-name>
 		<param-value>classpath:springMVC.xml</param-value>
 	</init-param>
  </servlet>
  <servlet-mapping>
  	<servlet-name>dispatcherServlet</servlet-name>
  	<url-pattern>*.action</url-pattern>
  </servlet-mapping>
</web-app>

注意到:url-pattern 可以配置為 *.do ,*.action這種攔截不包含jsp ,/*則是攔截所有,包括靜態資源和頁面

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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
	<!-- 配置controller掃描包 -->
	<context:component-scan base-package="cn.bing.controller" />
	<!-- 註解驅動 -->
	<mvc:annotation-driven></mvc:annotation-driven>
	<!-- 配置檢視解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
</beans>



相關文章