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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...