如何用Java類配置Spring MVC(不通過web.xml和XML方式)

来源:http://www.cnblogs.com/chry/archive/2016/12/31/6239510.html
-Advertisement-
Play Games

DispatcherServlet是Spring MVC的核心,按照傳統方式, 需要把它配置到web.xml中. 我個人比較不喜歡XML配置方式, XML看起來太累, 冗長繁瑣. 還好藉助於Servlet 3規範和Spring 3.1的功能增強, 可以採用一種全新的,更簡潔的方式配置Spring M ...


DispatcherServlet是Spring MVC的核心,按照傳統方式, 需要把它配置到web.xml中. 我個人比較不喜歡XML配置方式, XML看起來太累, 冗長繁瑣. 還好藉助於Servlet 3規範和Spring 3.1的功能增強, 可以採用一種全新的,更簡潔的方式配置Spring MVC了. 下麵按這種方式一個Hello World的MVC配置.

Step 1:先用eclipse創建一個Maven的WEB工程. pom.xml文件如下:

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 2   <modelVersion>4.0.0</modelVersion>
 3   <groupId>ocr</groupId>
 4   <artifactId>ocr</artifactId>
 5   <version>0.0.1-SNAPSHOT</version>
 6   <packaging>war</packaging>
 7 
 8     <properties>
 9         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
10         <javaee-api.version>7.0</javaee-api.version>
11         <spring.version>4.2.0.RELEASE</spring.version>
12         <junit.version>4.12</junit.version>
13     </properties>
14 
15     <dependencies>
16          <dependency>
17               <groupId>javax</groupId>
18               <artifactId>javaee-api</artifactId>
19               <version>${javaee-api.version}</version>
20         </dependency>
21         <dependency>
22                 <groupId>junit</groupId>
23                 <artifactId>junit</artifactId>
24                 <version>${junit.version}</version>
25         </dependency>
26         <dependency>
27             <groupId>org.springframework</groupId>
28             <artifactId>spring-context</artifactId>
29             <version>${spring.version}</version>
30         </dependency>
31         <dependency>
32             <groupId>org.springframework</groupId>
33             <artifactId>spring-aop</artifactId>
34             <version>${spring.version}</version>
35         </dependency>
36         <dependency>
37             <groupId>org.springframework</groupId>
38             <artifactId>spring-webmvc</artifactId>
39             <version>${spring.version}</version>
40         </dependency>
41         <dependency>
42             <groupId>org.springframework</groupId>
43             <artifactId>spring-web</artifactId>
44             <version>${spring.version}</version>
45         </dependency>
46 
47         <dependency>
48             <groupId>javax.servlet</groupId>
49             <artifactId>jstl</artifactId>
50             <version>1.2</version>
51         </dependency>
52 
53         <dependency>
54             <groupId>commons-logging</groupId>
55             <artifactId>commons-logging</artifactId>
56             <version>1.1.3</version>
57         </dependency>
58     </dependencies>
59 
60 
61     <build>
62         <plugins>
63             <plugin>
64                 <artifactId>maven-compiler-plugin</artifactId>
65                 <version>3.3</version>
66                 <configuration>
67                     <source>1.7</source>
68                     <target>1.7</target>
69                 </configuration>
70             </plugin>
71             <plugin>
72                 <artifactId>maven-war-plugin</artifactId>
73                 <version>2.6</version>
74                 <configuration>
75                     <warSourceDirectory>WebContent</warSourceDirectory>
76                     <failOnMissingWebXml>false</failOnMissingWebXml>
77                 </configuration>
78             </plugin>
79         </plugins>
80     </build>
81 </project>

Step 2: 配置DispatcherServlet. 需要創建一個Web初始化類OcrWebAppInitializer, 繼承自AbstractAnnotationConfigDispatcherServletInitializer

 1 package com.chry.ocr.config;
 2 
 3 import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
 4 
 5 public class OcrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
 6 
 7     @Override
 8     protected Class<?>[] getRootConfigClasses() {
 9         return new Class<?>[] { RootConfig.class };
10     }
11 
12     @Override
13     protected Class<?>[] getServletConfigClasses() {
14         return new Class<?>[] { WebConfig.class };        //ָ指定Web配置類
15     }
16 
17     @Override
18     protected String[] getServletMappings() {    //將DispatcherServlet映射到"/"
19         return new String[] { "/" };
20     }
21 
22 }

Step 3: 配置Spring MVC視圖解析WebConfig.java, 需要要創建一個類繼承自WebMvcConfigurerAdapter

 1 package com.chry.ocr.config;
 2 
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.context.annotation.ComponentScan;
 5 import org.springframework.context.annotation.Configuration;
 6 import org.springframework.web.servlet.ViewResolver;
 7 import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
 8 import org.springframework.web.servlet.config.annotation.EnableWebMvc;
 9 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
