我正在使用带有tomcat 7的Eclipse动态Web项目。我非常擅长这个并且正在慢慢地完成教程。
我正在尝试创建一个简单的webapp,用户输入用于生成QR码的信息。我可以制作图像并将其保存到WebContent文件夹中。我想向用户显示此图像并存储它。最终,我将为每个用户提供一个帐户,其中包含存储的QR码和其他图像。我有一个index.html,它通过表单获取信息并将其传递给创建映像的servlet并将其保存在我的WebContent文件夹中,然后构建一个简单的HTML来显示图像。但是,除非我告诉eclipse刷新项目,否则不显示图像。我的猜测是eclipse在刷新之前不知道新的图像文件,并且由于某种原因,即使它在正确的位置,servlet生成的HTML也没有在图像上拾取。
答案here建议将数据存储在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用户名进行了模糊处理,以便给我一点点虚假安全感。
以下是输出的屏幕截图:
左侧的QR码解码为旧数据,应显示新数据,username = UserName,password = Password。右侧的图像不会出现。当我使用文件管理器导航到我的计算机上的两个文件位置时,两个文件都具有包含正确数据的QR代码。我不知道旧的错误QR码存储在哪里,它没有显示在文件管理器中,我检查了隐藏文件。
编辑:
我已经通过使用图像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 "