当前位置: 首页 > 图文教程 > Java技术 > Java Web开发 > Ajax servlet实现

Java Web开发
JSP的技术方法
错误处理页面的制作404,和500
JSP动态生成并调用JSP程序
jsp防注入的代码,如何防止SQL注入的方法和预编译的PreparedStatement的代码例子
一段生成验证码图片的程序
include与jsp:include区别
jsp基础速成精华讲解
Ajax servlet实现
如何从JSP页面传送动态图片
Java中用Servlet Listener实现定时监听
JSP、Servlet中的相对路径和绝对路径
如何成为一个优秀的jsp程序员
Java开源软件六大帮派
JSP高访问量下的计数程序 (转载)
Servlet中的这些问题,你注意到了吗?
JSP解决中文乱码问题
Servlet常见错误校验表
Session和Cookie的深入研究
无限菜单之 xml+popup 版(IE5.5+)
关于hibernate多对多----many to many

Java Web开发 中的 Ajax servlet实现


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 86 ::
收藏到网摘: n/a

之前用struts2.0做了异步请求,但总感觉有问题,请求次数太多后服务端就会挂起无响应了
正在解决这个问题

最开始用了struts.spring,hibernate三层来做,后来觉得hibernate可能会成为瓶颈,就直接改用jdbc做数据层,更改后貌似增大了请求次数

不过还是有问题,上论坛发了帖子,发现js出了点问题,做延时提交的时候没有清除定时器,导致请求几次仍然是提交几次,每次都给服务端造成了无端的压力
更改成

clearTimeout(time); 
time = setTimeout('passtoserver()',1000);//设置延时1s 

后实现了真正的延时请求

不过多次请求无响应的问题仍然存在,数据源是用的JNDI,是整个项目配的,我也管不了
看来还是得从程序入手了

猜测可能是struts的问题,于是乎想改用servlet直接做

不过问题来了,之前struts中的service对象是采用spring依赖注入的
有个struts2-spring-plugin.jar的支持,而直接用servlet的话就实现不了了

于是百度之后得到了答案(最近其实用google也多了,不过都是在百度不到的时候用的……呵呵),通过ServletContext来或得ApplicationContext
 

//通过servletContext来拿ApplicationContext
 ServletContext   context=getServletContext();
 WebApplicationContext webContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
  
 TBasicinfoDAO tbasicinfodao =(TBasicinfoDAOImpl) webContext.getBean("tbasicinfodao");

 

具体的意思我也还不明白,总之是拿到sessionfactory中的对象了

然后传递中文出现了问题,服务端response回的中文出现乱码了(又来了……)
通过对uri进行编码才得以解决,代码如下

 

public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

  //通过servletContext来拿ApplicationContext
  [color=red]ServletContext   context=getServletContext();
  WebApplicationContext webContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context); [/color]
  
  TBasicinfoDAO tbasicinfodao =(TBasicinfoDAOImpl) webContext.getBean("tbasicinfodao");

  response.setContentType("text/html");
  PrintWriter out = response.getWriter();
  
  String start=request.getParameter("start");//异步传输过来的查询条件
  
  names = new ArrayList<String>();
  if(!start.equals(null)&&!start.equals(""))
  {
   List<TBasicinfo>  list = tbasicinfodao.getSearchInfo(start.trim());//根据查询条件查询
   JSONObject option = new JSONObject();
   try {
     TBasicinfo tmp=null;
     String encode=null;
     for(int i=0; i<list.size(); i++)
     {
      tmp=new TBasicinfo();
      tmp=list.get(i);
       option.put("value", tmp.getEmpno());
      
      // java.net.URLEncoder.encode(tmp.getName(), "gbk");
      
      option.put("name", [color=red]java.net.URLEncoder.encode(tmp.getName(), "utf-8"));[/color]
       ///option.put("name", tmp.getName());
       option.put("pinyin",tmp.getNamespell());
       names.add(option.toString());
     }
   } catch (Exception e) {
    e.printStackTrace();
   }
   [color=red]response.setHeader("Charset","gbk");
   response.setCharacterEncoding("gbk");[/color]
   
  }
  out.print(names);
 }

 

页面上解析返回的数据也要改变一下,用

 

var decodede=decodeURI(request.responseText);

 

来实现

现在是把整个异步提交改成了Servlet+JDBC 不过请求次数多了还是会报错

 

之前出现的是thread.run() not availiable;

改用servlet实现异步提交后出现的问题
严重: Servlet.service() for servlet FindTableValueServlet threw exception
org.hibernate.exception.GenericJDBCException: Cannot open connection
 at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
 at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
 at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
 at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
 at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:420)
 at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
 at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:105)
 at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1561)
 at org.hibernate.loader.Loader.doQuery(Loader.java:661)
 at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
 at org.hibernate.loader.Loader.doList(Loader.java:2145)
 at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
 at org.hibernate.loader.Loader.list(Loader.java:2024)
 at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
 at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
 at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
 at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
 at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
 at edu.bit.cctv.hr.dao.impl.Ttwz_stacontDAOImpl.getStatisticItem(Ttwz_stacontDAOImpl.java:22)
 at edu.bit.cctv.generalsearch.service.impl.DispViewServiceImpl.dispStatisticItem

(DispViewServiceImpl.java:59)
 at edu.bit.cctv.generalsearch.action.FindTableValueServlet.doPost(FindTableValueServlet.java:92)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:413)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
 at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for

idle object
 at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:104)
 at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
 at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection

(LocalDataSourceConnectionProvider.java:81)
 at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:417)
 ... 36 more
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
 at org.apache.tomcat.dbcp.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:825)
 at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:96)
 ... 39 more