2011-09-29 49 views
2

Ajax響應我有一個JSP網頁,其中有什麼,但有5行5列普通的HTML表格。使用JSP中

現在我調用Ajax並得到響應。現在,當我收到回覆後,我需要填寫表格中相應的單元格中的數據。

所以我的問題是,

  1. 我應該使用JSON來構建響應嗎?
  2. 如何在JSP級別處理數據。也就是說,一旦我有了服務器的迴應?

就像其他信息一樣,我使用的是DWR,它不過是從JavaScript代碼中調用Java方法(它構建響應)。

+0

看到我說客戶端時,我基本上是指JS代碼和JSP生成的html代碼...我不太明白downvote ... – testndtv

+1

Downvote不是我的。也許有人會因爲你的問題對英文的注意力不夠,或者相信你的研究工作很差(我想這些信息可以在DWR指南/教程中找到)。 – BalusC

+0

英語錯誤是bcoz即時通訊從我的iPad寫出來,因此不太流利輸入...我也檢查了dwr文檔..它沒有這個信息.. – testndtv

回答

6

讓我們考慮一下這個Java類。

class Employee 
    { 
     int id; 
     String eName; 
     // Setters and getters 
    } 

在JavaScript中,JSON對象:

var employee = { 
    id : null, 
    name : null 
}; 

這是從JavaScript函數的Java方法調用:所述EmployeeUtil類的

EmployeeUtil.getRow(employee,dwrData); 

在的getRow(),方法的退貨類型爲員工:

Employee getRow(); 

所以使用Employee的setters設置數據。 dwrData是回調函數。

function dwrData(data) { 
    employee=data; 
} 

返回的數據,這是一個Employee bean,將在回調函數中。

在JavaScript JSON對象只是初始化這一點。

因此使用JSON對象來填充表。

編輯:

可以使用List getRow()代替Employee getRow(),返回行的列表作爲列表,而不是一個Bean。

現在響應包含列表作爲數據。

參照Populate rows using DWR

檢查這些例子在表填充數據:

我應該使用JSON構建的反應如何?

  • 不需要傳遞JSON作爲迴應。而是返回一個如上所述的類的Bean。

  • 列表也可以作爲響應傳遞,也如上所述。

如何在JSP級別處理數據。也就是說,一旦我有了服務器的響應。

查看上面的解釋和給定鏈接的示例,以處理JSP中的響應並將響應數據顯示在表中。

+0

Thx很多爲您的答覆..u似乎來真正接近我正在尋找..儘管如此,我需要通過您的示例多次瞭解,在第一次閱讀,我只是想知道如果我可以輕鬆地縮放到多個錶行數據..也是我有點困惑如果我應該考慮dojo,因爲我沒有用過它......我的。簡單的要求是做一個DWR調用,並將響應數據粘貼到所有的5x5表格或基於div的網格中。 – testndtv

+0

A +1,用於理解問題並現在就很好地解決它。 – testndtv

+0

也只是添加,網格需要填寫2例;在頁面加載或用戶點擊任何鏈接後... – testndtv

1

JSP頁面是動態生成的servlet。一旦用戶點擊一個JSP頁面,他們會收到動態生成的HTML,除非他們完成諸如「刷新」或提交表單之類的操作,否則它們不再與生成該頁面的JSP頁面進行通信。查看Oracle的JSP Page獲取更多信息,Wikipedia獲得關於JSP技術的體面高級解釋。

來處理Ajax,你將需要定義能夠處理從JavaScript上來的XML請求的一個新的網絡端點。請參閱this example,this library或此JSON Example

+0

Thx很多這樣..我找不到我在尋找的例子...雖然我非常瞭解使用JSP,但我正在尋找的是如何動態解析AJAX響應並使用它來填充表格單元格...即說響應返回5x5(或更確切地說25個數據點)...我需要解析它們,並使用它們來填充我的5x5表格單元格.. – testndtv

1

我做的相當頻繁是設置針對這種情況兩個servlet:

MyServlet 
MyAJAXServlet 

MyServlet處理普通的HTTP請求和(通常)使用一個RequestDispatcher轉發結束對JSP的請求。

例子:

public class MyServlet extends HttpServlet { 
    private static final long serialVersionUID = -5630346476575695999L; 
    public void doGet(HttpServletRequest req, HttpServletResponse res) 
      throws ServletException, IOException { 
     doGetAndPost(req, res); 
    } 
    public void doPost(HttpServletRequest req, HttpServletResponse res) 
      throws ServletException, IOException { 
     doGetAndPost(req, res); 
    } 
    private final void doGetAndPost(HttpServletRequest req, 
      HttpServletResponse res) throws ServletException, IOException { 
     /* 
     * Handle the response here, manipulate the 'MODEL' 
     */ 
     /* 
     * Forward to the 'VIEW' (No Baba Wawa jokes please) 
     */ 
     RequestDispatcher rdis = req.getRequestDispatcher("Path/To/My/JSP"); 
     rdis.forward(req, res); 
    } 
} 

凡爲AJAX Servlet檢查請求的參數列表的「命令」的存在:如果格式化你的JSP,允許批量替換HTML的

