怎样给网站找空间做备案,网站模式下做淘宝客,wordpress三栏,合肥在线官网单页应用程序正Swift吸引人们的注意力#xff0c;以实现基于Web的丰富#xff0c;健壮和移动友好的应用程序。 本质上#xff0c;这需要改变应用程序体系结构#xff0c;其中整个应用程序用户界面是使用JavaScript来实现的#xff0c;而服务器端代码则为服务器端应用程序逻… 单页应用程序正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配置 servletservlet-nameapi/servlet-namedisplay-nameapi/display-nameservlet-classcom.khs.spa.servlet.ApiServlet/servlet-classinit-paramparam-nameredirect/param-nameparam-valuelocalhost:8080/khs-command-ref/param-value/init-param/servletservlet-mappingservlet-nameapi/servlet-nameurl-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