ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美vide,97精品国产97久久久久久久久久久久,日本综合精品一区http://www.aygfsteel.com/stevenjohn/category/51969.html那些青春的岁æœ?/description>zh-cnThu, 14 Jun 2012 01:16:25 GMTThu, 14 Jun 2012 01:16:25 GMT60深入研究Servlet¾U¿ç¨‹å®‰å…¨æ€§é—®é¢?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2012/06/14/380730.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 14 Jun 2012 01:12:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2012/06/14/380730.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/380730.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2012/06/14/380730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/380730.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/380730.html</trackback:ping><description><![CDATA[<strong>æ‘?要:介绍了Servlet多线½E‹æœºåˆÓž¼Œé€šè¿‡ä¸€ä¸ªå®žä¾‹åƈ¾l“合Java 的内存模型说明引起Servlet¾U¿ç¨‹ä¸å®‰å…¨çš„原因åQŒç»™å‡ÞZº†ä¿è¯Servlet¾U¿ç¨‹å®‰å…¨çš„三¿Uè§£å†Ïx–¹æ¡ˆï¼Œòq¶è¯´æ˜Žä¸‰¿Uæ–¹æ¡ˆåœ¨å®žé™…开发中的取舍ã€?br /><br />  关键字:Servlet ¾U¿ç¨‹å®‰å…¨ 同步 Java内存模型 实例变量<span> </span><br /><br />  Servlet/JSP技术和ASP、PHP½{‰ç›¸æ¯”,ç”׃ºŽå…¶å¤š¾U¿ç¨‹˜qè¡Œè€Œå…·æœ‰å¾ˆé«˜çš„æ‰§è¡Œæ•ˆçŽ‡ã€‚ç”±äºŽServlet/JSP默认是以多线½E‹æ¨¡å¼æ‰§è¡Œçš„åQŒæ‰€ä»¥ï¼Œåœ¨ç¼–写代码时需要非常细致地考虑多线½E‹çš„安全性问题。然而,很多人编写Servlet/JSP½E‹åºæ—¶åƈ没有注意到多¾U¿ç¨‹å®‰å…¨æ€§çš„问题åQŒè¿™å¾€å¾€é€ æˆ¾~–写的程序在ž®‘量用户讉K—®æ—¶æ²¡æœ‰ä“Q何问题,而在òq¶å‘用户上升åˆîC¸€å®šå€¼æ—¶åQŒå°±ä¼šç»å¸¸å‡ºçŽîC¸€äº›èŽ«æ˜Žå…¶å¦™çš„é—®é¢˜ã€?br /><br />  Servlet的多¾U¿ç¨‹æœºåˆ¶</strong><br /><strong> <span> </span><br />  Servlet体系¾l“构是徏立在Java多线½E‹æœºåˆ¶ä¹‹ä¸Šçš„åQŒå®ƒçš„生命周期是由Web容器负责的。当客户端第一‹Æ¡è¯·æ±‚某个Servletæ—Óž¼ŒServlet容器ž®†ä¼šæ ÒŽ®web.xml配置文äšg实例化这个Servlet¾c…R€‚当有新的客æˆïL«¯è¯äh±‚该Servletæ—Óž¼Œä¸€èˆ¬ä¸ä¼šå†å®žä¾‹åŒ–该Servlet¾c»ï¼Œä¹Ÿå°±æ˜¯æœ‰å¤šä¸ª¾U¿ç¨‹åœ¨ä‹É用这个实例。Servlet容器会自动ä‹É用线½E‹æ± ½{‰æŠ€æœ¯æ¥æ”¯æŒ¾pȝ»Ÿçš„运行,如图1所½Cºã€?br /><br /></strong> <table border="0" width="90%"> <tbody> <tr> <td><strong><img src="http://hiphotos.baidu.com/stevenjohn/pic/item/05b7b99c033b5bb5b839395436d3d539b700bc3c.jpg" alt="" /><br /></strong>å›? Servlet¾U¿ç¨‹æ±?/td></tr></tbody></table><br />  ˜q™æ ·åQŒå½“两个或多个线½E‹åŒæ—¶è®¿é—®åŒä¸€ä¸ªServletæ—Óž¼Œå¯èƒ½ä¼šå‘生多个线½E‹åŒæ—¶è®¿é—®åŒä¸€èµ„源的情况,数据可能会变得不一致。所以在用Servlet构徏的Web应用时如果不注意¾U¿ç¨‹å®‰å…¨çš„问题,会ä‹É所写的Servlet½E‹åºæœ‰éš¾ä»¥å‘现的错误ã€?br /><br />  <strong>Servlet的线½E‹å®‰å…¨é—®é¢?br /></strong><br />  Servlet的线½E‹å®‰å…¨é—®é¢˜ä¸»è¦æ˜¯ç”׃ºŽå®žä¾‹å˜é‡ä½¿ç”¨ä¸å½“而引èµïLš„åQŒè¿™é‡Œä»¥ä¸€ä¸ªçŽ°å®žçš„ä¾‹å­æ¥è¯´æ˜Žã€?br /><br /> <table border="1" width="90%"> <tbody> <tr> <td>Import javax.servlet. *;<span> </span><br />Import javax.servlet.http. *;<span> </span><br />Import java.io. *;<span> </span><br />Public class Concurrent Test extends HttpServlet {PrintWriter output;<span> </span><br />Public void service (HttpServletRequest request,<br />HttpServletResponse response) throws ServletException, IOException {String username;<br />Response.setContentType ("text/html; charset=gb2312");<br />Username = request.getParameter ("username");<span> </span><br />Output = response.getWriter ();<span> </span><br />Try {Thread. sleep (5000); //ä¸ÞZº†½Hå‡ºòq¶å‘问题åQŒåœ¨˜q™è®¾¾|®ä¸€ä¸ªåšgæ—?br />} Catch (Interrupted Exception e){}<br />output.println("用户å?"+Username+"<BR>");<span> </span><br />}<br />}</td></tr></tbody></table><br />  该Servlet中定义了一个实例变量outputåQŒåœ¨serviceæ–ÒŽ³•ž®†å…¶èµ‹å€égؓ用户的输出。当一个用戯‚®¿é—®è¯¥Servletæ—Óž¼Œ½E‹åºä¼šæ­£å¸¸çš„˜qè¡ŒåQŒä½†å½“å¤šä¸ªç”¨æˆ·åÆˆå‘è®¿é—®æ—¶åQŒå°±å¯èƒ½ä¼šå‡ºçŽ°å…¶å®ƒç”¨æˆïLš„信息昄¡¤ºåœ¨å¦å¤–一些用æˆïLš„‹¹è§ˆå™¨ä¸Šçš„é—®é¢˜ã€‚è¿™æ˜¯ä¸€ä¸ªä¸¥é‡çš„é—®é¢˜ã€‚äØ“äº†çªå‡ºåÆˆå‘é—®é¢˜ï¼Œä¾¿äºŽ‹¹‹è¯•、观察,我们在回昄¡”¨æˆ·ä¿¡æ¯æ—¶æ‰§è¡Œäº†ä¸€ä¸ªåšg时的操作。假讑ַ²åœ¨web.xml配置文äšg中注册了该ServletåQŒçŽ°æœ‰ä¸¤ä¸ªç”¨æˆ·aå’Œb同时讉K—®è¯¥ServletåQˆå¯ä»¥å¯åŠ¨ä¸¤ä¸ªIE‹¹è§ˆå™¨ï¼Œæˆ–者在两台机器上同时访问),卛_Œæ—¶åœ¨‹¹è§ˆå™¨ä¸­è¾“å…¥åQ?br /><br />  aåQ?http://localhost: 8080/servlet/ConcurrentTest? Username=a<br /><br />  båQ?http://localhost: 8080/servlet/ConcurrentTest? Username=b<br /><br />  如果用户b比用户a回èžR的时间稍慢一点,ž®†å¾—到如å›?所½Cºçš„输出åQ?br /><br /> <table border="0" width="90%"> <tbody> <tr> <td><img src="http://hiphotos.baidu.com/stevenjohn/pic/item/a790ee2062d0f703d97f8c7608fa513d2497c5d1.jpg" alt="" /><br />å›? a用户和b用户的浏览器输出</td></tr></tbody></table><br />  从图2中可以看刎ͼŒWeb服务器启动了两个¾U¿ç¨‹åˆ†åˆ«å¤„理来自用户a和用户b的请求,但是在用户a的浏览器上却得到一个空白的屏幕åQŒç”¨æˆ·a的信息显½Cºåœ¨ç”¨æˆ·b的浏览器上。该Servlet存在¾U¿ç¨‹ä¸å®‰å…¨é—®é¢˜ã€‚下面我们就从分析该实例的内存模型入æ‰?观察不同时刻实例变量output的值来分析使该Servlet¾U¿ç¨‹ä¸å®‰å…¨çš„原因ã€?br /><br />  Java的内存模型JMMåQˆJava Memory ModelåQ‰JMMä¸»è¦æ˜¯äØ“äº†è§„å®šäº†¾U¿ç¨‹å’Œå†…存之间的一些关¾p…R€‚根据JMM的设计,¾pȝ»Ÿå­˜åœ¨ä¸€ä¸ªä¸»å†…å­˜(Main Memory)åQŒJava中所有实例变量都储存在主存中åQŒå¯¹äºŽæ‰€æœ‰çº¿½E‹éƒ½æ˜¯å…±äº«çš„。每条线½E‹éƒ½æœ‰è‡ªå·Þqš„工作内存(Working Memory)åQŒå·¥ä½œå†…存由¾~“存和堆栈两部分¾l„成åQŒç¼“存中保存的是ä¸Õd­˜ä¸­å˜é‡çš„æ‹¯‚´åQŒç¼“å­˜å¯èƒ½åÆˆä¸æ€Õd’Œä¸Õd­˜åŒæ­¥åQŒä¹Ÿž®±æ˜¯¾~“存中变量的修改可能没有立刻写到ä¸Õd­˜ä¸­ï¼›å †æ ˆä¸­ä¿å­˜çš„æ˜¯çº¿½E‹çš„局部变量,¾U¿ç¨‹ä¹‹é—´æ— æ³•ç›æ€º’直接讉K—®å †æ ˆä¸­çš„变量。根据JMMåQŒæˆ‘们可以将论文中所讨论的Servletå®žä¾‹çš„å†…å­˜æ¨¡åž‹æŠ½è±¡äØ“å›?所½Cºçš„æ¨¡åž‹ã€?br /><br /> <table border="0" width="90%"> <tbody> <tr> <td><img src="http://hiphotos.baidu.com/stevenjohn/pic/item/4ea4efd7f703918fe91c2460513d26975beec4d1.jpg" alt="" /><br />å›? Servlet实例的JMM模型</td></tr></tbody></table><br />  下面æ ÒŽ®å›?所½Cºçš„内存模型åQŒæ¥åˆ†æžå½“用户aå’Œb的线½E‹ï¼ˆ½Ž€¿UîCØ“a¾U¿ç¨‹ã€b¾U¿ç¨‹åQ‰åƈ发执行时åQŒServlet实例中所涉及变量的变化情况及¾U¿ç¨‹çš„æ‰§è¡Œæƒ…况,如图4所½Cºã€?br /><br /> <table border="1" cellspacing="0" cellpadding="2" width="85%"> <tbody> <tr> <td>调度时刻</td> <td>a¾U¿ç¨‹</td> <td>b¾U¿ç¨‹</td></tr> <tr> <td>T1</td> <td>讉K—®Servlet™åµé¢</td> <td> </td></tr> <tr> <td>T2</td> <td> </td> <td>讉K—®Servlet™åµé¢</td></tr> <tr> <td>T3</td> <td>output=a的输出username=a休眠5000毫秒åQŒè®©å‡ºCPU</td> <td> </td></tr> <tr> <td>T4</td> <td> </td> <td>output=b的输出(写回ä¸Õd­˜åQ‰username=b休眠5000毫秒åQŒè®©å‡ºCPU</td></tr> <tr> <td>T5</td> <td>在用户b的浏览器上输出a¾U¿ç¨‹çš„usernameçš„å€?a¾U¿ç¨‹¾lˆæ­¢ã€?/td> <td> </td></tr> <tr> <td>T6</td> <td> </td> <td>在用户b的浏览器上输出b¾U¿ç¨‹çš„usernameçš„å€?b¾U¿ç¨‹¾lˆæ­¢ã€?/td></tr></tbody></table>                  å›? Servlet实例的线½E‹è°ƒåº¦æƒ…å†?br /><br />  从图4中可以清楚的看到åQŒç”±äºŽb¾U¿ç¨‹å¯¹å®žä¾‹å˜é‡output的修改覆盖了a¾U¿ç¨‹å¯¹å®žä¾‹å˜é‡output的修改,从而导致了用户a的信息显½Cºåœ¨äº†ç”¨æˆ·b的浏览器上。如果在a¾U¿ç¨‹æ‰§è¡Œè¾“出语句æ—Óž¼Œb¾U¿ç¨‹å¯¹output的修改还没有åˆäh–°åˆîC¸»å­˜ï¼Œé‚£ä¹ˆž®†ä¸ä¼šå‡ºçް图2所½Cºçš„输出¾l“æžœåQŒå› æ­¤è¿™åªæ˜¯ä¸€¿Uå¶ç„¶çŽ°è±¡ï¼Œä½†è¿™æ›´å¢žåŠ äº†½E‹åºæ½œåœ¨çš„危险性ã€?span> </span> <p><strong></strong> </p> <p><strong></strong> </p> <p><strong>设计¾U¿ç¨‹å®‰å…¨çš„Servlet</strong><br /><br />  通过上面的分析,我们知道了实例变量不正确的ä‹É用是造成Servlet¾U¿ç¨‹ä¸å®‰å…¨çš„主要原因。下面针对该问题¾l™å‡ºäº†ä¸‰¿Uè§£å†Ïx–¹æ¡ˆåƈå¯ÒŽ–¹æ¡ˆçš„选取¾l™å‡ºäº†ä¸€äº›å‚è€ƒæ€§çš„å»ø™®®ã€?br /><br />  1、实çŽ?SingleThreadModel 接口<br /><br />  该接口指定了¾pȝ»Ÿå¦‚何处理对同一个Servlet的调用。如果一个Servlet被这个接口指å®?那么在这个Servlet中的serviceæ–ÒŽ³•ž®†ä¸ä¼šæœ‰ä¸¤ä¸ª¾U¿ç¨‹è¢«åŒæ—¶æ‰§è¡Œï¼Œå½“然也就不存在线½E‹å®‰å…¨çš„问题。这¿Uæ–¹æ³•只要将前面的Concurrent Test¾cȝš„¾cÕd¤´å®šä¹‰æ›´æ”¹ä¸ºï¼š<br /><br /></p> <p> <table border="1" width="90%"> <tbody> <tr> <td>Public class Concurrent Test extends HttpServlet implements SingleThreadModel {<br />…………<br />}</td></tr></tbody></table></p> <p><br />  2、同步对å…׃ín数据的操ä½?br /><br />  使用synchronized 关键字能保证一‹Æ¡åªæœ‰ä¸€ä¸ªçº¿½E‹å¯ä»¥è®¿é—®è¢«ä¿æŠ¤çš„区ŒDµï¼Œåœ¨æœ¬è®ºæ–‡ä¸­çš„Servlet可以通过同步块操作来保证¾U¿ç¨‹çš„安全。同步后的代码如下:<span> </span><br /><br /></p> <p> <table border="1" width="90%"> <tbody> <tr> <td>…………<br />Public class Concurrent Test extends HttpServlet { …………<br />Username = request.getParameter ("username");<span> </span><br />Synchronized (this){<br />Output = response.getWriter ();<span> </span><br />Try {<br />Thread. Sleep (5000);<br />} Catch (Interrupted Exception e){}<br />output.println("用户å?"+Username+"<BR>");<span> </span><br />}<span> </span><br />}<br />}</td></tr></tbody></table></p> <p><br />  3、避免ä‹É用实例变é‡?br /><br />  本实例中的线½E‹å®‰å…¨é—®é¢˜æ˜¯ç”±å®žä¾‹å˜é‡é€ æˆçš„,只要在Servlet里面的ä“Q何方法里面都不ä‹É用实例变量,那么该Servletž®±æ˜¯¾U¿ç¨‹å®‰å…¨çš„ã€?br /><br />  修正上面的Servlet代码åQŒå°†å®žä¾‹å˜é‡æ”¹äؓ局部变量实现同æ ïLš„功能åQŒä»£ç å¦‚下:<br /><br /></p> <p> <table border="1" width="90%"> <tbody> <tr> <td>……<span> </span><br />Public class Concurrent Test extends HttpServlet {public void service (HttpServletRequest request, HttpServletResponse<span> </span><br />Response) throws ServletException, IOException {<br />Print Writer output;<span> </span><br />String username;<br />Response.setContentType ("text/html; charset=gb2312");<br />……<span> </span><br />}<span> </span><br />}</td></tr></tbody></table></p> <p><br />  对上面的三种æ–ÒŽ³•˜q›è¡Œ‹¹‹è¯•åQŒå¯ä»¥è¡¨æ˜Žç”¨å®ƒä»¬éƒ½èƒ½è®¾è®¡å‡ºçº¿½E‹å®‰å…¨çš„Servlet½E‹åºã€‚但是,如果一个Servlet实现了SingleThreadModel接口åQŒServlet引擎ž®†äؓ每个新的è¯äh±‚创徏一个单独的Servlet实例åQŒè¿™ž®†å¼•起大量的¾pȝ»Ÿå¼€é”€ã€‚SingleThreadModel在Servlet2.4中已不再提倡ä‹É用;同样如果在程序中使用同步来保护要使用的共享的数据åQŒä¹Ÿä¼šä‹É¾pȝ»Ÿçš„æ€§èƒ½å¤§å¤§ä¸‹é™ã€‚è¿™æ˜¯å› ä¸ø™¢«åŒæ­¥çš„代码块在同一时刻只能有一个线½E‹æ‰§è¡Œå®ƒåQŒä‹É得其同时处理客户è¯äh±‚的吞吐量降低åQŒè€Œä¸”很多客户处于é˜Õd¡žçŠ¶æ€ã€‚å¦å¤–äØ“ä¿è¯ä¸Õd­˜å†…容和线½E‹çš„工作内存中的数据的一致性,要频¾Jåœ°åˆäh–°¾~“å­˜,˜q™ä¹Ÿä¼šå¤§å¤§åœ°å½±å“¾pȝ»Ÿçš„æ€§èƒ½ã€‚所以在实际的开发中也应避免或最ž®åŒ– Servlet 中的同步代码åQ›åœ¨Serlet中避免ä‹É用实例变量是保证Servlet¾U¿ç¨‹å®‰å…¨çš„æœ€ä½³é€‰æ‹©ã€‚从Java 内存模型也可以知道,æ–ÒŽ³•中的临时变量是在栈上分配½Iºé—´åQŒè€Œä¸”每个¾U¿ç¨‹éƒ½æœ‰è‡ªå·±¿Uæœ‰çš„æ ˆ½Iºé—´åQŒæ‰€ä»¥å®ƒä»¬ä¸ä¼šåª„响线½E‹çš„安全ã€?br /><br />  <strong>ž®ç»“</strong><br /><br />  Servlet的线½E‹å®‰å…¨é—®é¢˜åªæœ‰åœ¨å¤§é‡çš„åÆˆå‘è®¿é—®æ—¶æ‰ä¼šæ˜„¡Ž°å‡ºæ¥åQŒåƈ且很隑֏‘玎ͼŒå› æ­¤åœ¨ç¼–写Servlet½E‹åºæ—¶è¦ç‰¹åˆ«æ³¨æ„ã€‚线½E‹å®‰å…¨é—®é¢˜ä¸»è¦æ˜¯ç”±å®žä¾‹å˜é‡é€ æˆçš?因此在Servlet中应避免使用实例变量。如果应用程序设计无法避免ä‹Éç”¨å®žä¾‹å˜é‡ï¼Œé‚£ä¹ˆä½¿ç”¨åŒæ­¥æ¥ä¿æŠ¤è¦ä½¿ç”¨çš„å®žä¾‹å˜é‡ï¼Œä½†äØ“ä¿è¯¾pȝ»Ÿçš„æœ€ä½Ïx€§èƒ½åQŒåº”该同步可用性最ž®çš„代码路径ã€?/p> <p> </p><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/380730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2012-06-14 09:12 <a href="http://www.aygfsteel.com/stevenjohn/archive/2012/06/14/380730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">¹ã¶«Ê¡</a>| <a href="http://" target="_blank">ÀÖ¶«</a>| <a href="http://" target="_blank">³±°²ÏØ</a>| <a href="http://" target="_blank">ƽÌÁÏØ</a>| <a href="http://" target="_blank">½úÖÐÊÐ</a>| <a href="http://" target="_blank">Äþ½úÏØ</a>| <a href="http://" target="_blank">Î÷²ýÊÐ</a>| <a href="http://" target="_blank">½ðÕ¯ÏØ</a>| <a href="http://" target="_blank">Ëì´¨ÏØ</a>| <a href="http://" target="_blank">»¢ÁÖÊÐ</a>| <a href="http://" target="_blank">ãòÎ÷ÏØ</a>| <a href="http://" target="_blank">ÐÃÖÝÊÐ</a>| <a href="http://" target="_blank">ÒÇÂ¤ÏØ</a>| <a href="http://" target="_blank">¸Á¶ûÏØ</a>| <a href="http://" target="_blank">ãä½­ÊÐ</a>| <a href="http://" target="_blank">Èø¸ÂÏØ</a>| <a href="http://" target="_blank">ÁúÓÎÏØ</a>| <a href="http://" target="_blank">Ì©ÄþÏØ</a>| <a href="http://" target="_blank">Æû³µ</a>| <a href="http://" target="_blank">·ï³ÇÊÐ</a>| <a href="http://" target="_blank">È·É½ÏØ</a>| <a href="http://" target="_blank">Îå»ªÏØ</a>| <a href="http://" target="_blank">Îâ±¤ÏØ</a>| <a href="http://" target="_blank">ÄÏÖ£ÏØ</a>| <a href="http://" target="_blank">ºÍ¾²ÏØ</a>| <a href="http://" target="_blank">¿â³µÏØ</a>| <a href="http://" target="_blank">ÓÀ¾¸ÏØ</a>| <a href="http://" target="_blank">ÇåÔ·ÏØ</a>| <a href="http://" target="_blank">ºº¹ÁÇø</a>| <a href="http://" target="_blank">ÁéÌ¨ÏØ</a>| <a href="http://" target="_blank">ǧÑôÏØ</a>| <a href="http://" target="_blank">ÎijÉÏØ</a>| <a href="http://" target="_blank">´óÇìÊÐ</a>| <a href="http://" target="_blank">¿íµé</a>| <a href="http://" target="_blank">ʦ×ÚÏØ</a>| <a href="http://" target="_blank">½­É½ÊÐ</a>| <a href="http://" target="_blank">·á¶¼ÏØ</a>| <a href="http://" target="_blank">ÙñÖÝÊÐ</a>| <a href="http://" target="_blank">ľÀ¼ÏØ</a>| <a href="http://" target="_blank">»ªÆºÏØ</a>| <a href="http://" target="_blank">½¹×÷ÊÐ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>