1

私は Json を struts 2 と jquery で使用しようとしています。ある程度までは実行できますが、過去 2 日間、いくつかの問題で立ち往生しています。これが私がこれに使用したコードと構成です

<package name="default" extends="struts-default,json-default" namespace="/">    

    <result-types>
        <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"></result-type>
    </result-types>

    <action name="showUpdateAjax" class="courseCreateAction" method="showUpdateAjax">
            <result type="json">
                <param name="includeProperties">courseInfo, fetchedAllSubjects, selectedFetchedSubs, subjectList, fetchedAllExamType, examTypeList, selectedExmTypes, fetchedAllCourse, isUpdate, btnPressed, updateCourseId, nextCourse, previousCourse</param>
                <param name="prefix">true</param>
                <param name="ignoreHierarchy">false</param>
            </result>
    </action>

これがこの部分の私のJspコードです

<tr><td><input type="submit" value="Refresh" onclick="refreshData()" id="refreshBtn"/></td></tr>

    <tr><td><s:a href="/SASIS/showUpdateAjax.action?updateCourseId=4">click Here 2</s:a></td></tr>
</table>
</center>
<script type="text/javascript"> 
    $(document).ready(function(){
            $("#refreshBtn").click(function(){
                $.getJSON("/SASIS/showUpdateAjax.action?updateCourseId=4",function(data){
                    alert('its working '+data);

                    });

                });
        });
</script>

そして、ここに私のJavaコードがあります

