Ajax servlet實現

之前用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


搞不定了 等宿老回來再說了~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章