網頁

2018/3/9

在Eclipse使用Maven建立Spring MVC Web專案 2018

在Eclipse建立Spring Web專案by Maven

首先在Eclipse用Maven建立一個Web專案

然後接著要匯入Spring MVC所需的依賴函式庫(jar),本範例使用的是Spring MVC 4.3.14。

Maven Repository取得Spring MVC的dependency敘述如下,並複製到專案的pom.xml

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.14.RELEASE</version>
</dependency>

開啟專案的pom.xml並將以上貼入如下並存檔。

pom.xml

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>idv.matt</groupId>
  <artifactId>springmvc</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>springmvc Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.14.RELEASE</version>
    </dependency>
    
  </dependencies>
  <build>
    <finalName>springmvc</finalName>
  </build>
</project><!-- by肉豬 -->

接著Spring MVC所依賴的jar便會被下載到Maven Dependencies。



在使用Spring MVC前必須要在WEB-INF/web.xml設定DispatcherServlet的servlet mapping url如下。

web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
  <display-name>Spring MVC Project</display-name>

  <!-- Spring MVC DispatcherServlet -->
  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  
</web-app><!-- by肉豬 -->

DispatcherServlet<servlet-name>可以任意命名,範例為"dispatcher"。

依照Spring MVC的規則,其預設會尋找位在WEB-INF目錄下名為[servlet-name]-servlet.xml的檔案作為WebApplicationContext的來源。例如在此DispatcherServlet<servlet-name>為"dispatcher",所以Spring會去WEB-INF目錄下找dispatcher-servlet.xml的檔案,這個檔案即為Spring MVC的設定檔。

Upon initialization of a DispatcherServlet, Spring MVC looks for a file named [servlet-name]-servlet.xml in the WEB-INF directory of your web application and creates the beans defined there, overriding the definitions of any beans defined with the same name in the global scope.

DistacherServlet<url-pattern>的設定會決定有哪些request要交由DispatcherServlet來處理,若希望所有的request url都交由DispatcherServlet管理,則<url-pattern>應設為/

如果不想使用Spring MVC預設的配置檔規則名稱,則可透過在web.xml修改DispatcherServletcontextConfigLocation初始值,例如下面設定Spring將會去classpath下尋找spring-mvc.xml作為配置檔。

web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

  <display-name>Spring MVC Project</display-name>
  
  <!-- Spring MVC DispatcherServlet -->
  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  
</web-app><!-- by肉豬 -->

根據上面classpath的設定,又Maven的src/main/resources即為classpath,所以在src/main/resources下新增spring-mvc.xml



spring-mvc.xml基本設定如下。

spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc" 
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/mvc 
                           http://www.springframework.org/schema/mvc/spring-mvc.xsd
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/tx
                           http://www.springframework.org/schema/tx/spring-tx.xsd
                           http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop.xsd">
        
    
  <mvc:annotation-driven />
  <context:annotation-config/>
  <context:component-scan base-package="idv.matt.controller"/>
  
  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/view/" />
    <property name="suffix" value=".jsp" />
  </bean>
  
</beans><!-- by肉豬 -->

以上在本範例中只用到了beansmvccontext XML schema。至於txaop並沒有用到。

<mvc:annotation-driven />用來啟用Spring MVC的annotation配置,如此就能使用@Controller搭配@RequestMapping直接在Controller類別中設定請求所導向的資源。

<context:annotation-config/>則是啟用透過annotation的方式來注入bean。

<context:component-scan base-package="idv.matt.controller"/>設定哪些package中的類別會被掃描並註冊為bean。這邊設定掃描idv.matt.controller中有@Component的類別(@Controller其實也是@Component的一種。)

InternalResourceViewResolver是用來mapping從Controller返回jsp頁面的設定。prefix屬性為要mapping jsp檔案名稱的前墜,通常是放檔案路徑;suffix屬性為mapping檔案名稱的後墜,通常是放附檔名,例如.jsp

接著在src/main/java下新增idv.matt.controller.HelloWorldController.java,負責處理等一下傳來的http://localhost:8080/springmvc/hello請求。

HelloWorldController

package idv.matt.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloWorldController {
  
  @RequestMapping(value="/hello")
  public ModelAndView hello(){
    System.out.println("Hello World! Spring MVC");
    return new ModelAndView("helloworld"); // 根據ViewResolver的設定,會返回/WEB-INF/view/helloworld.jsp
  }
}

接著在WEB-INF目錄下建立一個view目錄,然後在view新增一個helloworld.jsp,為HelloWorldController.hello()所返回的view對象。

helloworld.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>HelloWorld</title>
</head>
<body>
  <h1>Hello World!! Spring MVC</h1>
</body>
</html>

以上便完成此範例的所有設定。接著啟動專案在瀏覽器位址輸入http://localhost:8080/springmvc/hello的結果如下。


專案的結構如下。



Spring MVC流程圖。

                                    +---------------+                         
                                    |Browser(Clinet)|                         
                                    +---------------+                         
                                          |    ^                              
       http://localhost:8080/springmvc/hello   |                              
                                          |    |                              
             +-Web Container(Tomcat)----- | -- | --------------------------+  
             |                            v    |                           |  
             | +---------------------DispatcherServlet-------------------+ |  
             | |                          |    ^                         | |  
             | | WebApplicationContext--- | -- | ----------------------+ | |  
             | | |                        |    |                       | | |  
             | | |             +----------+    +--------+              | | |  
             | | |             v                        |              | | |  
             | | |      +--------------+         +--------------+      | | |  
             | | |      |HandlerMapping|         |helloworld.jsp|      | | |  
             | | |      +--------------+         +--------------+      | | |  
             | | |             |                        ^              | | |  
             | | |             v                        |              | | |  
             | | |   +--------------------+       +------------+       | | |  
             | | |   |HelloWorldController+------>+ViewResolver|       | | |  
             | | |   +--------------------+       +------------+       | | |  
             | | +-----------------------------------------------------+ | |  
             | +---------------------------------------------------------+ |  
             +-------------------------------------------------------------+    


如果本篇對您有幫助還不吝幫忙點一下Google廣告,謝謝。


4 則留言:

  1. 大大您好:

    看了您的文章JAVA EE的SPRING順利見到在使用Spring MVC前必須要在WEB-INF/web.xml設定DispatcherServlet的servlet mapping url如下。

    但是我的web.xml是無法KEY的....不知道為什麼,謝謝

    回覆刪除
  2. @黃滋滋 您好,請問你用的是Eclipse IDE嗎?如果在Eclipse無法編輯web.xml,那你可以在workspace目錄中對應的專案路徑中找到web.xml,並用一般的文字編輯器如Notepad++編輯看看。

    回覆刪除
  3. 後來發現是一直在DESIGN模式~忘記切成SOURCE模式了..感謝

    回覆刪除
  4. 大大我上您的上一篇有看到[workspace]/HelloWorld/.setting/org.eclipse.wst.common.project.facet.core.xml。也須更新,但找不到此檔案~想求救~謝謝


    接著把Project Facets的Dynamic Web Module也改為3.1,但這邊要到Eclipse的workspace中的專案目錄的.setting目錄中找到org.eclipse.wst.common.project.facet.core.xml來修改,即[workspace]/HelloWorld/.setting/org.eclipse.wst.common.project.facet.core.xml。

    把org.eclipse.wst.common.project.facet.core.xml將的version改為3.1,修改後如下。

    回覆刪除