在 JSP 中使用 Ajax 响应

Posted

技术标签:

【中文标题】在 JSP 中使用 Ajax 响应【英文标题】:Use an Ajax response in JSP 【发布时间】:2011-11-27 20:58:49 【问题描述】:

我有一个JSP 页面,它只有一个普通的五行五列 html 表格。

现在我正在进行 Ajax 调用并得到响应。现在,一旦我收到回复,我需要将数据填充到表格的适当单元格中。

所以我的问题是;

    我应该使用JSON 来构建响应吗? 如何在 JSP 级别处理数据。也就是说,一旦我得到服务器的响应?

作为附加信息,我正在使用DWR,它只是从 javascript 代码内部调用 Java 方法(构建响应)。

【问题讨论】:

看到当我说客户端时,我实质上是指 JS 代码和从 JSP 生成的 html 代码...我不太理解反对票... 那个反对票不是我的。也许有人因为您对英语的关注度低而感到烦恼,或者确信您的研究工作不佳(我想这些信息可以在 DWR 指南/教程中找到)。 英文错误是因为我是从我的 iPad 上写出来的,因此打字不是很流畅......我也检查了 dwr 文档......它没有这个信息...... iPad 与否,例如,您可以只写“because”和“I”而不是“bcoz”和“i”。 是的,我可以..但肯定不是很容易在上面输入长词或句子而不会出错:) 【参考方案1】:

让我们考虑这个 Java 类。

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

在 JavaScript 中,JSON 对象:

 var employee = 
     id   : null,
     name : null
 ;

这是从 JavaScript 函数调用 Java 方法:

   EmployeeUtil.getRow(employee,dwrData);

在EmployeeUtil类的getRow()中,方法的返回类型为Employee:

   Employee getRow();

所以使用 Employee 的 setter 设置数据。 dwrData 是回调函数。

function dwrData(data) 
    employee=data;

返回的数据是一个Employee bean,将在回调函数中。

只需在 JavaScript JSON 对象中初始化它。

相应地使用 JSON 对象来填充表格。

编辑:

您可以使用List getRow() 代替Employee getRow(),以List 而不是Bean 的形式返回行列表。

现在响应包含列表作为数据。

请参考Populate rows using DWR

检查这些示例以填充表中的数据:

DWR + Dojo Demo Dynamically Editing a Table

我应该使用 JSON 来构建响应吗?

无需传递 JSON 作为响应。而是返回上面提到的类的 Bean。

列表可以作为响应传递,也如上所述。

如何在 JSP 级别处理数据。也就是说,一旦我得到服务器的响应。

查看上面的解释和给定链接的示例,以在 JSP 中处理响应并在表格中显示响应数据。

DWR basics on YouTube

【讨论】:

非常感谢您的回复..你似乎真的很接近我正在寻找的东西..尽管如此,我需要多次阅读您的示例才能理解,首先阅读,我只是想知道我是否可以轻松地将其扩展到多个表行列数据..如果我应该考虑 dojo,我也有点困惑,因为我没有使用太多......我的。简单的要求是进行 DWR 调用并将响应数据粘贴到所有 5x5 表或基于 div 的网格中.. 也只是补充一下,2格需要填写;在页面加载或用户点击任何链接后... 不需要使用 DOJO 看看这个directwebremoting.org/dwr/documentation/browser/util/… 再次感谢..当你说相应地使用 JSON 对象填充到表中时......你能否让我知道如何做到这一点......从服务器端,我知道我需要在客户端使用Java bean和json..请确认.... 如果我有基于 div 的网格,也可以使用类似的逻辑,即我需要填充无表布局【参考方案2】:

Ajax 部分:我们返回一个对象列表:

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

IdTexto 是一个带有 getter 和 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函数的类被定义为creator:

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

在jsp中,我们定义了一个函数javascript来检索由某个文本对象开始的List:

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,而是拥有其他对象,您将以相同的方式访问属性。

【讨论】:

非常感谢...2件事;一是我不想输出完整的 html 字符串。它应该类似于已经存在占位符,我将通过解析响应来填充它们,二是我计划为我的表使用基于 div 的网格即将创建相同的网格但不使用表标签..thx 我们也可以将此逻辑扩展到像二维数组这样的多维数组吗? 使用占位符没问题,只需使用javascript函数修改其内容即可。我没有测试过使用列表属性,但是您可以使用 dwr 将任何 java 对象转换为 js,所以,我认为可以发送列表列表。【参考方案3】:
    如果您使用 DWR,则不需要使用 JSON,它会在内部使用。 使用javascript,jsp代码超出范围。该页面已生成,因此您只能使用 javascrip 修改 DOM

在 DWR 教程中有很多示例可以满足您的需求。我想你只需要做一些事情:

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

【讨论】:

你是说代码吗?有很多方法可以完成您的需求。基础是 ajax 函数应该返回一个 List 并且它们从 js 你可以访问列表的每个元素作为 data[index]。如果列表中的元素是另一个列表,您可以使用相同的方式再次访问 data[index1][index2]。请记住,列表中的最终对象在 dwr.xml 中定义为 bean。 你能提供任何你刚才提到的两件事的例子吗?以 List 形式返回并在 Javascript 中进行相应的解析。只有您能提供详细的示例,我才能接受。。【参考方案4】:

我经常做的是为这种情况设置两个 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 检查请求的参数列表是否存在“命令”:

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 */
            

    

如果您格式化您的 JSP 以允许像这样批量替换 html 元素:

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

那么动态修改一个网页内容就变得很容易了(这个例子我用的是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 的一些限制:

    如果您要发回中等到大量的数据,那么当客户端数量开始增加时,您的网络服务器很容易过载。好吧,它不会很好地扩展。 用于格式化 HTML 以发送给客户端的 Java 代码会变得丑陋且难以阅读。快点。

【讨论】:

【参考方案5】:

JSP 页面是动态生成的 servlet。一旦用户点击 JSP 页面,他们就会收到动态生成的 HTML,除非他们完成诸如点击“刷新”或提交表单之类的操作,否则不再与生成它的 JSP 页面对话。查看 Oracle 的JSP Page 了解更多信息,查看Wikipedia 以获得对 JSP 技术的高级解释。

要处理 AJAX,您需要定义一个能够处理来自 Javascript 的 XML 请求的新网络端点。请参阅this example、this library 或此JSON Example。

【讨论】:

为此非常感谢..我在示例中找不到我正在寻找的东西......虽然我非常了解使用 JSP,但我正在寻找的是如何解析动态 AJAX 响应并使用它来填充表格单元格......即假设响应返回 5x5(或者更确切地说是 25 个数据点)...我需要解析它们并使用它们来填充我的 5x5 表格单元格..

以上是关于在 JSP 中使用 Ajax 响应的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ajax 调用刷新 JSP 页面上的 div 而没有响应

Jquery Ajax 请求和 Jsp 响应

用 ajax 响应数据替换部分视图

如何从 servlet 将文本响应流式传输到 jsp?

动态网页技术--JSP

如何在php中使用ajax响应数据