Springboot開發web項目


當前,Spring毫無疑問已經成為java后台對象管理標准框架,除了通過IOC能夠管理我們的自定義對象的生命周期之外還提供了眾多功能繁復的可配置功能模塊。但同時帶來了復雜的配置項,這對初學者而言簡直是一種災難。於是SpringBoot應運而生,Springboot的出現大大簡化了配置,主要表現在消除了web.xml和依賴注入配置的整合,處處遵循規約大於配置的思想,將初學者在繁雜的配置項中解放出來,專注於業務的實現,而不需要去關注太底層的實現。當然,也可以自己手動添加Web.xml,因為對於高端玩家而言,很多時候配置項還是很有必要的。這篇博客不涉及具體的技術細節,只是從一個開發者的角度梳理下我的使用模式。

springboot提供了一套完整的web開發流程。前端到后台,再到數據庫一條龍。使用spring開發一個web工程有兩條路線:

1-前后端完全分離

這種方式前端開發和后端開發完全分離,只需要協商好接口就行,前端負責開發頁面並調用后端接口展示數據。后端只負責提供rest接口;

2-使用springboot自帶的模板

springboot支持多種主流后端模板:

· Thymeleaf
· FreeMarker
· Velocity
· Groovy
· Mustache
· JSP
需要注意的是,雖然Spring MVC支持JSP,但是Spring Boot不建議使用JSP,因為在使用嵌入式servlet容器時,有一些使用限制。2010年后Velocity停止更新,所以這兩個都不建議使用。以上幾個模板springboot可以同時支持,什么叫同時支持?簡而言之,springboot項目中可以同時共存多個模板,需要做的僅僅是在pom文件中進入相關模板引擎的jar包就可以了,springboot根據模板的后綴名來決定由哪種模板引擎來解析這個動態頁面。

    • Thymeleaf : .html
    • freemaker : .ftl
    • jsp : jsp

        所以一個頁面的控制器的實現方式可能如下所示:

@Controller //標示為controller層
public class FreeMarkerIndexController {
  @RequestMapping("/freemarkerindexController")//請求路徑,會去templates下去尋找freemarkerindex
  public String freemarkerindexController(Map<String, Object> result) {
    System.out.println("hello world");//在控制台輸出打印hello world
    result.put("name", "wangwu");//添加姓名
    result.put("sex", 1);//添加性別
    List<String> list = new ArrayList<String>();//創建一個無序集合
    list.add("zhangsan");//添加張三
    list.add("lisi");//添加李四
    result.put("userlist", list);//添加結果
    return "freemarkerindex";//返回templates的結果
  }
}

  該請求用來處理類似於:http://localhost:8080/freemarkerindex請求,但是相應的頁面模板可以隨便使用,例如你想使用jsp解析這個名為freemarkerindex這個模板,那么就在resources/templates目錄下創建名為freemarkerindex.jsp的模板文件就可以了,springboot會根據controller找到請求要返回的模板文件,然后在templates目錄下找到相應的模板文件,並且根據后綴名來判斷使用哪一種模板引擎來即系這個模板文件,最終將解析完成之后的模板文件返回(實際上,解析完成的模板文件已經是一個純html靜態頁面了)。

 

注意這些模板都是后端模板,有別於前端模板(如angular)。

前端模板:前端模板通常是通過模板提供的js根據模板規定的語法規則解析html中的模板標記;

后端模板:類似於前端,一個頁面請求到達之后,后端模板引擎根據特定的語法規則解析模板中的內容,將數據填充到模板中,最終返回給瀏覽器的實際上已經是一個完整的html頁面了。

用IDE創建的Springboot web工程可能如圖做所示:

      

會發現,springboot的工程中並沒有傳統java web項目中的WEB-INF目錄以及下面的web.xml文件,這讓人一頭霧水,以前做java web無論使用什么框架還沒見過不寫web.xml的。

 

那么某些情況下可能有必須使用web.xml這種場景,例如tomcat版本兼容性問題,有些版本的tomcat並不支持springboot開發的web應用,或者之前老項目想要遷移到springboot上來,完全摒棄web.xml可能不太現實。那么如何在springboot中使用原來的web.xml方式來配置servlet呢?

1-首先先在java/webapp/WEB-INF/下面加入web.xml

<?xml version="1.0" encoding="UTF-8"?>  
<web-app xmlns="http://java.sun.com/xml/ns/javaee"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
                      http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
         version="2.5">  
    <context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>com.robbie.SpringBootTraditionalApplication</param-value>  
    </context-param>  
    <listener>  
        <listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class>  
    </listener>  
    <servlet>  
        <servlet-name>appServlet</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <init-param>  
            <param-name>contextAttribute</param-name>  
            <param-value>org.springframework.web.context.WebApplicationContext.ROOT</param-value>  
        </init-param>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>appServlet</servlet-name>  
        <url-pattern>/</url-pattern>  
    </servlet-mapping>  
</web-app>  

2-將代碼中有關Servlet的所有配置全部去掉

例如SpringBootServletInitializer來初始化Servlet,也不能用FilterRegistrationBean和ServletRegistrationBean注冊Filter和Servlet,統統遷移到web.xml中的。

3-編寫前端頁面/模板

Springboot默認的靜態資源路徑和模板頁面路徑並不是傳統的WEB-INF同目錄下。而是resource/static和resource/template下面。下面是springboot默認的頁面路徑和傳統的java web頁面路徑:

靜態web頁面請求可能為:http://localhost:8080/example/index.html

動態web頁面請求可能為:http://localhost:8080/example/jsp/index.jsp

無論是基於springboot框架的web工程還是傳統的使用servlet的web工程請求的方式其實沒有什么本質區別,區別在於這兩種方式中靜態文件和動態文件存放在位置不同:

基於Springboot:靜態資源放在resource/static目錄下;動態資源放啊在resource/templates目錄下;

不基於springboot框架:靜態資源和動態資源存放目錄結構的組織有自己決定,並沒有強制要求必須放在那個目錄下面。通常將靜態資源放在和WEB-INF同目錄下

個人覺得,既然已經選擇使用springboot,那就入鄉隨俗,盡量使用springboot里面規約使用方式,不要生硬的搞出一些很別扭的東西出來。發散的有點遠了,回到文章剛開始提到的兩種web開發思想:前后盾完全分離和使用模板開發;這里主要介紹下前后端分離這種方式的開發。

 

1-前后端分離開發

使用這種方式開發web項目,后端全部開發成rest API,前端交給專業的前端開發工程師去開發,后端和前端之前完全解耦,前端工程師可以根據自己的喜好選擇前端開發框架,例如angular、react、vue等。

靜態資源存放路徑:src\main\resources\static\index.html

靜態資源訪問路徑:http://localhost:8080/index.html

js、css、圖片等靜態資源的訪問方式閾值類似;

動態請求全部按照restAPI的方式進行進行響應。

2-使用模板開發

@RequestMapping(value="/")
public String defaultHandler(){
return "thymeleaf";
}

這個例子的是意思是對於所有的請求都將會返回名為thymeleaf的模板文件。  

 


免責聲明!

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



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