Servlets 当在doGet或doPost以外的方法中使用println时,Servlet显示空白页

Servlets 当在doGet或doPost以外的方法中使用println时,Servlet显示空白页,servlets,Servlets,在doGet或doPost以外的方法中使用println时,我的动态web应用程序显示空白页。默认页面加载良好。在它上面是一个表单,它有一个传递给启动servlet的doPost的输入,然后它的请求、响应被传递给第二个servlet的doPost。然后将相同的请求、响应传递到输出方法,而不是使用println显示输出。但我得到的是一个空白页,而不是输出。我知道调用output方法是因为我最初尝试使用BufferedWriter写入输出文件时出错,但这不起作用。这是我第一次尝试使用JavaEE动态

在doGet或doPost以外的方法中使用println时,我的动态web应用程序显示空白页。默认页面加载良好。在它上面是一个表单,它有一个传递给启动servlet的doPost的输入,然后它的请求、响应被传递给第二个servlet的doPost。然后将相同的请求、响应传递到输出方法,而不是使用println显示输出。但我得到的是一个空白页,而不是输出。我知道调用output方法是因为我最初尝试使用BufferedWriter写入输出文件时出错,但这不起作用。这是我第一次尝试使用JavaEE动态web应用程序和println,尽管我在桌面应用程序中有PHP、ASP.Net和几种语言的中级经验

第二个servlet的doPost方法调用readnums、sort和outputSort方法。readnums方法读取程序要使用的文本文件。我在相对路径方面有问题(我想这就是为什么我不能让BufferedWriter在outputSort中工作的原因)。我用于输入文本文件的路径是“/WebContent/WEB-INFO/myfile.txt”。一旦web应用程序部署到托管站点,我会有问题吗?冒着一次问两个问题的风险,您如何正确指定应用程序的相对路径?我一直在谷歌上搜索,但似乎找不到有效的解决方案。当我尝试使用getServletContext().getRealPath()时,在该行的outputSort方法中出现错误。我还没有尝试在readnums方法中使用它。我有一个网站,我可以热链接到输入文件,如果这是一个可行的选择。你会怎么做

在此方面的任何帮助都将不胜感激。提前谢谢

从默认jsp调用的初始servlet:

package com.LAEWeb;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public  class Startup extends HttpServlet {

    private static final long serialVersionUID = 1L;


    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        req.getRequestDispatcher("/WEB-INF/Startup.jsp").forward(req,resp);

    }

    @Override
    public void doPost(HttpServletRequest req,
            HttpServletResponse resp) throws ServletException, IOException {


        String sorts = req.getParameter("sorts");

        String action = req.getParameter("action");


        if ("Powerball".equals(action)) {

            Powerball p = new Powerball();

            p.sortInputText = sorts;

            p.doPost (req, resp);
        }

         else if ("Mega Millions".equals(action)) {

            // Invoke SecondServlet's job here.
        }

    }
}
第二个servlet的方法(为了简洁起见,我没有列出readnums和sort):

@覆盖
公共无效doPost(HttpServletRequest请求,
HttpServletResponse resp)抛出ServletException、IOException{
如果(PB_操作==“排序”){
readnums();
如果(!errorMessage.isEmpty()){
分别为setContentType(“文本/html”);
PrintWriter out=resp.getWriter();
试一试{
out.println(“”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
out.println(“”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
out.println(“未找到输入文件”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
out.println(“”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
out.println(“”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
}最后{ out.close(); } 返回; } 否则{ 排序(); 输出排序(req、resp); } } } 无效输出排序(HttpServletRequest请求, HttpServletResponse resp)抛出ServletException、IOException{ 字符串温度; int i; 分别为setContentType(“文本/html”); PrintWriter out=resp.getWriter(); 试一试{ out.println(“”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
out.println(“”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
out.println(“”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
out.println(“”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
out.println(“LAEWeb”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
out.println(“”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
out.println(“”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
out.println(“”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
println(“所选范围的Powerball排序总数”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
out.println(“”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
out.println(“排名数字总计功率球总计”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
out.println(“”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");
out.println(“”);
String realPath = getServletContext().getRealPath("/WEB-INFO/myfile.txt");

对于(i=1;i如果要获取相对路径的实路径,可以使用
getRealPath()
方法,例如:

config.getServletContext().getRealPath("/WEB-INFO/myfile.txt");
如果您在servlet的
init()
方法中使用此代码,请使用:


要回答您问题的第一部分,我需要更多信息。获取信息后,我将编辑此答案。

我使用了getServletContext().getRealPath()在第一个servlet中,通过第二个servlet中的类变量传递到第二个servlet的路径。这很有效。感谢您的帮助,Ali为我指明了正确的方向。我想,因为第二个servlet实际上并没有正常初始化(我只是从第一个servlet调用它的doPost)它的上下文为空。再次感谢您的帮助!

您需要使用
getRealPath()
。不过,我个人会将文件保存在类路径上。无论如何,从应用程序的角度来看,web内容的根目录是
/
,例如
web-INF/blah.txt
@Dave Newton谢谢。我很感激。使用getRealPath()的正确方法是什么?第二个servlet的第一部分工作正常?右键单击网页并选择“查看页面源代码”以查看打印的是页面的哪一部分。我尝试了您的建议。我得到一个“NullPointerException”"在那一行。否。我在servlet的另一个方法中使用了它。@te7:或者您从doGet或doPost方法调用的另一个方法。对吗?是的。我从doPost调用的另一个方法。我的起始servlet的doPost处理来自起始jsp的输入,然后在我的第二个servlet中调用doPost,它调用另一个尝试使用该行的方法。可能是因为第二个servlet的上下文为NULL,所以我得到了一个“NullPointerException”。我应该使用第一个servlet中的行并传递路径吗?