0

私はオンライン ショップ アプリケーションの一部として Web サーバーを実行しており、フォーム JSP ページを機能させようとしています。私はMavenでEclipse IDEを使用しており、Jettyプラグインを試しています。

こんなふうになります:

ユーザーは、index.jsp ウェルカム ページからボタンを押して、GET 要求を AddProductoServlet に送信します。これは、「tiendas」(ショップ) のリストをロードして jsp ページに貼り付けるために必要であり、ユーザーはドロップダウン リストから 1 つを選択できます (html 要素を選択)。

AddProductoServlet の GET メソッドは次のとおりです。

@Override
public void doGet(HttpServletRequest request,
                HttpServletResponse response)
    throws ServletException, IOException {

    logger.debug("doGet de AddProductoServlet");

    // llamada al servicio para pedir la lista de tiendas en la BD
    // TODO añadir metodo a la clase conversora para meter listas de tiendas
    //List<TiendaWTO> tiendaWTOs = TiendaTOtoTiendaWTOConversor.toTiendaWTO(productoService.getTiendas());

    // Test
    List<String> tiendaWTOs = new ArrayList<String>();
    tiendaWTOs.add("El Rincón de José");
    tiendaWTOs.add("El bar de Antonio");
    tiendaWTOs.add("Pezuñita comics");

    request.setAttribute("tiendas", tiendaWTOs);

    // TODO lo que viene a continuacion en el ejemplo de servjsptutorial
    // va en una clase aparte y se llama a la función forwardTo
    RequestDispatcher requestDispatcher = request.getRequestDispatcher("AddProducto.jsp");

    requestDispatcher.forward(request, response);
}

そしてここに jsp ページ AddProducto:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    import="java.util.Map,
        java.util.List" %>

<html>
<head>
    <title>Nosa Tenda - Crear producto</title>
</head>

<body text="#000000" bgcolor="#ffffff">

<%-- Get errors. --%>

<%
    String nombreErrorMessage = "";
    String imagenErrorMessage = "";
    String precioErrorMessage = "";
    String stockErrorMessage = "";
    String tiendaErrorMessage = "";

    Map<String, String> errors = (Map<String, String>) request.getAttribute("errors");



    if (errors != null) {

        String errorHeader = "<font color=\"red\"><b>";
        String errorFooter = "</b></font>";

        if (errors.containsKey("nombre")) {
            nombreErrorMessage = errorHeader + errors.get("nombre") + 
                errorFooter;
        }

        if (errors.containsKey("imagen")) {
            imagenErrorMessage = errorHeader + errors.get("imagen") + 
                errorFooter;
        }

        if (errors.containsKey("precio")) {
            precioErrorMessage = errorHeader + errors.get("precio") + 
                errorFooter;
        }

        if (errors.containsKey("stock")) {
            stockErrorMessage = errorHeader + errors.get("stock") + 
                errorFooter;
        }

        if (errors.containsKey("tienda")) {
            tiendaErrorMessage = errorHeader + errors.get("tienda") + 
                errorFooter;
        }

    }

    String nombre = request.getParameter("nombre");
    if (nombre==null) {
        nombre="";
    }
    String descripcion = request.getParameter("descripcion");
    if (descripcion==null) {
        descripcion="";
    }
    String imagen = request.getParameter("imagen");
    if (imagen==null) {
        imagen="";
    }
    String precio = request.getParameter("precio");
    if (precio==null) {
        precio="";
    }
    String stock = request.getParameter("stock");
    if (stock==null) {
        stock="";
    }

    List<String> tiendas = (List<String>) request.getAttribute("tiendas");

    //response.setContentType("charset=UTF-8");
%>  

<div align="center">
    <p>
        <font color="#000099" face="Arial, Helvetica, san-serif">
            <b>Crear producto</b>
        </font>
    </p>
</div>

<form method="POST" action="AddProducto">

<table width="100%" border="0" align="center" cellspacing="12">

