SpringMVC學習--入門程式

来源:http://www.cnblogs.com/lcngu/archive/2016/05/25/5496626.html
-Advertisement-
Play Games

前面基本介紹了下SpringMVC的運行原理,現在按照前面的原理一步步實現一個簡單的程式。先搭建一個簡單的web工程,將spring的jar包導入項目中。 前端控制器配置 在web.xml中配置如下: load-on-startup:表示servlet隨服務啟動; url-pattern:*.act ...


  前面基本介紹了下SpringMVC的運行原理,現在按照前面的原理一步步實現一個簡單的程式。先搭建一個簡單的web工程,將spring的jar包導入項目中。

  • 前端控制器配置

  在web.xml中配置如下:

 1 <servlet>
 2 <servlet-name>springmvc</servlet-name>
 3 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 4 <init-param>
 5 <param-name>contextConfigLocation</param-name>
 6 <param-value>classpath:springmvc.xml</param-value>
 7 </init-param>
 8 <load-on-startup>1</load-on-startup>
 9 </servlet>
10 <servlet-mapping>
11 <servlet-name>springmvc</servlet-name>
12 <url-pattern>*.action</url-pattern>
13 </servlet-mapping>

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

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

  contextConfigLocation:指定springmvc配置的載入位置,如果不指定則預設載入WEB-INF/[DispatcherServlet 的Servlet 名字]-servlet.xml。

  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成功。

  • 配置處理器映射器

  在classpath下的springmvc.xml中配置處理器映射器

1 <!-- 處理器映射器 -->
2 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> 
  • 配置處理器適配器
1 <!-- 處理器適配器 -->
2 <bean
3 class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
  • 開發hander
public class ItemList1 implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest arg0,
            HttpServletResponse arg1) throws Exception {
        // 商品列表
        List<Items> itemsList = new ArrayList<Items>();

        Items items_1 = new Items();
        items_1.setName("技嘉筆記本");
        items_1.setPrice(6000f);
        items_1.setDetail("P35K V3筆記本電腦!");

        Items items_2 = new Items();
        items_2.setName("蘋果手機");
        items_2.setPrice(5000f);
        items_2.setDetail("iphone6plus蘋果手機!");

        itemsList.add(items_1);
        itemsList.add(items_2);
        // 創建modelAndView準備填充數據、設置視圖
        ModelAndView modelAndView = new ModelAndView();
        // 填充數據
        modelAndView.addObject("itemsList", itemsList);
        // 視圖
        modelAndView.setViewName("order/itemsList");
        return modelAndView;
    }
}

  配置處理器

1 <bean name="/items1.action" id="itemList1" class="com.luchao.controller.ItemList1"/>

 

  • 配置視圖解析器
1 <!-- 視圖解析器 -->
2     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
3         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
4         <property name="prefix" value="/WEB-INF/jsp/"/>
5         <property name="suffix" value=".jsp"/>
6     </bean>

  如果不使用視圖解析器,那麼上面控制器代碼中需要指定具體的視圖名稱,如:modelAndView.setViewName("/WEB-INF/jsp/order/itemsList.jsp");可見使用視圖解析器可以增加其靈活性。

  • 視圖代碼

 

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
 5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 6 <html>
 7 <head>
 8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 9 <title>查詢商品列表</title>
10 </head>
11 <body>
12 商品列表:
13 <table width="100%" border=1>
14 <tr>
15     <td>商品名稱</td>
16     <td>商品價格</td>
17     <td>商品描述</td>
18 </tr>
19 <c:forEach items="${itemsList }" var="item">
20 <tr>
21     <td>${item.name }</td>
22     <td>${item.price }</td>
23     <td>${item.detail }</td>
24 </tr>
25 </c:forEach>
26 
27 </table>
28 </body>
29 </html>

  上面控制器實現了controller介面,才能由org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter適配器執行。並且上面的處理器映射器為org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,這是一種根據Url的名字找到處理器。如上:items1.action對應了com.luchao.controller.ItemList1這個處理類。

  另一種簡單的處理器映射器:org.springframework.web.servlet.handler.SimpleUrlHandlerMapping其配置如下:

  • 處理器映射器配置
1 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
2         <property name="mappings">
3             <props>
4                 <prop key="/items1.action">itemList1</prop>
5                 <prop key="/items2.action">itemList2</prop>
6             </props>
7         </property>
8 </bean>

  如果處理器實現了HttpRequestHandler,那麼則需要使用org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter適配器。

  • 處理器適配器配置
1 <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
  • 處理器代碼
 1 public class ItemList2 implements HttpRequestHandler {
 2     @Override
 3     public void handleRequest(HttpServletRequest request,
 4             HttpServletResponse response) throws ServletException, IOException {
 5         // 商品列表
 6         List<Items> itemsList = new ArrayList<Items>();
 7 
 8         Items items_1 = new Items();
 9         items_1.setName("技嘉筆記本");
10         items_1.setPrice(6000f);
11         items_1.setDetail("P35K V3筆記本電腦!");
12 
13         Items items_2 = new Items();
14         items_2.setName("蘋果手機");
15         items_2.setPrice(5000f);
16         items_2.setDetail("iphone6plus蘋果手機!");
17 
18         itemsList.add(items_1);
19         itemsList.add(items_2);
20         // 填充數據
21         request.setAttribute("itemsList", itemsList);
22         //視圖
23         request.getRequestDispatcher("/WEB-INF/jsp/order/itemsList.jsp").forward(request, response);
24     }
25 }

  //使用此方法可以通過修改response,設置響應的數據格式,比如響應json數據

