一锹引、相關(guān)原理及概念
1.1執(zhí)行流程
從上面的圖中我們可以大致明白springMVC
的調(diào)度流程系任,下面詳細(xì)說明:
- 1.發(fā)起請求到前端控制器(
DispatcherServlet
) - 2.前端控制器請求
HandlerMapping
查找Handler
,可以根據(jù)xml
配置步氏、注解進(jìn)行查找 - 3.處理器映射器
HandlerMapping
向前端控制器返回Handler
- 4.前端控制器調(diào)用處理器適配器(
HandlerAdapter
)去執(zhí)行Handler
- 5.處理器適配器去執(zhí)行
Handler
- 6.
Handler
執(zhí)行完成后給適配器返回ModelAndView
- 7.處理器適配器向前端控制器返回
ModelAndView
响禽,ModelAndView
是springMVC
的一個底層對象,包括了Model
和View
- 8.前端控制器請求視圖解析器(
ViewResolver
)進(jìn)行視圖解析,根據(jù)邏輯視圖名解析成真正的視圖(jsp
) - 9.視圖解析器向前端控制器返回真正的視圖
View
- 10.前端控制器請求進(jìn)行視圖渲染金抡,視圖渲染將模型數(shù)據(jù)(在
ModelAndView
)填充到request
域 - 11.響應(yīng)
1.2 相關(guān)概念
- 1瀑焦、前端控制器
DispatcherServlet
作用就是接收請求,響應(yīng)結(jié)果梗肝,相當(dāng)于一個轉(zhuǎn)發(fā)器榛瓮。減少了其他組件之前的耦合度。不需要我們自己開發(fā)巫击。 - 2禀晓、處理器映射器
HandlerMapping
作用:根據(jù)請求url
查找Handler
- 3、
Handler
處理器(需要我們開發(fā)) - 4坝锰、處理器適配器
HandlerAdapter
作用:按照特定規(guī)則(HandlerAdapter
要求規(guī)則)去執(zhí)行Handler
注意:編寫Handler
時按照HandlerAdapter
的要求去做粹懒,這樣適配器才可以去正確執(zhí)行Handler
- 5、視圖解析器(
ViewResolver
)
作用:進(jìn)行視圖解析顷级。根據(jù)邏輯視圖名解析成真正的視圖(View
) - 6凫乖、視圖(
View
)
是一個接口,實(shí)現(xiàn)類就是來支持不同的View
類型(jsp弓颈、freemarker...
)帽芽,需要我們開發(fā)相關(guān)頁面。
二翔冀、入門程序
這里我們還是使用之前mybatis
的數(shù)據(jù)模型导街。我們需要將相關(guān)的pojo
類拷貝到本工程中。
2.1 配置前端控制器
我們在```web.xml``中配置前端控制器:
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<!-- springMVC前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation配置springMVC加載的配置文件(配置處理器映射器纤子、適配器的等等)
如果不配置搬瑰,默認(rèn)加載的是WEB-INF/servlet名稱-servlet.xml(springmvc-servlet.xml) -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 1、*.action訪問以.action結(jié)尾的DispatcherServlet進(jìn)行解析
2控硼、/表示所有訪問的地址都由DispatcherServlet解析泽论,對于靜態(tài)文件的解析需要配置不讓DispatcherServlet解析
使用此種方法可以實(shí)現(xiàn)RESTful風(fēng)格的url
3、/*這種配置不對卡乾,使用此種配置翼悴,最終要轉(zhuǎn)發(fā)到一個jsp頁面,仍然會由DispatcherServlet解析jsp地址说订,
不能根據(jù)此jsp頁面找到Handler -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
說明:從上面的配置中我們可以看到需要將配置處理器映射器、處理器適配器等的配置文件(springmvc.xml
)作為初始化參數(shù)配置給前端控制器潮瓶。而前端控制器就是一個servlet
陶冷。注意路徑的配置方法。
2.2 配置處理器適配器
首先我們來看看處理器是配置的源碼:
此類實(shí)現(xiàn)了接口
HandlerAdapter
毯辅,能執(zhí)行實(shí)現(xiàn)Controller
接口的Handler
(或者叫能識別Handler
的類型):下面我們配置處理器適配器(
config/springmvc.xml
):
<!-- 處理器適配器埂伦,所有的處理器適配器都實(shí)現(xiàn)HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
2.3 編寫一個Handler
從上面的源碼中我們可以看到編寫Handler
要實(shí)現(xiàn)Contoller
接口,才能由處理器適配器執(zhí)行:
ItemsController1.java
package cn.itcast.ssm.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import cn.itcast.ssm.pojo.Items;
//實(shí)現(xiàn)Controller接口的映射器
public class ItemsController1 implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
//調(diào)用service查詢數(shù)據(jù)庫思恐,查詢商品列表沾谜,這里使用靜態(tài)數(shù)據(jù)庫模擬
List<Items> itemsList = new ArrayList<Items>();
Items items_1 = new Items();
items_1.setName("聯(lián)想筆記本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T 430");
Items items_2 = new Items();
items_2.setName("蘋果手機(jī)");
items_2.setPrice(5000f);
items_2.setDetail("iphone6s");
itemsList.add(items_1);
itemsList.add(items_2);
//返回ModelAndView
ModelAndView modelAndView = new ModelAndView();
//相當(dāng)于request的setAttribute方法膊毁,在jsp頁面中就可以通過items取數(shù)據(jù)了
modelAndView.addObject("itemsList",itemsList);
//指定視圖
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modelAndView;
}
}
相關(guān)的視圖(/WEB-INF/jsp/items/itemsList.jsp
)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!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>查詢商品列表</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/item/queryItem.action" method="post">
查詢條件:
<table width="100%" border=1>
<tr>
<td><input type="submit" value="查詢" /></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
<td>商品名稱</td>
<td>商品價格</td>
<td>生產(chǎn)日期</td>
<td>商品描述</td>
<td>操作</td>
</tr>
<c:forEach items="${itemsList }" var="item">
<tr>
<td>${item.name }</td>
<td>${item.price }</td>
<td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss" /></td>
<td>${item.detail }</td>
<td><a href="${pageContext.request.contextPath }/items/editItems.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>
配置(springmvc.xml
):
<!-- 配置Handler -->
<bean name="/queryItems.action" class="cn.itcast.ssm.controller.ItemsController1"></bean>
2.4 配置處理器映射器
在springmvc.xml
<!-- 處理器映射器,就是將bean的名字作為url進(jìn)行查找基跑,需要在配置Handler時指定bean的名字(就是url) -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
2.5 配置視圖解析器
需要配置解析jsp
的視圖解析器(在springmvc.xml
)
<!-- 視圖解析器婚温,解析jsp視圖,默認(rèn)使用jstl媳否,classpath下需要有jstl的包 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
2.6 部署測試
這里我們部署之后使用地址http://localhost:8080/springMVC01/queryItems.action
訪問相關(guān)的action
栅螟。
注意:在將相關(guān)spring
的jar
包導(dǎo)入進(jìn)去的時候一定要將commons-logging.jar
這個包加入,不然會報錯篱竭。
注意:如果我們使用一個錯誤的地址http://localhost:8080/springMVC01/queryItemss.action
訪問則會報下面的錯誤:
這個錯誤就是說通過
url
找不到handler
力图,于是我們可以知道是處理器映射器根據(jù)我們給出的url
映射不到handler
。如果我們訪問地址是正確的掺逼,但是跳轉(zhuǎn)時jsp
頁面地址寫錯了吃媒,則會報下面的錯誤:這是兩個常見的錯誤。