Java Spring MVC入門(四)使用Maven創建項目


  使用普通方式創建項目的問題                                        

   前幾篇文章中,我們使用普通方法在eclispe上創建了項目,並成功的運行了helloworld文件,那么普通方法創建的項目在多人協作開發項目的時候,可能會有下面問題

   1、多人協作時候各成員所使用的jar包版本可能不一致,比如:張三下載的版本是3.2,而李四下載的版本是4.2 ,服務器上的版本是4.3,這樣可能導致在本地運行正常,而在服務器上運行卻有可能出現問題。

   2、需要從網上去搜索自己所需要的依賴包,如果想要團隊協作保證各個成員的jar包保持一致,需要來回的拷貝jar包。

  什么是Maven                                                          

  普通方式創建項目有上面所說的不足之處,還好我們有Maven可以解決上面的問題,那么什么Maven? (官網: http://maven.apache.org/index.html)

在這里我只能簡單的介紹,讓大家有個感性上的認識。

  Maven是一個管理項目的工具,可以方便的管理項目的jar包依賴、測試、編譯、打包、發布。

  1、管理jar包依賴

    這個功能可能是Maven最突出的特點,大家不用再去網上單獨下載jar包,而是在pom.xml里配置jar包的依賴關系,具體看下面例子:

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>3.2.4.RELEASE</version>
</dependency>
<!-- Spring的核心工具包,其他包依賴此包 -->
<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>3.2.4.RELEASE</version>
</dependency>

   大致解釋下幾個配置項的意思:

  groupId:所述的項目名稱,由於有的項目並不是一個jar包構成的,而是由很多的jar包組成的。因此這個groupId就是整個項目的名稱。

  artifactId:包的名稱。

  version:版本號。

  packaging:包的類型,一般都是jar,也可以是war之類的。如果不填,默認就是jar。

  大家可以看到每個jar包配置項內都有版本號,這樣團隊開發時候大家只要保證pom.xml一致,那么Maven就會自動下載pom.xml配置項內的包,這樣既不用自己下載,又保證了團隊內各個成員下載jar包的版本都一樣。

  2、其他功能

    Maven除了管理依賴包之外,還可以編譯、測試、打包項目,具體命令如下:   

mvn archetype:create 創建Maven項目
mvn compile 編譯源代碼
mvn deploy 發布項目
mvn test-compile 編譯測試源代碼
mvn test 運行應用程序中的單元測試
mvn site 生成項目相關信息的網站
mvn clean 清除項目目錄中的生成結果
mvn package 根據項目生成的jar
mvn install 在本地Repository中安裝jar
mvn eclipse:eclipse 生成eclipse項目文件
mvn jetty:run 啟動jetty服務
mvn tomcat:run 啟動tomcat服務
mvn clean package -Dmaven.test.skip=true:清除以前的包后重新打包,跳過測試類

    如果想要更加深入了解Maven請看:

   maven學習(上)- 基本入門用法 

    maven學習(中)- 私服nexus搭建 

    maven學習(下)利用Profile構建不同環境的部署包

 

  Eclipse建立Maven項目                                           

  1、打開eclispe 選擇Fire-> New -> Maven Project
 
2、在彈框內填寫選項
 

GroupID是項目組織唯一的標識符,實際對應JAVA的包的結構,是main目錄里java的目錄結構。

ArtifactID就是項目的唯一的標識符,實際對應項目的名稱,就是項目根目錄的名稱。

Version是版本號,這個自己寫了。

填寫完成點擊“Finish”。項目建好之后如下:
到這里項目已經基本成型,但是還沒有完成,還要稍做配置,我們首先右擊項目名->Build Path ->Configure Build Path..
 
把兩個"missing"的項"Remove"掉,之后點"OK"。之后右擊Java Resources -> New -> Source Folder
 
新增Source Folder
建立三個Source Folder
src/main/java
src/test/java
src/test/resources
完成之后如下:
之后再進入Java Build Path->Libraries標簽,選中 JRE System Library[J2SE-1.5],點擊 Edit 
選擇下圖選項:
 
接下來還要處理下排列順序,進入Java Build path ->Order and Export
利用"Up" 和 "Down"將順序調整成和上圖一樣。
 最后還要設置部署程序集,右鍵項目名->Properties->Deployment Assembly,

此處列表是,部署項目時,文件發布的路徑。

 我們刪除test的兩項,因為test是測試使用,並不需要部署。見下圖:

 
完成之后應該是下面這樣
OK,終於完成了。

  配置文件pom.xml                                        

   主要是要配置spring框架的一些依賴包,再就是和數據庫相關的包,具體內容如下:
<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>com.mavenPro</groupId>
  <artifactId>demo</artifactId>
  <packaging>war</packaging>
  <version>1.0</version>
  <name>demo Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
      <!-- spring需要的jar包 -->
      <!-- Spring的面向切面編程,提供AOP(面向切面編程)的實現 -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>3.2.4.RELEASE</version>
    </dependency>
    <!-- Spring的核心工具包,其他包依賴此包 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>3.2.4.RELEASE</version>
    </dependency>
    <!-- 提供在基礎IOC功能上的擴展服務,此外還提供許多企業級服務的支持,有郵件服務、任務調度、JNDI定位,EJB集成、遠程訪問、緩存以及多種視圖層框架的支持。 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>3.2.4.RELEASE</version>
    </dependency>
    <!-- Spring context的擴展支持,用於MVC方面 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>3.2.4.RELEASE</version>
    </dependency>
    <!-- Spring提供的對AspectJ框架的整合 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>3.2.4.RELEASE</version>
    </dependency>
    <!-- 整合第三方的orm實現,如hibernate,ibatis,jdo以及spring 的jpa實現 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>3.2.4.RELEASE</version>
    </dependency>
    <!-- 對JDBC 的簡單封裝 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>3.2.4.RELEASE</version>
    </dependency>
    <!-- 為簡化jms api的使用而做的簡單封裝 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jms</artifactId>
        <version>3.2.4.RELEASE</version>
    </dependency>
    <!-- 包含SpringMVC框架相關的所有類。包含國際化、標簽、Theme、視圖展現的FreeMarker、JasperReports、Tiles、Velocity、XSLT相關類。當然,如果你的應用使用了獨立的MVC框架,則無需這個JAR文件里的任何類。 -->
       <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>3.2.4.RELEASE</version>
    </dependency>
    <!-- 安全相關(待驗證) -->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-ldap</artifactId>
        <version>3.2.4.RELEASE</version>
    </dependency>
    <!-- 對JUNIT等測試框架的簡單封裝 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>3.2.4.RELEASE</version>
        <scope>provided</scope>
    </dependency>
    <!-- 使用 ehcache-spring-annotations 使得在工程中簡單配置即可使用緩存   http://www.tuicool.com/articles/reuQvmn -->
    <dependency>
        <groupId>com.googlecode.ehcache-spring-annotations</groupId>
        <artifactId>ehcache-spring-annotations</artifactId>
        <version>1.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-mongodb</artifactId>
        <version>1.5.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>1.2.0.RELEASE</version>
    </dependency>
    
    <!-- servlet依賴 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
    </dependency>
    
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>mavenDemo</finalName>
  </build>
</project>

文件里有一些注釋,初學者先大致了解,今后會詳細介紹。

  配置文件web.xml                                           

 
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>demo</display-name>
    
    <!-- 
        該元素用來聲明應用范圍(整個WEB項目)內的上下文初始化參數 ,這里是加載spring的配置文件 
        context-param 可以有多個,這里只介紹contextConfigLocation,作用是加載spring的配置文件
        這里我曾經遇到一個坑,這里說出來告訴大家。
            大家先看<servlet>內有個<init-param>里面也有一個<param-name>contextConfigLocation</param-name>配置
            於是我自作聰明把最外層的<context-param>刪除,只保留<servlet><init-param>內的配置,結果運行時候報錯說找不到classpath:demo-servlet.xml
            文件,此時系統會自動去找/WEB-INI/applicationContext.xml文件,此時文件是不存在的所以也報錯。
            切記:如果要用classpath方式去定位配置文件,文件路徑在最外層的配置一定要有,僅僅只寫servlet內的配置是無法找到的。如果最外層不想寫
            只在servlet標簽內定位spring配置文件,只能用/WEB-INI/文件名.xml這樣的方式。
        
        這里可以看到我們有兩個Spring 配置文件,一個是<context-param>里的<param-value>classpath:demo-root-serlvet.xml</param-value>
        一個是<servlet><init-param>內的<param-value>classpath:demo-servlet.xml</param-value>,這樣的目的是為了將配置文件分開,不同的配置放到不同的
        文件里,例如:數據庫配置可以放到單獨文件,AOP配置可以放到單獨文件里。demo-root-serlvet.xml里面可能包含了其他配置文件,這里我們僅僅作為演示,暫時為空。
    -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!-- 
            配置路徑方式有兩種,一種是將文件放到WEB-INF目錄下 parm-value的值為/WEB-INF/文件名.xml,另外一種是用classpath:文件名.xml
            文件放到/src/main/resources/下 
        -->
        <param-value>classpath:demo-root-servlet.xml</param-value>
    </context-param>
    
    <context-param>
        <param-name>log4jExposeWebAppRoot</param-name>
        <param-value>false</param-value>
    </context-param>
    <!-- character -->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <!-- spring mvc -->
    <servlet>
        <servlet-name>gameLiveServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:demo-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>gameLiveServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

注釋寫的有點多,大家要仔細看,這里重點說下我踩過的坑:

這里我曾經遇到一個坑,這里說出來告訴大家。
大家先看<servlet>內有個<init-param>里面也有一個<param-name>contextConfigLocation</param-name>配置 於是我自作聰明把最外層的<context-param>刪除,只保留<servlet><init-param>內的配置,
結果運行時候報錯說找不到classpath:demo-servlet.xml文件,此時系統會自動去找/WEB-INI/applicationContext.xml文件,
此時文件是不存在的所以也報錯。 切記:如果要用classpath方式去定位配置文件,文件路徑在最外層的配置一定要有,僅僅只寫servlet內的配置是無法找到的。如果最外層不想寫 只在servlet標簽內定位spring配置文件,只能用/WEB-INI/文件名.xml這樣的方式。

Spring容器加載web.xml的順序為context-param >> listener  >> fileter  >> servlet

  Spring配置文件                                       

   在上面的web.xml配置文件中我們有兩個Spring的配置文件,分別是/src/man/resources/demo-root-serlvet.xml 和/src/man/resources/demo-servlet.xml 

用classpath方式定位文件必須要放到/src/man/resources/下否則要放到/src/main/webapp/WEB-INF/ 路徑下。

      /src/man/resources/demo-root-servlet.xml 文件的主要用途為包含其他子配置文件,例如數據庫配置文件、AOP配置文件。

  /src/man/resources/demo-servlet.xml 文件主要是聲明一些本項目用到的bean。

 /src/man/resources/demo-root-servlet.xml 內容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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/util http://www.springframework.org/schema/util/spring-util-3.2.xsd 
    http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd" default-autowire="byName">
    <description>Spring公共配置</description>
    
    <!--  <import resource="classpath*:demo-db.xml"/> -->
</beans>

由於本次不涉及數據庫內容,所以我將引入數據配置文件內容注釋了。

/src/man/resources/demo-servlet.xml內容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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/util http://www.springframework.org/schema/util/spring-util-3.2.xsd 
    http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd" default-autowire="byName">
    
    <description>demo</description>
    <!-- 注冊Bean -->
    <bean id = "HelloWorld" class="com.demo.game.HelloWorld"> </bean>
</beans>

  Hello world                                        

   接下來我們就要寫hello world 了,先在/src/main/java里建立一個包,再包內建立一個文件HelloWorld

HelloWorld.java內容如下:

package com.demo.game;

import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

@Controller
public class HelloWorld {
    @RequestMapping("/hello")
    public void index(HttpServletRequest request, HttpServletResponse response) throws IOException {
        
        response.setHeader("content-type", "text/html;charset=UTF-8");
        response.getWriter().append("hello World");

    }
}

大家看到沒有demo-servlet.xml配置文件里有一句:

<bean id = "HelloWorld" class="com.demo.game.HelloWorld"> </bean>

將HelloWorld注冊為一個bean , 這樣就讓他由一個普通類變成控制器了,接下來我們啟動tomcat server ,再瀏覽器里輸入http://localhost:8080/demo/hello

忙活了半天,hello world終於出來了,終於有點小小成就感!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM