??xml version="1.0" encoding="utf-8" standalone="yes"?>国产黑人绿帽在线第一区,日本韩国欧美在线,欧美激情五月http://www.aygfsteel.com/simie/category/23732.htmlzh-cnTue, 03 Jul 2007 11:17:14 GMTTue, 03 Jul 2007 11:17:14 GMT60JSP/Servlet 中的汉字~码问题http://www.aygfsteel.com/simie/archive/2007/07/03/127838.html和田?/dc:creator>和田?/author>Tue, 03 Jul 2007 06:49:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/03/127838.htmlhttp://www.aygfsteel.com/simie/comments/127838.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/03/127838.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127838.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127838.html

JSP/Servlet 中的汉字~码问题

developerWorks
文档选项
此作为电(sh)子邮件发?src="http://www.ibm.com/i/v14/icons/em.gif"

此作为电(sh)子邮件发?/font>

未显C需?JavaScript 的文选项



U别: 初

IBM,

2001 q?3 ?01 ?/p>

|上?JSP/Servlet ?DBCS字符~码问题有许多优U的文章和讨论Q本文对它们作一些整理,q结合IBM WebSphere Application Server3.5QWASQ的解决Ҏ(gu)作一些说明,希望它不是多余的?/em>

问题的v?/span>

每个国家Q或区域Q都规定了计机信息交换用的字符~码集,如美国的扩展 ASCII? 中国?GB2312-80Q日本的 JIS {,作ؓ(f)该国?区域内信息处理的基础Q有着l一~码的重要作用。字W编码集按长度分?SBCSQ单字节字符集)QDBCSQ双字节字符集)两大cR早期的软gQ尤其是操作pȝQ,Z解决本地字符信息的计机处理Q出C各种本地化版本(L10NQ,Z区分Q引q了 LANG, Codepage {概c(din)但是由于各个本地字W集代码范围重叠Q相互间信息交换困难QY件各个本地化版本独立l护成本较高。因此有必要本地化工作中的共性抽取出来,作一致处理,特别的本地化处理内定w低到最。这也就是所谓的国际化(I18NQ。各U语a信息被进一步规范ؓ(f) Locale 信息。处理的底层字符集变成了几乎包含了所有字形的 Unicode?/p>

现在大部分具有国际化特征的Y件核心字W处理都是以 Unicode 为基的,在Y件运行时Ҏ(gu)当时?Locale/Lang/Codepage 讄定相应的本地字W编码设|,q依此处理本地字W。在处理q程中需要实?Unicode 和本地字W集的相互{换,甚或?Unicode Z间的两个不同本地字符集的怺转换。这U方式在|络环境下被q一步g伸,M|络两端的字W信息也需要根据字W集的设|{换成可接受的内容?/p>

Java 语言内部是用 Unicode 表示字符的,遵守 Unicode V2.0。Java E序无论是从/往文gpȝ以字W流?写文Ӟq是往 URL q接?HTML 信息Q或?URL q接d参数|都会(x)有字W编码的转换。这样做虽然增加了编E的复杂度,Ҏ(gu)引vhQ但却是W合国际化的思想的?/p>

从理Z来说Q这些根据字W集讄而进行的字符转换不应该生太多问题。而事实是׃应用E序的实际运行环境不同,Unicode 和各个本地字W集的补充、完善,以及(qing)pȝ或应用程序实现的不规范,转码时出现的问题时时困扰着E序员和用户?





回页?/font>


GB2312-80QGBKQGB18030-2000 汉字字符集及(qing) Encoding

其实解决 JAVA E序中的汉字~码问题的方法往往很简单,但理解其背后的原因,定位问题Q还需要了解现有的汉字~码和编码{换?/p>

GB2312-80 是在国内计算机汉字信息技术发展初始阶D制定的Q其中包含了大部分常用的一、二U汉字,?9 区的W号。该字符集是几乎所有的中文pȝ和国际化的Y仉支持的中文字W集Q这也是最基本的中文字W集。其~码范围是高?xa1Q?xfeQ低位也?0xa1-0xfeQ汉字从 0xb0a1 开始,l束?0xf7feQ?/p>

GBK ?GB2312-80 的扩展,是向上兼容的。它包含?20902 个汉字,其编码范围是 0x8140-0xfefeQ剔除高?0x80 的字位。其所有字W都可以一对一映射?Unicode 2.0Q也是?JAVA 实际上提供了 GBK 字符集的支持。这是现阶段 Windows 和其它一些中文操作系l的~省字符集,但ƈ不是所有的国际化Y仉支持该字W集Q感觉是他们q不完全知道 GBK 是怎么回事。值得注意的是它不是国家标准,而只是规范。随着 GB18030-2000国标的发布,它将在不久的来完成它的历史使命?/p>

GB18030-2000(GBK2K) ?GBK 的基上进一步扩展了汉字Q增加了藏、蒙{少数民族的字Ş。GBK2K 从根本上解决了字位不够,字Ş不的问题。它有几个特点,

  • 它ƈ没有定所有的字ŞQ只是规定了~码范围Q留待以后扩充?
  • ~码是变长的Q其二字节部分与 GBK 兼容Q四字节部分是扩充的字Ş、字位,其编码范围是首字?0x81-0xfe、二字节0x30-0x39、三字节 0x81-0xfe、四字节0x30-0x39?
  • 它的推广是分阶段的,首先要求实现的是能够完全映射?Unicode 3.0 标准的所有字形?
  • 它是国家标准Q是强制性的?

现在q没有Q何一个操作系l或软g实现?GBK2K 的支持,q是现阶D和来汉化的工作内宏V?/p>

Unicode 的介l?.....免了吧?/p>

JAVA 支持的encoding中与中文~程相关的有Q?有几个在JDK文中未列出)

ASCII 7-bit, ?ascii7
ISO8859-1 8-bit, ?8859_1,ISO-8859-1,ISO_8859-1,latin1...
GB2312-80 同gb2312,gb2312-1980,EUC_CN,euccn,1381,Cp1381, 1383, Cp1383, ISO2022CN,ISO2022CN_GB......
GBK (注意大小?,同MS936
UTF8 UTF-8
GB18030 (现在只有IBM JDK1.3.?有支?, 同Cp1392,1392

JAVA 语言采用Unicode处理字符. 但从另一个角度来_(d)在javaE序中也可以采用非Unicode的{码,重要的是保证E序入口和出口的汉字信息不失真。如完全采用ISO-8859-1来处理汉字也能达到正的l果。网l上行的许多解x法,都属于这U类型。ؓ(f)了不致引h؜淆,本文不对q种Ҏ(gu)作讨论?





回页?/font>


中文转码??'、ؕ码的由来

两个方向转换都有可能得到错误的结果:(x)

  • Unicode-->Byte, 如果目标代码集不存在对应的代码,则得到的l果?x3f.

    如:(x)
    "\u00d6\u00ec\u00e9\u0046\u00bb\u00f9".getBytes("GBK") 的结果是 "?ìéF?ù", Hex 值是3fa8aca8a6463fa8b4.

    仔细看一下上面的l果Q你?x)发现\u00ec被{换ؓ(f)0xa8ac, \u00e9被{换ؓ(f)\xa8a6... 它的实际有效位变长了Q这是因为GB2312W号Z的一些符可映射C些公qW号~码Q由于这些符号出现在ISO-8859-1或其它一些SBCS字符集中Q故它们在Unicode中编码比较靠前,有一些其有效位只?位,和汉字的~码重叠(其实q种映射只是~码的映,在显C时仔细不是一L(fng)。Unicode 中的W号是单字节宽,汉字中的W号是双字节? . 在Unicode\u00a0--\u00ff 之间q样的符h20个。了解这个特征非帔R要!由此׃隄解ؓ(f)什么JAVA~程中,汉字~码的错误结果中常常?x)出C些ؕ?其实是符号字W?, 而不全是'?'字符, 比如上面的例子?/p>

  • Byte-->Unicode, 如果Byte标识的字W在源代码集不存在,则得到的l果?xfffd.

    如:(x)
    Byte ba[] = {(byte)0x81,(byte)0x40,(byte)0xb0,(byte)0xa1}; new String(ba,"gb2312");

    l果???, hex 值是"\ufffd\u554a". 0x8140 是GBK字符Q按GB2312转换表没有对应的|取\ufffd. (h意:(x)在显CuniCodeӞ因ؓ(f)没有对应的本地字W,所以也适用上一U情况,昄Z??".)

实际~程中,JSP/Servlet E序得到错误的汉字信息,往往是这两个q程的叠加,有时甚至是两个过E叠加后反复作用的结?





回页?/font>


JSP/Servlet 汉字~码问题?qing)?WAS 中的解决办法

4.1 常见?encoding 问题的现?/font>

|上常出现的 JSP/Servlet encoding 问题一般都表现?browser 或应用程序端Q如:

  • 览器中看到?Jsp/Servlet 面中的汉字怎么都成?’?’ ?
  • 览器中看到?Servlet 面中的汉字怎么都成了ؕ码?
  • JAVA 应用E序界面中的汉字怎么都成了方块?
  • Jsp/Servlet 面无法昄 GBK 汉字?
  • JSP 面中内嵌在<%...%>,<%=...%>{Tag包含?JAVA code 中的中文成了qQ但面的其它汉字是对的?
  • Jsp/Servlet 不能接收 form 提交的汉字?
  • JSP/Servlet 数据库读写无法获得正的内容?

隐藏在这些问题后面的是各U错误的字符转换和处理(除第3个外Q是因ؓ(f) Java font 讄错误引v的)。解决类似的字符 encoding 问题Q需要了?Jsp/Servlet 的运行过E,查可能出现问题的各个炏V?/p>

4.2 JSP/Servlet web ~程时的 encoding 问题

q行于Java 应用服务器的 JSP/Servlet ?Browser 提供 HTML 内容Q其q程如下图所C:(x)




其中有字W编码{换的地方?

  • JSP ~译。Java 应用服务器将Ҏ(gu) JVM ?file.encoding D?JSP 源文Ӟ~译生成 JAVA 源文Ӟ再根?file.encoding 值写回文件系l。如果当前系l语a支持 GBKQ那么这时候不?x)出?encoding 问题。如果是英文的系l,?LANG ?en_US ?Linux, AIX ?SolarisQ则要将 JVM ?file.encoding 值置?GBK 。系l语a如果?GB2312Q则Ҏ(gu)需要,定要不要设|?file.encodingQ将 file.encoding 设ؓ(f) GBK 可以解决潜在?GBK 字符q问题

  • Java 需要被~译?.class 才能?JVM 中执行,q个q程存在与a.同样?file.encoding 问题。从q里开?servlet ?jsp 的运行就cM了,只不q?Servlet 的编译不是自动进行的。对于JSPE序, 对生的JAVA 中间文g的编译是自动q行?在程序中直接调用sun.tools.javac.Mainc?. 因此如果在这一步出现问题的? 也要查encoding和OS的语a环境Q或者将内嵌在JSP JAVA Code 中的静态汉字{?Unicode, 要么静态文本输Z要放?JAVA code 中。对于Servlet, javac ~译时手工指?encoding 参数可以了?/p>

  • Servlet 需要将 HTML 面内容转换?browser 可接受的 encoding 内容发送出厅R依赖于?JAVA App Server 的实现方式,有的查?Browser ?accept-charset ?accept-language 参数或以其它猜的方式定 encoding |有的则不。因此采用固定encoding 也许是最好的解决Ҏ(gu)。对于中文网,可在 JSP ?Servlet 中设|?contentType="text/html; charset=GB2312"Q如果页面中有GBK字符Q则讄为contentType="text/html; charset=GBK"Q由于IE ?Netscape对GBK的支持程度不一P作这U设|时需要测试一下。因?6?JAVA char在网l传送时?位会(x)被丢弃,也ؓ(f)了确保Servlet面中的汉字Q包括内嵌的和servletq行q程中得到的Q是期望的内码,可以?PrintWriter out=res.getWriter() 取代 ServletOutputStream out=res.getOutputStream(). PrinterWriter 根据contentType中指定的charset作{?(ContentType需在此之前指定Q?; 也可以用OutputStreamWriter装 ServletOutputStream cdƈ用write(String)输出汉字字符丌Ӏ对?JSPQJAVA Application Server 应当能够保在这个阶D将嵌入的汉字正传送出厅R?/p>

  • q是解释 URL 字符 encoding 问题。如果通过 get/post 方式?browser q回的参数g包含汉字信息Q?servlet 无法得到正的倹{SUN?J2SDK 中,HttpUtils.parseName 在解析参数时Ҏ(gu)没有考虑 browser 的语a讄Q而是得到的值按 byte 方式解析。这是网上讨论得最多的 encoding 问题。因是设计缺P只能?bin 方式重新解析得到的字W串Q或者以 hack HttpUtils cȝ方式解决。参考文?2 均有介绍Q不q最好将其中的中?encoding GB2312?CP1381 都改?GBKQ否则遇?GBK 汉字Ӟq是?x)有问题?Servlet API 2.3 提供一个新的函?HttpServeletRequest.setCharacterEncoding 用于在调?request.getParameter(“param_name”) 前指定应用程序希望的 encodingQ这有助于d解决q个问题?/p>

4.3 IBM Websphere Application Server 中的解决Ҏ(gu)

WebSphere Application Server Ҏ(gu)准的 Servlet API 2.x 作了扩展Q提供较好的多语a支持。运行在中文的操作系l中Q可以不作Q何设|就可以很好地处理汉字。下面的说明只是对WAS是运行在英文的系l中Q或者需要有GBK支持时有效?/p>

上述c,d情况QW(xu)AS 都要查询 Browser 的语a讄Q在~省状况下, zh, zh-cn {均被映ؓ(f) JAVA encoding CP1381Q注意:(x) CP1381 只是{同?GB2312 的一?codepageQ没?GBK 支持Q。这样做我想是因为无法确?Browser q行的操作系l是支持GB2312, q是 GBKQ所以取其小。但是实际的应用pȝq是要求面中出?GBK 汉字Q最著名的是朱ȝ名字中的“?F"(rong2 Q?xe946Q\u9555)Q所以有时还是需要将 Encoding/Charset 指定?GBK。当?WAS 中变更缺省的 encoding 没有上面说的那么ȝQ针?a,bQ参考文?5Q在 Application Server 的命令行参数中指?-Dfile.encoding=GBK 卛_Q?针对 dQ在 Application Server 的命令行参数中指?Ddefault.client.encoding=GBK。如果指定了-Ddefault.client.encoding=GBKQ那么c情况下可以不再指定charset?/p>

上面列出的问题中q有一个关于Tag<%...%>,<%=...%>中的 JAVA 代码里包含的静态文本未能正显C的问题Q在WAS中的解决Ҏ(gu)是除了设|正的file.encoding, q需要以相同Ҏ(gu)讄-Duser.language=zh -Duser.region=CN。这与JAVA locale的设|有兟?/p>

4.4 数据库读写时?encoding 问题

JSP/Servlet ~程中经常出?encoding 问题的另一个地Ҏ(gu)d数据库中的数据?/p>

行的关pL据库pȝ都支持数据库 encodingQ也是说在创徏数据库时可以指定它自q字符集设|,数据库的数据以指定的~码形式存储。当应用E序讉K数据Ӟ在入口和出口处都?x)?encoding 转换。对于中文数据,数据库字W编码的讄应当保证数据的完整? GB2312QGBKQUTF-8 {都是可选的数据?encodingQ也可以选择 ISO8859-1 (8-bit)Q那么应用程序在写数据之前须?16Bit 的一个汉字或 Unicode 拆分成两?8-bit 的字W,L据之后则需两个字节合qv来,同时q要判别其中?SBCS 字符。没有充分利用数据库 encoding 的作用,反而增加了~程的复杂度QISO8859-1不是推荐的数据库 encoding。JSP/Servlet~程Ӟ可以先用数据库管理系l提供的理功能查其中的中文数据是否正确?/p>

然后应当注意的是d来的数据?encodingQJAVA E序中一般得到的?Unicode。写数据时则相反?/p>

4.5 定位问题时常用的技?/font>

定位中文encoding问题通常采用最W的也是最有效的办法――在你认为有嫌疑的程序处理后打印字符串的内码。通过打印字符串的内码Q你可以发现什么时候中文字W被转换成UnicodeQ什么时候Unicode被{回中文内码,什么时候一个中文字成了两个 Unicode 字符Q什么时候中文字W串被{成了一串问P什么时候中文字W串的高位被截掉?#8230;…

取用合适的h字符串也有助于区分问题的cd。如Q?#8221;aa啊aa?@aa” {中q间、GB、GBK特征字符均有的字W串。一般来_(d)英文字符无论怎么转换或处理,都不?x)失真(如果遇到了,可以试着增加q箋的英文字母长度)?/p>



回页?/font>


l束?/span>

其实 JSP/Servlet 的中文encoding q没有想像的那么复杂Q虽然定位和解决问题没有定规Q各U运行环境也各不然Q但后面的原理是一L(fng)。了解字W集的知识是解决字符问题的基。不q,随着中文字符集的变化Q不仅仅?java ~程Q中文信息处理中的问题还是会(x)存在一D|间的?



参考资?



关于作?/span>

 

IBM has authored this article



]]>
JSP/Servlet的重定向技术综q?/title><link>http://www.aygfsteel.com/simie/archive/2007/07/02/127536.html</link><dc:creator>和田?/dc:creator><author>和田?/author><pubDate>Mon, 02 Jul 2007 05:38:00 GMT</pubDate><guid>http://www.aygfsteel.com/simie/archive/2007/07/02/127536.html</guid><wfw:comment>http://www.aygfsteel.com/simie/comments/127536.html</wfw:comment><comments>http://www.aygfsteel.com/simie/archive/2007/07/02/127536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/simie/comments/commentRss/127536.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/simie/services/trackbacks/127536.html</trackback:ping><description><![CDATA[  <strong>1.RequestDispatcher.forward()</strong><br><br>  是在服务器端起作?当用forward()?Servlet engine传递HTTPh从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文g,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在b.jsp都可以获?参数自动传?<br><br>  但forward()无法重定向至有frame的jsp文g,可以重定向至有frame的html文g,同时forward()无法在后面带参数传?比如servlet?name=frank,q样不行,可以E序内通过response.setAttribute("name",name)来传至下一个页?<br><br>  重定向后览器地址栏URL不变.<br><br>  ?在servlet中进行重定向<br><br>  public void doPost(HttpServletRequest request,HttpServletResponse response)<br><br>  throws ServletException,IOException<br><br>  {<br><br>  response.setContentType("text/html; charset=gb2312");<br><br>  ServletContext sc = getServletContext();<br><br>  RequestDispatcher rd = null;<br><br>  rd = sc.getRequestDispatcher("/index.jsp");   //定向的页?br><br>  rd.forward(request, response);<br><br>  }<br><br>  通常在servlet中用,不在jsp中用?br><br>  <strong>2.response.sendRedirect()</strong><br><br>  是在用户的浏览器端工?sendRedirect()可以带参C?比如servlet?name=frank传至下个面,同时它可以重定向至不同的L?sendRedirect()可以重定向有frame.的jsp文g.<br><br>  重定向后在浏览器地址栏上?x)出现重定向面的URL<br><br>  ?在servlet中重定向<br><br>  public void doPost(HttpServletRequest request,HttpServletResponse response)<br><br>  throws ServletException,IOException<br><br>  {<br><br>  response.setContentType("text/html; charset=gb2312");<br><br>  response.sendRedirect("/index.jsp");<br><br>  }<br><br>  ׃response是jsp面中的隐含对象Q故在jsp面中可以用response.sendRedirect()直接实现重定位?br><br>  注意Q?br><br>  (1).使用response.sendRedirectӞ前面不能有HTML输出?br><br>  qƈ不是l对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制Q一般在8KQ我是说JSP SERVERQ,q就意味着Q除非你关闭了cacheQ或者你使用了out.flush()强制hQ那么在使用sendRedirect之前Q有量的HTML输出也是允许的?br><br>  (2).response.sendRedirect之后Q应该紧跟一句return;<br><br>  我们已经知道response.sendRedirect是通过览器来做{向的Q所以只有在面处理完成后,才会(x)有实际的动作。既然你已经要做转向了,那么后的输出q有什么意义呢Q而且有可能会(x)因ؓ(f)后面的输出导致{向失败?br><br>  比较Q?br><br>  (1).Request Dispatcher.forward()是容器中控制权的转向Q在客户端浏览器地址栏中不会(x)昄{向后的地址Q?br><br>  (2).response.sendRedirect()则是完全的蟩转,览器将?x)得到蟩转的地址Qƈ重新发送请求链接。这P从浏览器的地址栏中可以看到跌{后的链接地址?br><br>  前者更加高效,在前者可以满需要时Q尽量用RequestDispatcher.forward()Ҏ(gu).<br><br>  注:(x)在有些情况下Q比如,需要蟩转到一个其它服务器上的资源Q则必须使用HttpServletResponse.sendRequest()Ҏ(gu)?br><br>  <strong>3.<jsp:forward page="" /></strong><br><br>  它的底层部分是由RequestDispatcher来实现的Q因此它带有RequestDispatcher.forward()Ҏ(gu)的印记?br><br>  如果?lt;jsp:forward>之前有很多输?前面的输出已使缓冲区?自动输出到客户?那么该语句将不v作用,q一点应该特别注意?br><br>  另外要注意:(x)它不能改变浏览器地址Q刷新的话会(x)D重复提交<br><br>  <strong>4.修改HTTP header的Location属性来重定?/strong><br><br>  通过讄直接修改地址栏来实现面的重定向?br>jsp文g代码如下Q?br><br>  Q?<br><br>  response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);<br><br>  String newLocn = "/newpath/jsa.jsp";<br><br>  response.setHeader("Location",newLocn);<br><br>  %Q?br><br>  <strong>5.JSP中实现在某页面停留若q秒?自动重定向到另一面</strong><br><br>  在html文g中,下面的代码:(x)<br><br>  <meta http-equiv="refresh" content="300; url=target.jsp"><br><br>  它的含义Q在5分钟之后正在览的页面将?x)自动变为target.htmlq一c(din)代码中300为刷新的延迟旉Q以Uؓ(f)单位。targer.htmlZ惌{向的目标?若ؓ(f)本页则ؓ(f)自动h本页?br><br>  ׃可知Q可以通过setHeader来实现某面停留若干U后,自动重定向到另一面?br><br>  关键代码Q?br><br>  String content=stayTime+";URL="+URL;<br><br>  response.setHeader("REFRESH",content);<br><br>  如果ȝ得不够全面,请各位发表自q意见或经验? <img src ="http://www.aygfsteel.com/simie/aggbug/127536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/simie/" target="_blank">和田?/a> 2007-07-02 13:38 <a href="http://www.aygfsteel.com/simie/archive/2007/07/02/127536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet实现动态图文结合输?/title><link>http://www.aygfsteel.com/simie/archive/2007/07/02/127535.html</link><dc:creator>和田?/dc:creator><author>和田?/author><pubDate>Mon, 02 Jul 2007 05:34:00 GMT</pubDate><guid>http://www.aygfsteel.com/simie/archive/2007/07/02/127535.html</guid><wfw:comment>http://www.aygfsteel.com/simie/comments/127535.html</wfw:comment><comments>http://www.aygfsteel.com/simie/archive/2007/07/02/127535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/simie/comments/commentRss/127535.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/simie/services/trackbacks/127535.html</trackback:ping><description><![CDATA[<a >http://www.stcore.com/java/2006-11-17/1163704120d113828.html</a> <img src ="http://www.aygfsteel.com/simie/aggbug/127535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/simie/" target="_blank">和田?/a> 2007-07-02 13:34 <a href="http://www.aygfsteel.com/simie/archive/2007/07/02/127535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>监听器统计在U的人数http://www.aygfsteel.com/simie/archive/2007/07/02/127533.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 05:33:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127533.htmlhttp://www.aygfsteel.com/simie/comments/127533.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127533.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127533.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127533.html
 属性绑定的变化,考虑了一?可以应用?在线人数l计","数据~存"{各个方?

下面是整理的一些资?



Listener是Servlet的监听器Q它可以监听客户端的h、服务端的操作等。通过监听器,可以自动Ȁ发一些操作,比如监听在线的用L(fng)数量。当增加一个HttpSessionӞ激发sessionCreated(HttpSessionEvent se)Ҏ(gu)Q这样就可以l在Uh数加1。常用的监听接口有以下几个:(x)

ServletContextAttributeListener监听对ServletContext属性的操作Q比如增加、删除、修改属性?br>
ServletContextListener监听ServletContext。当创徏ServletContextӞȀ发contextInitialized(ServletContextEvent sce)Ҏ(gu)Q当销毁ServletContextӞȀ发contextDestroyed(ServletContextEvent sce)Ҏ(gu)?br>
HttpSessionListener监听HttpSession的操作。当创徏一个SessionӞȀ发session Created(HttpSessionEvent se)Ҏ(gu)Q当销毁一个SessionӞȀ发sessionDestroyed (HttpSessionEvent se)Ҏ(gu)?br>
HttpSessionAttributeListener监听HttpSession中的属性的操作。当在Session增加一个属性时Q激发attributeAdded(HttpSessionBindingEvent se) Ҏ(gu)Q当在Session删除一个属性时Q激发attributeRemoved(HttpSessionBindingEvent se)Ҏ(gu)Q当在Session属性被重新讄ӞȀ发attributeReplaced(HttpSessionBindingEvent se) Ҏ(gu)?

下面我们开发一个具体的例子Q这个监听器能够l计在线的h数。在ServletContext初始化和销毁时Q在服务器控制台打印对应的信息。当ServletContext里的属性增加、改变、删除时Q在服务器控制台打印对应的信息?

要获得以上的功能Q监听器必须实现以下3个接口:(x)

HttpSessionListener

ServletContextListener

ServletContextAttributeListener

我们看具体的代码Q见CZ14-9?

【程序源代码?

1 // ==================== Program Discription =====================

2 // E序名称Q示?4-9 : EncodingFilter .java

3 // E序目的Q学?fn)用监听?br>
4 // ==============================================================

5 import javax.servlet.http.*;

6 import javax.servlet.*;

7

8 public class OnLineCountListener implements HttpSessionListener,

ServletContextListener,ServletContextAttributeListener

9 {

10  private int count;

11  private ServletContext context = null;

12  

13  public OnLineCountListener()

14  {

15   count=0;

16   //setContext();

17  }

18  //创徏一个session时激?br>
19  public void sessionCreated(HttpSessionEvent se)

20  {

21   count++;

22   setContext(se);

23   

24  }

25  //当一个session失效时激?br>
26  public void sessionDestroyed(HttpSessionEvent se)

27  {

28   count--;

29   setContext(se);

30  }

31  //讄context的属性,它将Ȁ发attributeReplaced或attributeAddedҎ(gu)

32  public void setContext(HttpSessionEvent se)

33  {

34   se.getSession().getServletContext().


]]>
Servlets和JSP开发原则(转蝲Q?/title><link>http://www.aygfsteel.com/simie/archive/2007/07/02/127513.html</link><dc:creator>和田?/dc:creator><author>和田?/author><pubDate>Mon, 02 Jul 2007 04:51:00 GMT</pubDate><guid>http://www.aygfsteel.com/simie/archive/2007/07/02/127513.html</guid><wfw:comment>http://www.aygfsteel.com/simie/comments/127513.html</wfw:comment><comments>http://www.aygfsteel.com/simie/archive/2007/07/02/127513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/simie/comments/commentRss/127513.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/simie/services/trackbacks/127513.html</trackback:ping><description><![CDATA[<a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>技术是?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>开发服务器端应用的主要技术,是开发商务应用表C端的标准?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>开发者喜Ƣ用它有多U原因,其一是对于已l熟(zhn)?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>语言的开发者来说这个技术容易学?fn);其二?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>?#8220;一ơ编写,到处q行”的理念带入到Web应用中,实现?#8220;一ơ编写,到处实现”。而且更ؓ(f)重要的是Q如果遵循一些良好的设计原则的话Q就可以把表C和内容相分,创造出高质量的、可以复用的、易于维护和修改的应用程序。比方说Q在HTML文中如果嵌入过多的<a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>代码QscriptletQ,׃(x)D开发出来的应用非常复杂、难以阅诅R不Ҏ(gu)复用Q而且对以后的l护和修改也?x)造成困难。事实上Q在CSDN?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>/<a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a><a class=channel_keylink ><u><font color=#0000ff>论坛</font></u></a>中,l常可以看到一些提问,代码很长Q可以逻辑却不是很清晰Q大量的HTML?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>代码h在一P让h看得一头雾水。这是随意开发的弊端?br><br>  如果你已l基本了?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>的各Ҏ(gu)术(最好也开发过一些Web应用Q,那么我们可以一h讨一下如何开?#8220;?#8221;的应用的一些指导原则。我们首先对<a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>技术做一个浏览?br><br> <span style="FONT-WEIGHT: bold"> </span><a class=channel_keylink style="FONT-WEIGHT: bold" ><u><font color=#0000ff>Servlet</font></u></a><span style="FONT-WEIGHT: bold">?/span><a class=channel_keylink style="FONT-WEIGHT: bold" ><u><font color=#0000ff>JSP</font></u></a><span style="FONT-WEIGHT: bold">概览</span><br><br>  早期的动态网主要采用CGIQCommon Gateway InterfaceQ公q?a class=channel_keylink ><u><font color=#0000ff>接口</font></u></a>Q技术,你可以用不同的语言~写C(j)GIE序Q如<a class=channel_keylink ><u><font color=#0000ff>VB</font></u></a>、C/<a class=channel_keylink ><u><font color=#0000ff>C++</font></u></a>?a class=channel_keylink ><u><font color=#0000ff>Delphi</font></u></a>{。虽然CGI技术发展成熟且功能强大Q但׃~程困难、效率低下、修改复杂等~点Q所以有逐渐被取代的势。在所有的新技术中Q?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>/<a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>具备更高效、更Ҏ(gu)~程、功能更强、更安全和具有良好的可移植性,因而被许多为是未来最有发展前途的动态网站技术?br><br>  与CGI怼Q?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>支持h/响应模型。当一个客户向服务器递交一个请求时Q服务器把请求送给<a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>Q?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>负责处理hq生成响应,然后送给服务器,再由服务器发送给客户。与CGI不同的是Q?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>没有生成新的q程Q而是与HTTP Server处于同一q程中。它通过使用U程技术,减小了服务器的开销?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>处理h的过E是q样的:(x)当收到来自客L(fng)的请求后Q调用serviceҎ(gu)Q该Ҏ(gu)?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>先判断到来的h是什么类型的QGET/POST/HEAD…Q,然后调用相应的处理方法(doGet/doPost/doHead…Qƈ生成响应?br><br>  别看q么复杂Q其实简单说?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>是一?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>cR与一般类的不同之处是Q这个类q行在一?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>容器内,可以提供<a class=channel_keylink ><u><font color=#0000ff>session</font></u></a>理和对象生命周期管理。因而当你?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>的时候,你可以得?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>q_的所有好处,包括安全性管理、用JDBC讉K<a class=channel_keylink ><u><font color=#0000ff>数据?/font></u></a>以及(qing)跨^台的能力。而且Q?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>使用U程Q因而可以开发出效率更高的Web应用?br><br>  <a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Server Pages (<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>)<br><br>  <a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>技术是J2EE的一个关键技术,它在更高一U的层次上抽?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>。它可以让常规静态HTML与动态生的内容相结合,看v来像一个HTML|页Q却作ؓ(f)<a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>来运行。现在有许多商业应用服务器支?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>技术,比如BEA WebLogic、IBM WebSphere?JRun{等。?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>比用<a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>更简单。如果你有一个支?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>的Web服务器,q且有一?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>文gQ你可以把它攑րQ何静态HTML文g可以攄的位|,不用~译Q不用打包,也不用进行ClassPath的设|,可以像讉K普通网那栯问它Q服务器?x)自动帮你做好其他的工作?br><br>  <a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>工作原理<br><br>  <a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a> 文g看v来就像一个普通静态HTML文gQ只不过里面包含了一?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>代码。它使用.jsp的后~Q用来告诉服务器q个文g需要特D的处理。当我们讉K一?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面的时候,q个文g首先?x)?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>引擎译Z?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>源文Ӟ其实是一?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>Qƈq行~译Q然后像其他<a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>一P?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>引擎来处理?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>引擎装蝲q个c,处理来自客户的请求,q把l果q回l客P如下图所C:(x) <br><br><img onerror="this.src='/Article/UploadFDL02/200602/20060217130122992.jpg';" hspace=3 src="http://www.360doc.com/DownloadImg/15540/389120_1.jpg" align=middle vspace=1 border=1><br>?Q?调用<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面的流E?br><br>  以后再有客户讉Kq个面的时候,只要该文件没有发生过更改Q?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>引擎q接调用已l装载的<a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>。如果已l做q修改的话,那就?x)再ơ执行以上过E,译、编译ƈ装蝲。其实这是所谓的“W一人惩|?#8221;。因为首ơ访问的时候要执行一pd以上的过E,所以会(x)耗费一些时_(d)以后的访问就不会(x)q样了?<br><strong><br>开发原?/strong><br><br>  q一部分我们列出一些开发原则,重点?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面。关于如何分表现和内容的MVC因ؓ(f)要涉?qing)?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>的整合,我们E候再谈?<br><br>  不要?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面中嵌入过量的<a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>代码Q对于非常简单或是测试性的代码Q把所有的<a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a> 代码直接攑օ<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面内是没有问题的。但是这U方法不应该被过度用,否则׃(x)产生一大堆HTML?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>混合h的代码,让h难以阅读和理解。解x法是写一个单独的c,用来执行相关的计。一旦这个类试通过Q就可以把它攑֜M执行同样计算的场合中。这样可以促q代码的复用?<br><br>  选择合适的包含QincludeQ机? 如果一个应用中每个面有一L(fng)抬头和底部,或者还有导航条Q那么就应该把它们放C个单独的文g中,然后在每一个页面中使用包含机制把它们加入到q个面中:(x)<br><br>Include 指o(h)Q?Q?@ include file="filename" %Q或{效xml语法<br>Qjsp:directive.includefile=”filename” /Q?<br><br>Include 动作Q?Qjsp:include page="page.jsp" flush="true" /Q?<br><br>  Include指o(h)是当<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面译?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>的时候包含另外一个文ӞInclude 动作是当h时包含另外一个文件的输出。如果被包含的文件不是经常改动的时候,我徏议用Include 指o(h)Q这样速度更快。如果被包含的文仉要不时改动或者知道请求时才能军_需要包含的内容Ӟ那么应该使用Include 动作?br><br>  如果你?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>标准标记库(<a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Server pages Standard Tag Library即JSTLQ的话,那么q有W三中包含机Ӟc:importQ,可以用来包含本地或者远E的资源。例如:(x) <br><br>Qc:import url="./copyright.html"/Q?br>Qc:import url="http://www.somewhere.com/hello.xml"/Q?br><br>  不要把业务逻辑和表C؜合在一P(x) 复杂的应用涉?qing)大量的代码Q因而把业务逻辑和前端的表示相分d昑־格外重要Q这U分d以让M一方的变化不会(x)影响到另外一斏V所以,所有的<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>代码都应该限制在表示层,可是如果q样的话Q你如何实现你的业务逻辑呢?q就?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Bean所做的事情?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Bean技术是一个独立于q_的组件模型,它让开发者编写、测试通过一个组件后Q可以随处用,提高了复用性。在<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>技术中Q?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Bean实现了业务逻辑部分Q它把数据返回给<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面Q由<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面负责格式化数据ƈ输出到客L(fng)的浏览器。在<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面中?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Beanlg的好处是Q?<br><br>  产生了可以复用的lgQQ何应用都可以使用q些lg <br><br>  可以把业务逻辑和表C相分离Q你可以修改数据的显C方式而不用考虑业务逻辑。这样做的结果也可以明确工作中开发h员的分工Q网开发h员可以把_֊攑ֈ如何昄数据上,<a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>开发者则更ؓ(f)x业务逻辑的实现?<br><br>  对于<a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Bean你不用提供源代码Q这样你的代码就不会(x)被浏览器|页的hL获得Q可以保护你的劳动成果?<br><br>  如果你的应用中用了EJBlgQ那么业务逻辑应该放|在EJB中,因ؓ(f)EJB模型提供了生命周期管理、事务管理以?qing)多客户讉K域对象(Entity BeansQ。你可以仔细看一下Enterprise BluePrints中的例子Q它?yu)是q么做的?<br><br>  使用定制的标讎ͼ(x) 上面我们已经讨论q,把所?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>代码嵌入?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面内ƈ不合适,因ؓ(f)|页开发h员ƈ不一定懂?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>语言Q更难以理解<a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>语法?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Bean可以装很多<a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>代码Q不q在<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面内?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Bean仍然要求面开发h员了解一?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>语法?br><br>  <a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>技术中包含了定制标记库的功能?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>开发h员可以生成自q标记库,q样|页设计人员可以用类似HTML的语法来使用q些标记。编写和使用自己定制的标记库可以在更大程度上促进业务逻辑和表C的分离。用定制标记库主要有以下好处:(x) <br><br>  <strong>可以消除?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面中用scriptlet</strong> 标记使用的Q何参数都可以通过<a class=channel_keylink ><u><font color=#0000ff>属?/font></u></a>传入Q从而不需要?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>代码可以达到希望的目的?<br><br>  <strong>可以化?/strong> |页设计人员不需要学?x)?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>语法Q他们可以用cMHTML语法可以用标记?<br>不懂<a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>的网设计h员可以用标记库来完成单独用HTML不能完成的Q务?<br><br>  <strong>提高了复用?/strong> 标记库完全可以复用,q可以节省开发和试的时间。Scriptlet代码只能?#8220;拯_脓(chung)”U别上进?#8220;复用”?<br><br>  单说来,你可以像用HTML构徏表示层一样用标记库完成非常复杂的Q务。下面是表页标记库的一些注意事:(x) <br><br>  1. 保持z性:(x)如果一个标记需要好几个<a class=channel_keylink ><u><font color=#0000ff>属?/font></u></a>的话Q那么尽可能把它分ؓ(f)几个标记?<br><br>  2. 保持复用性:(x)同标记的使用人员Q网设计h员)多多交流Q尽量开发出可以高度复用的标记库?<br><br>  3. 不要一切都从头开始:(x)现在已经有一些可以免费用的标记库,比如Jakarta Taglibs。如果你要用C个标讎ͼ先看看是不是已经有现成的可以使用?<br><br>  不要“重新发明轮子”Q不要一切从头开始:(x) 通过定制lg可以提高复用性,不过定制lg仍然需要编写、测试和调试E序。问题是q个事情别h可能已经实现了,而且你的实现方式q不一定比人家做得更好。这是<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>标准标记库(<a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Server Pages Standard Tag Library, JSTLQ要做的事情QJSTL请参考JSTL官方|站Q。JSTL提供了@环、读<a class=channel_keylink ><u><font color=#0000ff>属?/font></u></a>、遍历各U?a class=channel_keylink ><u><font color=#0000ff>数据l构</font></u></a>、条件表辑ּ求值等各种标记。它也提供了一些复杂的标记Q甚臛_解析<a class=channel_keylink ><u><font color=#0000ff>XML</font></u></a>文的标记它都有。所以如果你要用C个标记的话,最好先看看有没有别人已l实现的可以使用Q而不要次ơ从头开始,自己搞一套?<br><br>  使用JSTL表达使语aQJSTL Expression LanguageQ:(x) 传递给<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面的数据一般通过<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>作用?a class=channel_keylink ><u><font color=#0000ff>属?/font></u></a>或者请求参数来q行。专门ؓ(f)|页开发者设计的表达式语aQExpression Language, ELQ把使用作用?a class=channel_keylink ><u><font color=#0000ff>属?/font></u></a>传递信息作Z业务逻辑?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面传递信息的标准方式。这里要注意的是QEL只是<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>技术中关键的一个方面,q不是一U通用的程序设计语a。相反,它只是一U数据访问语aQ它可以化应用程序的数据的访问,不用Scriptlet和请求时表达式求值就可以讉K数据?br><br>  ?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>中,|页设计师要使用表达式语法<%= name %Q或<a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Beanlg来取得某些变量或<a class=channel_keylink ><u><font color=#0000ff>属?/font></u></a>的|例如Q?<br><br>QtagLib:tag attribute="Q?=<br><br>pageContext.getAttribute("name") %Q?Q?br><br>  ?<br><br>Q?= aCustomerBean.getAddress().getCountry() %Q?br><br>  表达使语a让网设计师可以使用化的语法来访问信息。如果你只是要访问一个简单的变量Q你可以使用q样的语法:(x)<br><br>QtagLib:tag attribute="${name}"Q?br><br>  如果你要讉K一个嵌?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Bean?a class=channel_keylink ><u><font color=#0000ff>属?/font></u></a>Q你可以q样Q?br><br>QtagLib:tag attribute ="${<br><br>aCustomerBean.address.country}"Q?br><br>  表达式语aQELQ借用?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Script 的语法,所以如果你?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Script 很熟(zhn)的话,你就?x)觉得巨爽?br><br>  使用qo(h)器(filterQ:(x) qo(h)器是一个对象,可以传输h或修改响应。它可以在请求到?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>之前对其q行预处理,而且能够在响应离开<a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>之后对其q行后处理。所以如果你有几?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>需要执行同L(fng)数据转换或页面处理的话,你就可以写一个过滤器c,然后在部|描q文Ӟweb.xmlQ中把该qo(h)器与对应?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>联系h?br><br>  创徏qo(h)器其实很Ҏ(gu)Q你只须实现javax.servlet.Filter<a class=channel_keylink ><u><font color=#0000ff>接口</font></u></a>?qing)它的三个方法?x)<br><br>public void init(FilterConfig config)<br><br>public void doFilter(<a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>Request req, <a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>Response rep, <br><br>FilterChain chain)<br><br>public void destroy()<br><br>  q样Q你可以完成你的过滤器?br><br>使用可移植的安全模型Q大部分的应用服务器都提供了安全模型Q不q一般它们都是针Ҏ(gu)一个服务器或某一个厂商专有的。如果你的应用需要移植的话,那么你的应用最好用可以移植的安全模型。如果你的应用有一些预先定义的固定用户的话Q那么你可以使用FROM验证和BASIC验证。可是如果你要动态生成客L(fng)话(一般都是这U情况)Q你可能需要用服务器特定的API来创建和理用户。这样当你的应用UL到另外一个服务器Ӟ你可能就?x)碰到API不兼容的问题。这U情况下Q最好的解决Ҏ(gu)是用适配器(AdapterQ模式(如果你对设计模式不熟(zhn)的话,请参看GoF的《设计模式》一书)?<br><br>  ?a class=channel_keylink ><u><font color=#0000ff>数据?/font></u></a>来保存持久性数据:(x) <a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>中可以用HttpSession对象也就是会(x)话对象来保存用户的(f)时数据。不q如果你想保存持久性数据的时候,你应该?a class=channel_keylink ><u><font color=#0000ff>数据?/font></u></a>Q数据保存数据会(x)更安全,而且对客h用的览器没有什么要求。这样即使你的应用服务器׃某种原因崩溃了,你的数据依然良好?<br><br>  高速缓存页面:(x) 应用E序中L一些东西是相对固定的,而另外一些东西是l常变化的。你应该使用静态的HTML文档来存储那些相对固定的内容Q这样客L(fng)可以进行高速缓存,客户每次讉K你的应用Ӟ只需讉K已经改动的部分。这样可以加快客L(fng)讉K速度?<br><br>  使用q接池:(x) 如果你要自己?a class=channel_keylink ><u><font color=#0000ff>数据?/font></u></a>讉K代码的话Q我觉得使用你应该学?x)如何?a class=channel_keylink ><u><font color=#0000ff>数据?/font></u></a>q接池技术。每一个服务器都有针对<a class=channel_keylink ><u><font color=#0000ff>数据?/font></u></a>q接池的配置文Q你要学?fn)一下如何用?a class=channel_keylink ><u><font color=#0000ff>数据?/font></u></a>q接池可以加速你的应用的数据讉K的速度Q而且׃服务器替你管理了<a class=channel_keylink ><u><font color=#0000ff>数据?/font></u></a>q接Q这可以节省你的很多工作?<br><br>  ~存<a class=channel_keylink ><u><font color=#0000ff>数据?/font></u></a>的访问结果:(x) 如果你的应用要对<a class=channel_keylink ><u><font color=#0000ff>数据?/font></u></a>q行频繁讉K的话Q你可以使用一个对象来~存你的数据Q这样你可以节省大量访?a class=channel_keylink ><u><font color=#0000ff>数据?/font></u></a>的开销。在《J2EE核心模式》和《实用J2EE设计模式~程指南》两本书中都有关于值对象模式(Value Object PatternQ的详细探讨Q你可以参考这两本书来获得相应的知识?<br><br>  使用数据讉K对象模式Q如果你的应用需要访问多?a class=channel_keylink ><u><font color=#0000ff>数据?/font></u></a>pȝ或者可能会(x)UL到其它的存储pȝ中,那么你针对特定厂商的优化代码可能会(x)失效。用通用的代码存在执行效率的问题Q而用优化代码又存在UL的问题。所以就产生了数据访问对象模式(Data Access Object Pattern, DAOQ,该模式既提供了各<a class=channel_keylink ><u><font color=#0000ff>数据?/font></u></a>厂商的适应性,又能利用C们提供的独特的好处。按?a class=channel_keylink ><u><font color=#0000ff>面向对象</font></u></a>的分MQ务的原则Q该模式与企业信息pȝQEnterprise Information System, EISQ通讯需要的逻辑隔离到它自己的类中。这P事物对象Q如<a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>lg?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Bean可以利用数据访问对象(DAOQ处理所有与EIS有关的事务?<br><br>  最好采?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>?a class=channel_keylink ><u><font color=#0000ff>XML</font></u></a>语法Q?<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>技术中l常存在着两种完成同一个Q务的语法Q一U是常规?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>语法Q一U是对应?a class=channel_keylink ><u><font color=#0000ff>XML</font></u></a>语法。虽然两U语法作用相同,你最好还是?a class=channel_keylink ><u><font color=#0000ff>XML</font></u></a>语法。存在两U语法的原因是,<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>语法可以与以前的代码兼容Q而J2EE使用<a class=channel_keylink ><u><font color=#0000ff>XML</font></u></a>作ؓ(f)其交换数据的核心Q所以同时提供了<a class=channel_keylink ><u><font color=#0000ff>XML</font></u></a>语法。随着J2EE的发展,<a class=channel_keylink ><u><font color=#0000ff>XML</font></u></a>的作用会(x)来大Q所以我你?a class=channel_keylink ><u><font color=#0000ff>XML</font></u></a>语法?<br><br>  研究Sun提供的J2EE BluePrints: Sun的Enterprise BluePrints 提供了大量指导原则、设计模式和很好的例子(宠物店,Pet StoreQ。你可以好好研究一下这些内容,q样可以提高你的设计和开发水q?<br><br>  <strong>整合<a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a></strong><br><br>  <a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>技术规范种l出了两U?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>开发Web应用的方式,q两U方式可以归Uؓ(f)模型一和模型二Q这两种模型的主要差别在于它们处理业务的程不同。模型一Q如下图所C,UC?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>+<a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Beans模型。在q一模型中,<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面独自响应hq将处理l果q回l客P所有的数据通过<a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Bean来处理,<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>实现面的表现?br><br><img onerror="this.src='/Article/UploadFDL02/200602/20060217130123372.jpg';" hspace=3 src="http://www.360doc.com/DownloadImg/15540/389120_2.jpg" align=middle vspace=1 border=1><br>?Q?<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>模型一 <br><br>  从上囑֏以看出,模型一也实C面表现和业务逻辑相分R然而用这U方式就要在<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面使用大量?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>代码Q当需要处理的业务逻辑很复杂时Q这U情况会(x)变得非常p糕。大量嵌入式代码使整个页面程序变得异常复杂。对于前端界面设计的|页开发h员来_(d)q简直是一场噩梦。所以,模型一不能满大型应用的需要,但是对于型应用Q因模型单,不用涉及(qing)诸多要素Q从而可以很好地满型应用的需要,所以在单应用中Q可以考虑模型一?br><br>  模型二,如下图所C,UC?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>+<a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>+<a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Beans模型。这一模型l合?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>技术,充分利用?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>两种技术原有的优势。这个模型?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>技术来表现面Q?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>技术完成大量的事务处理Q用Bean来存储数据?a class=channel_keylink ><u><font color=#0000ff>Servlet</font></u></a>用来处理h的事务,充当一个控制者的角色Qƈ负责向客户发送请求。它创徏<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>需要的Bean和对象,然后Ҏ(gu)用户h的行为,军_哪?a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>面发送给客户?br><br><img onerror="this.src='/Article/UploadFDL02/200602/20060217130123452.jpg';" hspace=3 src="http://www.360doc.com/DownloadImg/15540/389120_3.jpg" align=middle vspace=1 border=1><br>?Q?<a class=channel_keylink ><u><font color=#0000ff>JSP</font></u></a>模型?br><br>  从开发的观点看,模型二具有更清晰的页面表玎ͼ清楚的开发角色的划分Q可以充分利用开发团队中的网设计h员和<a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>开发h员。这些优势在大型目中表现得ؓ(f)H出Q网设计h员可以充分发挥自q术和设计才能来充分表现面Q程序编写h员可以充分发挥自q业务逻辑处理思维Q实现项目中的业务处理?br><br>  另外Q从设计l构来看Q这U模型充分体C模型视图控制器(MVCQ的设计架构。事实上Q现存的很多开发框枉是基于这U模型的Q充分实CMVC Q例如Apache Struts框架?a class=channel_keylink ><u><font color=#0000ff>Java</font></u></a>Server Faces框架 <br> <img src ="http://www.aygfsteel.com/simie/aggbug/127513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/simie/" target="_blank">和田?/a> 2007-07-02 12:51 <a href="http://www.aygfsteel.com/simie/archive/2007/07/02/127513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Java Servlets 2.4实现qo(h)http://www.aygfsteel.com/simie/archive/2007/07/02/127503.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 04:28:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127503.htmlhttp://www.aygfsteel.com/simie/comments/127503.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127503.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127503.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127503.html  Servlet qo(h)器是可插入的 Web lgQ它允许我们实现 Web 应用E序中的预处理和后期处理逻辑。过滤器支持 servlet ?JSP 面的基本请求处理功能,比如日志记录、性能、安全、会(x)话处理、XSLT 转换Q等{?qo(h)器最初是?Java Servlet 2.3 规范发布的,最q定E的 2.4 规范对它q行了重大升U。在此我向(zhn)介l?Servlet qo(h)器的基础知识 ―?比如M的体pȝ构设计、实现细节,以及(qing)?J2EE Web 应用E序中的典型应用Q还?x)涉及(qing)一些预计最新的 Servlet 规范?yu)?x)提供的扩展功能?

  Servlet qo(h)器是什么?

  Servlet qo(h)器是型?Web lgQ它们拦截请求和响应Q以便查看、提取或以某U方式操作正在客h和服务器之间交换的数据。过滤器是通常装了一些功能的 Web lgQ这些功能虽然很重要Q但是对于处理客hh或发送响应来说不是决定性的。典型的例子包括记录关于h和响应的数据、处理安全协议、管理会(x)话属性,{等。过滤器提供一U面向对象的模块化机Ӟ用以公׃Q务封装到可插入的lg中,q些lg通过一个配|文件来声明Qƈ动态地处理?/p>

  Servlet qo(h)器中l合了许多元素,从而得过滤器成ؓ(f)独特、强大和模块化的 Web lg。也是_(d)Servlet qo(h)器是Q?/p>

  • 声明式的Q过滤器通过 Web 部v描述W(web.xmlQ中?XML 标签来声明。这样允许添加和删除qo(h)器,而无需改动M应用E序代码?JSP 面?
  • 动态的Q过滤器在运行时?Servlet 容器调用来拦截和处理h和响应?
  • 灉|?/strong>Q过滤器?Web 处理环境中的应用很广泛,늛诸如日志记录和安全等许多最公共的辅助Q务。过滤器q是灉|的,因ؓ(f)它们可用于对来自客户机的直接调用执行预处理和后期处理Q以?qing)处理在防火墙之后?Web lg之间调度的请求。最后,可以过滤器链接h以提供必需的功能?
  • 模块化的Q通过把应用程序处理逻辑装到单个类文g中,qo(h)器从而定义了可容易地从请?响应链中d或删除的模块化单元?
  • 可移植的Q与 Java q_的其他许多方面一PServlet qo(h)器是跨^台和跨容器可UL的,从而进一步支持了 Servler qo(h)器的模块化和可重用本质?
  • 可重用的Q归功于qo(h)器实现类的模块化设计Q以?qing)声明式的过滤器配置方式Q过滤器可以Ҏ(gu)地跨不同的目和应用程序用?
  • 透明?/strong>Q在h/响应链中包括qo(h)器,q种设计是ؓ(f)了补充(而不是以M方式替代Qservlet ?JSP 面提供的核心处理。因而,qo(h)器可以根据需要添加或删除Q而不?x)破?servlet ?JSP 面?

  所?Servlet qo(h)器是通过一个配|文件来灉|声明的模块化可重用组件。过滤器动态地处理传入的请求和传出的响应,q且无需修改应用E序代码可以透明地添加或删除它们。最后,qo(h)器独立于Mq_或?Servlet 容器Q从而允许将它们Ҏ(gu)地部|到M相容?J2EE 环境中?/p>

  在接下来的几节中,我们进一步考察 Servlet qo(h)器机制的M设计Q以?qing)实现、配|和部vqo(h)器所涉及(qing)的步骤。我们还探?Servlet qo(h)器的一些实际应用,最后简要考察一下模?视图-控制器(MVCQ体pȝ构中包含?Servlet qo(h)器,从而结束本文的讨论?/p>

  Servlet qo(h)器体pȝ?br>
  正如其名U所暗示的, Servlet qo(h)器用于拦截传入的h?或传出的响应Qƈ监视、修Ҏ(gu)以某U方式处理正在通过的数据流。过滤器是自包含、模块化的组Ӟ可以它们添加到h/响应链中Q或者在无需影响应用E序中其?Web lg的情况下删除它们。过滤器仅只是改动请求和响应的运行时处理Q因而不应该它们直接嵌?Web 应用E序框架Q除非是通过 Servlet API 中良好定义的标准接口来实现?

  Web 资源可以配置为没有过滤器与之兌Q这是默认情况)、与单个qo(h)器关联(q是典型情况Q,甚至是与一个过滤器铄兌。那么过滤器I竟做什么呢Q??servlet 一P它接受请求ƈ响应对象。然后过滤器?x)检查请求对象,q决定将该请求{发给链中的下一个组Ӟ或者中止该hq直接向客户机发回一个响应。如果请求被转发了,它将被传递给链中的下一个资源(另一个过滤器、servlet ?JSP 面Q。在q个h设法通过qo(h)器链q被服务器处理之后,一个响应将以相反的序通过该链发送回厅R这样就l每个过滤器都提供了Ҏ(gu)需要处理响应对象的Z(x)?/p>

  当过滤器?Servlet 2.3 规范中首ơ引入时Q它们只能过?Web 客户机和客户机所讉K的指?Web 资源之间的内宏V如果该资源然后请求调度给其他 Web 资源Q那׃能向q后委托的Q何请求应用过滤器?.4 规范消除了这个限制。Servlet qo(h)器现在可以应用于 J2EE Web 环境中存在请求和响应对象的Q何地斏V因此,Servlet qo(h)器可以应用在客户机和 servlet 之间、servlet ?servlet ?JSP 面之间Q以?qing)所包括的每?JSP 面之间。这才是我所U的强大能力和灵zL!



]]>
servlet2.5/jsp2.1的新特征http://www.aygfsteel.com/simie/archive/2007/07/02/127500.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 04:20:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127500.htmlhttp://www.aygfsteel.com/simie/comments/127500.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127500.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127500.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127500.html2005q??6日,Sun公司和JSR154的专家组发布Servlet API的一个新的版本。在一般情况下Q一个JSR的新版本仅仅包括对以前少数有名无实的规范q行去除更新。但q次Q新版本中增加新的特征和变化Q他们对Servlets的生重要媄响,使得Servlet的版本升C 2.5?br>在这文章里Q我主要谈谈Servlet2.5版本中的新特征。描q每一个变化,阐述那些必要变化产生的背景,q展C如何在ZServlet的项目中利用q些变化。 
事实上,q是我ؓ(f)JavaWorld提供的第六篇关于Servlet API更新资料的文章。这文章意在两个目的:(x)从眼前来看,向你介绍 Servlet的新特征。从长远来看Q是展现Servlet变化的历史概要,q样当你Z老的Servlet API版本q行~码的时候,你可以正地军_哪些特征和功能你可以使用Q而哪些特征和功能你不应该使用。你可以参考我先前写的关于Servlet的文章?br>注意Q当你想实践q些Servlet的新特征和功能时Q你要知道的是:(x)q不是所有的Servlet容器和Java企业U应用服务器都能立即适用于最新版的Servlet APIQ写q篇文章Ӟ2006q??日)QJetty 6 server和Sun公司的GlassFish server是公认最好的支持Servlet2.5的容器,而Apache Tomcat5.5和Jboss 4.0目前只支持Servlet2.4?br>Servlet2.5一些变化的介绍Q?br>1Q?nbsp;   Z最新的J2SE 5.0开发的?br>2Q?nbsp;   支持注释?br>3Q?nbsp;   web.xml中的几处配置更加方便?br>4Q?nbsp;   去除了少数的限制?br>5Q?nbsp;   优化了一些实?br>J2SE 5.0的物:(x)
从一开始,Servlet 2.5 规范?yu)列出J2SE 5.0 (JDK 1.5) 作ؓ(f)它最的q_要求。它使得Servlet2.5只能适用ZJ2SE 5.0开发的q_Q这个变动意味着所有J2SE5.0的新Ҏ(gu)可以保证对Servlet2.5E序员有用?br>传统意义上,Servlet和JEE版本一直与JDK的版本保持同步发展,但是q次QServlet的版本蟩q?.4版本。专家组认ؓ(f)版本的加速增长是正当的,因ؓ(f)J2SE5.0提出一个引人注目的QServlet和JEE规范都要利用的特??注释?br>注释Q?/strong>
注释是作为JSR175的一部分提出的(一Uؓ(f)Java语言设计提供便利的MetadataQ一U新的语a特色。它是利用Metadata为Java ~码l构Q类Q方法,域等{)装饰的一U机制。它不能像代码那h行,但是可以用于标记代码Q这个过E是ZMetadata信息的代码处理机Q通过更新他们的事件行为来实现的?br>
我们可以凭借不同的技巧来注释cdҎ(gu)Q例如连l地标记接口或者是@deprecated Javadoc评论。这U新式的Metadata可以便利地提供了一U标准的机制来实现注释功能,以及(qing)通过库来创徏用户自己的注释类型的变量?br>下面是一个简单的Web service 注释例子Q?br>import javax.jws.WebService;
import javax.jws.WebMethod;
@WebService
public class HelloWorldService {
  @WebMethod
  public String helloWorld() {
    return "Hello World!";
  }
}
@WebService和@WebMethodq两个注释类型,在JSR181Qؓ(f)Javaq_提供的Web ServicesMetadataQ有详细说明Q可以像cML(fng)引用Q标记这个类作ؓ(f)一个Web serviceq且标记它的helloWorldQ)Ҏ(gu)做ؓ(f)一个Web serviceҎ(gu)。对于他们本w来_(d)注释只是写在那里q没有什么作用,好像在岗位上做记录一P但是Q一个容器一旦加载这个类q对那些注释q行二进制编码,可以把q个c连到Web service上?br>注释可以接受属?D些参数。它保存着参数的信息ƈ且可以利用这些参数来更改被请求的事g行ؓ(f)。例如下面更高的注释例子:(x)
@WebService(
 name = "PingService",
  targetNamespace=http://acme.com/ping
)
@SOAPBinding(
  style=SOAPBinding.Style.RPC,
  use=SOAPBinding.Use.LITERAL
)
public class Ping {
  @WebMethod(operationName = "Foo")
  public void foo() { }
}
一旦加载了q个c,一个正配|的容器׃(x)识别出注释及(qing)其参敎ͼq将q个做ؓ(f)一个PingService通过利用remote-procedure- call/literal的编码方式与一个Foo operation相连。实际上Q注释便指明了类和类的容器之间的联系?br>
Java本n的规范(JSR175Q仅仅有量的注释类型变量。而这些有的注释cd变量主要来自于其他的JSRsQ?br>"JSR 250: Javaq_的公共注?br>"JSR 220: 企业UJavaBeans 3.0 
"JSR 224: ZXML的Java API Web Services (JAX-WS) 2.0 
"JSR 181: Javaq_的Web Services Metadata 
Servlet2.5中的注释Q?br>回到Servlet2.5上来Q一U新的规范描qC几种注释在Servlet环境中是如何工作的。功能弱的Servlet容器忽略了这些规范,然而JEE容器中的Servlet却严格遵守这些规范?br>
有的注释提供了在XML注册的可选择性,否则p注册在配|文件web.xml中。有的作为容器的h来执行其dQ否则就由Servlet亲自来执行。还有的注释两者都具备?br>
注释准确的定义不是完全固定的Q因为Servlet本nq没有定义注释。它仅仅解释了它们如何媄响Servlet环境Q下面是注释的一个简要的概述Q你可以看到在JEE5中它们的用途:(x)

"@Resource and @ResourcesQ@Resource位于cL变量中以对Servlet容器q行“资源注入”。当容器识别个注释时Q它?x)在获得服务C之前Q用适当的值实现带注释的变量的重新注入。通过使用q种注释Q你不必利用JNDI来查扑֑令和在配|文件web.xml中手动声明资源。服务器通过Servlet的自我调整来执行它的d。变量的名称和类型由映像机制自动定Q尽你可以利用注释的参数来越q一限制。一个注入的资源可以是数据源QJava信息服务目的文g或者是环境讄的标量。下面是一个例子:(x)
@Resource javax.sql.DataSource catalog;
public getData() {
  Connection con = catalog.getConnection();
}
现在Q在q段Servlet代码变成服务之前Q容器会(x)定位JNDI变量Qƈ对于目录变量q行手动分配?br>Z效率Q仅仅某些类支持资源注入Q这些类有:(x)ServletsQServletqo(h)器,Servlet事g监听器,JSP标签操作器,JSP库事件监听器Q用于处理beans的JSFQ以?qing)一些与Serlvets无关的类?br>"@Resources注释与@Resource怼Q但是它用于一l@Resource注释。它们都来自JSR250Q是Javaq_的公共注释?br>"@PostConstruct and @PreDestroyQ可以Ҏ(gu)成ؓ(f)带有生命周期的方法。@PostConstructҎ(gu)用于资源注入初始化之后。@PreDestroyҎ(gu)用于Servletq服务q放注入的资源的时候。回收的Ҏ(gu)必须是事实的Ҏ(gu)Q返回voidq且不可以抛ZQ何异常。这些注释本质上使得MҎ(gu)都成为init()和destroy()的子Ҏ(gu)Q这些特征也来自与JSR250?br>"@EJBQ类g@ResourceQ设计用于注入企业的JavaBeans。比起@ResourceQ它略有不同Q在于@EJB的参数特定设计用来定位EJB的参数。这个注释来自EJB3.0的规范?br>"@WebServiceRefQ与@Resource ?nbsp;@EJB怼Q设计用于注入Web service参数。来自于JAX-WS2.0规范?br>"@PersistenceContext, @PersistenceContexts, @PersistenceUnit, and @PersistenceUnitsQ这些注释来自EJB3.0规范来支持Java对象的持久化?br>"@DeclareRoles: 定义应用E序中安全角色的使用。当定义一个ServletcLQ在配置文gweb.xml?lt;security-role>标签中对它进行设|,来自JSR250?br>" @RunAsQ用于声明哪个类应该执行。当定义一个ServletcLQ在配置文gweb.xml?lt;run-as>标签中对它进行设|。来自于JSR250?

注释的执行:(x)
不论你用注释与??其在你不用时??它对于理解服务器上程序的执行有着重要意义。ؓ(f)了让服务器识别类中的注释Q它必须加蝲q些c,q就意味着服务器必L启动着的,服务器通过WEB-INF/classes目录下和W(xu)EBQINF/lib目录下的所有类文g来查找注释。(每个规范下,服务器不必查找这两个目录以外的目录。)你可以通过下面的方法指?lt;web-app>根的属性而不必用如何进行注释:(x)
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
             version="2.5" full="true">
</web-app>
web.xml的便利:(x)
Servlet2.5对于web.xml引入几个的变动Q得它更加方便?br>Servlet名称的通配W化Q?br>首先Q当你写<filter-mapping>,你现在可以在<Servlet-name>标签中?h代表所有的Servlets。而以前,你必Mơ把一个Servletl定到过滤器上,像这P(x)

<filter-mapping>
  <filter-name>Image Filter</filter-name>
  <Servlet-name>ImageServlet</Servlet-name>
</filter-mapping> 

现在Q你可以一ơ绑定所有的ServletsQ?br>
<filter-mapping>
  <filter-name>Image Filter</filter-name>
  <Servlet-name>*</Servlet-name>  <!?新特?nbsp;-->
</filter-mapping>

q有着很大用途,例如Q?br>
<filter-mapping>
  <filter-name>Dispatch Filter</filter-name>
  <Servlet-name>*</Servlet-name>
  <dispatcher>FORWARD</dispatcher>
</filter-mapping>

映射的复合模式:(x)
其次Q当我们?lt;Servlet-mapping> 或?nbsp;<filter-mapping>Ӟ你现在可以在同一的标{中采用复合匚w的标准。以前一?lt;Servlet-mapping>只支持一?lt;url-pattern>元素Q现在它不只支持一个,例如Q?br><Servlet-mapping>
  <Servlet-name>color</Servlet-name>
  <url-pattern>/color/*</url-pattern>
  <url-pattern>/colour/*</url-pattern>
</Servlet-mapping>

同样圎ͼ以前<filter-mapping>也是只支持一?lt;url-pattern> 或者一?nbsp;<Servlet-name>。现在它对于每个元素都可以支持Q意多个:(x)

<filter-mapping>
  <filter-name>Multipe Mappings Filter</filter-name>
  <url-pattern>/foo/*</url-pattern>
  <Servlet-name>Servlet1</Servlet-name>
  <Servlet-name>Servlet2</Servlet-name>
  <url-pattern>/bar/*</url-pattern>
</filter-mapping>

HTTPҎ(gu)名:(x)

最q,你可以将合法的HTTP/1.1Ҏ(gu)名放q?lt;http-method>元素中。当你用这些方法时Q?lt;http- method>指?lt;security-constraint>标记里的Ҏ(gu)应该被应用。从以前来看Q它仅限于HTTP/1.1? 个标准方法:(x)GETQPOSTQPUTQDELETEQHEADQOPTIONS和TRACE。但是,HTTP/1.1允许Ҏ(gu)法进行扩展,W(xu)ebDAV 是用于这U扩展的普遍技术。在Servlet2.5中,你可以安全地U束M可能的HTTPҎ(gu)名,标准?qing)扩展,包括WebDAVҎ(gu)Q例如:(x)LOCKQ?UNLOCKQCOPY?qing)MOVE?br>如果你写一个WebDAV的ServletQ你不必使用doLock()和doCopy()Ҏ(gu)。你必须写自qservice()Ҏ(gu)?qing)分zrequest.getMethod()Ҏ(gu)。正׃q种变化Q你不必理pȝ的安全性?br>去除限制Q?br>
Servlet2.5去除了关于错误处理和回话跟踪的一些限制。对于错误处理,Servlet2.5之前Q配|在<error- page>中的错误处理面不能通过调用setStatus()Ҏ(gu)来修改触发他们的错误代码Q而Servlet2.5减弱了这一规范。这L(fng)规范的生于q样的观点,是错误面的工作是指出每个错误而不是修攚w误。但是,实际使用中,错误面不只是用于指出错误,而是q能做更多的事情Q或许可以代替在U帮助来帮助用户解决问题。这个规范将不再限制错误面所产生的反馈信息?br>
对于?x)话跟踪QServlet2.5之前Q调用RequestDispatcher.include()的Servlet不能讄响应的标题头Q?Servlet2.5减弱了这一规范。原规范的目的是使内部的Servlets限制在自q面I间中,不可以媄响外部的面。现在这个规范已l减弱,允许在内部的Servlet中用request.getSession()命o(h)Q这个命令可以?zhn)?zhn)地创徏一个会(x)话跟tcookie的标题头。逻辑上要求限制内部的资源Q但逻辑上也要求q些限制不应该取消其启动session的这一功能。这个变动对于Portlet规范来说昑־其重要。作用是Q如果响应已l有效,则getSession()命o(h)׃(x)抛出一个IllegalStateException(异常)Q而在此之前,没有这个功能?br>
优化Q?/strong>
最q,新的规范优化了一些实例,使得Servlets更加方便而且保证了更好地按要求工作?br>
l止响应Q?/strong>
W一处优化细又深奥Q但做ؓ(f)规范中的一个例子还有蛮有趣的。Servlet2.4规范规定响应在这几种情况下应该是有效的,包括Q在响应?setContentLengthҎ(gu)中内容已l明说明,以及(qing)内容已经写进了响应中。这U情况只有你的代码像下面q样才可以响应重新定向Q?br>
response.setHeader("Host", "localhost")Q?br>response.setHeader("Pragma", "no-cache")Q?br>response.setHeader("Content-Length", "0")Q?br>response.setHeader("Location", "http://www.apache.org")Q?br>
Servlet技术忽略特定区域的标题_(d)因ؓ(f)内容满0字节长度Q响应就?x)立即生效。而在它开始之前,响应已失效了!Servlet容器通常拒绝执行q种行ؓ(f)Q而Servlet2.5版本增加?#8220;长度必须大于0”q个原则?br>实例~码Q?br>
Servlet2.4规范规定必须在调用request.getReader()Ҏ(gu)之前调用 request.setCharacterEncoding()Ҏ(gu)。但是,如果你忽略这个原则而在其之后去调用 request.setCharacterEncoding()Ҏ(gu)Q那么会(x)产生什么后果,q个问题规范里ƈ没有说。ؓ(f)了简便,现在消除q种情况Q?br>Cross-context sessions(不同上下文目录间的会(x)?Q?br>最q,关于Cross-context?x)话处理的规则已l明说明。当Servlets指派从一个上下文到其他上下文的请求时Q这个规则就发挥了作??在目标调用过E中Q包括哪些会(x)话。这个版本的出现使得一个上下文目录的主里的portlets可以通过几种内部的命令来对别的上下文目录里的 portlets起作用。Servlet2.5明确指出一个上下文目录里的资源可以讉K其他上下文目录的session(?x)?Q而不用考虑q个h从哪里开始的。这意味着portlets可以q主页的范围而在自己的范围里q行Q而且q个规范q会(x)应用在不兼容的Serlvet容器中?br>期待Q?br>
׃Servlet2.5版本要保持一些旧的性质Q几个大的概念不得不延后C一个阶Dc(din)它们包括:(x)
"新的输入/输出(NIO)支持QNIO通道更有利于Servletsq行客户端通信成ؓ(f)可能?br>"qo(h)器wrap-under或wrap-over语义Q有时用qo(h)器包装请求,?或者响应对象去修改Ҏ(gu)行ؓ(f)或者启用新的方法。当把这U包装和服务器对h和响应的包装l合hӞ又应该怎么包装在一P
"用于Ƣ迎的Servlets文gQ做为烦引应该充当欢q作用的文g吗?在此之前Q这个回{是肯定的。但是规范没有明说明如何用这个功能,其在没有烦引的情况下?br>"用于Ƣ迎的文件的分派规则Q如何分z欢q文Ӟq个l节q没有完全说明,而是遗留了一些开攄~口来应对不兼容问题?br>"登陆后选择默认面Q如果用户通过他们的书{访问Servlet的登陆页面,那么在成功登陆后面应该转向哪里呢?q个问题至今未明确说明?br>"用户的主题日志:(x)在通过|站正确地注册之后,不通过传统地登陆方式没有办法Servlet信Q用户?br>l束语:(x)
如果抛开注释来看Servlet2.5的变化,可见在配|文件web.xml中去除了一些限Ӟ是有利的Q同时又优化了实例行Z其更适合更便于开发Webpȝ(|页)?br>Servlet2.5中注释的作用更加戏剧化。Servlets本n不能声明注释cd的变量,甚至性能qServlet容器都不支持注释。然而在 JEE5环境下的Servlets~写者可以看刎ͼ通过公共的注释及(qing)EJB3.0和JAX-WS2.0规范而引入的注释cd?x)对代码产生很大变化Qƈ且这也将对Servlet如何理外部资源Q对象的持久化及(qing)EJB的构成生重大媄?/p>

J2EE的两U重要的表现层技术JSP和JSF发布了新技术规范的预览版本Q其中最重要的一Ҏ(gu)两者将表达式语aQExpression LanguageQELQ部分合二ؓ(f)一。在不久的将来,q两U技术有可能更进一步地彼此融合Q成ZU统一的表现层技术。然而在J2EEC的普遍观点中Q如果单单作ZU视图技术,JSPq不是最佳的选择QVelocity和XSLT{基于模板的视图技术通常比JSP更方便;而基于组件的JSF也面临广泛的信Q危机。两者的l合是否能得C界的认可Q还需要时间的验?/p>

jsp 2.1


    我们很高兴向大家宣告QJavaServer Pages、JSR-245下开发的Faces.JavaServer PagesQJSPQ?.1和JSR-252下开发的JavaServer FacesQF(tun)acesQ?.2的新版规范的Early Draft Review发布?/p>

    JSP 2.1把Expression LanguageQELQ输出到它自己各自分ȝ文中,在技术上Q这些文是JSP规范的子文档。这些统一的EL规范定义了一个更高层的java 包,javax.el。这个包与用它的技术之间完全独立,q且允许此技术将自n插入EL处理q程。更改的JSP规范遵从使用标准化EL的规范?/p>

    对于前面提到的JSR-252Q这个规范ƈ没什么新Ҏ(gu)。Faces 1.2支持新的标准化ELQ还包含一些bug修复的相兌范?/p>

    Faces和JSP在JSRs下的l盟带来了一些新功能Q也为将来的发展打下了坚实的基础。例如,在同时用Faces和JSP的web应用中,|页仅用JSPQ不包含Mfaces内容Q来讉KManaged Beans成ؓ(f)可能。在JSP规范的附录E中和Faces规范的前a中都可以看到更改内容的细节?/p>

]]>
servlet规范要求Qrequest的缺省编码必Liso-8859-1http://www.aygfsteel.com/simie/archive/2007/07/02/127498.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 04:19:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127498.htmlhttp://www.aygfsteel.com/simie/comments/127498.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127498.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127498.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127498.html可是如果读过servlet规格说明书,关于java|页~码的问题就应该q刃而解了?br>
~写java|页Qservlet\jspQ,需要关心response(反馈l客L(fng)的页?和requestQ来自客L(fng)的数据)的编码问题?br>
response的编码可以直接用代码实现。而request的编码怎么办呢Q?br>以下是servlet规范书上的文字(我粗略翻译一下吧Q不怕见W)Q?br>
-- 整理?lt;Java Servlet Specification Version 2.3> SRV.4.9 --

当前,很多览器ƈ不发送带?#8220;Content-Type”头信息的字符~码限定W,而由dHTTPh的代码来军_字符的编码方式。如果客L(fng)h未定义编码限定符Q则包容器(如tomcatQ用于创建request reader和分析POST数据的request的缺省编码方式必L“ISO-8859-1”。然而,Z向开发者指明客L(fng)没有发送字W编码信息的情况Q包容器对getCharacterEncodingҎ(gu)q回null?br>
如果客户端不讄字符~码方式Qƈ且request不是按照以上~省~码方式Qiso-8859-1Q来~码Q则?x)发生问题。ؓ(f)了解册个问题,在接口ServletRequest中加入了一个新的方法setCharacterEncoding(String enc)。开发者可以调用这个方法来替换包容器提供的~省字符~码方式。但是,必须在从request中分析Q何POST数据或者读取Q何输入之前,调用q个Ҏ(gu)。一旦数据已被读取,则调用这个方法将不会(x)影响~码方式?

]]>
Servletqo(h)?/title><link>http://www.aygfsteel.com/simie/archive/2007/07/02/127497.html</link><dc:creator>和田?/dc:creator><author>和田?/author><pubDate>Mon, 02 Jul 2007 04:13:00 GMT</pubDate><guid>http://www.aygfsteel.com/simie/archive/2007/07/02/127497.html</guid><wfw:comment>http://www.aygfsteel.com/simie/comments/127497.html</wfw:comment><comments>http://www.aygfsteel.com/simie/archive/2007/07/02/127497.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/simie/comments/commentRss/127497.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/simie/services/trackbacks/127497.html</trackback:ping><description><![CDATA[一、Servletqo(h)器的概念Q?br>***************************************************************************************<br>Servletqo(h)器是在Java Servlet规范2.3中定义的Q它能够对Servlet容器的请求和响应对象q行查和修改。   <br><br>Servletqo(h)器本wƈ不生请求和响应对象Q它只能提供qo(h)作用。Servletq期能够在Servlet被调用之前检查Request对象Q修改Request Header和Request内容Q在Servlet被调用之后检查Response对象Q修改Response Header和Response内容?br><br>Servletq期负责qo(h)的Weblg可以是Servlet、JSP或者HTML文g。 <br>***************************************************************************************<br><br><br>二、Servletqo(h)器的特点Q?br>***************************************************************************************<br>AQServletqo(h)器可以检查和修改ServletRequest和ServletResponse对象<br>BQServletqo(h)器可以被指定和特定的URL兌Q只有当客户h讉K该URLӞ才会(x)触发qo(h)?br>CQServletqo(h)器可以被串联在一P形成道效应Q协同修改请求和响应对象<br>***************************************************************************************<br><br><br>三、Servletqo(h)器的作用Q?br>***************************************************************************************<br>AQ查询请求ƈ作出相应的行动?br>BQ阻塞请?响应对,使其不能q一步传递?br>CQ修改请求的头部和数据。用户可以提供自定义的请求?br>DQ修改响应的头部和数据。用户可以通过提供定制的响应版本实现?br>EQ与外部资源q行交互?br>***************************************************************************************<br><br><br>四、Servletqo(h)器的适用场合Q?br>***************************************************************************************<br>AQ认证过?br>BQ登录和审核qo(h)<br>CQ图像{换过?nbsp;<br>DQ数据压~过?nbsp;<br>EQ加密过?nbsp;<br>FQo(h)牌过?nbsp;<br>GQ资源访问触发事件过?nbsp;<br>HQXSL/Tqo(h) <br>IQMime-typeqo(h)<br>***************************************************************************************<br><br><br>五、Servletqo(h)器接口的构成Q?br>***************************************************************************************<br>所有的Servletqo(h)器类都必d现javax.servlet.Filter接口。这个接口含?个过滤器cdd现的Ҏ(gu)Q?br><br>A.init(FilterConfig)Q?br>q是Servletqo(h)器的初始化方法,Servlet容器创徏Servletqo(h)器实例后调用这个方法。在q个Ҏ(gu)中可以读取web.xml文g中Servletqo(h)器的初始化参?br><br>B.doFilter(ServletRequest,ServletResponse,FilterChain)Q?br>q个Ҏ(gu)完成实际的过滤操作,当客戯求访问于qo(h)器关联的URLӞServlet容器先调用qo(h)器的doFilterҎ(gu)。FilterChain参数用于讉K后箋qo(h)?br><br>B.destroy()Q?br>Servlet容器在销毁过滤器实例前调用该Ҏ(gu)Q这个方法中可以释放Servletqo(h)器占用的资源<br>***************************************************************************************<br><br><br>六、Servletqo(h)器的创徏步骤Q?br>***************************************************************************************<br>AQ实现javax.servlet.Filter接口<br>BQ实现initҎ(gu)Q读取过滤器的初始化函数<br>CQ实现doFilterҎ(gu)Q完成对h或过滤的响应<br>DQ调用FilterChain接口对象的doFilterҎ(gu)Q向后箋的过滤器传递请求或响应<br>EQ销毁过滤器<br>***************************************************************************************<br><br><br>七、Servletqo(h)器对h的过滤:(x)<br>***************************************************************************************<br>AQServlet容器创徏一个过滤器实例<br>BQ过滤器实例调用initҎ(gu)Q读取过滤器的初始化参数<br>CQ过滤器实例调用doFilterҎ(gu)Q根据初始化参数的值判断该h是否合法<br>DQ如果该h不合法则d该请?br>EQ如果该h合法则调用chain.doFilterҎ(gu)该h向后l传?br>***************************************************************************************<br><br><br>八、Servletqo(h)器对响应的过滤:(x)<br>***************************************************************************************<br>AQ过滤器截获客户端的h<br>BQ重新封装ServletResponseQ在装后的ServletResponse中提供用戯定义的输出流<br>CQ将h向后l传?br>DQWeblg产生响应<br>EQ从装后的ServletResponse中获取用戯定义的输出流<br>FQ将响应内容通过用户自定义的输出写入到~冲中<br>GQ在~冲中修改响应的内容后清空~冲,输出响应内容<br>***************************************************************************************<br><br>?ji)、Servletqo(h)器的发布Q?br>***************************************************************************************<br>AQ发布Servletqo(h)器时Q必dweb.xml文g中加?lt;filter>元素?lt;filter-mapping>元素?br><br>BQ?lt;filter>元素用来定义一个过滤器Q?br>属?nbsp;                  含义<br>filter-name    指定qo(h)器的名字<br>filter-class    指定qo(h)器的cd<br>init-param    滤器实例提供初始化参敎ͼ可以有多?br><br>CQ?lt;filter-mapping>元素用于过滤器和URL兌Q?br>属?nbsp;                    含义<br>filter-name    指定qo(h)器的名字<br>url-pattern    指定和过滤器兌的URLQؓ(f)”/*”表示所有URL<br>***************************************************************************************<br><br><br>十一、Servletqo(h)器用的注意事项<br>***************************************************************************************<br>AQ由于Filter、FilterConfig、FilterChain都是位于javax.servlet包下Qƈ非HTTP包所Ҏ(gu)的,所以其中所用到的请求、响应对象ServletRequest、ServletResponse在用前都必d转换成HttpServletRequest、HttpServletResponse再进行下一步操作?br><br>BQ在web.xml中配|Servlet和Servletqo(h)器,应该先声明过滤器元素Q再声明Servlet元素<br><br><br>CQ如果要在Servlet中观察过滤器生成的日志,应该保在server.xml的localhost对应?lt;host>元素中配|如?lt;logger>元素Q?br><Logger className = “org.apache.catalina.logger.FileLogger”<br>directory = “logs”prefix = “localhost_log.”suffix=”.txt”<br>timestamp = “true”/><br>*************************************************************************************** <img src ="http://www.aygfsteel.com/simie/aggbug/127497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/simie/" target="_blank">和田?/a> 2007-07-02 12:13 <a href="http://www.aygfsteel.com/simie/archive/2007/07/02/127497.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">˫</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>