<%-- Nombre --%>

    <tr>        
        <th align="right" width="50%">
            Nombre 
        </th>
        <td align="left">   
            <input type="text" name="nombre" 
                value="<%= nombre %>"
                size="64" maxlength="100">
            <%= nombreErrorMessage %>
        </td>
    </tr>

<%-- Descripcion --%>

    <tr>        
        <th align="right" width="50%">
            Descripción 
        </th>
        <td align="left">   
            <textarea name="descripcion" 
                rows="8" cols="40" maxlength="450"><%= descripcion %></textarea>
        </td>
    </tr>

<%-- Imagen --%>

    <tr>        
        <th align="right" width="50%">
            URL de la imagen 
        </th>
        <td align="left">   
            <textarea name="imagen" 
                rows="8" cols="40" maxlength="450"><%= imagen %></textarea>
            <%= imagenErrorMessage %>
        </td>
    </tr>

<%-- Precio --%>

    <tr>        
        <th align="right" width="50%">
            Precio 
        </th>
        <td align="left">   
            <input type="text" name="precio" 
                value="<%= precio %>"
                size="9" maxlength="8">
            <%= precioErrorMessage %>
        </td>
    </tr>

<%-- Stock --%>

    <tr>        
        <th align="right" width="50%">
            Stock 
        </th>
        <td align="left">   
            <input type="text" name="stock" 
                value="<%= stock %>"
                size="9" maxlength="8">
            <%= stockErrorMessage %>
        </td>
    </tr>

<%-- Tienda --%>

    <tr>        
        <th align="right" width="50%">
            Tienda 
        </th>
        <td align="left">   
            <select name="tiendaId">
            <% for (int i=0; i < tiendas.size(); i++) { %>
            <option value="<%= tiendas.get(i) %>"><%= tiendas.get(i) %></option>
            <% } %>
            </select>
            <%= tiendaErrorMessage %>
        </td>
    </tr>

<%-- Create button --%>

    <tr>        
        <td width="50%"></td>
        <td align="left" width="50%">
            <input type="submit" value="Crear producto">
        </td>
    </tr>

</table>

</form>


</body>

</html>

ここまでは、すべてが正常に機能し、ページが読み込まれ、ドロップダウン リストが正しく入力されています。今はショップ名をロードするためにモックを使用していることに注意してください。後で、Web サービスとデータベースの間でサービスへの呼び出しが行われますが、それは今は重要ではありません。

ここで、ユーザーがフォームの送信ボタンを押したときに次にしようとしているのは、AddProductoServlet の post メソッドを呼び出してフォーム フィールドをチェックすることです。エラーがなければ、成功ページにリダイレクトします。私はそれをテストしました、それは動作します、そしてデバッグから私はすべてのパラメータが正しくサーブレットに渡されることを知っています:

response.sendRedirect("AddProductoExito.jsp?id="
                + 1);

間違いがあり、この行が呼び出されると問題が発生します。

requestDispatcher.forward(request, response);

doPost メソッド全体を次に示します。

