使用Java作为后端,PHP作为前端

8

在SO上已经有一些讨论,关于这种架构是好还是坏的问题。由于公司内部现有的编程人才,我们决定将Java用于后端开发,将PHP用于前端开发。我们的目标是:

Java - 模型/控制器

PHP - 视图

我们正在构建Glassfish和Apache之间的交互原型。我们仍在努力解决一个问题:当用户访问http://domain.com/login.html并登录时,该登录信息将被发送到Glassfish控制器,该控制器存在于像/login.java这样的位置。我们可以轻松完成此操作,但问题在于如何在该URL处呈现视图。

是否有人使用PHP或其他技术来解决这个问题?


就像那首老歌《Lovin' Spoonful》唱的:“你应该选择其中一个,把另一个留下!” ;) - paulsm4
3个回答

6
你是否考虑过在Java中设置一个SOAP / REST服务器,并让PHP连接它?我想这比你试图实现的要简单得多。

我们在我之前的工作中做过这个,效果很好。SOAP很麻烦,但支持得很好。如果你想冒险的话,可以尝试一下JSON-RPC实现。 - Jody
那将是 IPC 或套接字通信实现之一。 - user529543
2
我们使用了Java Rest API(JSON)作为后端,PHP作为前端。这是一次很棒的经历,我们还可以将相同的后端用于移动平台。 - Gonzalo
1
使用REST,如果设计良好,应该不难通信两种语言。 - WhyNotHugo

2
很抱歉提出这个问题,但似乎只使用其中一种语言会使事情变得更简单。如果您使用PHP向视图添加更多逻辑,那么值得一看Velocity。它允许您访问和创建变量、迭代列表、使用条件语句、定义宏、进行方法调用等等。这似乎可以使事情变得更简洁。然而,通常最好尽可能将逻辑保持在模板之外。
如果您想使用PHP,因为这是所需的,我建议您考虑使用Web服务进行通信。看看Google的GSON库。它是一个非常好的工具(在Java方面)用于将JSON对象映射到您的模型(反之亦然)。
在您的前端,也值得一看Backbone。它是一个工具,使模拟您的模型对象并将事件绑定到它们或直接将它们绑定到字段等变得简单。

不要使用Velocity。使用类似JSF或甚至JSP的东西。Velocity是一种非常古老的模板语言,而且它也有很多缺点。JSF有很好的支持,并且可以为您做很多事情。 - seangates
真的吗?与直接使用JSTL相比,Velocity有哪些缺点?Velocity实际上不需要你以任何特定的方式修改/编写代码。你只需传递任何想要的对象即可。您可以从模板中调用方法、设置变量、声明新变量等等。并不是说你应该把所有这些逻辑都放在模板中。但Velocity允许你这样做。 - John Kane
从缺乏开发者支持的情况来看,大多数Java开发者并不熟悉这个模板引擎。在过去的三年里,我问了很多Java开发者他们使用的模板引擎是哪一个,只有一个人听说过它。 - seangates
这可能只是你提问的方式不对。它是一个相当常用的库。Groovy的模板也越来越普遍。但这取决于你的需求和你所处的水平。如果你正在做基本的企业应用程序,那么你很有可能会使用JSF,并使用一些任意的JavaEE实现,如Spring MVC或类似的东西。如果你正在使用一个更定制化的应用程序,它坐落在一个servlet容器中,那么你可能更有可能使用像Velocity或Groovy这样的模板引擎。至少从我的经验来看是这样的。 - John Kane
无论哪种情况,提问者都在寻找一些工具,允许在他们的视图中使用更多逻辑。他们正在调查PHP,所以我建议使用模板引擎以及其他一些工具,这些工具似乎会为他们的视图提供更多的灵活性。我并不是真正主张使用速度优于其他工具,您应该使用最符合您需求的工具。就个人而言,我最近一直在使用Play框架,而不是更传统的JavaEE堆栈。 - John Kane

1

我曾在两家公司亲身体验过使用Java Service层和PHP Client层技术栈,尽管它们并不是专门使用的。为了清晰地分离这些层,我们构建了一个明确定义的JSON REST API,以便每个层都有一个可以编码的合同。

Java层使用SpringMVC在持久化层之间生成JSON视图,并定义了良好的路由(即URL结构),以便PHP层可以GET/PUT/POST/DELETE资源。

关于登录问题,实际上有两个Java服务,一个专门用于登录/注销,另一个用于常规后端。

当访问/login时,我假设这将是一个.php文件。登录<form>提交到“登录”服务会导致添加一个会话cookie,但也会添加一个加密的“用户ID”cookie。然后可以使用加密cookie来保护产品的Java服务层的访问。每个从PHP到Java的REST请求都可以访问cookie,然后Java层可以解密“用户ID”,如果它是有效的,则响应PHP REST调用。然后,Java层将可以访问真实的用户ID,以便从持久存储返回特定于用户的数据。

虽然大部分服务都是RESTful的,但似乎登录不是,而且登录还依赖于PHP前端,所以我认为你在这方面失去了一些“关注点分离”。 - WhyNotHugo
如果您有两个异构层,使用Web服务是有意义的。如果您正在使用Web服务,则使用REST / JSON(而不是WS / SOAP)是有意义的。但是,在第一次不必要地堆叠多个不同的层会是最好的选择!在我看来... - paulsm4
登录并不依赖于PHP。它是一个外部的Java服务,只与登录有关。产品如何调用它取决于他们自己,无论是从PHP还是Java。一旦成功登录,每个产品都可以使用cookie来保护其资源。请注意,这不是我的架构,我只是详细介绍了我使用过的技术栈的一些信息! - andyb
分层主要是为了在公司内部进行重复使用。就像我说的,只有一个“登录”(Java)服务。它将常见组件分开,并允许各个团队在客户端技术方面有一些自由创新。如果需要前端,有些人选择Java / PHP堆栈,而其他人则坚持使用Java,如果他们所需的只是JSON数据。 - andyb
1
@andyb - 我完全理解并尊重你的立场。我非常感激你分享你(有用的!)经验。但是,尽管如此,如果Webnet公司即将做出一个看起来很愚蠢的决定,我仍然希望他们有机会重新考虑。关键问题:“为什么”使用“多种语言”?我恭敬地提出,“现有程序员专业知识”不是合法的标准。在我看来... - paulsm4
1
@paulsm4 是的,当时我确实在问同样的问题!决定采用双技术栈似乎是一个疯狂的决定,特别是最终Java做MVC,然后PHP也做MVC或MVVM! - andyb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接