1 response.setCharacterEncoding("utf-8");
2 
3 response.setContentType("application/json;charset=utf-8");
4 
5 response.getWriter().write("json串");

  因為處理器有不同的實現,所以需要通過適配器來滿足其處理的需求,這是一種適配器模式的經典實現。

  • 使用註解來實現

  註解處理器映射器和註解處理器適配器配置:

1 <!--註解映射器 -->
2 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
3 <!--註解適配器 -->
4 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

  一般中開發中使用

1 <mvc:annotation-driven/>

  使用 mvc:annotation-driven代替上邊註解映射器和註解適配器配置,mvc:annotation-driven預設載入很多的參數綁定方法,比如json轉換解析器就預設載入了,如果使用mvc:annotation-driven不用配置上邊的RequestMappingHandlerMappingRequestMappingHandlerAdapter,實際開發時使用mvc:annotation-driven。

  另外還需要掃描包來載入處理器,配置如下:

1 <!-- 掃描controller註解,多個包中間使用半形逗號分隔 -->
2 <context:component-scan base-package="com.luchao.controller"/>
  • 處理器代碼

 

 1 @Controller
 2 public class ItemList3 {
 3     // 商品查詢列表
 4     // @RequestMapping實現 對queryItems方法和url進行映射,一個方法對應一個url
 5     // 一般建議將url和方法寫成一樣
 6     @RequestMapping("/items3")
 7     public ModelAndView queryItems() throws Exception {
 8 
 9         // 調用service查找 資料庫,查詢商品列表,這裡使用靜態數據模擬
10         List<Items> itemsList = new ArrayList<Items>();
11         // 向list中填充靜態數據
12         Items items_1 = new Items();
13         items_1.setName("技嘉筆記本");
14         items_1.setPrice(6000f);
15         items_1.setDetail("P35K V3筆記本電腦!");
16 
17         Items items_2 = new Items();
18         items_2.setName("蘋果手機");
19         items_2.setPrice(5000f);
20         items_2.setDetail("iphone6plus蘋果手機!");
21 
22         itemsList.add(items_1);
23         itemsList.add(items_2);
24 
25         // 返回ModelAndView
26         ModelAndView modelAndView = new ModelAndView();
27         // 相當 於request的setAttribut,在jsp頁面中通過itemsList取數據
28         modelAndView.addObject("itemsList", itemsList);
29 
30         // 指定視圖
31         modelAndView.setViewName("order/itemsList");
32 
33         return modelAndView;
34 
35     }
36 }

  以上就是註解和非註解的幾種實現,其實還可以根據實際需要來實現其他的處理器映射器和處理器適配器。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DataTable dtPCI = dtblSourceData.DefaultView.ToTable(true, new string[] { "Server Cell PCI" }); 根據現有 DataView 中的行,創建並返回一個新的 DataTable。 命名空間:System.Dat ...
  • 第一個NhIbernate程式 1、目的: a) 鏈接到oracle資料庫 b) 增刪改 c) 基本查詢、sql查詢 d) 視圖查詢 e) 使用存儲過程 f) 多表查詢、級聯查詢 g) 級聯增刪改 2、後續目的 a) 載入機制——立即載入or延遲載入 b) 併發控制 c) 緩存——一級緩存,二級緩存 ...
  • 學WinForm也就半年,然後轉到WPF,還在熟悉中。最近拿到一個任務:從PropertyGrid控制項,輸出內容到Word。難點有: 一.PropertyGrid控制項是WinForm控制項,在WPF中並不能直接從工具箱獲得,或者直接在XMAL中聲明使用。 如要使用,需要使用WindowFormHost ...
  • 整理了一下ASP.NET Web.config配置文件的基本使用方法。很適合新手參看,由於Web.config在使用很靈活,可以自定義一些節點。所以這裡只介紹一些比較常用的節點。 <?xml version="1.0"?> <!--註意: 除了手動編輯此文件以外,您還可以使用 Web 管理工具來配置 ...
  • 我們真的需要一次一次的讀配置嗎 1. 通過配置文件,我們其實極大地優化了代碼的結構,很多易變的元素都可以通過配置來修訂. 2. 配置文件是一個文件,那麼使用的時候不可避免的涉及到IO操作. 3. 在內存不值錢的今天,我們到底是讀內存快還是讀文件快? 4. 電腦存儲交互的情況下,不是也有緩存的結構嗎? ...
  • 問題:如何通過JS獲取列表中所選記錄信息? 解決辦法: The CRM2011 Ribbon has a special set of parameters called 'CrmParameters' that provide information about the current sessi ...
  • 1、介紹的內容 1、感謝園友的文章支持 by 李永京 by wolfy 2、Nhibernate的框架介紹 3、Nhibernate的架構介紹 4、Nhibernate映射方法介紹(該點自己也存在一定的疑問,如果有知道的園友請指正) 2、參考文章 由於英語一向都不太好,雖然最近在改進ing,可是讓我 ...
  • 聲明:本系列為原創,分享本人現用框架,未經本人同意,禁止轉載!http://yuangang.cnblogs.com 希望大家好好一步一步做,所有的技術和項目,都毫無保留的提供,希望大家能自己跟著做一套,還有,請大家放心,只要大家喜歡,有人需要,絕對不會爛尾,我會堅持寫完~ 如果你感覺文章有幫助,點 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...