证人和证据的关系:一个证人对应多个证据。
该关系使用了动态枚举的方式,在建立一个案件的证据时,可以在证人信息的编辑界面,使用复选框组的形式,显示所有的证据信息。在编辑证人信息时,需要选择与其相关
的证据。
在数据库中,证人表为t_jud_witness,其中proofs字段是与证据相关的。在选取多个证据之后,将会把证据的id存放进去,多个id之间使用“,”作为间隔。
以此为前提:
在证人表的list界面中,需要显示与该证人相关的证据信息。效果:“证据1,证据2,证据3”。
在使用<Combox:combox>时出现一个问题,虽然成功显示了证据的名字,但是在每个名字后多了一个空格。查询数据库发现,数据库中存放的数据正确,并没有空格存在。
查询原因发现,该现象是因为使用combox标签时,doTag方法里面使用的是println的方式进行输出的。 也就是说,默认换行输出。 在list界面中出现的这个空格,打开网页源代码
可以看到是换行所致。
下面的代码可解决问题:
<c:set var="n">\n<c:set>
<c:if test="${tjudWitness.proofs != null}">
<c:set var="objectIds" value="${fn:split(tjudWitness.proofs, ',')}" />
<c:forEach items="${objectIds}" var="objectId" varStack="k">
<c:set var="proofName">
<Combox:Combox rname="proof_names" isLabl="99" hql="select t.id, t.proofName from TjudProof t where t.id='${objectId}'" rvalue="${objectId}" />
</c:set>${fn:replace(proofName, n, "")}${k.index < fn:length(objectIds)-1 ? ',' : ''}
<c:forEach>
</c:if>
这窜代码的意思是:
1.在证据字段不为空时,把证据的多个id拆分,并且存放近objectIds里面。
2.对所有证据的id进行遍历,其中每一项命名为objectId,varStack设置为k
3.使用combox标签内的hql语句将所有的证据的名字列出,基本功能到此完成。
4.使用fn:replace将所有的换行字符替换为空字符串,使用<c:set>将"\n"设置为"n",否则使用replace时会报错,不能正确识别。 并且使用<c:set>标签,将查询出来的
(证据 1 ,证据2, 证据3 )设置为proofName方便替换。
5.k的作用是拼接逗号,保证除最后一个证据外,每个证据后边都会有一个逗号。
整个过程就是这样,虽然不是自己写出来的。但是经过仔细的分析,已经搞懂了。