public class MyAJAXServlet extends HttpServlet { 
    private static final long serialVersionUID = -5630346476575695915L; 

    public void doGet(HttpServletRequest req, HttpServletResponse res) 
      throws ServletException, IOException { 
     doGetAndPost(req, res); 
    } 

    public void doPost(HttpServletRequest req, HttpServletResponse res) 
      throws ServletException, IOException { 
     doGetAndPost(req, res); 
    } 

    private final void doGetAndPost(HttpServletRequest req, 
      HttpServletResponse res) throws ServletException, IOException { 

      String cmd = req.getParameter("cmd"); 
      if (cmd == null || cmd.length() < 1) { 
       /* Custom fail mode here, perhaps toss back failure HTML */ 
       return; 
      } 

      /* Easily implement command pattern here, but for simplicity, we will use an if tree */ 

      if (cmd.equalsIgnoreCase("getSomeData")) { 
       String out = "<tr><td>ExampleCell in ExampleRow</td></tr>"; 
       res.getWriter().append(out); 
       return; 
      } else if (cmd.equalsIgnoreCase("someOtherCommand")) { 
       /* Do something else */ 
      } 

    } 
} 

像這樣的元素:

<table id="pleaseReplaceMyContentsTABLE"> 
    <tr><td>&nbsp;</td></tr> 
</table> 

然後,它變得非常容易動態修改網頁p年齡段的用戶(使用jQuery在這個例子中):

var url = "http://mydomain.whatever/myapp/MyAJAXServletMappedURL?cmd=getSomeData"; 
$.post(url, function(data) { 
    //Message data a bit & display 
    $("#pleaseReplaceMyContentsTABLE").html(data); 
}); 

從AJAX的Servlet發回預先格式化的HTML一些限制:

  1. 如果要回送一箇中度到大量的數據,然後當客戶數量開始上升時,您的網絡服務器很容易變得過載。又如,它不會很好地擴展。
  2. 正在格式化HTML以發送給客戶端的Java代碼可能會變得難看難讀。很快。
0
  1. 如果您使用DWR,則不需要使用JSON,它在內部使用。
  2. 使用javascript,jsp代碼超出範圍。該頁面已生成,因此您只能使用javascrip修改DOM。

在DWR教程中有很多示例正在做你所需要的。我想你只需要做一些事情爲:

dwrobject.funtionAjax(param,returnFunction); 
... 
    function returnFunction(data) { 
// use javascript to change the dom 
    } 
+0

你可以添加更多的細節... – testndtv

+0

你的意思是代碼? 有很多方法來實現你的內在。基礎是比ajax函數應該返回一個List,並且他們可以從js中訪問列表中的每個元素作爲data [index]。如果列表中的元素是另一個列表,則可以使用相同的方式data [index1] [index2]再次訪問它。請記住,列表中的最後一個對象在dwr.xml中定義爲bean。 – yoprogramo

+0

你能否提供你剛剛提到的2件事的任何例子;返回List和Javascript中的相應解析。我只能在你能提供詳細的樣本時才能接受。 – testndtv

0

阿賈克斯部分:我們返回對象的列表:

public List<IdTexto> getPaisesStartingBy(String texto,String locale){ 
     List<IdTexto> res = new ArrayList<IdTexto>(); 
// Fill the array 
return res; 
} 

的IdTexto是geters和setter一個簡單的bean:

public class IdTexto { 

    private int id; 
    private String texto; 
    private String texto2; 
// getters and setters 
} 

它在dwr.xml中定義爲bean:

<convert converter="bean" match="com.me.company.beans.IdTexto"/> 

而且包含Java功能的類被定義爲創作者:

<create creator="new" javascript="shopdb"> 
    <param name="class" value="com.me.company.ajax.ShopAjax"/> 
</create> 

在JSP中,我們定義一個函數JavaScript來獲取一些文本對象以這種方式開始的列表:

shopdb.getPaisesStartingBy(req.term,'<s:text name="locale.language"/>', writePaises); 

並寫下相應功能的文本:

function writePaides (data) { 
var result="<table>"; 
for (i=0; i<data.length;i++) { 
id = data[i].id; 
texto=data[i].texto; 
texto2=data[i].txto2; 
// now we write inside some object in the dom 
result+="<tr><td>"+id+"</td><td>"+texto+"</td><td>"+texto2+"</td></tr>"; 
} 
result+="</table>"; 
$("tabla").innerHTML=result; 
} 

如果是你,而不是一個bean有一些其他的對象,你會訪問properti以同樣的方式。

+0

Thx很多... 2件事;一個是,我不想輸出完整的HTML字符串..它應該像是會有佔位符已經存在的東西,我只是通過解析響應來填充它們,其次我計劃使用基於div的網格爲我的表即相同的網格將被創建,但不使用表格標記..thx – testndtv

+0

我們還可以將這個邏輯擴展到多維數組,如2維數組嗎? – testndtv

+0

使用佔位符沒有問題,只需使用javascript函數來修改其內容即可。我沒有使用list屬性進行測試,但是可以將任何java對象轉換爲js usin dwr,因此,我認爲可以發送列表列表。 – yoprogramo