您必备的参考资?/p>
![]() |
|
U别: 初
Roy Miller
(roy@roywmiller.com), 创始人兼总裁, The Other Road, LLC
2007 q?1 ?15 ?/p>
对于 Java?语言开发h员来_信息q量是一个真正的问题。每个新入行的程序员都要面一个o人畏~的挑战Q要q入的行业是一个具有v量知识的行业。要了解的东西简直太多了。对于有l验的老手来说Q情况只有些微好转。知识量d增大Q仅仅跟上进度就是一个挑战。如果有一份专业h士必备的书籍和网站列表该有多好!本文是q个列表。它包含了每个专业的 Java 语言E序员在书架或浏览器书签中必备的最重要的书c和|站?/blockquote>q些都是您书架上必备的书和应该经怋用的 Web 链接。时间是一w要的资源Q本文帮您回遉K些分心的事情Q把旉专注于最有益于您作ؓJava 语言E序员职业生涯的信息源。尽有多少E序员就有多他们最喜欢的参考资料,但本文收集的q些都是优中选优Q来源于我书架上的私家珍藏和许多 Java 专家的推荐?/p>
我考虑了两U组l这份参考资料列表的Ҏ。我本可以通过主题领域来组l,q也许很有帮助,但主题列表很快就会变得不实用。相反,我选择了另一U方法:通过cd来组l,即书c和 Web 站点?/p>
ȝ来讲Q有l验的老手们用 Web 站点来跟t行业的走势。书c、文章和论文有助于跟上潮,但它们M上更适合于基学习。极富创造性的书籍偶尔会撼动一两个基础性的东西。这L书也在本列表之列?/p>
需要提出的一点警告是Q专注于 Java 语言的书c和 Web 站点数量巨大。您钟爱的未必在q䆾列表里。那q不意味着它们不好。它们只是不在这份列表里而已。可能是因ؓ我还不知道它们。也可能是因为我不认为它们能够算得上是重要资源。不包含一些参考资料是一个评判问题,但如果不q样的话Q您也许p花几时来拖动滚动条Q还要花上成千上万美元来C。如果您作ؓ一个专业的 Java E序员,有一些常用的优秀参考资料,一定要让我知道q些资料。这份列表一直都在更CQ您提出的那些也许就会被收录q去?/p>
每个E序员都会有一些由于经常被当作专业资料参阅而磨坏的书。下列书c应该是 Java 语言E序员的书架上必备的。书很贵Q所以我有意这份列表弄得很短,仅限于重要书c?/p>
Thinking in Java (Bruce Eckel)
Thinking in Java, 3rd edition QBruce Eckel; Prentice Hall PTRQ?002 q_
Java ~程思想Q第3?/font> Q陈昊鹏 {译; 机械工业出版C,2005 q_
Eckel 的书对于学习如何?Java 语言环境中用好面向对象技术极其实用。书中大量的代码样例解释了他所介绍的概c文字出自一个ƈ不认?Java 技术L正确{案的hQ所以相当地实用。Eckel h多种语言的大量经验,q有用面向对象方式进行思考的扎实技能。本书将q些技能放到实用的 Java 语言环境中。他q在写一本新书,名ؓ Thinking in Enterprise Java?/p>Effective Java: Programming Language Guide QJoshua Bloch; Addison-WesleyQ?001 q_
Effective Java 中文?/font> Q潘爱民 ? 机械工业出版C,2003 q_
本书是理解优U Java E序设计原则的最佳书c。大多数材料从其他的 “学?Java ?的书中根本找不到。例如,Bloch 书中关于覆盖equals()
q一章是我读q的最好的参考资料之一。他也在书中包括了很实用的徏议:用接口替代抽象类和灵zM用异常。Bloch ?Sun 公司 Java q_库的架构师,所以他透彻C解这门语a。事实上Q他~写了该语言中大量有用的库。本书必读!The Java Programming Language (Ken Arnold, James Gosling, David Holmes)
The Java Programming Language QKen ArnoldQJames GoslingQDavid Holmes; Addison-WesleyQ?000 q_
Java ~程语言Q第 3 版) Q虞万荣 {译Q中国电力出版社Q?003 q_
q也许是能弄到的最好的 Java 入门ȝ。它q不是一个标准规范,而是一本介l每门语aҎ的可读书籍。这本书在严谨性和教育性方面权衡得很好Q能够让懂编E的速被 Java 语言Q和其丰富的cdQ所吸引?/p>Concurrent Programming in Java: Design Principles and Patterns (Doug Lea)
Concurrent Programming in Java: Design Principles and Patterns, 2nd edition QDoug Lea; Addison-WesleyQ?999 q_
Java q发~程—设计原则与模式Q第二版Q?/font> Qn?{译Q中国电力出版社Q?004 q_
不是每个开发h员都需要如此细致地了解q发性,也不是每个工E师都能辑ֈ本书的水准,但却没有比本书更好的关于q发性编E的概述了。如果您Ҏ感兴,请从q里开始。Lea ?SUNY 的一名专业程序员Q他的和q发性有关的作品和想法都包含在了 JDK 5.0 规范Q引?JSR166Q中Q所以您大可攑ֿQ他所说的关于有效使用 Java 语言的徏议是值得一听的。他是一个很善于沟通的人?/p>Expert One-On-One J2EE Design and Development (Rod Johnson)
Expert One-On-One J2EE Design and Development QRod JohnsonQ?br />WROX: J2EE 设计开发编E指?/font> Q魏 译,电子工业出版C,2003 q_
对于刚接?J2EE 的h来说Q这是唯一的一本如实反映这Ҏ术的书。本书收录了多年的成功经验和p|l验Q不同于其他许多作者,Johnson 乐于失败的l验公诸于众。J2EE 常常都被q度使用。Johnson 的书能帮您避免这一炏V?Refactoring (Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts)
Refactoring: Improving the Design of Existing Code QMartin FowlerQKent BeckQJohn BrantQWilliam OpdykeQDon Roberts; Addison-WesleyQ?999 q_
重构Q改善既有代码的设计Q中文版Q?/font> Q侯?{译Q中国电力出版社 Q?003 q_
Fowler 写了几本现已出版的最行的编E书Q包?Analysis Patterns。他的关?i>重构 的书是这一主题的基本书c。重构代码是被程序员忽略的训l,但却是程序员最直观的想法。重构是在不改变代码l果的前提下改进现有代码的设计。这是保持代码整z的最x式,用这U方法设计的代码L很容易修攏V什么时候进行重构呢Q当代码“散发出味道”时。Fowler 的书里满?Java 语言代码的例子。许?Java 语言集成开发环境(IDEQ(包括?IBM ?EclipseQ都?Fowler 的重构包含了q去Q每一个都使用他的重构名命名,所以熟悉如extract method {重构方法还是很值得的?/p>Design Patterns (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides)
Design Patterns: Elements of Reusable Object Oriented Software QErich GammaQRichard HelmQRalph JohnsonQJohn Vlissides; Addison-WesleyQ?997 q_
设计模式Q可复用面向对象软g的基 Q李英军 {译Q机械工业出版社 Q?005 q_
q是一本在专业E序员圈子里更ؓ有名的书Q基于作者共同的l号Q这本书被认为是 “四人帮QGOFQ之书”。模式是思考和解决普通编E问题时可以重用的方式。学习模式是一门学U。用好模式Q或知道什么时?i>?/i> 使用模式Q是一Ҏ能。忽略模式则是错误的。书中所有的例子都以 C++ 表示Q但 Java 语言是从那里诞生的,?Java 语言E序员由此联pd如何?Java 语言中实现这些模式相对简单一些。熟悉模式ƈ了解如何使用好模式ɾ~程更加单。这使得和其他程序员交流也更单,因ؓ在针寚w用问题的通用解决Ҏ中,模式是描q解x案中彼此协作的大量相关编E概늚快捷方式。一些更为通用的方式,?i>工厂Ҏ 则是普便存在的,甚至存在?Java 语言本n。关于明Z用模式的q个主题Q也可以阅读 Joshua Kerievsky ?Refactoring to PatternsQ该书称可以让代码来告诉您何时实现模式?/p>Patterns of Enterprise Application Architecture (Martin Fowler)
Patterns of Enterprise Application Architecture QMartin Fowler; Addison-WesleyQ?002 q_
企业应用架构模式 Q王怀?{译Q机械工业出版社 Q?004 q_
比v型、一ơ性项目来_企业开发当然代表了更大的挑战。那q不意味着企业开发带来的所有挑战都是新挑战。事实上有些时候,q项开?i>已经 是以前完成过的了。Fowler 做了很多个这L目。他的书提到了一些通用解决ҎQƈ提供了关于用、折中和可选方案的指导。Fowler 在书中包含了一些熟悉的模式Q如模型视图控制器(MVCQ,他也提供了一些您也许不了解的模式Q如处理 Web 站点上特定页面请求或行ؓh?Page Controller 模式。正如您对待大多数模式一P一旦您读过许多模式Q您׃认ؓ “我已经知道那个模式了?。也许是q样Q但有一个用来引用模式的通用表达方式q是很有帮助的。在有多个组Ӟ׃同h开发)的大型项目中Q该cd用是一很好的帮助?/p>UML Distilled: A Brief Guide to the Standard Object Modeling Language QMartin Fowler; Addison-Wesley 2003 q_
UML_aQ标准对象语a明指南(W?版) Q徐家福 译,清华大学出版C?Q?005 q_
对于专业的程序员来说QUML 是一门很重要的通用可视化沟通语aQ但是它被过度用和草率地滥用了。您无需对?UML 沟通了解太多。Martin ?UML 的提gؓ您提供了最核心的东ѝ事实上Q前后的页提供了常规基上可能用到的所有东ѝ该书中 UML 例子的代码都?Java 代码?/p>Test-Driven Development: By Example (Kent Beck)
Test-Driven Development: By Example QKent Beck; Addison-Wesley 2002 q_
试驱动开发(中文版) Q崔?译,中国电力出版C?Q?004 q_
试优先~程ɾ~程发生革命性变化,能助您成为更好的E序员。在写代码之前编写测试开始很难,但却是一威力强大的技能。通过优先~写试Q可使代码更加简单,q确保从一开始它p工作QBeck 实践着他提倡的试优先Q与人合写了 JUnitQ这?Java 语言最行的测试框Ӟ。Beck 的书是权威的参考资料,扩展了的 Money 例子也用 Java 语言写成。Beck 详述了如何用试优先q行 思?/b>Q这也许是许多程序员首先遇到的障)?/p>The Pragmatic Programmer: From Journeyman to Master (Andy Hunt and Dave Thomas)
The Pragmatic Programmer: From Journeyman to Master QAndrew Hunt ?David Thomas; Addison-Wesley 1999 q_
E序员修g道——从工C?Q马l达 译,电子工业出版C?Q?004 q_
做一个纯_的面向对象开发h员有其优势所在。在当今复杂的社会中Q作?Java 语言开发h员,为完成Q务常要妥协。Hunt ?Thomas 探讨了如何不真正重要的东西妥协掉而完成Q务。这不是一本关?Java 语言的书Q而是 Java 语言开发h员重要的思想ȝ。例如,我认为没从“要解决问题Q而不是推卸责仠Z这句忠a中受益的E序员,不能像个自豪的艺术家一样在他的C上签上大名?/p>Peopleware: Productive Projects and Teams (Tom DeMarco and Timothy Lister)
Peopleware: Productive Projects and Teams QTom DeMarcoQTimothy Lister; Dorset HouseQ?999 q_
ZgQ第2版) QUMLChina 译l?译,清华大学出版C?Q?003 q_
q䆾列表中的其他所有书c都臛_和技术有些相兟뀂这本书却不是。在所有技术行话和首字母羃略词的vz中Q有时Y件开发h员和l理们会忘记Q是?/i> 刉了软g。DeMarco ?Lister 向我们提醒了q一事实Q也向我们提醒了形成q一区别的原因。这不是一本关于一门特定编E语a的书c,但却是每?Java 语言E序员都应该ȝ书。关?“篏ȝ序员如何让经理们适得其反?q有许多其他的好书,但这是最好的一本?/p>
![]()
![]()
![]()
![]()
回页?/font>
Web 站点的数目浩如烟P如果您想要消化其中的内容Q穷毕生之力也难以全部访问。包?Java 语言某方面内容的详尽的网站列表会大得谱。下列站炚w是可靠、真实的?/p>
Sun ?Java 语言站点
q是 Sun ?Java 语言ȝ。作?Java 语言开发h员,您会发现自己频繁地访问此站点。下列链接特别重要,特别是对新入行的 Java 语言开发h员:
- New to Java Center
New to Java Center
New to Java Center 存放了许多@序渐q的 Java 技术资源链接。如果您刚接触这门语aQ这是一个好的v炏V?- 教程和代码库
Java Tutorial
q里有大名鼎鼎的 Java TutorialQ以及关?Java 语言各个斚wQ例?CollectionQ的其他教程?
IBM ?developerWorks
推销自己也许有些厚脸皮,?developerWorks 是一巨大的资源Q收录了大量 Java 语言工具和技术的教程和文章。其内容从初学者指南到学习q门语言到高Uƈ发性技术。可以根据主题搜索内容,然后Ҏcd览?/p>Apache Software Foundation
Apache 站点是许多可重用库(通用领域Q和工具的主,q些库和工具帮助 Java 开发h员进行开发。这里的内容全都是开放源码,所以尽下载想要的吧!许多极其行?Java 语言库和工具Q如 Struts、Ant ?TomcatQ都始于 Apache 目。Jakarta 专区汇聚了大多数新兴?Java 语言材料?/p>Eclipse
有几个好?Java 语言集成开发环境(IDEQ。EclipseQ来?IBMQ是最新的 IDE 之一Q它很快成ؓ Java 语言开发的首要 IDE。它完全是开源的Q这意味着它是免费的。该站包含了学习如何有效使用 Eclipse 的各U参考资料。这里还有关?Standard Widget ToolkitQSWTQ的信息QSWT 是相对于 Swing 来说更加轻量U的选择?/p>Eclipse 插g中心 ?Eclipse 插g
Eclipse Z插g架构。事实上Q插件是 Eclipse ?Java 语言开发组件。但有差不多上千个插Ӟ?Web 开发的插g到在 Eclipse 环境中玩游戏的插件。这两个站点分类列出了大多数插gQ可以进行搜索。它们是很棒的资源。如果您惛_ Eclipse 开发环境中弄点C西,q运的话有某个插件可能已l实玎ͼ从这两个站点能找到想要的插g。这两个站点都允许评论插Ӟq样您就可以知道哪些插g好,哪些值得一试?/p>JUnit.org
Junit ?Java 语言中一个基本的单元试框架。该站点包含?Junit 最新最的版本Q外加大量有x试(Java 语言或者其他语a的)各个层面上(针对桌面应用E序、Web 应用E序、J2EE 应用E序{)的其他资源。如果您x试资源Q这里就是最佌v炏V?TheServerSide.com
如果您要(或将?从事服务器端 Java 语言的开发,此站Ҏ一处D重的资源。您可以到这里找到有?JBoss、J2EE、LDAP、Struts 和大量其他主题的文章Qƈ且都是完全可索的。这些文章不仅仅是简单描q?Java 语言的特征或者支持的库。它们更q一步地描述了库的新奇用法(如?Jakarta Velocity 作ؓ规则引擎Q而不是模板引擎)。它们也提供了有?Java 语言现状的连l评论(当前的一文章是?Tim Bray 所写的 Java is boring Q。该站点更好的通用功能之一是对 Java 语言工具和品(应用服务器等Q的矩阵式比较?Bruce Eckel's MindView, Inc.
Eckel 写了几本 “用 …?q行思考?的书Q内容关?Java 语言、Python ?C++ Q当我学?Java 语言Ӟ他的 Thinking in Java Ҏ其有帮助。它很实用ƈ切中要害Q在“在 Java 语言环境中如何面向对象思考”方面具有卓识。您可以从此站点免费下蝲他所有书c的电子版。他也写了许多好文章Qƈ且他把这些文章的链接都放Cq里Q包括关?Jython、Java ?.NET 比较{内容的文章Q?/p>ONJava.com
O'Reilley 历年来出版了一些有关编E语a和工L优秀书籍。他们的专注?Java 语言的网站也不错。它有些有关各种 Java 语言工具Q如 JDOM ?HibernateQ、Java q_Q如 J2SE ?J2EEQ不同领域不同部分的文章。全部都可以被检索到。他们有优秀的文章和教程。该站点按主题排列。例如有 Java ?XML、Java Security、Wireless Java ?Java SysAdmin。该站点也有?O'Reilley Learning Lab 的链接,在那里您能获得在U参考资料(Java 语言相关和其他的Q。那些不是免费的Q但是许多都面向大学认证。因此您可以以一U很方便的方式来学习技能,q得C些认证?java.net C
java.net C有多个“社区”,有特定于主题的论坛和文章。例?Java Desktop C有各cM Java 语言桌面开发相关的资料。Java Patterns C作ؓ一个门P也许Ҏ?Java 语言的模式资源相当感兴趣。还有一?Java User Groups (JUG) CQ在那里能找到有兛_建、加入和理一?JUG 的信息?
![]()
![]()
![]()
![]()
回页?/font>
M “好的”、“关键性的?或?“重要的?参考资料列表都注定是不完整的,本文的列表也未能例外?Java 语言的书c数目众多,当然Q万l网也很庞大。除本文所列的参考资料之外,q有很多用于学习 Java 语言的参考资料。但如果您拥有了q里所提到的所有书c、网站、文章或者教E,您应当已l拥有了一个您良好开端ƈ助您d入室的实用宝库?/p>
最后,要成Z个能力日增和高效?Java 语言开发h员,Ҏ是用它工作Q动手来试。如果有一个教E详l介l了所需创徏的Y件的每一部分Q您很可能ƈ没得到多好处。有Ӟ您可能得走自q路。在成功地尝试了一些新的东西之后,您可能想要写一文章、教E或者一本书来分享您所学到的?/p>
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文 ?br />
- ?developerWorks Java 技术专?/font> 查找更多 Java 技术参考资料?br />
- 讉K Java 技术新手入?/font> 站点Q获取最新的参考资料,帮您开始?Java ~程?br />
- 通过参与 developerWorks blog 加入 developerWorks C?br />
- 览 关于q些主题和其他技术主题的书籍?br />
![]()
![]()
Roy Miller 是一名独立Y件开发培训师、程序员gӞ他在充满挑战、快节奏的咨询公叔R从事了十多年软g开发和目理工作。他最初在 Andersen ConsultingQ现在是 AccentureQ公司工作,在那里,他管理团队实C许多pȝQ从L记帐pȝ到星形模式数据集市。最q三q来Q他在北卡罗来纳?Holly Springs ?RoleModel Software, Inc. 公司工作Q在那里他专业地q用着 Java 技术,q担d发h员兼 Extreme Programming (XP) 培训师。他与h合著?Addison-Wesley XP pd?Extreme Programming Applied: Playing to Win 一书,最q他写了 Managing Software for Growth: Without Fear, Control and the Manufacturing Mindset 一书,来帮助经理和理层理解:?XP q样的敏h建方法ؓ什么比传统的方法更有效?003 q_他创办了自己的公司:The Other RoadQ该公司帮助其他公司了解如何?XP 和被他称?Extreme Business (XB) 的方法{换?/p>
]]>
<context-param> <param-name>productId</param-name>如何从java代码中访问web.xml 中的初始化参?
你可以用externalContext?getInitParameter Ҏ得到他们.例如 如果你的参数如下:<context-param> <param-name>connectionString</param-name> <param-value>jdbc:oracle:thin:scott/tiger@cartman:1521:O901DB</param-value> </context-param>你可以用下面代码访问connectionString :
FacesContext fc = FacesContext.getCurrentInstance();
String connection = fc.getExternalContext().getInitParameter("connectionString");
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <f:loadBundle basename="demo.bundle.Messages" var="Message"/> <html> <head> <title>Input Name Page</title> <script> function gowait() { document.getElementById("main").style.visibility="hidden"; document.getElementById("wait").style.visibility="visible"; } </script> </head> <body bgcolor="white"> <f:view> <div id="main"> <h1><h:outputText value="#{Message.inputname_header}"/></h1> <h:messages style="color: red"/> <h:form id="helloForm"> <h:outputText value="#{Message.prompt}"/> <h:inputText id="userName" value="#{GetNameBean.userName}" required="true"> <f:validateLength minimum="2" maximum="20"/> </h:inputText> <h:commandButton onclick="gowait()" id="submit" action="#{GetNameBean.action}" value="Say Hello" /> </h:form> </div> <div id="wait" style="visibility:hidden; position: absolute; top: 0; left: 0"> <table width="100%" height ="300px"> <tr> <td align="center" valign="middle"> <h2>Please, wait...</h2> </td> </tr> </table> </div> </f:view> </body> </html>
如果你想有一个动画gif囄?L?.."?当表单提交后该图片应该从新加?因此,再一ơ指定图片的id,q且dl过一D|间g时后重新加蝲的代?下面是个例子:
<script> function gowait() { document.getElementById("main").style.visibility="hidden"; document.getElementById("wait").style.visibility="visible"; window.setTimeout('showProgress()', 500); } function showProgress(){ var wg = document.getElementById("waitgif"); wg.src=wg.src; } </script> .... .... .... <img id="waitgif" src="animated.gif">
public void viewPdf(ActionEvent event) { |
jsp1.jsp:
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <f:view> <head> <title>jsp1</title> <link rel="stylesheet" type="text/css" href="./style.css" title="Style"/> </head> <body bgcolor="#ffffff"> TESTING... <h:form id="form1"> <h:panelGrid id="panelgridtest" binding="#{jsp1Bean.component}"/> </h:form> </body> </f:view> </html>
Jsp1Bean.java:
package test; |
faces-config.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> <faces-config> <navigation-rule> <from-view-id>/jsp1</from-view-id> <navigation-case> <from-action>submit</from-action> <to-view-id>/jsp1</to-view-id> <redirect/> </navigation-case> </navigation-rule> <managed-bean> <managed-bean-name>jsp1Bean</managed-bean-name> <managed-bean-class>test.Jsp1Bean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> </faces-config>
This page was made fast and I hope don't be a nuisance to someboby
首先我们定义backbean来管理我们的 selectMany "list" :
<managed-bean> <managed-bean-name>Manager</managed-bean-name> <managed-bean-class>demo.Manager</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-bean>
现在Managercd该有?SelectMany object来管理信?
package demo; |
JSP面的代码如?
<h:selectManyMenu binding="#{Manager.list}">
如果你想使用CheckBox or a ListBox仅仅在JSF文g中该变标{ְ可以??<h:selectManyCheckBox> by either <h:selectManyListbox> or <h:selectManyCheckbox>, it is great!!
单的Ҏ是在commandlink中添加一?action attribute .然后你有一个actionListener ?an action Attribute, 两个都是可行?
但是你还可以使用下面的代?
String viewId = "/edit.jsp"; 如何从java代码中重定向一个JSF面CZ代码如下:
|
EmailValidator.java:
import javax.faces.application.FacesMessage; |
EmailValidatorTag.java: faces-config.xml: mytags.tld: mypage.jsp: import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.el.MethodBinding;
import javax.faces.el.ValueBinding;
import javax.faces.event.ValueChangeEvent;
import javax.faces.webapp.ConverterTag;
import javax.faces.webapp.UIComponentTag;
public class Tags {
// Converter Tags and Validator Tags helper methods
public static String eval(String expression) {
if (expression != null && UIComponentTag.isValueReference(expression)) {
FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
ValueBinding vb = app.createValueBinding(expression);
return "" + vb.getValue(context);
} else {
return expression;
}
}
}import javax.faces.component.UIComponent;
import javax.faces.validator.Validator;
import javax.faces.webapp.ValidatorTag;
import javax.servlet.jsp.JspException;
public class EmailValidatorTag extends ValidatorTag {
private String errorMessage = null;
public EmailValidatorTag() {
setValidatorId("Email");
}
public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; }
public Validator createValidator() throws JspException {
EmailValidator validator = (EmailValidator) super.createValidator();
validator.setErrorMessage(errorMessage);
return validator;
}
public void release() {
errorMessage = null;
}
}<validator>
<validator-id>Email</validator-id>
<validator-class>EmailValidator</validator-class>
</validator>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.2</jspversion>
<shortname>mytags</shortname>
<uri>mytags</uri>
<tag>
<name>validateEmail</name>
<tagclass>EmailValidatorTag</tagclass>
<attribute>
<name>errorMessage</name>
<description>message if a validation error occurs</description>
</attribute>
</tag>
</taglib>
<h:inputText id="email" required="true">
<mytags:validateEmail errorMessage="#{bean.message}"/>
</h:inputText>
]]>
<div align="center"> <h:messages id="errMsgs" styleClass="errorFeedback" layout="table" /> </div>
errorFeedback style class 可能是下面的代码:
.errorFeedback { color: black; vertical-align: middle; background-image: url(/AccountSetup/images/warning_feedback.gif); background-repeat: no-repeat; background-position: left top; font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold; line-height: 18px; font-size: 10pt; text-align: left; text-indent: 22px;}