【问题标题】:How to build a command line interface in java for an existing web based application如何在 Java 中为现有的基于 Web 的应用程序构建命令行界面
【发布时间】:2014-05-19 16:53:18
【问题描述】:

我使用 JSP 和 Servlet 创建了一个基于 Web 的应用程序,该应用程序使用 SQL Server DB 作为其后端。

架构是这样的:

  1. 我的所有业务逻辑都在一个 jar 文件中
  2. 我已经使用 JSP 创建了我的视图,并且正在使用 servlet 与我的业务逻辑 jar 进行交互
  3. jar 连接到数据库以保存和混合信息,这些信息由我的 servlet 中继到 JSP。

我的 Web 应用程序在远程 Tomcat 服务器上运行。

现在,我得到了一个新的要求。我必须创建一个命令行界面,在那里我应该能够指定命令列表并按回车键(或者,创建一组命令并将其保存在 .bat 文件或其他文件中,然后运行它),这样我的应用程序执行必要的操作。基本上,我必须创建一个命令行界面,它可以与我已经拥有的 GUI(JSP)一起使用。

我对此完全陌生。谁能说明我可以从哪里开始以及如何开始?

非常感谢任何一点帮助。

编辑

这就是我的网络应用程序所做的。用户可以看到测试脚本列表(用 Selenium WebDriver 编写)。他可以选择脚本,选择从哪里运行它们的主机,然后单击“运行”,测试在所述机器上执行。

现在,我想要一个命令行界面,它将消除对 GUI 的需求。比方说,我只是希望用户能够键入类似“execute My_Script_1”这样的命令,并且应该执行脚本。

测试脚本、selenium 驱动程序,一切都驻留在应用服务器上。

我的命令行界面应该能够在 Windows 命令提示符下工作。

谢谢。

【问题讨论】:

  • 您可以使用 python 来创建 CLI。到目前为止我用过python很容易实现CLI。
  • 谢谢@Shriram,但我不得不使用Java。你知道我如何用 Java 做到这一点吗?
  • 我不会投反对票,因为您的问题的格式非常好,但是您必须更具体地说明这个 CLI 必须完成的工作,因为现在它有点宽泛。它将使用什么平台(Linux 终端?Windows cmd?定制的 Java 提示?),这些命令将控制什么?
  • @AlexisLeclerc,我已经编辑了我的问题。请帮助我。

标签: java command-line ejb command-prompt


【解决方案1】:

你在使用 Spring 吗? 您能具体说明一下您的 CLI 应该做什么吗?

你可以这样做,托马斯说的。 您还可以使用 Velocity.. 等模板引擎来形成您的输出。 使用某种类似于 JavaCurses 的库来制作您的输出...看起来不错。

指定命令... 嗯..想想你的业务逻辑你到底向用户展示了什么。 记住 webapp ui 是 webapp ui。控制台用户界面不同。并且用户期望不同的行为

这样的命令

show goods category="for kids"

会很棒。 也不要忘记不同的帮助命令 yourJarName.jar --help / -h 等

如果您想编写具有交互模式的应用程序...请考虑那里的帮助命令。

【讨论】:

    【解决方案2】:

    您说您将业务逻辑放在 JAR 中。

    为什么不使用这个 JAR 作为依赖项启动另一个项目并将其构建为可执行 jar 呢? 然后只需使用 System.in 和 System.out 与用户进行交互。

    编辑

    所以您的应用程序是托管的。你有 REST 或 SOAP 之类的 API 吗?

    然后您可以构建一个客户端,读取用户编写的字符串,对其进行解析并在您的 API 中调用正确的服务。

    【讨论】:

    • 这就是我打算构建的,@Thomas。但我被困在这里。比如说,当我运行命令 1 时,我的应用程序创建了一个类对象,比如 MyClass。现在如果用户运行命令 2,如果命令 2 需要使用命令 1 创建的对象,我该如何访问它。对不起,如果我的问题是基本的,但这就是我所知道的..
    • 好的,所以您需要告诉我们更多信息。您的应用程序托管在哪里?你有一个每个人都应该访问的共享实例吗?或者您可以将完整应用程序的实例打包到可执行 jar 中吗?
    • 到目前为止,我已经在远程服务器上的 Tomcat 容器上托管了应用程序。正如您在可执行 jar 中所说,我还可以打包完整应用程序的实例。但是,在后一种情况下,我如何保留我之前指定的对象?
    【解决方案3】:

    我看到两个选项:

    • 创建一个客户端 CLI,生成与服务器相同的数据 收到。换句话说,您无需修改​​服务器代码,而是创建了一个 解析命令行并发送 与您的实际 GUI 发送的内容完全相同。
    • 在您的 Web 应用程序(装饰为 CLI)中设置一个文本区域,以响应 在按下每个 Enter 键时,将行发送到您的服务器。在 你的服务器,你可以创建一个实用程序类(比如 CLIParser.java 实例),并使用Args4j 解析接收到的命令, 验证并运行它。

    【讨论】:

      【解决方案4】:

      【讨论】:

        【解决方案5】:

        你的数据结构看起来很简单。您还提到您以业务逻辑与前端分离的方式设计应用程序。

        在这种情况下,您可以考虑将您的业务逻辑公开为基于 REST 的 WebService。这应该不难,因为您的应用程序中有分层结构。

        貌似有几个方法:

        • list scripts - 返回可用脚本列表主机列表
        • 返回可用主机列表运行脚本(scriptName, hostAddress)
        • 在地址为 hostAddress 的主机上运行脚本 scriptName 可能会返回结果,如果您的应用程序支持此操作

        这三个看起来都适合 GET 方法。

        您可以考虑JerseyResteasy 或其他框架。

        您可以找到很多关于它们的教程。以here为例。

        从您的命令行应用程序中,您可以以不同的方式调用您的网络服务。因为我过去大部分时间都在使用 Jersey JAX-RS 实现,所以我发现使用 Jersey client(the latest stable version) 最方便。 Here 你可以找到一个简短的教程,你可以在命令行应用程序中使用 Jersey 客户端进行操作。 JBoss 也有一个client API 作为其框架的一部分(也是完全认证的 JAX-RS 实现)。您甚至可以决定不使用任何客户端 API 并使用 HttpURLConnection 手动完成所有工作,但我不建议这样做。使用客户端 API 或使用 HttpURLConnection 手动完成简单服务的所有工作没有太大区别,但您永远不知道何时您的应用程序变得不那么简单,因为您的客户端一开始就没有想到新的需求。

        希望有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-23
          • 2016-11-01
          • 1970-01-01
          • 2012-12-09
          • 2015-09-27
          • 1970-01-01
          • 2012-05-18
          • 1970-01-01
          相关资源
          最近更新 更多