在<jsp:include/>中引用多个action遇到不能正常显示的问题,只能显示第一个action的内容,相关文件如下:
1,include.jsp的内容:
代码   1. <jsp:include page="test1.do"/>  
   2. <jsp:include page="test2.do"/>  
2,struts-config.xml的部分内容:
代码   1. <action path="/test1" name="myForm" type="TestAction1" scope="request" validate="true" input="/error.jsp">  
   2.   <forward name="test" path="/test1.jsp"/>  
   3. </action>  
   4. <action path="/test2" name="myForm" type="TestAction2" scope="request" validate="true" input="/error.jsp">  
   5.   <forward name="test" path="/test2.jsp"/>  
   6. </action>  
3,TestAction1的内容(TestAction2的内容类似)
代码   1. import javax.servlet.http.HttpServletRequest;  
   2. import javax.servlet.http.HttpServletResponse;  
   3. import org.apache.struts.action.Action;  
   4. import org.apache.struts.action.ActionForm;  
   5. import org.apache.struts.action.ActionForward;  
   6. import org.apache.struts.action.ActionMapping;  
   7.   
   8. public class TestAction1 extends Action  
   9. {  
  10.     public ActionForward execute(  
  11.             ActionMapping actionMapping,  
  12.             ActionForm actionForm,  
  13.             HttpServletRequest request,  
  14.             HttpServletResponse response)  
  15.     {  
  16.         return actionMapping.findForward( "test" );  
  17.     }  
  18. }  
4,test1.jsp的内容(test2.jsp的内容相似)
代码   1. test1: <br />  
   2. <%=new java.util.Date()%>  
当在浏览器中打开include.jsp时,只能显示test1.jsp的内容,即
=============================
test1:
Sat Aug 25 12:57:16 CST 2007
=============================
但我将include.jsp改为如下内容时,就能正常显示,
代码   1. XXXX  
   2. <jsp:include page="test1.do" flush="true"/>  
   3. <jsp:include page="test2.do"/>  
“XXXX”可以是任意长度的任意字符,显示的结果为:
=============================
XXXX test1:
Sat Aug 25 12:59:01 CST 2007 test2:
Sat Aug 25 12:59:01 CST 2007
=============================
但是去掉“XXXX”或者“flush="true"”就都只能显示test1.jsp的内容。请问这是什么原因?我估计是struts跳转到jsp时出现的问题。
另外,若不通过struts,直接include jsp文件,比如,修改include.jsp的为以下内容,是两个jsp的内容都可以显示的。
代码   1. <jsp:include page="test1.jsp"/>  
   2. <jsp:include page="test2.jsp"/>  
我的struts版本是1.2.7,jsp容器是tomcat5.0.28,jdk是1.5

解决方案 »

  1.   

    应该和<jsp:include page="test1.do">的flush="true"属性有关。
    当flush属性为true,表示在执行插入操作之前,先调用当前页面的输出流的flush()方法。
      

  2.   

    我知道flush="true"的意思,但是这还是不能解释这个现象啊
    flush="true"顶多只能影响前面的内容,跟后面的内容应该没有关系啊?
    另外,就算加了flush="true",在<jsp:include page="test1.do" flush="true"/>之前也必须要有输出,
    要不显示也只能显示前一个jsp的内容,这一点很奇怪。
    就是不清楚struts在这里面到底是怎么处理的?
      

  3.   

    <jsp:include page="test1.do" flush="true"/>  
    <jsp:include page="test2.do"/>  
    这样也不能全部输出吗?
      

  4.   

    2.   <forward name="test" path="/test1.jsp"/>  
      3.   <forward name="test" path="/test2.jsp"/>  
     2个test的值
      

  5.   

    我猜想是不是由于struts容器在解释action路径时,是当前工作目录发生了改变,将你的相对路径换为全路经试试:如jsp:include page="<%=context_url%>/test1.do"
      

  6.   

    To:javaboy2006(喝着coffee学java)  不能输出。除了flush=“true” 前面还要有输出,比如“XXX”
    To:qiuqingqiang  两个test的值有问题吗?能不能说得明白些
    To:huoyin,我明天试一下,不过改变当前目录又怎样了呢?
      

  7.   

    struts 要包含页面,我一般用 frame,这样没有问题,
      

  8.   

    今天调了一下,跟路径好像没有关系。有看看,work目录下jsp对应的java文件,发现,如果include.jsp文件的内容是:
    1. <jsp:include page="test1.do"/>《
    2. <System.out.println("xxx")>
    3. <jsp:include page="test2.do"/> 那么,Tomcat执行了和jsp:include page="test1.do"/>对应的java代码后,后面的语句都不执行了,,
    估计是,中间出错异常。想用,lomboz跟踪来着,环境塔了半天没有搭好
      

  9.   

    解决了。果然是struts的问题。不知道2.0有没有这个问题:
    关键在struts处理跳转的时候,用的是org.apache.struts.tiles.TilesRequestProcessor类的以下代码:
    protected void doForward(
    String uri,
    HttpServletRequest request,
    HttpServletResponse response)
    throws IOException, ServletException {
                
    if (response.isCommitted()) {
    this.doInclude(uri, request, response);
                
    } else {
    super.doForward(uri, request, response);
    }
    }
    所以,如果<jsp:include page="test1.do"/>前面没有输出,且这个标签没有flush="true"这一项的时候,response是没有commit的。所以struts全部把它当forward处理了。我觉得由此来判断是include还是forward有点挫诶。不过能解决问题,知道原因就行了。多谢回复!