10 import org.springframework.web.servlet.view.InternalResourceViewResolver;
11 
12 @Configuration
13 @EnableWebMvc                                //啟動SpringMVC
14 @ComponentScan("com.chry.ocr.controller")            //啟動組件掃描
15 public class WebConfig extends WebMvcConfigurerAdapter {
16 
17     //配置JSP視圖解析器
18     @Bean
19     public ViewResolver viewResolver() {
20         InternalResourceViewResolver resolver = new InternalResourceViewResolver();
21         resolver.setPrefix("WEB-INF/views/");
22         resolver.setSuffix(".jsp");
23         resolver.setExposeContextBeansAsAttributes(true);
24         return resolver;
25     }
26     
27     //配置靜態資源的處理
28     @Override
29     public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
30         configurer.enable();        //對靜態資源的請求轉發到容器預設的servlet,而不使用DispatcherServlet
31     }
32     
33 }

Step 4: 配置RootConfig.java

 1 package com.chry.ocr.config;
 2 
 3 import org.springframework.context.annotation.ComponentScan;
 4 import org.springframework.context.annotation.ComponentScan.Filter;
 5 import org.springframework.context.annotation.Configuration;
 6 import org.springframework.context.annotation.FilterType;
 7 import org.springframework.web.servlet.config.annotation.EnableWebMvc;
 8 
 9 @Configuration
10 @ComponentScan( basePackages={"com.chry.ocr"}, 
11                 excludeFilters = { @Filter(type=FilterType.ANNOTATION,value=EnableWebMvc.class)}
12               )
13 
14 public class RootConfig {
15 
16 }

至此, 傳統方式中需要通過web.xml進行配置的東西就已將全部完成有上面三個java類(OcrWebAppInitializer, RootConfig, WebConfig)完成. 可以開始寫Controller和頁面代碼了

Step 5: 編寫一個HomeController.java, 它將輸出"hello World from Spring MVC"到home.jsp頁面

 1 package com.chry.ocr.controller;
 2 
 3 import static org.springframework.web.bind.annotation.RequestMethod.*;
 4 import org.springframework.stereotype.Controller;
 5 import org.springframework.web.bind.annotation.RequestMapping;
 6 import org.springframework.web.bind.annotation.RequestMethod;
 7 import org.springframework.web.servlet.ModelAndView;
 8 
 9 @Controller
10 public class HomeController {
11     @RequestMapping(value = "/", method=GET)
12     public ModelAndView home() {
13         String message = "Hello world from Spring MVC";
14         return new ModelAndView("home", "message", message);
15     }
16 }

Step 6: 編寫一個jsp頁面, 按照我們在視圖解析器和Controller裡面的配置,放在WEB-INF/views/home.jsp中

 1 <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="UTF-8"%>
 2 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 3 <html>
 4 <head>
 5 <title>Spring MVC Tutorial chry</title>
 6 <style type="text/css">
 7 </style>
 8 </head>
 9 <body>
10     <br>
11     <div style='text-align:center;'>
12         ${message}
13     </div>
14 </body>

Step 7: 至此所有工作完成, 使用maven的"clean install"選項進行編譯打包後,在執行,訪問http://localhost:8080即可. 頁面效果和工程結構如下,工程裡面沒有web.xml


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

-Advertisement-
Play Games
更多相關文章
  • 1. 適用場景 實現條件的過濾和查詢等功能。 2. 說明 跟SQL語句中的where作用相似,都起到了範圍的限定即過濾的作用,而判斷條件是緊跟後面的條件子句。where主要分為三種形式:簡單形式、條件形式、First()形式,下麵分別舉例測試一下: 2.1 簡單形式 例如:查詢在倫敦購買的訂單。 例 ...
  • 純粹是記錄一下自己在剛開始使用的時候遇到的一些坑,以及自己是怎樣通過配合redis來解決問題的。文章分為三個部分,一是怎樣跑起來,並且怎樣監控相關的隊列和任務;二是遇到的幾個坑;三是給一些自己配合redis使用的代碼示例。 一.celery使用: Ⅰ.把任務中間件伺服器跑起來,rabbitmq-se ...
  • Input 輸入數據首先包括一個整數C,表示測試實例的個數,每個測試實例的第一行是一個整數N(1 <= N <= 100),表示數塔的高度,接下來用N行數字表示數塔,其中第i行有個i個整數,且所有的整數均在區間[0,99]內。 Output 對於每個測試實例,輸出可能得到的最大和,每個實例的輸出占一 ...
  • 在學習CGlib動態代理時,遇到如下錯誤: Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V 經過百度上尋找答案,是jar包衝突導致,解決方案: 把cgli ...
  • 今天學習主要內容: Python: 1、with語句(補充昨天的文件操作) 用with打開的文件在腳本結束會自動關閉,以防普通打開方式忘記關閉文件連接 語法: with open("demo.txt","r",encoding="utf-8") as file: for line in file: ...
  • JVM的類載入機制就是:JVM把描述類的class文件載入到記憶體,並對數據進行校驗、轉換解析和初始化,最終形成可以被JVM直接使用的Java類型 ...
  • 假設網站A有以下功能需求:1,pc端微信掃碼登錄;2,微信瀏覽器中的靜默登錄功能需求,這兩種需求就需要用到用戶的unionID,這樣才能在多個登錄點(終端)識別用戶。那麼這兩種需求下用戶的unionID該如何獲取呢? 1,先看pc端的解決方案 以snsapi_login為scope發起網頁授權,先拿 ...
  • 攔截導彈動態規劃問題 某國為了防禦敵國的導彈襲擊,發展出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈。 輸入導彈 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...