日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

war3必须安装的游戏组件_在单独的WAR组件中对SPA资源和API实现进行分区

發(fā)布時間:2023/12/3 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 war3必须安装的游戏组件_在单独的WAR组件中对SPA资源和API实现进行分区 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

war3必須安裝的游戲組件

單頁應(yīng)用程序正Swift吸引人們的注意力,以實現(xiàn)基于Web的豐富,健壯和移動友好的應(yīng)用程序。 從本質(zhì)上講,這需要更改應(yīng)用程序體系結(jié)構(gòu),在該體系結(jié)構(gòu)中,整個應(yīng)用程序用戶界面都是使用JavaScript來實現(xiàn)的,而服務(wù)器端代碼則為服務(wù)器端應(yīng)用程序邏輯和數(shù)據(jù)訪問提供了基于RESTful,基于JSON的API。 該模型如下所示:

單獨的客戶端和服務(wù)器端部署組件的案例

這種SPA轉(zhuǎn)移為用戶帶來了體驗和性能上的好處,并提供了將用戶界面與服務(wù)器端邏輯完全分離的機會。 從代碼分區(qū)的角度來看,我們通過應(yīng)用模型視圖控制器(MVC)模式將UI與應(yīng)用程序邏輯分離。 從部署應(yīng)用程序生命周期的角度來看,它們?nèi)匀皇邱詈系?也就是說,應(yīng)用程序是在一個組件中與靜態(tài)客戶端元素和服務(wù)器端元素一起打包和部署的。

似乎自然的本能是將客戶端和服務(wù)器端元素都打包到單個JEE WAR組件中。 這可以使應(yīng)用程序的生命周期更簡單,但是,應(yīng)用程序的構(gòu)建似乎自然地組織了使用UI的開發(fā)人員和使用服務(wù)器端API的開發(fā)人員,并且由于使用了兩種不同的開發(fā)語言,因此更為自然。 因此,將應(yīng)用程序分為用于UI和服務(wù)器端API元素的單獨的可部署WAR,而不是一個WAR,可以帶來以下好處:

  • API對于UI開發(fā)保持穩(wěn)定(不是移動目標)
  • UI控制何時引入服務(wù)器端API更改
  • 支持UI和API層的并發(fā)開發(fā)人員路徑
  • 可以測試對UI的更改并將其移至質(zhì)量檢查和生產(chǎn)環(huán)境中,而無需重新測試API層
  • 可以更改底層API實施/技術(shù),而不會影響UI
  • UI實現(xiàn)/技術(shù)可以更改而不會影響API
  • 在運行時引入UI元素的機會(利用JavaScript動態(tài)行為)

這是此拓撲的圖片:

怎么樣?

由于UI是使用動態(tài)JavaScript實現(xiàn)的,因此不必使用JEE WAR組件來容納UI資源。 可以使用任何Web服務(wù)器,例如Apache或非常流行的Node.js服務(wù)器 。 但是,已經(jīng)支持JEE的企業(yè)將獲得對WAR的生命周期支持,這為使用服務(wù)器端動態(tài)行為進行資源的初始加載,身份驗證以及以動態(tài)方式集成或中介事物打開了大門。

例如,代替使用index.html初始加載SPA,可以使用index.jsp將某些用戶/客戶端特定的邏輯應(yīng)用于加載過程。

Servlet解決方案

支持SPA API /端點的一種解決方案是在靜態(tài)內(nèi)容SPA WAR中實現(xiàn)Servlet,該Servlet將API URL路由重定向到端點所駐留的服務(wù)器。 這是通過在web.xml中定義一個servlet以及到服務(wù)器的API調(diào)用的映射來實現(xiàn)的。

這是一個示例web.xml配置,該配置處理以API開頭的URI:

<servlet><servlet-name>api</servlet-name><display-name>api</display-name><servlet-class>com.khs.spa.servlet.ApiServlet</servlet-class><init-param><param-name>redirect</param-name><param-value>localhost:8080/khs-command-ref</param-value></init-param></servlet><servlet-mapping><servlet-name>api</servlet-name><url-pattern>/api/*</url-pattern></servlet-mapping>

Servlet將根據(jù)上面顯示的重定向初始化參數(shù)值中定義的URL重定向到API WAR。

重定向API HTTP GET / POST / PUT / DELETE請求的API Servlet實現(xiàn)如下所示:

package com.khs.spa.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ApiServlet extends HttpServlet {private static final long serialVersionUID = 4345668988238038540L;private String redirect = null;@Overridepublic void init() throws ServletException {super.init();// load redirect for servletredirect = getServletConfig().getInitParameter("redirect");if (redirect == null) {throw new RuntimeException("redirect value not set in servlet <init-param>");}}private void doService(HttpServletRequest request,HttpServletResponse response) throws RuntimeException, IOException {// you could do extra stuff here, i.e. logging etc...String path = request.getRequestURI().split(request.getContextPath())[1];String route = redirect + path;response.sendRedirect(route);}@Overrideprotected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {doService(request, response);}@Overrideprotected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {doService(request, response);}@Overrideprotected void doPut(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {doService(request, response);}@Overrideprotected void doDelete(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {doService(request, response);}@Overrideprotected long getLastModified(HttpServletRequest req) {return super.getLastModified(req);}@Overrideprotected void doHead(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {super.doHead(req, resp);}@Overrideprotected void doOptions(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {super.doOptions(req, resp);}@Overrideprotected void doTrace(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {super.doTrace(req, resp);} }

注意事項

此方法假定無狀態(tài)API實現(xiàn)。 由于涉及重定向,因此如果API WAR基于會話,則除非采用某種聯(lián)合會話機制,否則它將不起作用。 身份驗證和授權(quán)機制可以在客戶端SPA UI-WAR和/或API層進行。 同樣,如果需要為SPA訪問多個API服務(wù)或企業(yè)系統(tǒng),則仍可以在SPA UI-WAR中應(yīng)用它們。

單頁應(yīng)用程序不僅使我們能夠?qū)崿F(xiàn)豐富/響應(yīng)的用戶界面,而且還促進了對數(shù)據(jù)和應(yīng)用程序邏輯的輕量級易用的寧靜API的使用。 用戶界面的這種物理運行時解耦使“廢棄”用戶界面的概念更加切合實際,并且可以通過API層實現(xiàn)可重用服務(wù)的可用性。

  • 代碼項目

參考: Keyhole Software博客上的JAR合作伙伴 David Pitt 將SPA資源和API實現(xiàn)劃分為單獨的WAR組件 。

翻譯自: https://www.javacodegeeks.com/2014/02/partitioning-spa-resources-and-api-implementations-in-separate-war-components.html

war3必須安裝的游戲組件

總結(jié)

以上是生活随笔為你收集整理的war3必须安装的游戏组件_在单独的WAR组件中对SPA资源和API实现进行分区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。