2011-09-29 50 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