在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 物聯(lián)網(wǎng)/ 用Gradle開(kāi)發(fā)Web項(xiàng)目
依賴管理實(shí)戰(zhàn)
配置遠(yuǎn)程倉(cāng)庫(kù)
安裝Gradle
簡(jiǎn)介
項(xiàng)目自動(dòng)化簡(jiǎn)介
配置子項(xiàng)目
Gradle強(qiáng)大的特性
自動(dòng)化測(cè)試
簡(jiǎn)介
掌握構(gòu)建生命周期
使用命令行操作
構(gòu)建Java項(xiàng)目
管理任務(wù)
構(gòu)建工具
連續(xù)傳遞的特性
用Gradle開(kāi)發(fā)Web項(xiàng)目
聲明依賴
構(gòu)建塊
簡(jiǎn)介
測(cè)試Java應(yīng)用
java構(gòu)建工具
為什么選擇Gradle
拆分項(xiàng)目文件
單元測(cè)試
多項(xiàng)目打包
Gradle 起步
介紹這個(gè)Gradle項(xiàng)目
簡(jiǎn)介
自定義腳本
Gradle包裝器
簡(jiǎn)要概述依賴管理
項(xiàng)目模塊化

用Gradle開(kāi)發(fā)Web項(xiàng)目

Java服務(wù)端的Web組件(JavaEE)提供動(dòng)態(tài)擴(kuò)展能力允許你在web容器或者應(yīng)用服務(wù)器中運(yùn)行你的程序,就像Servlet這個(gè)名字的意思,接收客戶端的請(qǐng)求返回響應(yīng),在MVC架構(gòu)中充當(dāng)控制器的角色,Servlet的響應(yīng)通過(guò)視圖組件--JSP來(lái)渲染,下圖展示了一個(gè)典型的MVC架構(gòu)的Java應(yīng)用。

http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag15.png" alt="" />

WAR(web application archive)用來(lái)捆綁Web組件、編譯生成的class文件以及其他資源文件如部署描述符、HTML、JavaScript和CSS文件,這些文件組合在一起就形成了一個(gè)Web應(yīng)用,要運(yùn)行Java Web應(yīng)用,WAR文件需要部署在一個(gè)服務(wù)器環(huán)境---Web容器。

Gradle提供拆箱插件用來(lái)打包WAR文件以及部署Web應(yīng)用到本地的Servlet容器,接下來(lái)我們就來(lái)學(xué)習(xí)怎么把Java應(yīng)用編程Web應(yīng)用。

添加Web組件

接下來(lái)我們將創(chuàng)建一個(gè)Servlet,ToDoServlet,用來(lái)接收HTTP請(qǐng)求,執(zhí)行CRUD操作,并將請(qǐng)求傳遞給JSP。你需要寫(xiě)一個(gè)todo-list.jsp文件,這個(gè)頁(yè)面知道怎么去渲染todo items,提供一些UI組件比如按鈕和指向CURD操作的鏈接,下圖是用戶檢索和渲染todo items的流程:

http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag16.png" alt="" />

Web 控制器

下面這個(gè)就是web 控制器ToDoServlet,用來(lái)處理所有的URL請(qǐng)求:

    package com.manning.gia.todo.web;

    public class ToDoServlet extends HttpServlet {
        private ToDoRepository toDoRepository = new InMemoryToDoRepository();

        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String servletPath = request.getServletPath();
            String view = processRequest(servletPath, request);
            RequestDispatcher dispatcher = request.getRequestDispatcher(view);
            dispatcher.forward(request, response);

        }

        private String processRequest(String servletPath, HttpServletRequest request) {

            if(servletPath.equals("/all")) {
                List<ToDoItem> toDoItems = toDoRepository.findAll();
                request.setAttribute("toDoItems", toDoItems);
                return "/jsp/todo-list.jsp";
            }
            else if(servletPath.equals("/delete")) {
                (...)
            }
            (...)
            return "/all";
        }

    }

對(duì)于每一個(gè)接收的請(qǐng)求,獲取Servlet路徑,基于CRUD操作在processRequest方法中處理請(qǐng)求,然后通過(guò)請(qǐng)求分派器請(qǐng)求傳遞給todo-list.jsp。

使用War和Jetty插件

Gradle支持構(gòu)建和運(yùn)行Web應(yīng)用,接下來(lái)我將介紹兩個(gè)web應(yīng)用開(kāi)發(fā)的插件War和Jetty,War插件繼承了Java插件用來(lái)給web應(yīng)用開(kāi)發(fā)添加一些約定、支持打包War文件。Jetty是一個(gè)很受歡迎的輕量級(jí)的開(kāi)源Web容器,Gradle的Jetty插件繼承War插件,提供部署應(yīng)用程序到嵌入的容器的任務(wù)。

