【问题标题】:How to pass command line args (String array type) to a servlet init method at runtime如何在运行时将命令行参数(字符串数组类型)传递给 servlet init 方法
【发布时间】:2019-03-13 02:34:56
【问题描述】:

我正在尝试将 Java 桌面应用程序转换为 Web 应用程序,因为数据将在两个不同的服务器之间进行交互。 在桌面应用程序中,我们使用在运行配置中设置的命令行参数获取主方法的输入。 现在在 Web 应用程序中转换项目时,我不知道如何通过 servlet 传递运行时参数。

桌面应用代码:

public class A extends B {
public static void main(String[] args) {//Get this args value on runtime through arguments set in run configuration
     new A().initialize(args);
    }
    public void initializeProcess(String[] args) {
    ...
     ...
    }

现在转换为 servlet 后:

public class A  extends B
 {     
  public void init() throws ServletException
  {
   new A().initializeProcess(args);//How to get this args, as it is throwing errors
}
   public void initializeProcess(String[] args) {
  ....
  ....
 }

我尝试在 web.xml 中使用 init-params

 <servlet>
    <servlet-name>test</servlet-name>
    <servlet-class>or.com.test</servlet-class>
    <init-param>
            <param-name>args</param-name>
            <param-value>api</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>
</web-app>

Servlet 类:

public class A  extends HttpServlet
{
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException{

                PrintWriter pw = response.getWriter();
                pw.println(getServletConfig().getInitParameter("args"));

            }

    public void init() throws ServletException
    {
    new A().initializeConsumerProcess(pw);//Not getting how to pass the init param value here
  }

我应该如何在我的 servlet 类中传递程序参数值?

【问题讨论】:

    标签: java rest spring-mvc servlets servlet-3.0


    【解决方案1】:

    当使用命令行启动应用程序时,您会在 JVM 中获得一个正在运行的应用程序实例。这就是为什么命令行参数可用于将参数传递给您的应用程序的原因。在 web 容器中情况并非如此。 Web 容器本身可能会启动数十个应用程序/servlet。那么这十几个中的哪一个要“将参数传递给”?不可行。请注意,Web 容器具有称为“虚拟主机”的此功能,因此甚至可能会出现多次启动同一应用程序的情况,在任意数量的“虚拟主机”中的每一个上启动一次。出于各种原因,同一应用的配置可能在这些“虚拟主机”之间有所不同。

    当应用程序在 web 容器中作为 servlet 运行时,将参数传递给应用程序的多种替代方法:

    系统属性。它们可以在用于启动容器的命令行上使用 -D 来定义,或者可以在容器的设置中为给定的 servlet 定义(如果容器具有该功能)。

    JNDI 系统。

    上下文属性。在容器内为应用程序的特定部署定义。可以在 init() 方法中使用 getContext().getInitParameters() 和相关方法访问它们。

    要与应用程序一起部署的属性文件(以便属性文件出现在 servlet 的类路径中,并且可以使用 Class.getResource() 或类似的方法找到)。请注意,取消部署将丢失现有的配置信息,如果可能,请采取特定措施来应对这种情况。

    上下文属性(上下文初始化参数)可能是您的最佳选择,但还必须考虑谁将管理这些设置以及如何完成这些设置。

    最后,如果命令行参数的意图是明确地为最终用户提供它们,那么应用程序将不得不重写它将向用户显示一个网页,他可以在其中输入等效数据。

    【讨论】:

    • 实际上在运行配置中,程序参数我已经设置了一个我曾经在桌面应用程序中使用的参数,但是现在我已经将它转换为一个 Web 项目,我不知道如何使用该程序参数现在通过 servlet 值。我应该如何在 web.xml 中设置它,以便我可以从那里获取该值或以任何其他方式获取程序参数值
    • 我试图解释但显然没能做到的是,没有“程序参数”之类的东西(在通过 main(String [] args) 给你的东西。在 web.xml 中有 标签,这是定义上下文初始化参数的一种可能方式。
    • 感谢您详细解释的文章。我面临一个问题,如果你能帮助我解决这个问题。在 (String [] args) 我们使用字符串数组,而我从 getServletConfig().getInitParameter("args") 得到的是一个字符串。然后在相应地设置条件的 switch case 中传递该值。我不知道我应该如何从 servlet 容器中获取字符串数组。在主要问题中也添加相关代码
    • 不确定 getServletConfig() 是否与 getServletContext() 相同。 getInitParameter(String) 为您获取为参数配置的 value,该参数的名称作为该 String 参数传递。获取所有可用参数名称的方法是 getInitParameterNames()。您可以对其进行迭代。 (请注意,命令行参数可能采用诸如 --setoptionsuchandso 之类的语法,但初始化参数名称旨在遵循名称-值对的样式,例如 optionsuchandso:true 因此遵循最佳实践可能会导致在该级别上进行一些重写。)跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2016-09-08
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 2016-06-25
    相关资源
    最近更新 更多