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版本的地方。估計新手,不一定很快的搞定這個問題,我就再附上幾張圖。
有些是已經自動給設值了,但是也可能有些還得手動配置下。