既然War插件繼承了Java插件,所有你在應(yīng)用了War插件后無(wú)需再添加Java插件,即使你添加了也沒(méi)有負(fù)面影響,應(yīng)用插件是一個(gè)非冪等的操作,因此對(duì)于一個(gè)指定的插件只運(yùn)行一次。添加下面這句到你的build.gradle腳本中: apply plugin: 'war'

除了Java插件提供的約定外,你的項(xiàng)目現(xiàn)在多了Web應(yīng)用的源代碼目錄,將打包成war文件而不是jar文件,Web應(yīng)用默認(rèn)的源代碼目錄是src/main/webapp,如果所有的源代碼都在正確的位置,你的項(xiàng)目布局應(yīng)該是類似這樣的:

http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag17.png" alt="" /> http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag18.png" alt="" />

你用來(lái)實(shí)現(xiàn)Web應(yīng)用的幫助類不是java標(biāo)準(zhǔn)的一部分,比如javax.servlet.HttpServlet,在運(yùn)行build之前,你應(yīng)該確保你聲明了這些外部依賴,War插件引入了兩個(gè)新的依賴配置,用于Servlet依賴的配置是providedCompile,這個(gè)用于那些編譯器需要但是由運(yùn)行時(shí)環(huán)境提供的依賴,你現(xiàn)在的運(yùn)行時(shí)環(huán)境是Jetty,因此用provided標(biāo)記的依賴不會(huì)打包到WAR文件里面,運(yùn)行時(shí)依賴比如JSTL這些在編譯器不需要,但是運(yùn)行時(shí)需要,他們將成為WAR文件的一部分。

    dependencies {
       providedCompile 'javax.servlet:servlet-api:2.5'
       runtime 'javax.servlet:jstl:1.1.2'
    }

build Web項(xiàng)目和Java項(xiàng)目一樣,運(yùn)行g(shù)radle build后打包的WAR文件在目錄build/libs下,輸出如下:

    $ gradle build
    :compileJava
    :processResources UP-TO-DATE
    :classes
    :war
    :assemble
    :compileTestJava UP-TO-DATE
    :processTestResources UP-TO-DATE
    :testClasses UP-TO-DATE
    :test
    :check
    :build

War插件確保打包的WAR文件符合JAVA EE規(guī)范,war任務(wù)拷貝web應(yīng)用源目錄src/main/webapp到WAR文件的根目錄,編譯的class文件保存在WEB-INF/classes,運(yùn)行時(shí)依賴的庫(kù)放在WEB-INF/libs,下面顯示了WAR文件todo-webapp-0.1.war的目錄結(jié)構(gòu):

http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag19.png" alt="" />

自定義WAR插件

假設(shè)你把所有的靜態(tài)文件放在static目錄,所有的web組件放在webfiles,目錄結(jié)構(gòu)如下:

http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag20.png" alt="" />

    //Changes web application source directory

    webAppDirName = 'webfiles'

    //Adds directories css and jsp to root of WAR file archive
    war {
    from 'static'
    }

在嵌入的Web容器中運(yùn)行

嵌入式的Servlet容器完全不知到你的應(yīng)用程序知道你提供準(zhǔn)確的classpath和源代碼目錄,你可以手工編程提供,Jetty插件給你完成了所有的工作,你只需要添加下面一條命令: apply plugin: 'jetty'

運(yùn)行Web應(yīng)用需要用到的任務(wù)是jettyRun,啟動(dòng)Jetty容器并且無(wú)需創(chuàng)建WAR文件,這個(gè)命令的輸出應(yīng)該類似這樣的:

    $ gradle jettyRun
    :compileJava
    :processResources UP-TO-DATE
    :classes
    > Building > :jettyRun > Running at http://localhost:8080/todo-webapp-jetty

最后一行Jetty插件給你提供了一個(gè)URL用來(lái)監(jiān)聽(tīng)HTTP請(qǐng)求,打開(kāi)瀏覽器輸入這個(gè)鏈接就能看到你編寫(xiě)的Web應(yīng)用了。

Jetty插件默認(rèn)監(jiān)聽(tīng)的端口是8080,上下文路徑是todo-webapp-jetty,你也可以自己配置成想要的:

    jettyRun {
       httpPort = 9090
       contextPath = 'todo'
    }

這樣你就把監(jiān)聽(tīng)端口改成了9090,上下文目錄改成了todo。