在 spring-boot 中如何分离前端和后端机器?

Posted

技术标签:

【中文标题】在 spring-boot 中如何分离前端和后端机器?【英文标题】:How seperate Front-End & Back-End machine in spring-boot? 【发布时间】:2015-10-10 17:27:37 【问题描述】:

我想将后端和前端(html 页面)机器分开。后端将由 Spring-Boot 开发。如何将控制器中的视图返回到前端机器而不是后端(Spring-Boot--->Apache Tomacat)机器中的“资源/模板”?

例如:

@Controller
public class GreetingController 

    @RequestMapping("/greeting")
    public String greeting(@RequestParam(value="name", required=false,  defaultValue="World") String name, Model model) 
        model.addAttribute("name", name);
        return "greeting";
    


我想将“问候”视图放在另一台服务器(前端)中。

【问题讨论】:

【参考方案1】:

您没有透露您正在使用哪种模板技术(例如 JSP、Thymeleaf 等),但无论哪种方式,Spring 都需要将您的变量从模型注入 HTML 模板。

AFAIK,没有办法在一个 JVM 中托管视图,而控制器在其他 JVM 上填充它。您可以将视图提取到单独的 JAR 中,但最终它需要托管在同一个 Servlet 容器中。

如果您想要真正分离客户端和服务器,请研究客户端(单页应用程序)上的模板并仅使用 AJAX 从 REST 后端获取数据。

【讨论】:

【参考方案2】:

您可以启动两台服务器,一台用于后端,另一台用于前端。两者将通过 REST 调用进行通信。后端服务器将数据提供给前端服务器,前端服务器将收集数据并将其发送到前端服务器中的 html 模板。模板引擎集成将节省您完成工作的时间。 Springboot 与 Thymeleaf 有很好的集成,所以我建议你使用相同的。

在您准备好原型之后,这实际上非常简单。我已经为frontend 和backend 分别制作了springboot 应用程序的原型。这里使用的模板引擎是thymeleaf,数据库是mysql,语言是java。您可以删除不需要的部分并开始您的工作!

【讨论】:

您是否做过任何测试以查看使用 rest 模板的性能? 我反对这个建议。如果您创建 REST 服务,您可以通过 SPA 应用程序使用它并在浏览器中进行 HTML 模板化。这样的架构总体上会更简单,性能更好,运行的服务器盒更少。【参考方案3】:

您可能需要实现一个/WebMvcConfigurerAdapter 接口。

这是一个代码示例:

@Configuration
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter 

    @Value("$spring.thymeleaf.prefix")
    private String thymeleafTemplatePath;


    @Value("$node_modules.path")
    private String nodeModulesPath;

    public void addResourceHandlers(ResourceHandlerRegistry registry)

        if (thymeleafTemplatePath != null && !thymeleafTemplatePath.isEmpty())
            if (!registry.hasMappingForPattern("/**")) 
                registry.addResourceHandler("/**")
                        .addResourceLocations(thymeleafTemplatePath);
            
        

        if (nodeModulesPath != null && !nodeModulesPath.isEmpty())
            if (!registry.hasMappingForPattern("/node_modules/**")) 
                registry.addResourceHandler("/node_modules/**")
                        .addResourceLocations(nodeModulesPath);
            

        
    

以下代码用于属性文件中的配置变量。

此示例具有 Windows 文件路径模式。您可能需要针对您的环境更改模式。

spring.thymeleaf.prefix=file:///C:/Users/young.k.jun/workspaces/separated-front-end/front-end/src/
node_modules.path=file:///C:/Users/young.k.jun/workspaces/separated-front-end/front-end/node_modules/

我做了一个示例项目,将前端和后端工作区分开,以免与它们的工作目录冲突。

请参考this link。您可以在该页面上找到 GitHub 链接。

【讨论】:

以上是关于在 spring-boot 中如何分离前端和后端机器?的主要内容,如果未能解决你的问题,请参考以下文章

微服务前端和后端的交互

使用 Laravel 和 Vue.js 分离前端和后端

如何在开发时部署和运行前后端分离的JavaWe

如何在解耦的前端和后端中的每个请求中仅发送 http cookie(包含 jwt)?

软件架构之前后端分离与前端模块化发展史

jQuery如何实现类似JSTL的功能进行前后端分离?