最近在了解J2EE开发相关的东西,自己学习做了一个小东西,后台是java,服务器用的tomcat6,使用了struts2框架,下面这段代码,我想实现的效果是按下“查看借书情况”后在下方以表格的方式显示出当前用户的借书记录,最后的结果是,浏览器里可以观察到表格出来了,但是表格里面的内容不是我放入session内的数据,而是"${myCurRecordList.RBname }" "${myCurRecordList.RBid }" "${myCurRecordList.ROut }"这三个表达式字符串,我自己调试的时候,后台可以查询到数据并已经放入List类型的myCurRecordList中,
Map<String, Object > session=(Map<String, Object >)context.getSession();
session.put("myCurRecordList", myCurRecordList);debug模式下我已经确认后台查到的myCurRecordList被放入了session范围里,但是在前台就是取不出来,困扰了很久还是没有解决,麻烦各位帮我看看,谢谢啦!
<form action="searchMyCurRecord.action" method="post">
    <table align="center">
    <input align="center" type="submit" value="查看借书情况"/>
        
<% 
if(session.getAttribute("myCurRecordList")==null);
else{
out.println("<caption><h4>当前借书情况</h4> </caption>");
out.println("<tr>");
out.println("<th>书名</th>");
out.println("<th>图书编号</th>");
out.println("<th>借书日期</th>");
out.println("</tr>");
out.println("<s:iterator value=\"#session.myCurRecordList\" id=\"myCurRecordList\" status=\"st\">");
out.println("<tr>");
out.println("<td>${myCurRecordList.RBname }</td>");
out.println("<td>${myCurRecordList.RBid }</td>");
out.println("<td>${myCurRecordList.ROut }</td>");
out.println("</tr>");
out.println("</s:iterator> ");
}
%>     
    </table>   
    </form>

