私はTomcat 7でEclipse動的Webプロジェクトを使用しています。私はこれが非常に新しく、チュートリアルをゆっくりと進めています。
ユーザーが QR コードの生成に使用される情報を入力する単純な webapp を作成しようとしています。画像を作成して WebContent フォルダーに保存できます。この画像をユーザーに表示して保存したいと思います。最終的には、保存された QR コードやその他の画像を使用して、各ユーザーのアカウントを作成します。フォームを介して情報を取得し、画像を作成して WebContent フォルダーに保存するサーブレットに渡す index.html があります。次に、単純な HTML を作成して画像を表示します。ただし、プロジェクトを更新するようにEclipseに指示しない限り、画像は表示されません。私の推測では、Eclipse は更新されるまで新しい画像ファイルを認識せず、何らかの理由でサーブレットによって生成された HTML が適切な場所にあるにもかかわらず画像を取得していません。
ここでの答えは、データを webapp フォルダーの外に保存してストリーミングすることを提案しています。これは私がよく知らないことです。画像を外部フォルダーに保存し、WebContent フォルダーから画像ファイルへの絶対パスと相対パスの両方を使用して参照しようとしましたが、どちらも機能しません。また、WebContent フォルダー内から表示できた QR コードは、イメージを作成するために別のデータを指定しても更新されません。ファイル名と場所が同じであっても、Eclipse でプロジェクトを更新する必要があります。ファイルブラウザを使用して画像ファイルを開くと、新しいデータが含まれています。
私は非常に基本的な助けを求めています。私は無能ではありませんが、これまでインターネットプログラミングを行ったことがなく、これは学ぶべきことがたくさんあります. 一般に、データを取得して保存し、新しいデータを生成し、それを動的に呼び出してユーザーに表示する方法を知る必要があります。ありがとうございました。
サーブレットの 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 コードは古いデータにデコードされ、新しいデータ (ユーザー名 = ユーザー名、パスワード = パスワード) が表示されます。右の画像が表示されません。ファイル マネージャーを使用してコンピューター上の両方のファイルの場所に移動すると、両方のファイルに正しいデータの QR コードがあります。古い間違った QR コードがどこに保存されているのかわかりません。ファイル マネージャーに表示されず、隠しファイルをチェックしました。
編集:
イメージサーブレットを使用して問題を解決しましたが、残念ながら、そのパスにたどり着いたスタックオーバーフローページが見つかりません。この doGet メソッドを使用して単純なサーブレットを作成しました。
@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 "