【问题标题】:Calling java methods from inside servlet从 servlet 内部调用 java 方法
【发布时间】:2018-11-25 18:23:18
【问题描述】:

我是 servlet 编程新手,我正在尝试使用以下 java 方法创建和写入文件-

public void file() throws FileNotFoundException, UnsupportedEncodingException {
    PrintWriter writer = new PrintWriter("the-file-name.txt", "UTF-8");
    writer.println("The first line");
    writer.println("The second line");
    writer.close();
    System.out.println("file created");
}

我想像这样从 servlet 调用它

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    TryMethod tryMethod = new TryMethod();
    tryMethod.file();
}

谁能建议为什么它没有从 servlet 中执行? 当从 main 方法调用时,会调用此方法。

【问题讨论】:

  • 使用doGet方法
  • 如果你想在你的 servlet 中有一个简单的System.out.println 语句,它会被执行吗?您的 servlet 是否 100% 正常工作?
  • @SM 你确定文件没有创建吗?我怀疑它正在创建,但您正在查看不同的文件夹。正如您现在正在创建的那样,您正在使用相对路径创建它。当您将代码作为 Web 应用程序(Servlet 容器)运行时,您的“当前文件夹”可能与 IDE Main 运行的当前文件夹不同。
  • @SM 使用固定路径(例如将文件放在桌面上)。
  • @SM 很高兴它工作。我相信您会发现“某处”(您的网络应用程序的“当前目录”)创建的其他文件。要找出它们的创建位置,只需 println(从您的 servlet)当前路径:Paths.get("").currentRelativePath.toAbsolutePath().toString() - 您会在那里找到它们。

标签: java file servlets writer


【解决方案1】:

不,从 servlet 运行构造函数或方法通常没有问题(至少对于作为 WebApp 一部分的类来说不是)。如果出现问题,您会收到异常/错误。

因此,如果您没有看到打印输出,则很可能代码没有执行。这可能是不同的方法(doPost 而不是 doGet)或不同的 servlet(检查您的 URL 和 servlet 映射),或者可能是您的更新类未部署或找到 - 或者它已部署但使用了另一个.

我要做的第一件事是将 System.out 添加到 doGet() 方法。只要那个没有打印出来,你就不用担心你自己的类。

哦,很明显,您的代码使用了您可能没有检查文件的 Web 服务器的当前运行目录(相对文件名)。尝试绝对路径或使其可配置。无论如何,您的 system.out 都应该被打印出来。

【讨论】:

  • 有点跑题了,但是虽然“从 servlet 运行构造函数没有问题”,但没有令人信服的理由这样做;任何初始化通常在init() 中完成。请参阅why we can't initialize a servlet using constructor itself? 的答案以及关于 SO 的许多其他类似问题。
  • 不幸的是 servlet 是多线程的,所以在 init() 中初始化的对象必须是线程安全的。如果 servlet 标准提供像 EJB 过去那样的池化 servlet 实例,那将是一个巨大的胜利。
猜你喜欢
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多