Struts 2 Ajax url 和 div 标签不适用于 struts 文件标签

Posted

技术标签:

【中文标题】Struts 2 Ajax url 和 div 标签不适用于 struts 文件标签【英文标题】:Struts 2 Ajax url and div tag not working with struts file tag 【发布时间】:2012-12-31 06:13:53 【问题描述】:

在一个 Jsp 页面上,我正在检索基于先前列表选择的列表,用于使用 struts 2 url 和 struts dojo 标签 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>

【问题讨论】:

我认为 Ajax 不支持文件上传,你应该使用 iframe 代替。检查这是否有帮助js1.hotblocks.nl/tests/ajax/file-drag-drop.html 【参考方案1】:

向页面添加&lt;s:file/&gt;(即呈现后为&lt;input type="file"/&gt;)要求表单内容类型为multipart/form-data,而不是默认的(即application/x-www-form-urlencoded)。

所以您应该enctype="multipart/form-data" 添加到表单的属性中;

但是,也就是说,如果您尝试使用 AJAX 上传文件,这是不可能的(根据this SO answer,最终可以使用 XHR2 上传 AJAX。);

最好的办法是在单独的页面/选项卡/表单中管理文件上传,而不是在同一个 AJAX 调用中。


编辑:您的&lt;sx:div /&gt;&lt;s:file /&gt; 相同,它使用formId 参数引用frm_demo 表单。

根据the documentation,formId属性指定

其字段将被序列化并作为参数传递

然后,当您尝试发布 dojo AJAX 请求时,您会尝试序列化所有表单元素,包括 File 元素。 Java 文件不能立即序列化,尤其是 AJAX 库; &lt;s:file /&gt; 是否为空或您没有使用它都没有关系:它与您发布的形式相同,那么它会导致问题;将&lt;s:file /&gt; 移动到另一个表单(即使在同一页面中),它会起作用。

最初的解决方案是正确的,现在我们有了解释:)

Doc

P.S:Dojo 使用 XHRPOST 发布数据,无法发送二进制数据(如上所述,现在可以使用 jQuery 和 XHR2)。

请注意,自 2.1 起,Struts 已弃用 Dojo...最新版本建议将 jQuery 作为 AJAX 库(但没有包含在内,因此选择权在您)

【讨论】:

在action类中不使用ajax上传正常上传,表单内容类型已经是multipart/form-data 在放&lt;s:file/&gt;之前,当AJAX工作时,表单内容类型已经是multipart/form-data ? 是的,内容类型是 multipart/form-data 我已经更改了它。multipart/form-data 即使在添加后仍然需要上传,但仍然遇到相同的问题。您认为在 标记 ajax 功能停止后会发生什么 嗯,你能发布一个更大的 JSP 片段吗?至少完整的表格 (检查错误控制台,看看您是否也有 javascript 错误)

以上是关于Struts 2 Ajax url 和 div 标签不适用于 struts 文件标签的主要内容,如果未能解决你的问题,请参考以下文章

Struts 2 操作未将所需结果返回给 Jquery Ajax 调用

extjs ajax请求与struts2进行交互

jquery 的ajax请求传递json数据给struts的action

struts中实现ajax的配置信息

jquery+Struts2实现ajax局部刷新分页

使用 Java、Struts 2 和 AJAX 下载文件