【JSP】struts标签BUG合集
1.<s:file>标签的使用
此标签的特点是用来传文件,要用到流,所以提交参数的时候不能是简单的post,需要指定enctype类型。或者再<s:form>中直接指定属性,或者在提交时调用的function中设置。代码如下:
// 导入订单 function importOrder() {//enctype="multipart/form-data" document.forms["myForm"].enctype="multipart/form-data"; document.forms["myForm"].action = "trade!batchSendEmailOrderImport.html?"; document.forms["myForm"].submit(); }
另外如果以弹窗的方式来使用<s:file>标签则需要调用appendto()方法进行一次插入指定,具体原因尚不明。
html代码为:
<!-- 导入订单弹框 --> <div id="dialog_target"></div> <div id="dlgAddValue" class="easyui-dialog" title="导入订单 " data-options="iconCls:'icon-save',buttons: '#dlg-buttons-meals',resizable:true,modal:true" style="width: 750px; height: 420px; padding: 5px; position: relative; top: 5px;"> <table> <tr> <td> <table align="center" cellpadding="10px" style="border-width: 1px 1px 1px 1px; border-spacing: 0; border-style: solid; border-color: #95B8E7;"> <tbody> <tr> <td>选择文件:</td> <td colspan="2"><s:file name="excel" id="excelName" /> <button type="button" onclick="return importOrder();">导入订单</button> </td> </tr> <tr> <td colspan="4"><p /></td> </tr> <tr> <td colspan="4"> <ul> </ul> </td> </tr> </tbody> </table> </td> </tr> </table> </div> </div>
js代码为:
//打开订单导入弹框 var flagAddValue = true; function openImportOrder() { if (flagAddValue) { //关闭操作 flagAddValue = false; $('#dlgAddValue').dialog('close'); } else { //打开操作 flagAddValue = true; $('#dlgAddValue').dialog('open'); $("#dlgAddValue").parent().appendTo("#dialog_target"); } }
2:<s:iterator>中通过点击按钮获取指定某行某列的值
这里要实现的功能是点击某列的按钮之后将该行的input中填入的值与<s:property>中显示的值传回后台action中。
html部分代码为:
<table id="stupidtable" width="100%" align="center" class="table"> <caption> <s:if test="cardPwListType == @cn.com.chinatelecom.ecms.action.TradeAction$CardPwListType@All"> 全部卡密列表 </s:if> <s:elseif test="cardPwListType == @cn.com.chinatelecom.ecms.action.TradeAction$CardPwListType@Send"> 已发卡密列表 </s:elseif> <s:elseif test="cardPwListType == @cn.com.chinatelecom.ecms.action.TradeAction$CardPwListType@UnSend"> 待发卡密列表 </s:elseif> </caption> <thead> <tr> <th data-sort="int">序号</th> <th data-sort="string">订单编号</th> <th data-sort="string">收货人email</th> <th data-sort="string">换发email</th> <th data-sort="string">订单类型</th> <th data-sort="string">订单状态</th> <th data-sort="string">AB分类</th> <th data-sort="string">拆单类型</th> <th data-sort="string">所在省</th> <th data-sort="string">所在市</th> <th data-sort="float">金额(元)</th> <th data-sort="string">支付方式</th> <th data-sort="date">订单生成时间</th> <th data-sort="date">支付确认时间</th> <th data-sort="date">支付完成时间</th> <th>操作</th> </tr> </thead> <tbody> <s:iterator value="ddzflist" id="order" status="status"> <tr onmouseover="this.bgColor='#EAF2FF'" onmouseout="this.bgColor='#FFFFFF'" align="center"> <th><s:property value="%{(#request.pageInfo.pageNo - 1) * #request.pageInfo.pageSize + #status.index + 1}" /> </th> <%-- <s:iterator value="#order" id="content" status="status"> <td> <s:property value="#content" /> </td> </s:iterator> --%> <td ><s:property value="#order.orderId" /></td> <td ><s:property value="#order.dealPayInfo.sendCusemail" /></td> <td><input type="text" id="field1" /><s:hidden value="#emailReceiver" /></td> <td align="left"><s:property value="#order.orderType.dicCn" /></td> <td align="left"><s:property value="#order.orderStatus.dicCn" /></td> <td><s:property value="#order.abType.dicCn" /></td> <td><s:property value="#order.isSplit.dicCn" /></td> <td align="left"><s:property value="#order.provSystemCity.cname" /></td> <td align="left"><s:property value="#order.citySystemCity.cname" /></td> <td align="right"><s:property value="#order.orderPriceText" /></td> <td align="left"><s:property value="#order.payType.dicCn" /></td> <td><s:date name="#order.orderCreatetime" format="yyyy-MM-dd HH:mm" /></td> <td><s:date name="#order.payCommitTime" format="yyyy-MM-dd HH:mm" /></td> <td><s:date name="#order.orderPayTime" format="yyyy-MM-dd HH:mm" /></td> <td align="center"> <%-- <s:a href="%{url}">明细</s:a>   <s:a href="%{url1}">重发</s:a>   <s:a href="%{url2}" onclick="return test($(this).parent().parent().find('input').val());">换发</s:a> --%> <button type="button" onclick="return queryOrderList();">明细</button> <button type="button" onclick="return queryOrderList();">重发</button> <button type="button" onclick="return changeSend(this);">换发</button></td> </tr> </s:iterator> <s:hidden name="cardPwAddr" value="%{#request.cardPwAddr}"></s:hidden> </tbody> <tfoot> <tr> <td colspan="16"><s:if test="cardPwList.size > 0"> <div align="right"> <p:pages pageNo="pageInfo.pageNo" total="pageInfo.total" pageSize="pageInfo.pageSize" count="pageInfo.count" includes="orderInfo.orderId" /> </div> </s:if></td> </tr> </tfoot> </table>
重点是换发的changeSend()实现。首先是把this指针传进去,方便定位到该行,再做进一步操作。
JS代码为:
function changeSend(content){ var orderId=""; $(content).parent().parent().find("td").each(function(i){ if(i==0){ orderId = $(this).text(); } }); var newEmail= $(content).parent().parent().find("input").val(); document.forms["myForm"].action = "trade!changeSendCardPw.html?emailReceiver="+newEmail +"&orderInfo.orderId="+orderId; document.forms["myForm"].submit(); return; }
根据table的DOM结构,可知$(content).parent()取到的是button所在的父节点,即button所在的td标签。再取一次parent(),得到的就是td所在的行,即tr标签。
然后用find()函数来查找内容,参数为标签类型。tr中包含的td标签有很多,但是我们可以知道需要的orderId在第一个td中,所以直接在i==0时抓值即可。
另外td标签中的内容是用.text()取到。循环中,this指针表示的是当前对象,也即循环中的当前td。
input标签只有一个,所以直接取值即可。
需要说明的是,在table的HTML中加了<s:hidden>特意放入emailReceiver变量,是因为如果不这样做则在生成页面的时候不会将此变量解析为html代码,那么在changeSend()中向action传值的时候就无法找到emailReceiver