0

我正在使用带有 tomcat 7 的 Eclipse 动态 Web 项目。我对此非常陌生,并且正在慢慢学习教程。

我正在尝试制作一个简单的 web 应用程序,用户可以在其中输入用于生成 QR 码的信息。我可以制作图像并将其保存到 WebContent 文件夹。我想将此图像显示给用户并存储它。最终,我将为每个用户创建一个帐户,其中包含他们存储的 QR 码和其他图像。我有一个 index.html,它通过表单获取信息并将其传递给创建图像并将其保存在我的 WebContent 文件夹中的 servlet,然后构建一个简单的 HTML 来显示图像。但是,除非我告诉 eclipse 刷新项目,否则不会显示图像。我的猜测是,eclipse 在刷新之前不知道新的图像文件,并且由于某种原因,servlet 生成的 HTML 没有在图像上拾取,即使它在正确的位置。

这里的答案建议将数据存储在 webapp 文件夹之外并流式传输。这是我不熟悉的事情。我试图将图像存储在外部文件夹中,并使用从 WebContent 文件夹到图像文件的绝对路径和相对路径来引用它,但都不起作用。当我给它不同的数据来构建图像时,我能够从 WebContent 文件夹中显示的 QR 码不会更新,即使文件名和位置相同,我也必须在 eclipse 中刷新项目。当我使用文件浏览器打开图像文件时,它具有新数据。

我正在寻求非常基本的帮助,我不是无能,但我以前从未做过互联网编程,这需要学习很多东西。一般来说,我需要知道如何获取和存储数据并生成新数据,然后动态调用它以显示给用户。谢谢你。

这是我的 servlet 的 doPost 方法:

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        username = request.getParameter("userName");
        password = request.getParameter("password");
        PrintWriter out = response.getWriter();
        response.setContentType("text/html");
        // check the input and create the html
        checkFormData();
        // Unless something goes very wrong, this string should be replaced.
        String html = "<html><p>SOMETHING BROKE!</p></html>";
        if(usernameOK && passwordOK){
            html = buildHTMLForGoodInfo();
        }else{
            html = buildHTMLForBadInfo();
        }
        out.println(html);

    }

这里是我生成 QR 码并创建 HTML 来显示它的地方:

private String buildHTMLForGoodInfo(){
    QRGenerator qrg = new QRGenerator();
    // This file goes into the webcontent folder
            File filename1 = new File("/home/NAME/Workspace/MyWebApp/WebContent/qr1.png");
            // This file goes outside the webcontent folder
    File filename2 = new File("/home/NAME/Workspace/Data/qr2.png");
    String result = "User Name = " + username + " Password = " + password +".";
    qrg.makeQR(result, filename1);
    qrg.makeQR(result, filename2);
    String html = "<html><head><title>Results Page</title></head>\n" +
                  "<body><center>\n" +
                  "<p>Your user name is " + username + ".<p>\n" +
                  "<br/>\n" +
                  "<p>Your password is " + password + ".<p>\n" +
                  "<br/>\n" +
                  "<p> Have a QR Code</p>\n" +
                  "<br/>\n" +
                  // Show the image from inside the webcontent folder
                  "<img src=\"qr1.png\" alt=\"qr1.png\" border=\"1\">\n" +
                  // show the image from outside the webcontent folder
                  "<img src=\"/home/NAME/Workspace/Data/qr2.png\" alt=\"qr2.png\" border=\"1\">\n" +
                  "</center></body></html>";
    return html;
}

注意:我混淆了我的 linux 用户名,给我提供了一点虚假的安全感。

这是输出的屏幕截图:

在此处输入图像描述

左边的二维码解码为旧数据,它应该显示新数据,用户名=用户名,密码=密码。右边的图像没有出现。当我使用文件管理器导航到计算机上两个文件的位置时,两个文件都有带有正确数据的二维码。我不知道旧的错误二维码存储在哪里,它没有显示在文件管理器中,我已经检查了隐藏文件。

编辑:

我已经通过使用图像 servlet 解决了我的问题,不幸的是我找不到引导我进入该路径的 stackoverflow 页面。我用这个 doGet 方法做了一个简单的 servlet:

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    // In the event of an error, make a red square.
    int[] pixels = new int[128*128*3];
    for(int i = 0; i < 128*128; i++){
        pixels[i] = 200 << 16 | 0 << 8 | 0;
    }
    BufferedImage image = new BufferedImage(128,128,BufferedImage.TYPE_INT_RGB);
    image.setRGB(0,0,128,128, pixels,0,128);

    // get the file's address from the request
    File imageID = new File(request.getParameter("imageID"));
    // Try to read the file into the image, if you can't read it, print an error
    try{
        image = ImageIO.read(imageID);
    }catch(Exception e){
        System.out.println("IMAGE IO ERROR");
        e.printStackTrace();
    }

    System.out.println(imageID.toString());

    // get the response output stream and pass the image to it
    ServletOutputStream out = response.getOutputStream();
    ImageIO.write(image, "png", out);
}

然后当我想显示图像时,我使用这个 html:

    img src=\"ImageServlet?imageID= PUT YOUR IMAGE ADDRESS HERE "
4

0 回答 0