在Jsp页面上,我根据之前的列表选择重新查找列表,用于使用struts 2 url和struts dojo tag div
<s:url id="d_url" action="employDivisionAction"/>
<sx:div showLoadingText="false" id="details1" href="%{d_url}" theme="ajax" listenTopics="show_division" onchange="show_Department()" formId="frm_demo"/>
在js文件中,此函数被称为
function show_Department()
{
dojo.event.topic.publish("show_department");
}
一切正常我能够检索列表但是当我尝试使用
时会出现问题<s:file/>
jsp中的标签。当我包含上述标签时,ajax功能停止工作。 任何想法为什么它不起作用任何指导都会有所帮助。
完整的jsp代码
<s:form name="employee" action="AddEmployee" method="POST" theme="css_xhtml" enctype="multipart/form-data" id="frm_demo" >
<table align="center" cellspacing="10px">
<tr>
<td align="left"> <s:text name="global.empno"/> </td>
<td align="left"> <s:textfield name="employeeNo" value="%{employee.employeeNo}" onkeypress="return inputLimiter(event,'NameCharactersAndNumbers')"/> </td>
<td align="left"> <s:text name="global.fnm"/> </td>
<td align="left"> <s:textfield name="firstName" value="%{employee.firstName}" onkeypress="return inputLimiter(event,'NameCharacters')"/> </td>
</tr>
<tr>
<td><s:file name="Image"/></td>
</tr>
<tr>
<td align="left"> <s:text name="Company"/> </td>
<td align="left"><s:select name="currentCompany" id="companyList" headerKey="" headerValue="Select" list="companyList" onchange="show_branch()"/></td>
<td align="left"> <s:text name="Branch"/> </td>
<td align="left">
<div ><s:fielderror fieldName="branchName" /></div>
<s:url id="d_url" action="employBranchAction"/>
<sx:div showLoadingText="false" name="branchDiv" id="details" href="%{d_url}" theme="ajax" listenTopics="show_branch" onchange="show_division()" formId="frm_demo"/>
</td>
</tr>
<tr>
<td align="left"> <s:text name="Division"/> </td>
<td align="left">
<div ><s:fielderror fieldName="divisionName" /></div>
<s:url id="d_url" action="employDivisionAction"/>
<sx:div showLoadingText="false" id="details1" href="%{d_url}" theme="ajax" listenTopics="show_division" onchange="show_Department()" formId="frm_demo"/>
</td>
<td align="left"> <s:text name="Department"/> </td>
<td align="left">
<div><s:fielderror fieldName="departmentName" /></div>
<s:url id="d_url" action="employDepartmentAction"/>
<sx:div showLoadingText="false" id="details2" href="%{d_url}" theme="ajax" listenTopics="show_department" onchange="show_Section()" formId="frm_demo"/>
</td>
</tr>
<tr>
<td align="left"> <s:text name="Section"/> </td>
<td align="left">
<div><s:fielderror fieldName="sectionName" /></div>
<s:url id="d_url" action="employSectionAction"/>
<sx:div showLoadingText="false" id="details3" href="%{d_url}" theme="ajax" listenTopics="show_section" onchange="show_Unit()" formId="frm_demo"/>
</td>
<td align="left"> <s:text name="Unit"/> </td>
<td align="left">
<div ><s:fielderror fieldName="unitName" /></div>
<s:url id="d_url" action="employUnitAction"/>
<sx:div showLoadingText="false" id="details4" href="%{d_url}" theme="ajax" listenTopics="show_unit" onchange="show_Position()" formId="frm_demo"/>
</td>
</tr>
<tr>
<td align="left"> <s:label value="Position"/> </td>
<td align="left">
<div><s:fielderror fieldName="positionName" /></div>
<s:url id="d_url" action="employPositionAction"/>
<sx:div showLoadingText="false" id="details5" href="%{d_url}" theme="ajax" listenTopics="show_position" formId="frm_demo"/>
</td>
</tr>
</table>
<s:set name="webFramework" value="%{employee.employeeID}"/>
<table align="center" cellspacing="20px">
<tr>
<s:if test="#webFramework==0">
<td align="left"> <s:submit value="Add" cssClass="buttonSmall" onclick="return validateEmployee();"/> </td>
</s:if>
<s:if test="#webFramework>0">
<td align="left"> <s:submit name="update" cssClass="buttonSmall" value="Update"/> </td>
</s:if>
</tr>
</table>
</s:form>
答案 0 :(得分:2)
将<s:file/>
(一旦呈现,它是<input type="file"/>
)添加到页面,要求表单内容类型为multipart/form-data
而不是默认值(即application/x-www-form-urlencoded
)。
因此应将enctype="multipart/form-data"
添加到表单的属性中;
但是,如果您尝试使用AJAX上传文件,这是不可能的(根据this SO answer,最终可以使用AJAX上传XHR2。);
最好的办法是在单独的页面/标签/表单中管理文件上传,而不是在同一个AJAX调用中。
编辑:您的<sx:div />
位于<s:file />
的同一表单中,并且frm_demo
表单带有formId
参数。
根据the documentation,formId属性指定
其字段将被序列化并作为参数传递
然后,当您尝试发布dojo AJAX请求时,您正在尝试序列化所有表单元素,包括File元素。 Java文件不能立即序列化,特别是对于AJAX库;如果<s:file />
为空或者您没有使用它并不重要:它与您发布的形式相同,那么它将导致问题;将<s:file />
移动到另一个表单(即使在同一页面中),它也会起作用。
初步解决方案是正确的,现在我们有解释:)
P.S:Dojo使用XHRPOST发布数据,并且无法发送二进制数据(如上所述,您现在可以使用jQuery和XHR2执行此操作)。
请注意,自2.1以来,Dojo在Struts上已被弃用...最新版本建议将jQuery作为AJAX库(但不包含任何内容,因此选择权在您身上)