@Override
public void doPost(HttpServletRequest request,
                HttpServletResponse response)
    throws ServletException, IOException {

    logger.debug("doPost de AddProductoServlet");

    Map<String, String> errors = new HashMap<String, String>();

    String nombre = request.getParameter("nombre");
    String descripcion = request.getParameter("descripcion");
    String imagen = request.getParameter("imagen");
    String precio = request.getParameter("precio");
    String stock = request.getParameter("stock");
    //Long tiendaId = Long.parseLong(request.getParameter("tiendaId"));
    String tiendaId = request.getParameter("tiendaId");

    // validamos campos
    PropertyValidator.validateMandatory(errors, "nombre", nombre);
    PropertyValidator.validateMandatory(errors, "imagen", imagen);
    double precioAsDouble = PropertyValidator.validateDouble(errors,
            "precio", precio, true, 0, Double.MAX_VALUE);
    long stockAsLong = PropertyValidator.validateLong(errors,
            "stock", stock, true, 0, Long.MAX_VALUE);
    /*long tiendaIdAsLong = PropertyValidator.validateLong(errors,
            "tiendaId", tiendaId, true, 0, Long.MAX_VALUE);*/

    if (!errors.isEmpty()) {
        request.setAttribute("errors", errors);
        // TODO lo que viene a continuacion en el ejemplo de servjsptutorial
        // va en una clase aparte y se llama a la función forwardTo
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("AddProducto.jsp");

        requestDispatcher.forward(request, response);
    } else {

        // llamada al servicio para insertar producto
        // TODO usar productoWTO (meter clase conversora en la linea siguiente)
        /*ProductoTO insertedProducto = productoService.newProducto(
                                            nombre,
                                            descripcion,
                                            imagen,
                                            precio,
                                            stock,
                                            tiendaId);

        response.sendRedirect("AddProductoExito.jsp?id="
                + insertedProducto.getId());*/

        // Test
        response.sendRedirect("AddProductoExito.jsp?id="
                + 1);
    }

これらすべての目的は、エラーが発生した場合に AddProducto.jsp を再度ロードすることですが、今回は画面にエラーを表示し (問題を示すエラーのあるフィールドの横に赤いテキストが表示されます)、入力された内容も表示します。以前のテキスト フィールド。

これは、私が取得した NullPointerException エラーのスタックトレースです。言及されている AddProductoServlet の 85 行目は「requestDispatcher.forward(request, response);」に対応します。前に述べたように:

2015-01-29 12:01:24.877:WARN:oejs.ServletHandler:
org.apache.jasper.JasperException: java.lang.NullPointerException
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:575)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:276)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:103)
    at es.udc.jcastedo.NosaTenda.webservice.service.web.servlets.AddProductoServlet.doPost(AddProductoServlet.java:85)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:370)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
    at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:695)
Caused by: 
java.lang.NullPointerException
    at org.apache.jsp.AddProducto_jsp._jspService(AddProducto_jsp.java from :233)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:575)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:276)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:103)
    at es.udc.jcastedo.NosaTenda.webservice.service.web.servlets.AddProductoServlet.doPost(AddProductoServlet.java:85)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:370)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
    at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:695)
2015-01-29 12:01:24.880:WARN:oejs.ServletHandler:/NosaTenda-webservice/AddProducto
java.lang.NullPointerException
    at org.apache.jsp.AddProducto_jsp._jspService(AddProducto_jsp.java from :233)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:575)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:276)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:103)
    at es.udc.jcastedo.NosaTenda.webservice.service.web.servlets.AddProductoServlet.doPost(AddProductoServlet.java:85)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:370)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
    at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:695)

だから今私は立ち往生しています。そのエラーが発生する理由がわかりません。呼び出しは GET メソッドと同じで、問題なく動作します。

以前と同じように、デバッグしましたが、パスは正しいです。それにもかかわらず、/AddProducto.jsp などの何らかの理由で jsp ページが見つからないように思われるため、いくつかの組み合わせを試しましたが、役に立ちませんでした。

このページや他のページでも同様の質問について調査しましたが、何もしませんでした。他のすべてのサーブレットは正常に動作するため、構成は問題ないようです。

ここで何が欠けていますか?ありがとう。

4

1 に答える 1

0

複雑すぎることについて話してください... ここで私は、doGet と doPost による同じページへの 2 つの連続した呼び出しについて何かがおかしいと考えていました。おそらく、応答または要求で属性が破損しているか何かが発生したか、さらに悪いことにconfig にバグがありました...いいえ、いつものように、もちろんそれに気づいたら、もっとシンプルでもっと明白なものでした。

簡単に言えば、何らかの理由でまだリクエストに添付されていると思っていたので、「tiendas」参照は doPost で再度作成されません。そのため、jsp ページが「tiendas.get(i)」を実行しようとすると、明らかに変数が見つからず、NullPointerException がスローされました。

また、私がページのデバッグに欠けていたために、サーブレットに集中していて、例外が実際にページによってスローされたとは考えていませんでした。

これに時間を費やしてくれた人に感謝し、申し訳ありません。私の間違いです。

于 2015-02-02T18:24:08.303 に答える