【问题标题】:What is other better way to send response and print data in table structure?在表结构中发送响应和打印数据的其他更好方法是什么?
【发布时间】:2014-08-21 06:39:09
【问题描述】:

我是 ajax 新手,我正在进行 ajax 调用,它会点击 servlet,它会使用 out.println() 获取数据并将数据打印到 jsp。它工作正常,但我觉得它不是一个好方法。这是我的编码,

Ajax 调用,

xmlHttpReq.open('GET', "RTMonitor?rtype=groups&groupname="+temp, true);

在我的 RTMonitor servlet 中,

sql ="SELECT a.vehicleno,a.lat,a.lng,a.status,a.rdate,a.rtime from latlng a,vehicle_details b where a.vehicleno=b.vehicleno and b.clientid="+clientid +"  and b.groupid in(select groupid from group_details where groupname='"+gname+"' and clientid='"+clientid+"')";
resultSet = statement.executeQuery(sql);
while(resultSet.next())
{
  response.setContentType("text/html");
  out.println("<tr>"+
   "<td>"+"&nbsp"+"&nbsp"+resultSet.getString("vehicleno")+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"&nbsp"+"<br>"+"<br>"+"</td>"+);
//other <td>s

}

我认为这不是好方法。所以我考虑将响应返回为JSON 对象。告诉我如何以 JSON 格式返回对象并在&lt;td&gt; 中设置值。告诉我 JSON 是一个好方法,或者有没有其他方法请给我建议。

【问题讨论】:

  • 那些&amp;nbsp 肯定不是个好主意!
  • 你可以使用JqGrid
  • 你的朋友是数据表(datatables.net)。检查它有各种示例如何使用它
  • @Daniel 是的,你知道其他方法吗。
  • 检查这个 jquery 插件:datatables.net

标签: java jquery ajax json servlets


【解决方案1】:

对象到 JSON 的转换有问题解释:Converting Java Object to Json using Marshaller

其他:

  • 您的 SQL 不安全!请参考以下问题,该问题解释了准备好的语句并有示例:Difference between Statement and PreparedStatement
  • 一般来说,除非您打算学习一些东西,否则您不应该自己编写低级 AJAX 代码。有许多跨浏览器功能的 Javascript 库以稳健的方式提供这些东西,例如 JQuery。 JQuery 的 API 有 getJSON,你肯定会发现它非常有用 (API doc):

     var params = {myObjectId: 1337}; // just some parameters
     $.getJSON( "myUrl/myAjaxAction", params, function( data ) { /* this is the success handler*/
        alert(data.myObject.name); // assuming that returned data (JSON) is: {myObject: {name: 'Hello World!'}}
     });
    

【讨论】:

    【解决方案2】:

    您应该尽量避免将服务器端代码与客户端代码混用。 您的客户端代码应该只通过操纵服务器提供的数据来提供一个漂亮而丰富的用户界面。服务器端代码应该只处理数据——来自不同的调用,或者取自存储,通常是数据库。

    通常来自客户端和服务器的通信(异步与否)是这样的:

    • 客户端向服务器发送请求
    • 服务器处理请求并给出响应,通常是一些html或json/xml
    • 客户端处理来自服务器的响应

    好的,现在让我们将注意力转移到您的具体问题上。

    您的 ajax 调用:xmlHttpReq.open('GET', "RTMonitor?rtype=groups&amp;groupname="+temp, true); 应该将请求发送到 servlet,并期望一些数据返回处理并以良好的方式呈现给用户。您的 servlet 应该通过查询数据库来处理请求(您绝对应该更改代码,以便它使用准备好的语句,因为它们可以防止 SQL 注入)。通过这样做,您将客户端代码与服务器端代码分开。

    private List<YourObject> loadObjectsBySomeLogic() throws SQLException{
    
        String sql ="SELECT a.vehicleno,a.lat,a.lng,a.status,a.rdate,a.rtime FROM latlng a,vehicle_details b WHERE a.vehicleno=b.vehicleno AND b.clientid= ? AND b.groupid in(select groupid from group_details where groupname= ? and clientid= ?)";
    
        List<YourObject> list = new ArrayList<YourObject>();//new ArrayList<>(); for Java versions > 1.7
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            ps = connection.prepareStatement(sql);
            ps.setLong(1, clientId);
            ps.setString(2, gname);
            ps.setLong(3, clientId);
    
            rs = ps.executeQuery();
            while(rs .next())
            {
                //load data from ResultSet into an object/list of objects
            }
        }finally{
            closeResources(rs , ps);
        }
        return list;
    }
    
    private static final void closeResources(final ResultSet rs , final PreparedStatement ps){
       if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                //nasty rs. log the exception?
                LOGGER.error("Could not close the ResultSet!" , e);
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                 //nasty ps. log the exception?
                LOGGER.error("Could not close the PreparedStatement!" , e);
            }
        }
    }
    

    您可以将此方法委托给不同的对象,该对象处理业务/应用程序域逻辑,但这不是我们在这种情况下的重点。

    您可以将 Json 用于您的数据格式,因为它有一种很好且易于理解的数据格式设置方式,并且与 XML 相比它更轻量级。您可以使用任何 Java 库将数据编码为 Json。我将提供一个使用 Gson 库的示例。

    List<YourObject> list = loadObjectsBySomeLogic();
    String json = new Gson().toJson(list);
    response.setContentType("application/json"); 
    response.setCharacterEncoding("UTF-8"); 
    response.getWriter().write(json);
    

    现在您的 Ajax 请求应该处理来自服务器的 Json 数据(我建议您使用 jQuery 来进行 Ajax 调用,因为它已经过测试并且在所有主流浏览器上都很好用)。

    $.get('RTMonitor', function(responseJson) {    
        //handle your json response by rendering it using html + css.           
    });
    

    【讨论】:

    • 好吧,我试试这个,这里的 LOGGER 是什么
    • 这是一个 log4j logger 。暂时忽略它,将该行更改为e.printStackTrace();
    • 我不太明白您所说的更多数据是什么意思,但是在某些情况下您必须处理大量数据。如果您认为该 sql 查询将加载太多行,您可以通过添加限制来限制要加载的行数。这通常是UI分页的对应。
    • @Daniel 这种 PreparedStatement 用法不会阻止 SQL 注入。此代码与原始代码一样易受攻击。
    • @Daniel k ... 那么通过 JSon 发送的数据没有限制吧?因为有时我的查询可能会返回很多行。
    猜你喜欢
    • 2018-01-13
    • 2018-11-21
    • 2011-12-21
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 2020-07-01
    相关资源
    最近更新 更多