2

Jspページで、使用されたstruts2urlおよびstrutsdojotagdivの以前のリスト選択に基づいてリストを取得しています。

<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>
4

1 に答える 1

2

<s:file/>ページに(レンダリングされると)を追加する<input type="file"/>には、フォームのコンテンツタイプをmultipart/form-dataデフォルト(つまりapplication/x-www-form-urlencoded)ではなくする必要があります。

したがって、フォームの属性に追加する必要があります。enctype="multipart/form-data"

ただし、AJAXを使用してファイルをアップロードしようとしている場合、これは不可能です(このSOの回答によると、AJAXを使用したXHR2のアップロードが最終的に可能になります)。

最善の方法は、AJAX呼び出しを行うのと同じ方法ではなく、別のページ/タブ/フォームでファイルのアップロードを管理することです。


編集:あなたは<sx:div />の同じフォームの中にあなたを持っています<s:file />、そしてそれはパラメータでフォームfrm_demoを参照しformIdます。

ドキュメントによると、formId属性は

そのフィールドはシリアル化され、パラメーターとして渡されます

次に、dojo AJAXリクエストを投稿しようとすると、File要素を含むすべてのフォーム要素をシリアル化しようとします。特にAJAXライブラリでは、Javaファイルをすぐにシリアル化することはできません。空であるか使用していないかは関係ありません<s:file />。投稿しているのと同じ形式である場合、問題が発生します。<s:file />(同じページでも)別のフォームに移動すると、機能します。

最初の解決策は正しかったのですが、今は説明があります:)

Doc

PS:DojoはXHRPOSTを使用してデータを投稿し、バイナリデータを送信できません(上記のように、jQueryとXHR2を使用して送信できます)。

Dojoは2.1以降Strutsで非推奨になっていることに注意してください...最新のリリースでは、jQueryがAJAXライブラリとして提案されています(ただし、含まれていないため、選択はあなた次第です)

于 2012-12-31T08:08:19.640 に答える