问题描述:在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;
}}
上述方法的调用均通过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;
}}
<s:iterator id="item" value="list" status="sta">
${item.XXX}
</s:iterator>item是list中的每一项,若该项为对象,可以通过.XXX取得对象某属性值
<s:iterator id="question" value="answerList" status="vs">
<tr>
<td> ${answer.questionNumber}</td>
<td>${answer.correct}</td>
</tr>
</s:iterator>
<s:debug/>
你这questionNumber是不是对象QuestionAnswer里的属性?
如果这样的话你用${questionNumber}就可以了,你在前面加个answer是做什么的?
${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对象正确得传到页面上去。
你看下我的那个${item.XXX},我的item是和iterator中的id一致的
<%@ 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中的值
使用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>