http://blog.csdn.net/huhai463127310/archive/2009/11/29/4901654.aspx
多亏了这篇文章!!!!
上一篇日志提过jquery通过$.get访问servlet的问题.当servlet执行成功,会返回一个data,我们就可以利用这个data来返回我们想要的数据.
拿这次要实现的功能为例,利用jsp+servlet+bean来实现数据的显示.每条记录都存在一个bean中,且每一个bean都有其相应的各种属性.我们可以通过事件触发来进行$.get操作,同时传递参数.在进入servlet后,会进行一系列的操作会把符合要求的bean存入一个ArrayList中,然后再将ArrayList中的数据转换为json数组返回.到达前台后,再将数组中的每一条记录取出显示即可.举例说明:
将数据库中的值绑定到下拉列表
前台代码:
前台将返回的String通过eval来转换为JSON对象.
<script type="text/javascript">
$(document).ready(function(){
var url='TypeGet?d='+Math.random();/*使用随机数解决jquery的缓存问题*/
$.get(url,
function dedit(data){
var m=eval(data);
$.each(m, function(i) {
//alert(s[i]);
$('#pselect').append('<option value="'+m[i].no+'">' + m[i].name+ '</option>');
});
});
</script>
后台:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");/*解决中文乱码的问题*/
response.setCharacterEncoding("UTF-8");
ArrayList result=new ArrayList();
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try{
conn=DBConnection.getConnection();
st=conn.createStatement();
rs=st.executeQuery("select * from ddpms_devicetype order by name");
while(rs.next()){
DevicetypeBean dt=new DevicetypeBean();
dt.setNo(rs.getInt("no"));
dt.setName(rs.getString("name"));
result.add(dt);
}
}catch(Exception e){
e.printStackTrace();
}
finally{
try{
rs.close();
st.close();
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
response.setContentType("text/html");
PrintWriter out= response.getWriter();
out.write(toString(result));
}
public String toString(ArrayList s)
{
String str="[";
for(int i=0;i<s.size();i++){
DevicetypeBean dt=(DevicetypeBean)s.get(i);
str+="{'no':'"+dt.getNo()+"','name':'"+dt.getName()+"'},";
}
str=str.substring(0,str.length()-1)+"]";
return str;
}
之前已经说过,在servlet通过out.write可以输出想要返回到前台的data,那要返回json数组,格式是什么?
比如我要返回两条记录,每条记录都有no和name两个属性,那就应写成:
out.write("[{'id':'aa','name':'bb'},{'id':'cc','name':'dd'}]");
这里为了方便把ArrayList转为json数组形式的String,可以专门写一个函数来处理,即上面后台代码中的
toString(ArrayList s)函数.
PS:也正是因为这个函数,如果要在前台判断获取的json数组是否为空,不能用
if(data=="")
而应该是
if(data=="]")
下面是关于JQuery缓存的问题,这个问题真的很恶心恶心.....
发现这个问题是因为使用刚才的$.get访问servlet来对数据库进行操作然后读数据,发现读到的竟然还是修改前的数据,需要清理一下INTERNET临时文件才可以看到新的结果.后来上网一查说是JQUERY缓存的问题.
$.ajax可以通过设置cache:false来确定是否读缓存,即自动给url加时间戳.而$.get貌似不能这么设.需要每个请求的末尾都添加了一个随机数.
如,这里可以通过在要访问的servlet的url后加随机数来解决,即:
var url='TypeGet?d='+Math.random();/*使用随机数解决jquery的缓存问题*/
$.get(url,function(data){});