1. 程式人生 > >springmvc教程--快速入門教程

springmvc教程--快速入門教程

轉自:https://blog.csdn.net/sihai12345/article/details/67633053

springmvc教程系列:
springmvc史上最好教程(3)

springmvc史上最好教程(2)

一、 SpringMVC架構
1.1、 Spring web mvc介紹
 

Spring web mvc和Struts2都屬於表現層的框架,它是Spring框架的一部分,我們可以從Spring的整體結構中看得出來:

 

 

 

 

 

1.2、 Web MVC
 

mvc設計模式在b/s系統下應用:

 

 

1、 使用者發起request請求至控制器(Controller)

控制接收使用者請求的資料,委託給模型進行處理

2、 控制器通過模型(Model)處理資料並得到處理結果

模型通常是指業務邏輯

3、 模型處理結果返回給控制器

4、 控制器將模型資料在檢視(View)中展示

web中模型無法將資料直接在檢視上顯示,需要通過控制器完成。如果在C/S應用中模型是可以將資料在檢視中展示的。

5、 控制器將檢視response響應給使用者

通過檢視展示給使用者要的資料或處理結果。

 

 

1.3、 Spring web mvc 架構
1.3.1、 架構圖
 

 

 

1.3.2、 架構流程
1、 使用者傳送請求至前端控制器DispatcherServlet

2、 DispatcherServlet收到請求呼叫HandlerMapping處理器對映器。

3、 處理器對映器根據請求url找到具體的處理器,生成處理器物件及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。

4、 DispatcherServlet通過HandlerAdapter處理器介面卡呼叫處理器

5、 執行處理器(Controller,也叫後端控制器)。

6、 Controller執行完成返回ModelAndView

7、 HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet

8、 DispatcherServlet將ModelAndView傳給ViewReslover檢視解析器

9、 ViewReslover解析後返回具體View

10、 DispatcherServlet對View進行渲染檢視(即將模型資料填充至檢視中)。

11、 DispatcherServlet響應使用者

 

1.3.3、元件說明
以下元件通常使用框架提供實現:

DispatcherServlet:前端控制器
使用者請求到達前端控制器,它就相當於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它呼叫其它元件處理使用者的請求,dispatcherServlet的存在降低了元件之間的耦合性。
HandlerMapping:處理器對映器
HandlerMapping負責根據使用者請求找到Handler即處理器,springmvc提供了不同的對映器實現不同的對映方式,例如:配置檔案方式,實現介面方式,註解方式等。
Handler:處理器
Handler 是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的使用者請求進行處理。
由於Handler涉及到具體的使用者業務請求,所以一般情況需要程式設計師根據業務需求開發Handler。
 
HandlAdapter:處理器介面卡
通過HandlerAdapter對處理器進行執行,這是介面卡模式的應用,通過擴充套件介面卡可以對更多型別的處理器進行執行。
 
ViewResolver:檢視解析器
ViewResolver負責將處理結果生成View檢視,ViewResolver首先根據邏輯檢視名解析成物理檢視名即具體的頁面地址,再生成View檢視物件,最後對View進行渲染將處理結果通過頁面展示給使用者。 springmvc框架提供了很多的View檢視型別,包括:jstlView、freemarkerView、pdfView等。

一般情況下需要通過頁面標籤或頁面模版技術將模型資料通過頁面展示給使用者,需要由程式設計師根據業務需求開發具體的頁面。
 

 

二、商品訂單業務說明
 

本教程在通過商品訂單業務學習使用springmvc進行功能開發。

 

 

2.1、 業務流程
1、管理員維護商品資訊

2、使用者挑選商品,購買,建立訂單

 

2.2、 資料庫環境
 

先匯入sql_table.sql,再匯入sql_data.sql指令碼:

 

 

如下:

 

 

 

 

2.3、 商品訂單資料模型
 

 

 

三、SpringMVC入門
3.1、 需求
實現商品查詢列表功能。

 

3.2、 開發環境準備
本教程使用Eclipse+tomcat7開發

 

詳細參考“Eclipse開發環境配置-indigo.docx”文件

 

 

3.3、 第一步:建立一個Web專案
在eclipse下建立動態web工程springmvc_first。

 

3.4、 第二步:匯入spring3.2.0的jar包
 

 

 

3.5、 第三步:前端控制器配置
在WEB-INF\web.xml中配置前端控制器,

 

<servlet>
<servlet-name>springmvc</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>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>


load-on-startup:表示servlet隨服務啟動;

url-pattern:*.action的請交給DispatcherServlet處理。

contextConfigLocation:指定springmvc配置的載入位置,如果不指定則預設加

載WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml。

 

3.5.1、 Servlet攔截方式
1、攔截固定字尾的url,比如設定為 *.do、*.action, 例如:/user/add.action

