2

テーブルを更新するための ajax リクエスト/レスポンスに取り組んでいます。

しかし、Ajax がコントローラーを呼び出すと、ページ全体が返されます。しかし、私が欲しいのは、c:forEach テーブルにマップする必要がある正確なテーブル データだけです。ありがとう。

Jsp ビュー:

      <script type="text/javascript">
       jQuery(document).ready(function(){
           function doAjaxPost() {
                // get the form values
    var contextPath ='<jsp:expression>contextPath</jsp:expression>';

                $.ajax({
                    type: "GET",
                    url: contextPath+"/noticesAjaxRequest",
                    dataType: "json",
                    contentType: 'application/json',
                    success: function(data){
                        // we have the response
                        $('#info').empty().html(data);

                    },

                    });

                }
          setInterval(doAjaxPost,10*1000);
       });

    </script>  

       <div id="info">
        <c:forEach  items="${noticeForm.noticeList}" var="notice">
            <c:out value="${notice.coreValue} "/>
            <c:out value="${notice.description} "/>
            <br/>
        </c:forEach>
   </div> 

コントローラ:

@Controller
public class DashboardController {

private NoticeBO noticeBO;

/*@RequestMapping("/dashboardTest")
public String printWelcome(ModelMap model) {
    List<Employee> employeeList=dashboardDAO.getAllEmployee();
    for(Employee employee:employeeList)
    model.addAttribute("msg", model.get("msg")+"<br/> Spring 3 MVC Hello World"+employee.getCustomerId());

    return "DashboardTest";

}*/

public NoticeBO getNoticeBO() {
    return noticeBO;
}

public void setNoticeBO(NoticeBO noticeBO) {
    this.noticeBO = noticeBO;
}

@RequestMapping("/dashboard")
public String dashboard(ModelMap model) {
    return "Dashboard";
}

@RequestMapping("/notices")
public ModelAndView notices(@ModelAttribute("NoticeForm") NoticeForm noticeForm, ModelMap model) {

    noticeBO.prepareNoticeList(noticeForm,model);

    return new ModelAndView("notices","noticeForm",noticeForm);
}

@RequestMapping("/noticesAjaxRequest")
public ModelAndView noticesAjaxRequest(@ModelAttribute("NoticeForm") NoticeForm noticeForm, ModelMap model) {

    noticeBO.prepareNoticeList(noticeForm,model);

    return new ModelAndView("notices", "noticeForm", noticeForm);
}
}

更新{1}:

コントローラーで変更を試みたところ、エラーが発生し始めました: [object XMLHttpRequest]

 @RequestMapping("/noticesAjaxRequest")
public @ResponseBody List<Notice> noticesAjaxRequest(@ModelAttribute("NoticeForm") NoticeForm noticeForm, ModelMap model) {

    noticeBO.prepareNoticeList(noticeForm,model);

    return noticeForm.getNoticeList();
}

エラーの説明:

HTTP ステータス 406 - このリクエストによって識別されたリソースは、リクエストの「accept」ヘッダーによると、受け入れられない特性を持つレスポンスしか生成できません。

応答ヘッダー

Content-Length  1067
Content-Type    text/html;charset=utf-8
Date    Thu, 11 Jul 2013 12:48:19 GMT
Server  Apache-Coyote/1.1

リクエスト ヘッダー

Accept  application/json, text/javascript, */*
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Cookie  JSESSIONID=D54D66F6B7FE05C2B6FB684BF19387F1
Host    localhost:8080
Referer http://localhost:8080/vServFinance/notices
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0
X-Requested-With    XMLHttpRequest
4

3 に答える 3

5

助けてくれてありがとう。最善かつ簡単なのは、別のjspビューを作成し、コントローラーからの戻り/応答中にそれを含めることです。

jQuery(document).ready(function(){
           function doAjaxPost() {
                // get the form values
               var contextPath ='<jsp:expression>contextPath</jsp:expression>';

                $.ajax({
                    type: "GET",
                    url: contextPath+"/noticesAjaxRequest",
                    success: function(data){
                        // we have the response

                         $('#info').html(data); 
                        /* $('#info').refresh(); */
                    },

                     error: function(e){
                        alert('Error: ' + e);
                    } 
                    });
                }
          setInterval(doAjaxPost,10*1000);
       });

コントローラ:

@RequestMapping(value="/noticesAjaxRequest")
public  ModelAndView noticesAjaxRequest(@ModelAttribute("NoticeForm") NoticeForm noticeForm, ModelMap model) {

    noticeBO.prepareNoticeList(noticeForm,model);

    return new ModelAndView("/noticesList","noticeForm",noticeForm);
}
于 2013-07-12T06:13:53.377 に答える
1

ModelAndView を返すコードでは、ビューが返されます。JSON データを返したい場合は、 @ResponseBody を戻り値の型に追加する必要があります。そのように:

@RequestMapping(value = "/porUF", method = RequestMethod.GET)
    public @ResponseBody List<Municipio> municipios(
            @RequestParam(value = "uf", required = true) String uf) {

        if ( uf.length() != 2) {
            return null;    
        }

        return municipioBO.findByUf(uf);
    }   

これにより、LIST が JSON オブジェクトに変換されます。HTTP 応答は次のようになります。

[{"codigo":9701,"uf":{"uf":"DF","nome":"DISTRITO FEDERAL"},"nome":"BRASILIA"}]

そのためには、オブジェクトを JSON オブジェクトに変換するこの MAGIC を実行するライブラリが必要です。ジャクソンを使用しています。POM に追加します。

<!-- Data Mapper package is a high-performance data binding package built 
        on Jackson JSON processor -->
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
    </dependency>
于 2013-07-11T16:06:03.407 に答える
1

HTTP 406 は、クラスパスにjackson-core-aslおよびjackson-mapper-asljar がないことが原因である可能性があります。こことスタック オーバーフローの投稿はこちらを参照してください。

要約すると、Maven を使用している場合は、次の 2 つの依存関係を pom.xml に追加します。

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-lgpl</artifactId>
    <version>1.9.12</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-lgpl</artifactId>
    <version>1.9.12</version>
</dependency>

Maven を使用していない場合は、上記の 2 つの jar がクラスパスに存在することを確認してください。

于 2013-07-11T14:20:48.793 に答える