解决方案 »

  1.   

    到tomcat6目录下面,删除work,temp,logs文件夹后,再启起下服务试试.
      

  2.   

    EL表达式不能这样用吧 out.println("<td>"+myCurRecordList.RBname +"</td>");
      

  3.   


    搞不懂你页面中为什么要这么去输出 out.println("<caption><h4>当前借书情况</h4> </caption>");
            out.println("<tr>");
            out.println("<th>书名</th>");
            out.println("<th>图书编号</th>");
            out.println("<th>借书日期</th>");
            out.println("</tr>");
            out.println("<s:iterator value=\"#session.myCurRecordList\" id=\"myCurRecordList\" status=\"st\">");
            out.println("<tr>");
            out.println("<td>${myCurRecordList.RBname }</td>");  <color>// 既然都用了strust2了标签了为什么这里要用el表达式</color>
            out.println("<td>${myCurRecordList.RBid }</td>");
            out.println("<td>${myCurRecordList.ROut }</td>");
            out.println("</tr>");
            out.println("</s:iterator> ");
    反正都是在页面上改成这样吧 
    1. Map<String, Object > session=(Map<String, Object >)context.getSession(); 将object改为你的对象,不然页面上用标签循环的时候,无法识别具体对象,所以无法直接输出属性2. 
    <caption><h4>当前借书情况</h4></caption>
    <tr>        
    <th>书名</th>    
    <th>图书编号</th>
    <th>借书日期</th>
    </tr>
    <s:iterator value="#session.myCurRecordList" id="myCurRecordList" status="st">
        <tr>
            <td><s:property value='RBname' /></td> 
            <td><s:property value='RBid' /></td>
            <td><s:property value='ROut' />/td>
        </tr>
    </s:iterator>
      

  4.   

    #session.myCurRecordListmyCurRecordList.RBname 这些写法貌似不对
      

  5.   


    我之所以要采用这样的方式输出,是因为我想让页面简洁一些,当没有查询借书记录的时候不显示表格,而且当借书记录不存在的时候比起直接将表格写在<body />里不会出现异常。
    另外,采用你提供的这种输出方式,当有借书记录的时候的确可以输出查到的记录,但是,没有借书记录的时候,会报下面这个错,
    TTP Status 500 -type Exception reportmessagedescription The server encountered an internal error () that prevented it from fulfilling this request.exceptionorg.apache.jasper.JasperException: An exception occurred processing JSP page /PersonalCenter.jsp at line 4441:  <th>图书编号</th>
    42:  <th>借书日期</th>
    43:  </tr>
    44:  <s:iterator value="#session.myCurRecordList" id="myCurRecordList" status="st">
    45:       <tr>
    46:          <td><s:property value='RBname' /></td> 
    47:          <td><s:property value='RBid' /></td>
    Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    root causeThe Struts dispatcher cannot be found.  This is usually caused by using Struts tags without the associated filter. Struts tags are only usable when the request has passed through its servlet filter, which initializes the Struts dispatcher needed for this tag. - [unknown location]
    org.apache.struts2.views.jsp.TagUtils.getStack(TagUtils.java:60)
    org.apache.struts2.views.jsp.StrutsBodyTagSupport.getStack(StrutsBodyTagSupport.java:44)
    org.apache.struts2.views.jsp.ComponentTagSupport.doStartTag(ComponentTagSupport.java:48)
    org.apache.jsp.PersonalCenter_jsp._jspx_meth_s_005fiterator_005f0(PersonalCenter_jsp.java:256)
    org.apache.jsp.PersonalCenter_jsp._jspService(PersonalCenter_jsp.java:179)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    note The full stack trace of the root cause is available in the Apache Tomcat/6.0.26 logs.
      

  6.   


    晕哟。这个错误是你没有引用strust2的标签头吧。。<%@ taglib prefix="s" uri="/struts-tags"%>
    还有:如果数据为空,那你在<s:iterator>外层做一个判空不行么? strust2如果连这个小小的功能都实现不了。。那标签还有谁用?
      

  7.   

    我把整个jsp页面的代码贴上来吧,自己表达能力有限,直接说可能大家不能领会我的意图
    表现层的东西我懂的很少,目前只能做成这样,见笑了<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
    <%@taglib prefix="s" uri="/struts-tags"%>
    <html>
      <head>
        <title>个人中心</title>
      </head>
      
      <body>   
        <h4>个人信息</h4>  
        <br>&nbsp;&nbsp;登录名:${sessionScope.loginUser.UId}
        <br>真实姓名:${sessionScope.loginUser.UName }
        <br>借书本数:${sessionScope.loginUser.UCount}
        <br>&nbsp;&nbsp;&nbsp;&nbsp;欠费:${sessionScope.loginUser.UDebts}
       
        <form id="passwordForm" action="changePassword.action" method="post" 
        onsubmit="return checkForm(this)">
        <table align="center"><caption><h4>修改密码</h4></caption>
        <tr>
        <td>原密码:&nbsp;&nbsp;&nbsp;&nbsp;<input type="password" name="orgPassword" id="orgPassword"/></td>
        </tr>
        <tr>
        <td>新密码:&nbsp;&nbsp;&nbsp;&nbsp;<input type="password" name="newPassword" id="newPassword"/></td>
         </tr>
        <tr>
        <td>新密码确认:<input type="password" name="passwordEnsure" id="passwordEnsure"/></td>
        </tr>
        <tr align="center">
        <td colspan="2"><input type="submit" value="确定"/><input type="reset" value="重置" />
        </tr>
        </table>
        </form>
       
       
        <form action="searchMyCurRecord.action" method="post"
        onsubmit="return (!listIsNull())">
        <table align="center">
        <input align="center" type="submit" value="查看借书情况"/>        
    <%
    if(session.getAttribute("myCurRecordList")==null);
    else{
    out.println("<caption><h4>当前借书情况</h4> </caption>");
    out.println("<tr>");
    out.println("<th>书名</th>");
    out.println("<th>图书编号</th>");
    out.println("<th>借书日期</th>");
    out.println("</tr>");
    out.println("<s:iterator value=\"#session.myCurRecordList\" id=\"myCurRecordList\" status=\"st\">");
    out.println("<tr>");
    out.println("<td>${myCurRecordList.RBname }</td>");
    out.println("<td>${myCurRecordList.RBid }</td>");
    out.println("<td>${myCurRecordList.ROut }</td>");
    out.println("</tr>");
    out.println("</s:iterator> ");
    }
    %>     
        </table>   
        </form>
      
       
        <script language="javascript" type="text/javascript">
        function checkForm(theForm){
        if(theForm.orgPassword.value==""||theForm.newPassword.value==""||theForm.passwordEnsure.value==""){
        alert("请将表单填写完全!");
        return (false);
        }
        else if(theForm.newPassword.value.length>10){
        alert("密码长度不能超过10位!");
        theForm.newPassword.value="";
        theForm.passwordEnsure.value="";
        return (false);
        }
        else if(theForm.newPassword.value!=theForm.passwordEnsure.value){
        alert("两次密码输入不一致!");
        theForm.newPassword.value="";
        theForm.passwordEnsure.value="";
        return (false);
        }
        else return (true);
        }
       
        function listIsNull(){
        if(0==${sessionScope.loginUser.UCount}){
        alert("当前没有借书记录!");
        return true;
        }
        else return false;
        }
       
        </script>
      </body>
    </html>
      

  8.   

    <%@taglib prefix="s" uri="/struts-tags"%>和标签库有关系
    你试着用<%%>看看能不能取到值,如果能,说明你的标签有问题
      

  9.   

    1. <s:iterator value=\"#session.myCurRecordList\" id=\"myCurRecordList\" status=\"st\">  这里面的斜杠是干嘛的?改成这样:
    <s:iterator value="#session.myCurRecordList" id="myCurRecordList" status="st">2.  Map<String, Object > session=(Map<String, Object >)context.getSession(); 将object改为“RBname,RBid,Rout属性的真实对象”,就是采用泛型。不然页面上用标签循环的时候,无法识别具体对象,所以无法直接输出属性。
      

  10.   

    3. out.println("<td>><s:property value='RBname' /></td>");
            out.println("<td>><s:property value='RBid'/></td>");
            out.println("<td>><s:property value='ROut'/></td>");
      

  11.   

    out.println("<td>${myCurRecordList.RBname }</td>");
            out.println("<td>${myCurRecordList.RBid }</td>");
            out.println("<td>${myCurRecordList.ROut }</td>");
    这里错的应该是out.println("<td>"+myCurRecordList.RBname+"</td>");
    out.println("<td>"+myCurRecordList.RBid+"</td>");
    out.println("<td>"+myCurRecordList.ROut+"</td>");
      

  12.   

    myCurRecordList.RBname  是数据,你怎们能把写在<td><td>里面呢。你把正则表达式和java代码搞混了。。
    <%
        if(session.getAttribute("myCurRecordList")==null);
        else{
            out.println("<caption><h4>当前借书情况</h4> </caption>");
            out.println("<tr>");
            out.println("<th>书名</th>");
            out.println("<th>图书编号</th>");
            out.println("<th>借书日期</th>");
            out.println("</tr>");
            out.println("<s:iterator value=\"#session.myCurRecordList\" id=\"myCurRecordList\" status=\"st\">");
            out.println("<tr>");
            out.println("<td>${myCurRecordList.RBname }</td>");
            out.println("<td>${myCurRecordList.RBid }</td>");
            out.println("<td>${myCurRecordList.ROut }</td>");
            out.println("</tr>");
            out.println("</s:iterator> ");
        }
    %> <% %> 这里面是java代码,
    你如果用标签应该是才应该是${myCurRecordList.RBname }
    <tr>
      <td>${myCurRecordList.RBname }</td>
    </tr>
      

  13.   

    右斜杠是用来打印双引号的转义符
    我在session范围内放了类型不同的好几个对象,将Object改为具体的对象后其他对象的存取不能顺利进行

    //查询用户当前借书记录
    public String searchCurRecords()throws Exception{
    ActionContext context=ActionContext.getContext();
    Map<String, Object > session=(Map<String, Object >)context.getSession();
    L1017Users loginUser=(L1017Users)session.get("loginUser");
    List myCurRecordList=sch.recordSearch(loginUser.getUId());
    session.put("myCurRecordList", myCurRecordList);
    return "success";
    }
    另外,你11楼给的输出方式我之前也试过,输出结果是空,可能是因为我没有将
    Map<String, Object > session=(Map<String, Object >)context.getSession();
    这个地方的Object改成具体的类型,但是这里改了后会影响在session里的其它对象的存取,这里我不知道怎么处理了
      

  14.   

    <s:iterator value="%{#session.myCurRecordList}" id="myCurRecordList" status="st">这样试试。里面用
    <s:property value="#myCurRecordList.RBname"/>的方式
      

  15.   

    引入struts标签<%@ taglib uri="/struts-tags" prefix="s"%>
    然后在页面对标签,居然用out.println();
      

  16.   

    问题解决了,我是在这个页面判断list是否为空,然后在另外一个页面采用<s:iterator />标签迭代输出这个表格。
    在这个页面应该也能用<s:if>标签进行判断,采用3楼给出的输出方式,但是我现在玩不转,再研究研究另外,我知道我问题出在哪了,正如12楼所说,我这么输出的话打印的是字符串,而不是变量。通过遍历我放入session里的list并输出每个list对象的RBname、RBid、ROut三个属性是可以得到我要的结果的,但是此种方法我目前也玩不转。
    哎,结贴了,菜鸟先飞,我差的好多啊,继续学习去~~~