我正在开发一个Web服务,它从数据库中提取所有消息,作为json响应 这是我的用户密码&登录,搜索他们的ID并从数据库中提取用户的消息:
@GET
@Path("/historiquemethod")
@Produces("application/json")
public msgTabl historique(
@QueryParam("pseudo") String pseudo,
@QueryParam("motDePasse") String motDePasse
) {
msgTabl tab = new msgTabl();
MsgBean ms = new MsgBean();
int i = 0;
int id = 0;
// extraire l'id de la personne selon le pseudo & le mot de passe
try {
ResultSet rs1 = conn.createStatement().executeQuery("select id_u from utilisateur where pseudo='" + pseudo + "'and motdepasse='" + motDePasse + "' ");
if (rs1.next()) {
id = rs1.getInt(1);
}
} catch (SQLException ex) {
}
// extraire les messages et les mettre dans le tableau
try {
ResultSet rs2 = conn.createStatement().executeQuery("select * from message where idUser='" +id+ "'");
while (rs2.next()) {
tab.setTest("ok");
String from2 = rs2.getString("fromm");
String contenu2 = rs2.getString("contenu");
String dateenvoi2 = rs2.getString("DateEnvoi");
String numexp2 = rs2.getString("NumExp");
ms.setFrommm(from2);
ms.setContenu(contenu2);
ms.setDateEnvoi(dateenvoi2);
ms.setNumExp(numexp2);
tab.m[i] = ms;
i = i + 1;
}
} catch (SQLException ex) {
tab.setTest("Catch error");
}
return tab;
}
每条消息都是" msgbean"其中包含一些信息(from,to,content,id,idUser,Date ...)
并且WS的响应是" msgTabl"这是一个包含在msgbean和字符串表中的对象,
问题是我的ws总是只返回最后一条消息!! 这意味着如果用户有3条消息,只有最后一条消息返回3次!!
{
"msgTabl": {
"m": [
{
"contenu": 3333333333,
"dateEnvoi": 3333333333,
"frommm": 333333333,
"id": 3,
"idu": 1,
"numExp": 33333333333
},
{
"contenu": 3333333333,
"dateEnvoi": 3333333333,
"frommm": 333333333,
"id": 3,
"idu": 1,
"numExp": 33333333333
},
{
"contenu": 3333333333,
"dateEnvoi": 3333333333,
"frommm": 333333333,
"id": 3,
"idu": 1,
"numExp": 33333333333
}
],
"test": "ok"
}
}
你可以告诉我,请问错误在哪里?是他们的任何prb与我的代码?
另外,我想知道为什么msgTabl存在于json响应中?
我的意思是为什么我没有得到
{
"m": [
{
"contenu": 3333333333,
"dateEnvoi": 3333333333,
"frommm": 333333333,
"id": 3,
"idu": 1,
"numExp": 33333333333
},
{
"contenu": 3333333333,
"dateEnvoi": 3333333333,
"frommm": 333333333,
"id": 3,
"idu": 1,
"numExp": 33333333333
},
{
"contenu": 3333333333,
"dateEnvoi": 3333333333,
"frommm": 333333333,
"id": 3,
"idu": 1,
"numExp": 33333333333
}
],
"test": "ok"
}
直接?
答案 0 :(得分:0)
问题是您的代码只创建一个MsgBean ms
对象,并将相同的内容一遍又一遍地插入到数组中。这就是为什么你得到相同数据的三倍,实际上你实际上三次显示同一个对象。您需要将该对象的实例化移动到循环内部,如下所示:
while (rs2.next()) {
tab.setTest("ok");
String from2 = rs2.getString("fromm");
String contenu2 = rs2.getString("contenu");
String dateenvoi2 = rs2.getString("DateEnvoi");
String numexp2 = rs2.getString("NumExp");
// a fresh ms per iteration
MsgBean ms = new MsgBean();
ms.setFrommm(from2);
ms.setContenu(contenu2);
ms.setDateEnvoi(dateenvoi2);
ms.setNumExp(numexp2);
tab.m[i] = ms;
i = i + 1;
}
接下来,看起来你的类msgTabl
(类名应该以大写字母开头,最好将其重命名为MsgTabl
)包含一个数组,可能更喜欢用ArrayList替换该数组,特别是当列表的长度可变时。
关于John Gardner关于SQL注入的声明 - 将查询字符串串在一起确实非常危险 - 请参阅http://bobby-tables.com/,了解为什么有一天会< / strong>如果您没有解决此问题,请进行黑客攻击或破坏。使用PreparedStatement来解决这个问题非常简单:
PreparedStatement statement = conn.prepareStatement("select id_u from utilisateur where pseudo= ? and motdepasse= ?");
statement.setString(1,pseudo);
statement.setString(2,motDePasse);
ResultSet rs1 = statement.executeQuery();