问题描述:在countAnswer这个Action中有一返回值answerList,在页面上无法获取List中保存的值,得到的对象是一个0长度的List。在Action类中有返回值answerList的set和get方法。answerList是一个List,里面存放的对象QuestionAnswer,是一个JavaBean。QuestionAnswer在Spring的配置文件中配置成一个Bean。QuestionAnswer在数据库中并没有相应的数据表,但该类QuestionAnswer实现了Serializable接口。List<QuestionAnswer> answerList = service.reviewAnswers(paperId, examineeId,timed);List<QuestionAnswer> answerList = service.reviewAnswers(paperId, examineeId);
上述方法的调用均通过JUnit测试通过,能够正确得出结果下面是程序代码:
public class AnswerAction extends ActionSupport implements SessionAware { private static final Log log = LogFactory.getLog(ExamineeAction.class);
/**
 * 
 */
private static final long serialVersionUID = 5903526363944669675L;
private Map<String,Object> session;
private AnswerService service;
//参数
private Date endTime = null;
private Boolean end;

//在页面显示的返回值
private List<QuestionAnswer> answerList=null; public List<QuestionAnswer> getAnswerList() {
return answerList;
}
public void setAnswerList(List<QuestionAnswer> answerList) {
this.answerList = answerList;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}

public void setService(AnswerService service) {
this.service = service;
}

public Boolean getEnd() {
return end;
}
public void setEnd(Boolean end) {
this.end = end;
}
public String countAnswer(){
log.debug("inserting an answer" );
Integer paperId = (Integer)session.get("paperId");
Long examineeId = (Long)session.get("examineeId");
Boolean timed =(Boolean)session.get("timed");
try {
if(timed){
answerList = service.reviewAnswers(paperId, examineeId,timed);
}else{
answerList = service.reviewAnswers(paperId, examineeId);
}
} catch (Exception e) {
log.error("inserting failed because od some database's reason" );
e.printStackTrace();
return ERROR;
}
endAnswer();
log.debug("inserting success" );
return SUCCESS;
}

public void endAnswer(){
log.debug("ending an exam" );
session.remove("paperId");
session.remove("examineeId");
session.remove("username");
log.debug("ending success" );
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}}

解决方案 »

  1.   

    你在后台设一个断点看一下那个answerList里取到值了没。
      

  2.   

    我专程写测试程序,把answerList中的值全部打印出来了的,就是不知道为什么页面取不到值。
      

  3.   

    楼主页面上是怎么取这个list的值的呢?用用这个试试:
    <s:iterator id="item" value="list" status="sta">
        ${item.XXX}
    </s:iterator>item是list中的每一项,若该项为对象,可以通过.XXX取得对象某属性值
      

  4.   

    按照楼上的方法,这是我的JSP代码,但仍然无法获取answerList中的值,answerList在anction执行后是有值的,但是我通过<s:debug/>查看stack context中的内容。parameters的值是空的!
    <s:iterator id="question" value="answerList" status="vs">
      <tr>
        <td> ${answer.questionNumber}</td>
        <td>${answer.correct}</td>
      </tr>
    </s:iterator>
    <s:debug/>
      

  5.   

    <td> ${answer.questionNumber}</td>
    你这questionNumber是不是对象QuestionAnswer里的属性?
    如果这样的话你用${questionNumber}就可以了,你在前面加个answer是做什么的?
      

  6.   

    <s:iterator />标签中没有item属性。下面是更改后的代码,通过JSTL得到List对象的长度,结果为0.
    ${fn:length(answerList) }
    <s:iterator value="answerList" status="vs">
    <tr>
     <td> ${questionNumber}</td>
      <td>${correct}</td>
     </tr>
    </s:iterator>
    顺带贴上stack context中的内容:
    request {.freeer.RequestParameters=freeer.ext.servlet.HttpRequestParametersHashModel@1968f06, .freeer.Request=freeer.ext.servlet.HttpRequestHashModel@1b5b945, struts.valueStack=com.opensymphony.xwork2.ognl.OgnlValueStack@f0ffcf, hibernateFilter.FILTERED=true}
    parameters {}
    com.opensymphony.xwork2.ActionContext.parameters {}
    可以看出,struts2并没有把answerList对象正确得传到页面上去。
      

  7.   


    你看下我的那个${item.XXX},我的item是和iterator中的id一致的
      

  8.   

    当然你要在每个用到标签的页面导入这个:<%@taglib prefix="s" uri="/struts-tags"%>
      

  9.   

    下面是我在JSP页面中引入的标签库,因为有时我会使用JSTL标签。
    <%@ taglib uri="/struts-tags" prefix="s"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>使用JSTL读取answerList中值的代码如下:
    <c:forEach items="${requestScope.answerList}" var="answer" varStatus="vs">
    <tr> <td>${answer.questionNumber }</td>
    <td>${answer.correct }</td>
    </tr>
    </c:forEach>
    使用struts2标签的代码:
    <s:iterator id ="question" value="answerList" status="vs">
     <tr>
           <td><s:property value="serialNumber"/></td>
           <td><s:property value="correct"/></td>
     </tr>
    </s:iterator>但每一种方式都无法读取出answerList中的值
      

  10.   

    有没有哪个大侠知道原因!
    使用struts2标签的代码已经更正:
    <s:iterator id ="question" value="answerList" status="vs">
     <tr>
      <td><s:property value="questionNumber"/></td>
      <td><s:property value="correct"/></td>
     </tr> 
    </s:iterator>