代码之家  ›  专栏  ›  技术社区  ›  kuriouscoder

将对象从JSP页传递回Servlet

  •  22
  • kuriouscoder  · 技术社区  · 14 年前

    总之,我想知道如何通过 object 从JSP页面返回到Servlet。具体来说,我有一个表单元素,它的action标记引用一个servlet。在提交表单时,我想嵌入 对象 在里面 HttpServletRequest 请求 对象 以便它可以被servlet解除引用。

    到目前为止,我试着设置 request.setAttribute(object) 在JSP页面中。但是仍然从servlet中检索它会将其作为空值。任何指点都将不胜感激。

    3 回复  |  直到 8 年前
        1
  •  42
  •   BalusC    5 年前

    了解HTTP的工作原理:

    • 客户端(通常是web浏览器)发出HTTP请求。
    • 服务器检索HTTP请求。
    • Servletcontainer创建 新的 HttpServletRequest HttpServletResponse 物体。
    • Servletcontainer使用这些对象调用适当的servlet。
    • Servlet处理请求并将请求和响应转发给JSP。
    • JSP写入响应体。
    • Servletcontainer提交HTTP响应和 毁灭 请求和响应对象。
    • 服务器将HTTP响应发送回客户端。
    • 客户端检索HTTP响应并处理它(显示HTML、应用CSS、执行JS)。

    通过提交表单发送新请求时,它不会重用相同的请求和响应对象。

    有两种方法可以克服HTTP的这种无状态特性。您需要将此对象转换为 String 并将其包含在JSP中HTML表单的隐藏输入字段中,以便在提交时可以将其作为请求参数使用。

    <input type="hidden" name="myObject" value="${myObjectAsString}" />
    

    转换为 字符串 是必要的,因为HTTP和HTML不理解Java对象。从Java的角度来看,HTML基本上是 字符串 (右键单击并 查看源 在webbrowser看到它)。如果不将Java对象转换为 字符串 ,则默认情况下Java对象的 toString() 结果将被打印到HTML,而HTML不是每个定义都可以转换回原始Java对象。最常用的 字符串 复杂对象的格式是JSON和XML。有很多Java库可以在复杂的Java对象和 字符串 JSON或XML格式。

    或者,如果对象太大或太复杂而无法转换为 字符串 反之亦然,则需要将其存储在服务器的内存或某个数据库中,并将其唯一标识符作为隐藏的输入值传递。通常会话作用域用于此。

    所以,在准备数据并转发给 JSP页面:

    String myObjectId = UUID.randomUUID().toString();
    request.getSession().setAttribute(myObjectId, myObject);
    request.setAttribute("myObjectId", myObjectId);
    request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);
    

    并且,在转发的JSP页面中:

    <form action="nextservlet" method="post">
        <input type="hidden" name="myObjectId" value="${myObjectId}" />
        ...
    </form>
    

    最后,在处理表单提交的下一个servlet中:

    String myObjectId = request.getParameter("myObjectId");
    Object myObject = request.getSession().getAttribute(myObjectId);
    request.getSession().removeAttribute(myObjectId);
    // ...
    

    另见:

        2
  •  2
  •   Pokuri    14 年前

    一旦JSP被呈现,请求对象就结束了。因此,根据JSP的请求设置的对象可以单独用于该JSP页面请求。您对使用会话而不是请求有任何限制吗。因此,会话可以在新请求之间保存数据,直到会话过期。

        3
  •  2
  •   Mudit Verma    8 年前

    最好的方法是在base64中对Java对象进行编码,然后将其作为字符串从JSP传递到servlet。

    例如-

    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(javaObject);
    oos.flush();
    final String result = new String(Base64.getEncoder().encode(baos.toByteArray()));
    

    在HTTP请求中传递此结果-

       <input type = "hidden" name="<%= "MY_JAVA_OBJECT" %>" value="<%= result  %>" />
    

    在服务器上读回java对象-

    final String base64String = request.getparameter("MY_JAVA_OBJECT");
    final byte[] objToBytes = Base64.getDecoder().decode(base64String);
    ByteArrayInputStream bais = new ByteArrayInputStream(objToBytes);
    ObjectInputStream ois = new ObjectInputStream(bais);
    return (ObjectClass) ois.readObject();