0

プログラムに送信されるパラメーターに基づいて有効な BufferedImage bi を生成する Java プログラムがあります。このプログラムをサーブレットから呼び出して、ユーザーが入力したパラメーターに適合するイメージを含む JSP をサーブレットからユーザーに送信させたいと考えています。以下に記述したコードは、要求された画像の代わりに null メッセージを生成します。

get_bi() は、開発用コンピューターで BufferedImage を生成するのに数百ミリ秒かかる場合があることを付け加えておく必要があります。問題の一部が時間遅延の問題であるかどうかはわかりません。

null メッセージの代わりにユーザーの Web ブラウザに実際の画像を出力するように、以下のコードを変更する方法を教えてもらえますか?

ImageServlet のコードは次のとおりです。

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//import org.apache.log4j.Logger;
import myownpackage.GetBI;

public class ImageServlet extends HttpServlet{
//   private Logger logger = Logger.getLogger(this.getClass());
   private RequestDispatcher jsp;

   public void init(ServletConfig config) throws ServletException {
      ServletContext context = config.getServletContext();
      jsp = context.getRequestDispatcher("/WEB-INF/jsp/send-image-into-html.jsp");
   }

   protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
       throws ServletException, IOException {
    //      logger.debug("doGet()");
          String imageParams = req.getParameter("imageParams");
          jsp.forward(req, resp);
   }

   protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
       throws ServletException, IOException{  
       Map<String, String> errors = validate(req);
       if (!errors.isEmpty()){
          //         logger.debug("validation errors");
          jsp.forward(req, resp);
       return;
       }

      resp.setContentType("image/gif");
      BufferedImage bi = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
      GetBI fetchBI = new GetBI();
      bi = fetchBI.get_bi(req.getParameter("imageParams"));
      File imgFile = new File("imgFile");
      ImageIO.write(bi, "gif", imgFile);
      resp.sendRedirect("send-image-into-html");
   }  

   public static Map<String, String> validate(HttpServletRequest req){
   HashMap<String, String> errors = new HashMap<String, String>();
   req.setAttribute("errors", errors);
   String imageParams = req.getParameter("imageParams");
   if (imageParams == null || imageParams.trim().length() == 0){
      errors.put("imageParams", "imageParams required.");
   }
   return errors;
 }
}

send-image-into-html.jsp のコードは次のとおりです。

<jsp:useBean id="errors" scope="request" type="java.util.Map" class="java.util.HashMap" />
<%@ include file="top.inc" %>
<%@ include file="middle.inc" %>
<table>
    <tr>
        <td width=350>
            <%=request.getParameter("imgFile")%>
            <img src="<%=request.getParameter("imgFile")%>">
        </td>
        <td>
            <form method="post">
                <table>
                    <tr>
                        <td>Image Parameters: </td>
                        <td><input type="text" name="imageParams" value="some parameters" size="50" />  
                            <% if (errors.containsKey("imageParams")) {
                            out.println("<span class=\"error\">" + errors.get("imageParams") + "</span>");
                            }%>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <input type="submit" name="submit-button" value="Click Here" />
                        </td>
                    </tr>
                </table>
            </form>
        </td>
    </tr>
</table>
<%@ include file="bottom.inc" %>

編集:


Joop の提案を理解したことに基づいてコードを編集しましたが、それでも機能しません。これをさらに編集して機能させる方法を教えてもらえますか?

FirstServlet のコードは次のとおりです。

public class FirstServlet extends HttpServlet{
    //   private Logger logger = Logger.getLogger(this.getClass());
    private RequestDispatcher jsp;

public void init(ServletConfig config) throws ServletException {
    ServletContext context = config.getServletContext();
    jsp = context.getRequestDispatcher("/WEB-INF/jsp/send-image-into-html.jsp");
}

protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {//      logger.debug("doGet()");
    jsp.forward(req, resp);
}

protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException{
    Map<String, String> errors = validate(req);
    if (!errors.isEmpty()){//         logger.debug("validation errors");
        jsp.forward(req, resp);
        return;
    }
    resp.sendRedirect("/send-image-into-html");
}

public static Map<String, String> validate(HttpServletRequest req){
    HashMap<String, String> errors = new HashMap<String, String>();
    req.setAttribute("errors", errors);
    String imageParam1 = req.getParameter("imageParam1");
    if (imageParam1 == null || imageParam1.trim().length() == 0){  
        errors.put("imageParam1", "imageParam1 required.");
    }
    return errors;
}
}  

SecondServlet のコードは次のとおりです。

public class GetGraphServlet extends HttpServlet{
    //   private Logger logger = Logger.getLogger(this.getClass());
    private RequestDispatcher jsp;

public void init(ServletConfig config) throws ServletException {
    ServletContext context = config.getServletContext();
    jsp = context.getRequestDispatcher("/WEB-INF/jsp/send-image-into-html.jsp");
}

protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {//      logger.debug("doGet()");
    // Create the BufferedImage, using any parameters and
    // possibly the exact request URI:
    String requestURI = req.getRequestURI();
    String imageParam1 = req.getParameter("imageParam1");
    resp.setContentType("image/gif");//256 colors
    BufferedImage bi = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
    GetBI fetchBI = new GetBI();
    bi = fetchBI.get_bi(req.getParameter(imageParam1));
    ImageIO.write(bi,"gif",resp.getOutputStream());
    resp.setContentType("image/gif"); // 256 colors.
    ImageIO.write(bi, "gif", resp.getOutputStream());
    jsp.forward(req, resp);
}

protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException{}
}

send-image-into-html.jsp のコードは次のとおりです。

