在表结构中发送响应和打印数据的其他更好的方法是什么?

时间:2014-08-21 06:39:09

标签: java jquery ajax json servlets

我是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返回并在<td>中设置值。并告诉我JSON是一个好方法,或者有任何其他方式请建议我。

2 个答案:

答案 0 :(得分:0)

对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!'}}
     });
    

答案 1 :(得分:-1)

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

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

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

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

你的ajax调用:xmlHttpReq.open('GET', "RTMonitor?rtype=groups&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.           
});