index.jsp
<input type="text" onfocusout="show(this.value)" />
<div id="output"></div>
<script type="text/javascript">
function show(cat)
{
var output = document.getElementById("output");
$.ajax({
type:"get",
url:"fetchdata",
data:"cat="+cat,
success:function(responseJson){
output.innerHTML = responseJson;
}
});
}
fetchdata.java
public class fetchdata extends HttpServlet {
Connection con =null;
PreparedStatement ps = null;
ResultSet rs = null;
ArrayList<String> pname = new ArrayList();
ArrayList<String> iname = new ArrayList();
ArrayList<String> cname = new ArrayList();
ArrayList<Double> price = new ArrayList();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String cat = request.getParameter("cat");
PrintWriter out= response.getWriter();
try {
Class.forName("com.mysql.jdbc.Driver");
con= DriverManager.getConnection("jdbc:mysql://localhost:3306/dealtime","root","root");
ps = con.prepareStatement("Select images.product_name,image_name,company_name,price "
+ "from images,products where images.product_name = products.product_name AND "
+ " category_name = ?");
ps.setString(1,cat);
rs=ps.executeQuery();
while(rs.next())
{
pname.add(rs.getString("product_name"));
iname.add(rs.getString("image_name"));
cname.add(rs.getString("company_name"));
price.add(rs.getDouble("price"));
}
String json =new Gson().toJson(pname);
response.setContentType("application/json");
out.println(json);
} catch (ClassNotFoundException | SQLException ex) {
Logger.getLogger(fetchdata.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
上面的代码工作正常,但是当发出多个ajax请求时,数据会附加到我从前一个ajax请求收到的数据中。我只想用新数据更新div
,我想知道如何发送多个对象作为响应并操纵它们从中提取值。
答案 0 :(得分:1)
Servlet是多线程的,这意味着Servlet容器将实例化少量实例,但是通过每个实例运行多个线程(每个请求一个)。因此,作为实例属性在Servlet类上定义的属性将在通过该实例执行的所有线程(请求)之间共享状态。
如果实例化一个类(在其上调用new),那么实例属性对该类中的所有方法都是可见的,它们的值是共享的。对于Servlet,servlet容器至少创建一个Servlet实例,然后出于性能原因,通过该servlet实例为每个传入请求执行1个线程。这意味着每个执行线程都能够看到实例属性中的值。在方法范围内移动属性意味着每个线程都有自己的副本。
将所有属性的声明从实例级别移动到doGet()方法中,然后将不再共享该状态。以这种方式在Servlet上共享状态通常是不好的做法。
此行为在此处的EE教程中进行了解释 - 请参阅17.3.2: https://docs.oracle.com/javaee/7/tutorial/servlets003.htm#BNAFO
此外,最好不要创建自己的JDBC连接,而是在servlet容器上定义数据源(如何执行此操作取决于您正在运行的内容),并让应用服务器为您管理连接。您只需在需要时从数据源中提取连接。
要回答问题的第二部分,您可以像这样构建json以在响应中包含多个属性:
{
"pname" : "pname value",
"iname" : "iname value"
//etc
}
如果这些属性中的任何一个本身具有属性,嵌套对象,那么只需创建另一个Json对象作为其中一个属性的值。