我现有一个jsp文件,显示书的目录,每一个条目是一个href,通过点击相应条目,以流的形式读取本地磁盘的文件供外网访问。action已经获得了路径信息,我原来是拿servlet实现的,会生成新的页面。现想直接通过struts2 action直接实现,我想原理还是一样,都是读流,但是具体怎么实现,还请明示。另如何使目录和内容如何显示在一页。

解决方案 »

  1.   

    个人看书发现action必须返回success,error、input等5个,可是当前想通过流返回,那么如何在浏览器中显示本地的文件htm格式的
      

  2.   

    在你的Action里:
    [code=Java]
    // 首先,设置Action框架在本Action执行完毕后,不再做转发
    ActionContext.getContext().getActionInvocation().getProxy().setExecuteResult(false);// 取得 HttpServletResponse
    HttpServletResponse response = ServletActionContext.getResponse();//接下来,你可以像在servlet中一样,使用response直接向前台写数据了。
      

  3.   

    谢谢3楼的朋友和各位顶贴的朋友。3楼的方法完全可以。第一个问题基本实现了,已经符合我的要求了。但是我还是想问,这样还是直接输出页面,因为我现在做的东西比较简单,还可以。但是如果是一个比较大的系统,这样直接由模型控制输出,没经过控制器,是否不是很好呢?再有第2个问题,如何将内容和目录放在一个页面中,我想要是用ajax的话,ajax返回的是数据,可是现在返回的是整个页面包括html的头信息等等,要是用iframe的话,我试了试还是没成功,又如何操作呢,谢谢各位了。
      

  4.   

    但是如果是一个比较大的系统,这样直接由模型控制输出,没经过控制器,是否不是很好呢?
    用合适的技术解决合适的问题,这是我的观点。
    既然你已经采用Struts,实际上,就应该遵循Struts的用法,
    但如果你一定要有自己的独特用法,那要么是你有独特的需求,要么是你没有真正理解自己的工具。
    所以,我觉得没什么好不好的,适合你的需求就好。

    再有第2个问题,如何将内容和目录放在一个页面中,我想要是用 ajax的话,ajax返回的是数据,
    可是现在返回的是整个页面包括html的头信息等等。
    因为你现在用的不是Ajax,而是在Action中读取一个文件返回,所以当然包含HTML头等信息了。
    反过来说,即便用Ajax,如果像你现在这样直接读文件返回,也是包含头的。
    返回什么数据是你后台的程序说了算,不是你用的什么技术说了算。
    要是用iframe的话,我试了试还是没成功,又如何操作呢,谢谢各位了。
    没明白,实际上,如果你后台就是html的话,用iframe,完全可以不写任何后台,
    直接iframe.src=URL就可以了。
      

  5.   

    太感谢jinxfei了,你的回复对我有很大的帮助。前一阵也问过相关的帖子(链接路径见下)。
    http://topic.csdn.net/u/20090424/16/dab34eb2-be76-4577-ad94-3ff45eaddd4c.html
    http://topic.csdn.net/u/20090424/16/f27e9134-9e50-4ed1-a194-52ede474a41c.html
    第2个问题我主要想实现的是左边是由数据库读出来的目录,右边是根据点击相应目录读取本地磁盘相应位置的内容。所以考虑了异步请求ajax和实现相对简单些的iframe。至于你说的iframe.src=url的方式,由于是根据左边的点击来动态得到的,所以需要灵活的写,我还不是很清楚,希望能再次得到你的指点。
    我也尝试用左右两个iframe,但是我想可能设计到了二次请求吧,如果左左边是iframe,并没有得到目录,如果左边不是iframe,在目录上我用<a href...targets="">的形式指向右边的iframe,并没有在当前页中打开,而是在新的页面中打开的。此外,按你所说直接指向url,这样能否供外网访问。
    再次感谢你对我的帮助!
      

  6.   

    <a href="要展示的URL" target="目标frame>目录项</a>
    改成:
    <a href="javascript:void(0)" onclick="目标frame.src='要展示的URL'">目录项</a>
      

  7.   

    我按照你说的做了,但是无法执行,showdetail.action是我按你所说整合进去的利用response输出指定位置的htm的action。是否我需要添加js的代码,js我不会,希望你能再帮帮我
    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
    <%@ taglib uri="/alveole-struts2" prefix="s"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title><s:property value="traycd" /></title>
    <meta http-equiv="Content-Script-Type" content="text/javascript"><body>
       <form name="form1"   method="post"   action="">   
          <table border="0">
    <s:iterator value="ptrees">
       <tr><td>
                <s:url id="url" value="showdetail.action">
       <s:param name="t1">
        <s:property value="t1" />
       </s:param>   <s:param name="e1">
         <s:property value="e1" />
       </s:param>
      
    <s:param name="p1">
         <s:property value="p1" />
       </s:param>
      
    <s:param name="c1">
         <s:property value="c1" />
       </s:param>
    </s:url>

    <s:a href="javascript:void(0)"  onclick="show2.src='%{url}'"><s:property value="Name" /> </s:a> 
    </td></tr>
         </s:iterator>
       </table>   <iframe width="0px" height="0px" id="show2" name="show2" ></iframe>   </form>
    </body>
    </html>
      

  8.   

    因为我本是不是做java的,也是由于工作需要,现在需要实现一个java 的东西,所以有很多疑问,这些虽然算不上什么理由,可是现在我要学的东西很多,我是一边做一边看书,上网查资料,加上工作总是有时间限制的,所以很着急,就希望能有一些捷径吧,谢谢jinxtei和各位回帖的兄弟。五一期间我也会在家恶补一下相关知识的,还是希望能得到大家得帮助的。小弟不胜感激。
      

  9.   

    给你个struts的action:
    <action name="download" class="actionFile" method="download">
       <interceptor-ref name="params"/>
       <result type="stream">
          <param name="contentType">download</param>
          <param name="inputName">targetFile</param>
          <param name="contentDisposition">filename=${filePOJO.file_name}</param>
          <param name="bufferSize">4096</param>
       </result>
    </action>你只要在download方法里,将文件读出来,读到一个inputStream中,并将其赋值给targetFile.
    本人如此实现已成功,自己试试。