war3必须安装的游戏组件_在单独的WAR组件中对SPA资源和API实现进行分区
war3必须安装的游戏组件
单页应用程序正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调用的映射来实现的。
这是一个示例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将根据上面显示的重定向初始化参数值中定义的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层实现可重用服务的可用性。
- 代码项目
翻译自: https://www.javacodegeeks.com/2014/02/partitioning-spa-resources-and-api-implementations-in-separate-war-components.html
war3必须安装的游戏组件
war3必须安装的游戏组件_在单独的WAR组件中对SPA资源和API实现进行分区相关推荐
- 在单独的WAR组件中对SPA资源和API实现进行分区
单页应用程序正Swift吸引人们的注意力,以实现基于Web的丰富,健壮和移动友好的应用程序. 本质上,这需要改变应用程序体系结构,其中整个应用程序用户界面是使用JavaScript来实现的,而服务器端 ...
- vue 添加全局组件_自定义vue2.0全局组件(下篇)
在上篇中,老K为大家介绍了一个初级自定义按钮组件的编写方法.虽然能用,但是还不算完美,可扩展性不够强大.在这一篇中,老K继续为大家完善这个按钮组件. 启动命令窗口, 进入在上篇中我们搭建的vue目录中 ...
- kong组件_使用Kongzue全家桶组件创建项目全攻略(一、引入和沉浸式的那些事儿)...
[更新于 2018.12.18] 前言 本文主要介绍如何使用在Github开源的Kongzue全家桶组件快速创建新项目,以及处理响应式.权限等操作的方法. 本文中演示的步骤成品将会在最终开源至Gith ...
- vue 构建根组件_构建迷你图Vue组件
vue 构建根组件 Sparklines can be used to quickly visualize data variance. They are small and intuitive to ...
- pythonguitkinter组件_四十八、Python中的GUI布局tkinter
「@Author:Runsen」 现在极少有人会用上tkinter了,所以真正研究的人也就更少了,本来不想更新tkinter.看到很多人在学tkinter,其实用Python做布局,没有人这么干.但还 ...
- 导入第三方组件_大型 web 应用公共组件架构是如何来的?
来源:腾讯AlloyTeam https://mp.weixin.qq.com/s/gVUJRF_nLHOT_iXDXQ8F-w 腾讯文档公共组件历史包袱 1. 架构问题--开发层面 腾讯文档管理的公 ...
- vue 移动端头像裁剪_vue头像上传裁剪组件_一个漂亮的Vue组件,用于图像裁剪和上传...
vue头像上传裁剪组件 vue-image-crop-upload (vue-image-crop-upload) A beautiful vue component for image crop a ...
- java导入excel组件_三十五、Java中常见解析Excel引入的XXE组件复现与分析
实验准备 1)在实验开始之前,我们已经在C盘根目录准备好了实验需要用到的POC验证excel文件,如下: 注:实验环境中没有安装Excel不能直接创建,方法供参考. 新建excel文件 test1.x ...
- 滚动的组件_我们成功的一个组件 KRW滚动体
我们成功的一个组件- KRW滚动体 除了生产完整的滚动轴承外,生产滚动体在我公司有着悠久的传统;因为这是我们耐用和高精密滚动轴承最重要的关键部件之一. 除了所有直径和宽度比范围的标准圆柱滚子外,KRW ...
最新文章
- 转 无损转换Image为Icon
- 【Groovy】闭包 Closure ( 闭包定义 | 闭包类型 | 查看编译后的字节码文件中的闭包类型变量 )
- C++学习笔记35:函数模板
- Linux系统的压缩技术
- PC-lint使用说明
- [Java基础]字节流读数据
- spring生命周期七个过程_Spring杂文(三)Spring循环引用
- 投入100亿,一所新“交通大学”选址定了!校名却让网友吵翻…
- Linux 命令(80)—— chown 命令
- 电大数据库应用技术形考3_华为荣耀路由3体验:Wi-Fi6技术成熟应用,真正的平民好路由...
- 自动化测试基础篇--Selenium发送测试报告邮件
- 电脑重装操作系统——使用U盘安装(简略步骤)
- 算法(字符串)——重复的子字符串
- MTK Android11内置Google拼音输入法
- 实战技巧-学会这一招让前端工程师都刮目相看
- 宏基aspire拆机触摸_Acer宏碁(Acer宏碁)Acer S5-371-76GS超极本拆解图评测-ZOL中关村在线...
- [面试专题]前端需要知道的web安全知识
- Wargames(一)
- 什么是.NET开发中常提到的CLR
- 编程的各种骚操作(一)