【问题标题】:Pass model from servlet to JSP page将模型从 servlet 传递到 JSP 页面
【发布时间】:2015-07-22 16:19:26
【问题描述】:

我正在使用 servlet 将文档上传到服务器。成功上传后,我需要向用户显示附加信息,例如使用哪个 id 上传的文档。为此,我将 ID 和文件名放在 modelMap 中,我试图在 JSP 页面上发送它。

为此,我正在使用此代码:-

 ModelMap model = new ModelMap();
 for(FileItem item : files) {
        model.put(id, fileName);
 }
 req.setAttribute("message", model);
 RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/success.do");
 dispatcher.forward(req, resp);

在 JSP 页面上

<%
    if(request.getAttribute("message")!=null){
    String value = request.getAttribute("message").toString();
    if(value!=null)
  {
    value = value.substring(1, value.length()-1);           //remove curly brackets
    String[] keyValuePairs = value.split(",");              //split the string to creat key-value pairs
    for(String pair : keyValuePairs)                        //iterate over the pairs
        {
        String[] entry = pair.split("=");                   //split the pairs to get key and value 
            out.println("<font color='red'>"+entry[1].trim()+"</font> indexed with id <font color='red'>"+entry[0].trim()+"</font><br/>");
       }
  }

     System.out.println(request.getAttribute("message"));
    }
%>

我的问题是在这个场景中所有的东西都在工作,除了一个。当我上传文档消息时显示,但我的 URL 仍然是上传的 servlet URL。所以当用户点击它(GET请求)时,servlet会抛出一个上传文件的异常。

如果我使用

resp.sendRedirect("../success.do");

然后我不能在其中传递参数。那么我该如何完成这个任务呢?

我的文件上传servlet是

mySite/upload/servlet

成功页面是

mySite/success.do 

【问题讨论】:

  • 要传递参数,您可以执行类似 resp.sendRedirect("../success.do?p1=abcd&p2=xyz");
  • 假设用户选择上传 100 个文件,因此文件名和上传 ID URL 超过 256 个字符的限制。所以我们不能用这个。
  • 如果允许用户上传多个文件,那么其他选项可能是在会话中设置地图,然后重定向请求,从那里我们可以获取地图,然后从会话中删除变量。跨度>
  • 是的,投了赞成票,但这不是一个好习惯,我不想对每个请求都使用会话。
  • 另一种方法是在 servlet 的输出中提供一个 html 表单,该表单由 javascript 自动提交到 /success.do

标签: java jsp servlets


【解决方案1】:

无法真正发表评论,因此将其添加为答案。

如果您的主要目的是能够上传文件并隐藏servlet url,那么使用AJAX进行文件上传怎么样?

这里是示例 sn-p

JSP:


<script type="text/javascript">
function performAjaxSubmit() {
    var sampleText = document.getElementById("sampleText").value;
    var sampleFile = document.getElementById("sampleFile").files[0];
    var formdata = new FormData();
    formdata.append("sampleText", sampleText);
    formdata.append("sampleFile", sampleFile);
    var xhr = new XMLHttpRequest();       
    xhr.open("POST","/fileUploadTester/FileUploader", true);
    xhr.send(formdata);
    xhr.onload = function(e) {
        if (this.status == 200) {
           alert(this.responseText);
        }
    };                 
}   

这是取自这里 http://www.technicaladvices.com/2011/12/10/ajax-file-upload-to-a-java-servlet-in-html5/

当然还有很多使用 JSP + JQUERY 的例子

在 servlet 方面,您总是可以使用类似的东西

PrintWriter print = response.getWriter();

print.println("");

打印一个简单的输出

【讨论】:

    【解决方案2】:

    好的,因此您必须通过重定向传递任意大量信息。一些框架发明了他们称之为 flash 的东西。在引擎盖下,它意味着:

    • 在重定向之前将会话中的信息保存在众所周知的属性名称(或模式)下
    • 在重定向页面中,查看session中是否存在flash属性,如果有则放入request中并从session中移除

    优点:它允许您通过重定向模拟请求属性的通过

    注意事项:它在中间的 AJAX 调用中效果不佳,因为 flash 通常用于下一个请求,但通常适用于重定向。

    可能的实现:

    • 如果您在应用程序的一个地方使用它,只需在会话中使用专用属性名称,在执行重定向的 servlet 中设置它,然后在您重定向的 servlet(或 JSP)中获取它
    • 如果您打算在整个应用程序中使用它,您应该考虑使用一个过滤器来处理这个(这些)闪存属性,并编写一个将属性放入闪存并发送重定向响应的方法以确保确保它在整个应用程序中保持一致且易于维护。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多