此方法最簡單,不會導致靜態資源(jpg,js,css)被攔截。

 

2、攔截所有,設定為/,例如:/user/add  /user/add.action

此方法可以實現REST風格的url,很多網際網路型別的應用使用這種方式。

但是此方法會導致靜態檔案(jpg,js,css)被攔截後不能正常顯示。需要特殊處理。

 

3、攔截所有,設定為/*,此設定方法錯誤,因為請求到Action,當action轉到jsp時再次被攔截,提示不能根據jsp路徑mapping成功。

 

3.6、 第四步:springmvc配置檔案
 

Springmvc預設載入WEB-INF/[前端控制器的名字]-servlet.xml,也可以在前端控制器定義處指定載入的配置檔案,如下:

 

<init-param>
 
<param-name>contextConfigLocation</param-name>
 
<param-value>classpath:springmvc.xml</param-value>
 
</init-param>


如上程式碼,通過contextConfigLocation載入classpath下的springmvc.xml配置檔案。

 

3.7、 第五步:配置處理器對映器
 

在springmvc.xml檔案配置如下:

 

<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"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.2.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
 
    <!-- 處理器對映器 -->
    <!-- 根據bean的name進行查詢Handler 將action的url配置在bean的name中 -->
    <bean
        class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />


BeanNameUrlHandlerMapping:表示將定義的Bean名字作為請求的url,需要將編寫的controller在spring容器中進行配置,且指定bean的name為請求的url,且必須以.action結尾。

 

3.8、 第六步:配置處理器介面卡
 

在springmvc.xml檔案配置如下:


<bean        class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 


 

SimpleControllerHandlerAdapter:即簡單控制器處理介面卡,所有實現了org.springframework.web.servlet.mvc.Controller介面的Bean作為

Springmvc的後端控制器。

 

3.9、 第七步:配置檢視解析器
 

在springmvc.xml檔案配置如下:

 

<!-- ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

<!-- ViewResolver -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="viewClass"value="org.springframework.web.servlet.view.JstlView"/>

<property name="prefix"value="/WEB-INF/jsp/"/>

<property name="suffix"value=".jsp"/>

</bean>

 

InternalResourceViewResolver:支援JSP檢視解析

viewClass:JstlView表示JSP模板頁面需要使用JSTL標籤庫,所以classpath中必須包含jstl的相關jar包;

prefix 和suffix:查詢檢視頁面的字首和字尾,最終檢視的址為:

字首+邏輯檢視名+字尾,邏輯檢視名需要在controller中返回ModelAndView指定,比如邏輯檢視名為hello,則最終返回的jsp檢視地址 “WEB-INF/jsp/hello.jsp”

 

 

3.10、 第八步:後端控制器開發
 

public class ItemList1 implements Controller {
 
    @Override
    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        
        //商品列表
        List<Items> itemsList = new ArrayList<Items>();
        
        Items items_1 = new Items();
        items_1.setName("聯想筆記本");
        items_1.setPrice(6000f);
        items_1.setDetail("ThinkPad T430 聯想膝上型電腦!");
        
        Items items_2 = new Items();
        items_2.setName("蘋果手機");
        items_2.setPrice(5000f);
        items_2.setDetail("iphone6蘋果手機!");
        
        itemsList.add(items_1);
        itemsList.add(items_2);
        
        //建立modelAndView準備填充資料、設定檢視
        ModelAndView modelAndView = new ModelAndView();
        
        //填充資料
        modelAndView.addObject("itemsList", itemsList);
        //檢視
        modelAndView.setViewName("order/itemsList");
        
        return modelAndView;
    }
    
 
}


 

org.springframework.web.servlet.mvc.Controller:處理器必須實現Controller介面。

ModelAndView:包含了模型資料及邏輯檢視名

 

 

 

3.11、 第九步:後端控制器配置
 

在springmvc.xml檔案配置如下:

 

!-- controller配置 -->
    <bean name="/items1.action" id="itemList1" 
class="com.sihai.springmvc.controller.first.ItemList1"/>    

 

name="/items1.action":前邊配置的處理器對映器為BeanNameUrlHandlerMapping,如果請求的URL為“上下文/items1.action”將會成功對映到ItemList1控制器。

 

3.12、 第十步:檢視開發
 

建立/WEB-INF/jsp/order/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>
商品列表:
<table width="100%" border=1>
<tr>
    <td>商品名稱</td>
    <td>商品價格</td>
    <td>商品描述</td>
</tr>
<c:forEach items="${itemsList }" var="item">
<tr>
    <td>${item.name }</td>
    <td>${item.price }</td>
    <td>${item.detail }</td>
</tr>
</c:forEach>
 
</table>
</body>
</html>