1. 程式人生 > >Java springmvc web專案,基於maven的hello world入門級專案使用IntelliJ IDEA 2017版本

Java springmvc web專案,基於maven的hello world入門級專案使用IntelliJ IDEA 2017版本

主要是告訴你:
怎麼使用IntelliJ IDEA編輯器;怎麼自己新建tomcat伺服器;怎麼把伺服器跑起來;
簡單的瞭解一下什麼是maven,什麼是倉庫,怎麼配置倉庫位置,如何使用國內的映象倉庫。等等吧。
那個算是最簡單的框架啦,基本所有的web專案都是這麼個套路,
現在,也就對那個簡單的專案稍微擴充套件一下,帶上springMVC框架,當然了,雖然帶上了springMVC框架,也還是很簡單的一個Java web maven專案。
九層之臺,起於壘土。還是一步步學習,慢慢的來嘛。
至於前面的新建個web專案的步驟,我就不贅述了,跟前面那個簡單web例子是一模一樣的。
就說下不同的地方:
先看下面的2個專案的目錄不同,除了你要新建這麼幾個目錄以外,還得簡單幾步的設定。


請注意:

上圖的右半部分是我們下面要建立的springMVC專案的超簡單的專案的目錄結構。和下面的那些個單獨的檔案是對應的上的。

之所以和左邊的那個放在一起,是為了做對比,對比,這個springmvc專案,比之前那個自動生成的Java web專案之間的目錄差別。

簡單描述下目錄結構:

有controller層,前臺URL的對映關係,都在這個controller層處理。

有dao層,訪問資料庫,一般的crud都是在這寫

有service層,一般的服務端的業務邏輯都是在service層,可以通用的方法都在這地方。

有前臺頁面views下面的都是前臺頁面的jsp,下面可以看到根據返回的ModelAndView型別,來繫結到對應的前臺頁面

有spring的配置spring-servlet.xml,spring配置相關的設定,掃描哪個目錄下的檔案註解等的設定

有web專案必備的web.xml 。。。。

有maven專案必備的pom.xml,存放的是專案所需的jar包依賴,以及專案打包所需的一些配置相關

有web專案必備的target資料夾,是專案打包自動生成的目錄。

有test目錄,這個也是專案的測試目錄,一些測試程式碼就是在這資料夾下寫的。


至於為什麼這麼做,看下面連結的解釋:

注意:

上面的那個必須看,不然你都不知道怎麼新建個Java檔案。設定一下所有的目錄的不同功能。

好,準備工作就緒,那麼就開幹了。看程式碼,至於整個專案的目錄結構,在上面的對比圖裡面已經看過了,這就不再重複上圖啦。
大致看一下,整個簡單的專案都用到了什麼jar包,也就是了解下maven依賴。
最好看下上面說的那個簡單Java web maven專案的那一篇文章,因為,裡面說了如何使用國內的映象倉庫,maven下載jar包的時候,速度就快很多。
先是pom.xml檔案

,如下:

pom.xml檔案中包含spring mvc依賴及為編寫jsp檔案提供支援的taglib相關依賴

<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>lxk</groupId>
    <artifactId>springMVC</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>springMVC Maven Webapp</name>
    <url>http://maven.apache.org</url>

    <properties>
        <org.springframework-version>4.1.4.RELEASE</org.springframework-version>
    </properties>

    <dependencies>
        <!-- Spring MVC support -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>

        <!-- Tag libs support for view layer -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
            <scope>runtime</scope>
        </dependency>

        <!-- junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <build>
        <finalName>springMVC</finalName>
    </build>
</project>
因為這個專案太簡單,所以,這個pom.xml檔案裡面的配置也很簡單。可以參考下面連結的一篇文章瞭解到基本所有的標籤的作用。
哎,不要嫌囉嗦,你可以全文搜尋你要了解的標籤,又不是讓你全部看一遍。對不對嘛。我就不解釋標籤的作用啦。
pom.xml配置檔案中所有標籤及作用簡單描述

因為我在之前,轉載過一篇,關於springmvc的各個jar包之間的maven依賴關係,具體連結如下:

上面的pom.xml檔案裡面引入的jar包依賴就有冗餘。

此文中詳細描述了各個jar包之間的依賴關係,那麼,我上面的pom.xml裡面對springmvc的依賴匯入,就有一個是多餘的啦,就那個spring-web,這個jar包啦。spring-webmvc這個jar包是依賴spring-web的,所以,maven會自動新增這個jar的,所以,你就不需要自己宣告引入jar依賴啦。