<jsp:useBean id="errors" scope="request" type="java.util.Map" class="java.util.HashMap" />
<%@ include file="top.inc" %>
<%@ include file="middle.inc" %>
    <form method="post">
        <table>
            <tr>
                <td width=350>
                    <img src="<%="/get-graph.gif?imageParam1="%>">
                </td>
                <td>
                    <table>
                        <tr>
                            <td>imageParam1: </td>
                            <td><input type="text" name="imageParam1" value="samplevalue" size="50" />
                            <%if (errors.containsKey("imageParam1")) {
                                out.println("<span class=\"error\">" + errors.get("imageParam1") + "</span>");}%>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <input type="submit" name="submit-button" value="CreateImage"/>
                            </td>
                        </tr>
                    </table>
                </td>
            </tr>
        </table>
    </form>
<%@ include file="bottom.inc" %>  

web.xml の関連タグは次のとおりです。

    <servlet>
        <servlet-name>FirstServlet</servlet-name>
            <servlet-class>mypackage.FirstServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FirstServlet</servlet-name>
            <url-pattern>/html-page-url</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>SecondServlet</servlet-name>
        <servlet-class>mypackage.SecondServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SecondServlet</servlet-name>
        <url-pattern>/get-graph</url-pattern>
    </servlet-mapping>
4

3 に答える 3

1

3 つの個別のリクエストがあるようです。

  1. GET html ページの URL

    (send-image-into-html.jsp (フォームを含む) で応答します)。

  2. パラメーター imageParam1=... を指定した POST html-page-url

    (send-image-into-html.jsp (画像を含む) で応答します)。

  3. パラメータ imageParam1=... を使用して get-graph.gif を取得します。

    (gif content-type と画像データで応答します)。

どこに問題があるのか​​を絞り込み、一つ一つ解決していくことが重要です。サーブレットに完全なログを追加し、FireBug/Chrome DevTools などのツールを使用して、何が起こっているかを正確に確認します。リクエスト、パラメータ、および生成された html を見てください。正しい URL はどれですか? どのパラメータが正しいですか? 正しい回答はどれですか?

最初のリクエストは正常に機能していると思います。

3 番目の要求から始めます。これは、ブラウザに URL を直接入力することでテストできます。.gif 拡張子とフル パスが必要かどうかを確認します。

少なくとも重複した行と jsp.forward を削除する必要があります。

protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
    // Create the BufferedImage, using any parameters and
    // possibly the exact request URI:
    String requestURI = req.getRequestURI();
    String imageParam1 = req.getParameter("imageParam1");
    BufferedImage bi = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
    GetBI fetchBI = new GetBI();
    bi = fetchBI.get_bi(req.getParameter(imageParam1));

    resp.setContentType("image/gif");//256 colors
    ImageIO.write(bi,"gif",resp.getOutputStream());
}

イメージが正しく表示されたら、イメージを含むページをテストします。これで、URL がどうあるべきかがわかったので、生成された html を見て、期待するものと比較してください。画像のソースは正しいですか?

<td width=350>
    <img src="<%="/get-graph.gif?imageParam1="%>">
</td>

これは、絶対パスと拡張子を使用しているように見え、パラメーター値を出力せず、ユーザーが imageParam を入力しなくても表示されます。

そのため、imageParam1 パラメーターの値をここに出力する必要があります。おそらく if ステートメントで囲んでいます。他の場所で行ったように、今のところスクリプトレットを使用できますが、jstl などのタグ ライブラリの使用を検討する必要があります。

編集:

GetBI クラスはありませんが、次の例をテストしました。

public class SecondServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String imageParam1 = request.getParameter("imageParam1");

        BufferedImage bi = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);

        // Try replacing with:
        //GetBI fetchBI = new GetBI();
        //BufferedImage bi = fetchBI.get_bi(req.getParameter("imageParam1"));

        Graphics2D g = bi.createGraphics();
        g.setColor(new Color(255, 255, 255));
        g.drawString(imageParam1, 0, 150);
        g.dispose();

        response.setContentType("image/gif");
        ImageIO.write(bi, "gif", response.getOutputStream());
    }
}

これにより、imageParam1 のテキストを含む画像が次の場所に表示されます。

http://127.0.0.1:8080/myapp/get-graph?imageParam1=Testing
于 2013-08-04T11:32:14.407 に答える
0

これを試してみてください... 100%動作します

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

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

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 *
 * @author kites
 */
public class FileUpload extends HttpServlet {

    File uploadFile;
    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */

    long fileSize;


    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {

            boolean bb = upload(request);


        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private boolean upload(HttpServletRequest request) {
        boolean bool = false;

        try {
                    String fileName = "";

            boolean isMultipart = ServletFileUpload.isMultipartContent(request);
            if (isMultipart) {
                System.out.println("Inside fileupload.....");
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                List items = upload.parseRequest(request);
                Iterator iterator = items.iterator();
                //  System.out.println("File content" + request.getParameter("f1"));
                while (iterator.hasNext()) {
                    FileItem item = (FileItem) iterator.next();
                    FileItem item1 = item;
                    System.out.println("Form field:::" + item.isFormField());

                    if (!item.isFormField()) {
                        fileName = item.getName();
                        fileSize = item.getSize();
                        File f = new File("C:\\"+fileName);
                        String filepath=f.getAbsolutePath();

                        System.out.println("fileName = " + fileName);
                        System.out.println("fileSize = " + fileSize);
                        if (!fileName.equals("")) {


                            item.write(filepath);


                        }
                    }


                }


            }


        } catch (Exception e) {
            e.printStackTrace();
        }
        return bool;
    }


}
于 2013-08-03T12:41:40.120 に答える