public class CourseCreateAction extends ActionSupport implements ServletRequestAware{
private CourseInfo courseInfo;
private List fetchedAllSubjects;
private List<SubjectInfo> selectedFetchedSubs;
private List subjectList;
private List fetchedAllExamType;
private List examTypeList;
private List<ExamType> selectedExmTypes;
private List fetchedAllCourse;
private String nextCourse;
private String previousCourse;
private DAOInterface dao;
private String btnPressed;
private String updateCourseId;  
private HttpServletRequest request; 
private boolean isUpdate;

public void setServletRequest(HttpServletRequest request) {
    request=request;
}

public List getFetchedAllSubjects() {
    return fetchedAllSubjects;
}

public void setFetchedAllSubjects(List fetchedAllSubjects) {
    this.fetchedAllSubjects = fetchedAllSubjects;
}

public List<SubjectInfo> getSelectedFetchedSubs() {
    return selectedFetchedSubs;
}

public void setSelectedFetchedSubs(List<SubjectInfo> selectedFetchedSubs) {
    this.selectedFetchedSubs = selectedFetchedSubs;
}

public List getSubjectList() {
    return subjectList;
}

public void setSubjectList(List subjectList) {
    this.subjectList = subjectList;
}

public CourseInfo getCourseInfo() {
    return courseInfo;
}

public void setCourseInfo(CourseInfo courseInfo) {
    this.courseInfo = courseInfo;
}
public List getFetchedAllExamType() {
    return fetchedAllExamType;
}

public void setFetchedAllExamType(List fetchedAllExamType) {
    this.fetchedAllExamType = fetchedAllExamType;
}

public List getExamTypeList() {
    return examTypeList;
}

public void setExamTypeList(List examTypeList) {
    this.examTypeList = examTypeList;
}

public List<ExamType> getSelectedExmTypes() {
    return selectedExmTypes;
}

public void setSelectedExmTypes(List<ExamType> selectedExmTypes) {
    this.selectedExmTypes = selectedExmTypes;
}

public List getFetchedAllCourse() {
    return fetchedAllCourse;
}

public void setFetchedAllCourse(List fetchedAllCourse) {
    this.fetchedAllCourse = fetchedAllCourse;
}

public String getNextCourse() {
    return nextCourse;
}

public void setNextCourse(String nextCourse) {
    this.nextCourse = nextCourse;
}

public String getPreviousCourse() {
    return previousCourse;
}

public void setPreviousCourse(String previousCourse) {
    this.previousCourse = previousCourse;
}

public DAOInterface getDao() {
    return dao;
}

public void setDao(DAOInterface dao) {
    this.dao = dao;
}

public String getBtnPressed() {
    return btnPressed;
}

public void setBtnPressed(String btnPressed) {
    this.btnPressed = btnPressed;
}

public String getUpdateCourseId() {
    return updateCourseId;
}

public void setUpdateCourseId(String updateCourseId) {
    this.updateCourseId = updateCourseId;
}

public boolean getIsUpdate() {
    return isUpdate;
}

public void setIsUpdate(boolean isUpdate) {
    this.isUpdate = isUpdate;
}

public String showUpdateAjax(){
        try{
        System.out.println("Ajax calling...........");
        showUpdateCourse();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return SUCCESS;
    }

public String showUpdateCourse(){
    try {
        isUpdate=true;
        courseInfo=dao.getCourse(Integer.parseInt(updateCourseId));
        System.out.println(courseInfo.getCourseId());
        selectedFetchedSubs=courseInfo.getSubjectList();
        selectedExmTypes=courseInfo.getExamTypeList();
        fetchedAllSubjects=dao.getAllSubjects();
        fetchedAllExamType=dao.getActiveExamTypes();
        for(ExamType exmType:selectedExmTypes)
            for (int i = 0; i < fetchedAllExamType.size(); i++) {
                if(exmType!=null&&((ExamType)fetchedAllExamType.get(i)).getExamTypeId()==exmType.getExamTypeId()){
                    fetchedAllExamType.remove(i);
                    break;
                }
            }
        for(SubjectInfo subInfo:selectedFetchedSubs)
            for (int i = 0; i < fetchedAllSubjects.size(); i++) {
                if(subInfo!=null&&((SubjectInfo)fetchedAllSubjects.get(i)).getSubjectId()==subInfo.getSubjectId()){
                    fetchedAllSubjects.remove(i);
                    break;
                }
            }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return SUCCESS;
}

プロジェクトでも春と休止状態を使用しました。showUpdateAction.action を呼び出しているリンクをクリックすると、これを実行しているときに、次のような応答が得られました

{}&& {"btnPressed":null,"courseInfo":{},"examTypeList":null,"fetchedAllCourse":[],"fetchedAllExamType":[],"fetchedAllSubjects":[],"isUpdate":true,"nextCourse":null,"previousCourse":null,"selectedExmTypes":[],"selectedFetchedSubs":[],"subjectList":null,"updateCourseId":"4"}

しかし、ボタンをクリックすると何も表示されませんが、関数が呼び出されます。さらに、ここで CourseInfo は setter getter メソッドを持つ変数があるオブジェクトであり、このオブジェクトは showUpdateAction.action が呼び出されるとフル状態になりますが、出力では courseInfo が空の中括弧で囲まれていることがわかります。この問題を解決するのを手伝ってください。私はいくつかの投稿を見て、たくさんグーグルで調べました。今はお願いするしかありません。助けてください

4

3 に答える 3

1

refrehButton のクリック時のスターターとして、なぜ refreshData javascript メソッドを呼び出すのですか?

onclick="refreshData()"

そのためのjQueryアクションをすでに宣言しているので

$("#refreshBtn").click(function()、同じイベントに対して 2 つのリスナーを持たないでください。次のような jQuery リスナーからのonclick="refreshData()呼び出しが必要な場合は、 を削除してください。refreshData

    $(document).ready(function(){
                $("#refreshBtn").click(function(){
                    //refreshData(); call this method here if you need to call
                    $.getJSON("/SASIS/showUpdateAjax.action?updateCourseId=4",
                        function(data){
                            alert('its working '+data);        
                        }, function(error) {
                            alert('Error here');
                        });

                    });
            });

2番目に、パッケージが拡張されている場合、拡張する必要json-defaultはありませんstruts-defaultjson-defaultstruts-default

extends="struts-default,json-default"これを使う代わりにextends="json-default"

3rdまた、実際にデータベースから結果を取得しているかどうかを確認します

courseInfo=dao.getCourse(Integer.parseInt(updateCourseId)); // Check if your object has field values

これらの変更を行って、調査結果を投稿してください

于 2012-05-23T04:46:05.103 に答える
1

mprabhat さんと Rahul さん、返信ありがとうございます。この問題をデバッグするために firebug を使用しました. そして、mprabhat が提案したように、jquery の問題を解決するための助けを本当に得ました。

さて、実際の問題は struts-jquery プラグインとスプリングにありました。「dao」の私のコードでは、オブジェクトは春を通して注入されます。json プラグインがオブジェクトをシリアル化しようとしているときに、パブリック アクセス修飾子を使用してデータベース オブジェクトのメソッドを作成しました。これはどういうわけかすべての問題を引き起こします。includeProperties「 」パラメータなしでjsonを返そうとすると、次のような例外が発生しました

org.apache.struts2.json.JSONException:  
org.apache.struts2.json.JSONException:  
org.apache.struts2.json.JSONException:  
org.apache.struts2.json.JSONException: java.lang.IllegalAccessException:  
Class org.apache.struts2.json.JSONWriter can not access a member of class  
org.hibernate.persister.entity.AbstractEntityPersister$3 with  
modifiers "public"
org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:230)
org.apache.struts2.json.JSONWriter.process(JSONWriter.java:160)
org.apache.struts2.json.JSONWriter.value(JSONWriter.java:126) 

したがって、残りのプロパティを含める代わりに、struts 構成でプロパティ「dao」を除外することにしました。

<action name="showUpdateAjax" class="courseCreateAction" method="showUpdateAjax">
    <result type="json">
        <param name="excludeProperties">dao</param>
        <param name="ignoreHierarchy">false</param>
        <param name="excludeNullProperties">true</param>
    </result>
</action>

そして、問題は解決しました。

于 2012-05-23T20:40:53.607 に答える
1

私はあなたのコードを見て(ストラットについての知識はありません)、気づいた、

<action name="showUpdateAjax" class="courseCreateAction" method="showUpdateAjax">

あなたのajax呼び出しは、

"/SASIS/showUpdateAjax.action?updateCourseId=4"

あなたのコントローラーは「courseCreateAction」で、アクションは「showUpdateAjax」であり、典型的なGET URLは次のようになります/controller/action?param1=value1&param2=value2...

しかし、あなたのURLにはコントローラーが含まれていません。

このリクエストを処理するアクション、

public String showUpdateAjax(){
  try{
  System.out.println("Ajax calling...........");
  showUpdateCourse();
  }catch (Exception e) {
      e.printStackTrace();
  }
  return SUCCESS;
}

showUpdateAjax() に渡される courseId はどこにありますか?

最後に、mprabhat が述べたように、クリック時に ajax 呼び出しを起動するようにボタンを既にバインドしています。だから、持っている必要はありません onclick="refreshData()"

于 2012-05-23T05:04:54.467 に答える