前提是你知道他們之間的關係,你才知道哪個可以寫,哪個不用寫。一般我看到的,基本都是隨意的引入,不需要考慮,那樣的話,你的pom.xml檔案裡面的dependency標籤會很多,起碼,我看很多人在示範這個springmvc框架,構建專案的時候,pom檔案可是相當可觀的,估計自己都不知道引入那麼多有啥用。

所以,你可以把上面的那個多餘的jar包給刪除了。專案還是會正常的跑起來的。

再看一下,所有依賴的jar包,都使用了些什麼jar包。


下面就該web.xml檔案的配置了(注意啦,這個自動生成的web.xml有點問題,看下面的修正。)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    <display-name>Archetype Created Web Application</display-name>

    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

修正:

這個web.xml,那個頭標籤那,我原來使用的是這個專案生成後自帶的,然後沒注意,導致bug啦。

直接自動生成的是下面這個樣子的,

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app id="WebApp_ID" 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>Archetype Created Web Application</display-name>

,這之後,就會在最後,訪問那個獲得學生的資料的頁面的時候,就沒資料。如下圖。

修正結束。


在配置中設定spring-servlet.xml的路徑

        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-servlet.xml</param-value>
        </init-param>
本來上面的這個是可以不用配置的,預設在/WEB-INF/自己找XXX--servlet.xml對應的配置檔案xxx對應為servlet的名字,我們也可以如上自己指定,

然後是servlet.xml的配置內容。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.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-3.0.xsd">

    <!-- 開啟spring的掃描注入,使用如下註解 -->
    <!-- @Component,@Repository,@Service,@Controller-->
    <context:component-scan base-package="com.lxk"/>

    <!-- 開啟springMVC的註解驅動,使得url可以對映到對應的controller -->
    <mvc:annotation-driven />

    <!-- 檢視解析 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>
<mvc:annotation-driven /> 這個預設就給容器注入了下面的2個bean,所以就不需要再次重複注入了
下面第一個行使得自動對映到對應的controller類上,再下一行是對映到方法上,缺一不可。
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
這個地方,有的人是不知道的。我看有的人的例子,這個地方就寫重複啦。

配置基本完成,從發出請求到controller,然後處理完,得到資料之後,再返回到瀏覽器頁面上,這麼個流程。

先看controller的程式碼。

package com.lxk.controller;

import com.lxk.service.StudentService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;

/**
 * Created by lxk on 2017/3/27
 */
@Controller
@RequestMapping("student")
public class StudentController {

    @Resource(name = "studentService")
    private StudentService studentService;

    //@ResponseBody(之前我因為加了這個註解,導致頁面訪問一直是406錯誤,註釋了就好啦,具體為啥我暫時還不知道)
    @RequestMapping(value = "/getAllStudent", method = RequestMethod.GET)
    public ModelAndView getAllStudent() {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("studentDisplay");
        mav.addObject("students", studentService.getAllStudent());
        return mav;
    }
}

下面是我補充的,上面註釋那行程式碼的原因。

然後是service

package com.lxk.service;

import com.lxk.dao.StudentDao;
import com.lxk.model.Student;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * Created by lxk on 2017/3/27
 */
@Service("studentService")
public class StudentService {

    @Resource(name = "studentDao")
    private StudentDao dao;

    public List<Student> getAllStudent() {
        return dao.findAll();
    }
}
然後是dao,這個地方,為了簡單,沒有去訪問資料庫,而是直接返回了個list集合。還請見諒。
package com.lxk.dao;

import com.lxk.model.Student;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by lxk on 2017/3/27
 */
@Repository("studentDao")
public class StudentDao {

    public List<Student> findAll() {
        List<Student> all = new ArrayList<Student>();
        all.add(new Student("1", "tom", 18, true));
        all.add(new Student("2", "cat", 28, true));
        all.add(new Student("3", "lxk", 18, true));
        all.add(new Student("4", "cms", 18, true));
        return all;
    }
}
最後,是我們使用的Java model bean的程式碼
package com.lxk.model;

import java.io.Serializable;

/**
 * Created by lxk on 2017/3/27
 */
public class Student implements Serializable {
    private String id;
    private String name;
    private int age;
    private boolean sex;


    public Student() {
    }

