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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

在单独的WAR组件中对SPA资源和API实现进行分区

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

單頁應用程序正Swift吸引人們的注意力,以實現基于Web的豐富,健壯和移動友好的應用程序。 本質上,這需要改變應用程序體系結構,其中整個應用程序用戶界面是使用JavaScript來實現的,而服務器端代碼則為服務器端應用程序邏輯和數據訪問提供了基于RESTful,基于JSON的API。 該模型如下所示:

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

SPA的這種轉變為用戶帶來了體驗和性能上的好處,并提供了將用戶界面與服務器端邏輯完全分離的機會。 從代碼分區的角度來看,我們通過應用模型視圖控制器(MVC)模式將UI與應用程序邏輯分離。 從部署應用程序生命周期的角度來看,它們仍然是耦合的–也就是說,應用程序在一個組件中與靜態客戶端元素和服務器端元素一起打包和部署。

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

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

這是此拓撲的圖片:

怎么樣?

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

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

Servlet解決方案

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

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

<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將根據上面顯示的重定向初始化參數值中定義的URL重定向到API WAR。

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

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);} }

注意事項

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

單頁應用程序不僅使我們能夠實現豐富/響應的用戶界面,而且還促進了數據和應用程序邏輯的輕巧易用的寧靜API的使用。 用戶界面的這種物理運行時解耦使“廢棄”用戶界面的概念更加切合實際,并且可以通過API層實現可重用服務的可用性。

  • 代碼項目

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

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。