将模型从servlet传递到JSP页面

时间:2015-07-22 04:12:45

标签: java jsp servlets

我使用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 

2 个答案:

答案 0 :(得分:0)

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

如果您的主要动机是能够上传文件并隐藏servlet网址,那么如何使用AJAX进行文件上传?

以下是示例代码段

JSP:


12

这是从这里开始的 http://www.technicaladvices.com/2011/12/10/ajax-file-upload-to-a-java-servlet-in-html5/

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

在servlet端,你总是可以使用类似

的东西
<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);
        }
    };                 
}   

打印简单输出

答案 1 :(得分:0)

好的,所以你必须通过重定向传递任意大量的信息。一些框架为这种用法发明了他们所谓的 flash 。在引擎盖下,它意味着:

  • 在重定向
  • 之前,使用众所周知的属性名称(或模式)将信息保存在会话中
  • 在重定向的页面中,查看会话中是否存在 flash 属性,如果有,请将其置于请求中并将其从会话中删除

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

警告:中间的AJAX调用效果不佳,因为闪存通常用于下一个请求,但通常它适用于重定向。

可能的实施:

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