    public Student(String id, String name, int age, boolean sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    
    getter and setter,直接複製程式碼的老鐵,知道什麼叫getter和setter嗎?我為了省篇幅,這沒寫,我這句話不註釋掉,你直接複製肯定報錯。 
    ......
}
這地方有需要注意的地方:你重寫了一個model bean的構造方法,那麼他的無參建構函式就不見了,所以,你最好。
哦,不,為了省去不必要的麻煩,你必須給他加上預設的建構函式。因為,在這使用的簡單,請求都是不帶引數的。
專案複雜了,是會帶model bean型別的引數的,那麼可能就會因為物件初始化失敗而報錯。可能你排錯都得整半天,都不知道錯在哪,一直請求400錯誤碼。

現在後臺完事了,那麼就該前臺的jsp程式碼了,不要嫌棄,為什麼還在使用jsp當前臺,學習嘛。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>Spring MVC Hello World</title>
</head>

<body>
	<h2>All Students in System</h2>

	<table border="1">
		<tr>
			<th>Id</th>
			<th>Name</th>
			<th>Age</th>
			<th>Sex</th>
		</tr>
		<c:forEach var="student" items="${students}">
			<tr>
				<td>${student.id}</td>
				<td>${student.name}</td>
				<td>${student.age}</td>
				<td>${student.sex}</td>
			</tr>
		</c:forEach>
	</table>

</body>
</html>
這個jsp頁面也是有個地方需要注意的,對就是亂碼的問題。因為你不設定一下jsp頁面的編碼格式,漢字就會顯示為???很多個問號。
我看其他人做測試的時候,都沒遇到,也就不會考慮這個問題啦。因為溼胸我出過這個bug,所以,深切知道這個問題的重要性,
誰讓計算機不是中國人發明的呢,所以,就會莫名其妙的出現編碼問題的bug,比如我最近的編碼bug就是log4j日誌輸出到檔案所有漢字都變問號了。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
另外,jsp頁面上使用的就是jstl標籤啦。也就是個簡單的foreach迴圈,雷同Java的foreach迴圈。簡單理解一下就OK拉。

現在,前後臺的程式碼,算是都敲完了,該配置個tomcat伺服器,跑起來這個Java web專案。具體配製流程,我也不上圖啦,我在此文一開始的時候,附的那個連結
詳細的記錄瞭如何配置啟動一個tomcat。當你按照那個配置完成之後,直接啟動tomcat,會跳到hello world頁面,然後你再輸入如下URL
http://localhost:8080/lxk/student/getAllStudent
就可以看到如下的執行結果啦。


至此,這個算是極其簡單的spring mvc專案算是從頭到尾的示範完了。遺憾的是,這個專案還是太簡單了,還是麼有使用到資料庫,比如mongo DB。
也沒有使用到JavaScript,jQuery,ajax,而且後臺程式碼也是超級簡單。也沒有使用到配置檔案,而且使用的前臺頁面也是不符合實際開發要求的。
所以,還是不行的。
所以,還是可以繼續複雜起來的。路漫漫其修遠兮吾將上下而求索。留待溼胸我慢慢整理吧。
雖然這一篇,還是水的不行。當然,還是希望各位,不嫌棄麻煩的,點個贊啥的。也是極好的。

後面我又多方試探,發現,pom.xml檔案還是可以繼續精簡的。那個依賴可以直接只要下面2個依賴就可以了。

其他的都是多餘的。

    <dependencies>
        <!-- Spring MVC support -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>

        <!-- Tag libs support for view layer -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
            <scope>runtime</scope>
        </dependency>

    </dependencies>
就這2個jar包就夠用了。

想不想看看,現在這個maven專案的所有jar包的依賴關係呢?

看圖。


好,這個就是現在的修改過,去掉多餘的jar包之後的maven jar 包依賴關係圖。

注意:

理論上講,你先建立個maven版本的Java web專案,我的文章開頭的那個連結就是啦。那個建立完畢,你的就算是個web專案啦,當然,是個很簡單的骨架級專案。

然後再根據這篇文章,把springmvc的東西新增進去。

理論上講,是不建議使用我下面提供的雲盤的原始碼的,參考倒是可以滴。

為了方便小夥伴們,我就把這個放在雲盤上了,

連結:http://pan.baidu.com/s/1hrHhQoG 密碼:edsf

當你下載下來之後,除了簡單的配置下tomcat之後,

jdk相關的報錯的,可以參考下面的幾個設定jdk的地方的圖

還有要配置幾個jdk版本的地方。估計新手,不一定很快的搞定這個問題,我就再附上幾張圖。





有些是已經自動給設值了,但是也可能有些還得手動配置下。