??xml version="1.0" encoding="utf-8" standalone="yes"?>激情内射亚洲一区二区三区,亚洲网址在线观看,亚洲日本成本人观看http://www.tkk7.com/soufan/zh-cnMon, 12 May 2025 06:11:52 GMTMon, 12 May 2025 06:11:52 GMT60Java 专业人士必备的书c和|站列表http://www.tkk7.com/soufan/archive/2007/01/18/94618.htmlsoufansoufanThu, 18 Jan 2007 05:39:00 GMThttp://www.tkk7.com/soufan/archive/2007/01/18/94618.htmlhttp://www.tkk7.com/soufan/comments/94618.htmlhttp://www.tkk7.com/soufan/archive/2007/01/18/94618.html#Feedback0http://www.tkk7.com/soufan/comments/commentRss/94618.htmlhttp://www.tkk7.com/soufan/services/trackbacks/94618.html

(?Java 专业人士必备的书c和|站列表

您必备的参考资?/p>
文档选项
 

 

未显C需?JavaScript 的文档选项


拓展 Tomcat 应用

下蝲 IBM 开?J2EE 应用服务?WAS CE 新版?V1.1


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 (Joshua Bloch)

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 (Martin Fowler)

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 站点

Web 站点的数目浩如烟P如果您想要消化其中的内容Q穷毕生之力也难以全部访问。包?Java 语言某方面内容的详尽的网站列表会大得谱。下列站炚w是可靠、真实的?/p>

Sun ?Java 技术站?/font>

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

IBM ?developerWorks
推销自己也许有些厚脸皮,?developerWorks 是一巨大的资源Q收录了大量 Java 语言工具和技术的教程和文章。其内容从初学者指南到学习q门语言到高Uƈ发性技术。可以根据主题搜索内容,然后Ҏcd览?/p>

Apache Software Foundation

Apache Software Foundation
Apache 站点是许多可重用库(通用领域Q和工具的主,q些库和工具帮助 Java 开发h员进行开发。这里的内容全都是开放源码,所以尽下载想要的吧!许多极其行?Java 语言库和工具Q如 Struts、Ant ?TomcatQ都始于 Apache 目。Jakarta 专区汇聚了大多数新兴?Java 语言材料?/p>

Eclipse.org

Eclipse
有几个好?Java 语言集成开发环境(IDEQ。EclipseQ来?IBMQ是最新的 IDE 之一Q它很快成ؓ Java 语言开发的首要 IDE。它完全是开源的Q这意味着它是免费的。该站包含了学习如何有效使用 Eclipse 的各U参考资料。这里还有关?Standard Widget ToolkitQSWTQ的信息QSWT 是相对于 Swing 来说更加轻量U的选择?/p>

Eclipse 插g中心?Eclipse 插g

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.org
Junit ?Java 语言中一个基本的单元试框架。该站点包含?Junit 最新最的版本Q外加大量有x试(Java 语言或者其他语a的)各个层面上(针对桌面应用E序、Web 应用E序、J2EE 应用E序{)的其他资源。如果您x试资源Q这里就是最佌v炏V?

TheServerSide.com

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.

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

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

java.net C֌
java.net C֌有多个“社区”,有特定于主题的论坛和文章。例?Java Desktop C֌有各cM Java 语言桌面开发相关的资料。Java Patterns C֌作ؓ一个门P也许Ҏ?Java 语言的模式资源相当感兴趣。还有一?Java User Groups (JUG) C֌Q在那里能找到有兛_建、加入和理一?JUG 的信息?





回页?/font>


l束?/span>

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>

参考资?



关于作?/span>

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>



soufan 2007-01-18 13:39 发表评论
]]>JasperReporthttp://www.tkk7.com/soufan/archive/2006/12/21/89320.htmlsoufansoufanThu, 21 Dec 2006 09:13:00 GMThttp://www.tkk7.com/soufan/archive/2006/12/21/89320.htmlhttp://www.tkk7.com/soufan/comments/89320.htmlhttp://www.tkk7.com/soufan/archive/2006/12/21/89320.html#Feedback0http://www.tkk7.com/soufan/comments/commentRss/89320.htmlhttp://www.tkk7.com/soufan/services/trackbacks/89320.html1Q??


JasperReport是一个强大的开源报表工P它可以传送丰富的报表内容到显C器、打印机或者PDF、HTML、XLS、CSV、XML文g。它完全使用Java~写Q可以在各种Java应用中用来创建动态报表内宏V它的主要目标是用简单灵zȝҎ帮助创徏便于打印的分|档?

JasperReportҎ一个xml报表设计文g来组l从JDBC获得的关pL据库数据。要用数据填充报表,首先必须~译报表。编译xml的报表设计文件是用JasperManagercȝcompileReport()Ҏ完成的?

通过~译Q报表设计被加蝲C个报表设计对象(net.sf.jasperreports.engine.JasperReportcȝ实例Q中q被序列化然后保存。在应用E序用数据填充报表时使用该序列化文g。实际上Q报表编译完成了报表设计中所有的java表达式的~译。很多检查工作在~译期间q行以确保报表设计的完整性,~译后的文g是待填充的报表,以方便应用程序用各种数据集来产生不同的报表文档?

要填充报表,可以使用JasperManagercȝfillReportXXX()Ҏ。这些方法接受一个参C表报表设计——可以是一个JasperDesign对象Q也可以是一个存放该cd象的文g名——还有一个获得填充报表数据的JDBCq接。报表填充的l果是一个表C待打印文档的对象(net.sf.jasperreports.engine.JasperPrintcȝ实例Q,可以被序列化保存以后l箋使用Q或者传送给打印机、显C器Q或者导出成PDF、HTML、XLS、CSV或者XML文g?

2Q?报表设计

一个报表设计表CZ个模版用来被JasperReport引擎填充数据q传送到屏幕、打印机或者Web。数据库的数据根据报表设计被l织来填充报表以得到待打印的分页文档。报表设计都保存C个特定结构的一个XML文g中,文gl构定义在一个JasperReport引擎可以识别的DTD文g中。然后这些xml文g会被~译以准备报表填充操作?

创徏一个报表设计(模版Q,必须按照如下l构~辑一个xml文gQ?

<?xml version="1.0"?>
<!DOCTYPE jasperReport
PUBLIC "-//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<jasperReport name="name_of_the_report" ... >
...
</jasperReport>

3Q?报表参数

报表参数是传递给报表填充操作的对象的引用Qؓ报表引擎传递它无法在数据源中找到的数据是非常有用的。例如,我们可以登陆执行报表填充操作的用户名传l引擎,q样我们可以在报表上昄制表人或者动态改变报表的标题?

一个用报表参数的重要作用是完成报表的动态查询语句,以报表获得的数据更加符合要求,q些参数像报表数据的过滤器?

在报表中声明参数非常单,只需要指定名U和cdQjavac)Q?

<parameter name="ReportTitle" class="java.lang.String"/>

<parameter name="MaxOrderID" class="java.lang.Integer"/>

<parameter name="SummaryImage" class="java.awt.Image"/>

可以用两U方法在查询语句中用报表参敎ͼ

1. 像通常在java.sql.PreparedStatement中用参CP

SELECT * FROM Orders WHERE OrderID <= $P{MaxOrderID} ORDER BY ShipCountry

2. 有时需要用参数来动态改变SQL查询的部分语句或者将整个SQL语句作ؓ参数传给报表Q在q种情况下,语法有一点不同,如下Q?

SELECT * FROM Orders ORDER BY $P!{OrderByClause}

q有一些报表内建的pȝ参数可以直接在表辑ּ中用:

REPORT_PARAMETERS_MAP

REPORT_CONNECTION

REPORT_DATA_SOURCE

REPORT_SCRIPTLET

4Q?数据?

JasperReport只是各种cd的数据源Qƈ提供一个JRDataSource的接口。该有一个缺省的实现c(JRResultSetDataSource classQ包装了ResultSet对象Q允怋用Q何通过JDBCq接的数据库。用JDBC数据源时Q即可以通过数据库q接传给报表填充引擎q在报表定义中指定一个SQL查询语句Q参考dtd定义中的<queryString>元素Q来提供数据Q也可以直接用ResultSet作参数生成JRResultSetDataSource对象来提供数据?

对于其他的数据源Q也不会太麻烦,只需要实现JRDataSource接口来创q数据源类?

5Q?字段

报表字段提供了唯一映射数据源中数据到报表数据的方式。如果数据源是ResultSet对象Q报表字D必d应ResultSet对象中的列,是说报表字D必d对应的列有相同的名字和匹配的cd?

例如Q我们要创徏的报表需要用Employees表的数据Q该表结构如下:

Column Name Datatype Length
--------------------------------------
EmployeeID int 4
LastName varchar 20
FirstName varchar 10
HireDate datetime 8
我们可以在报表设计文件中定义如下的字D:

<field name="EmployeeID" class="java.lang.Integer"/>
<field name="LastName" class="java.lang.String"/>
<field name="FirstName" class="java.lang.String"/>
<field name="HireDate" class="java.util.Date"/>
如果我们生命一个报表字D在ResultSet中没有对应的列,则会在运行时抛出异常。当然ResultSet中的列没有被声明为报表字D不会媄响报表的数据填充Q但是他们仍然是可以讉K的?

6Q?表达?

表达式是JasperReport的一个很强大有用的特性。用表达式可以:声明报表变量来完成各U计,为数据分l,指定报表文本字段内容或对其他报表对象的显C行更灉|的定制。基本上Q所有的报表表达式都是Java表达式,q且可以引用报表字段和报表变量?

在报表设计的xml文g中有诸多定义表达式的元素Q?lt;variableExpression>, <initialValueExpression>, <groupExpression>, <printWhenExpression>, <imageExpression> ?lt;textFieldExpression>?

要在在表辑ּ中引用报表字D,字段名必d?F{和}W号之间。例如,如果我们要在一个文本域中连接两个字D,我们可以像下面定义表辑ּQ?

<textFieldExpression>
$F{FirstName} + " " + $F{LastName}
</textFieldExpression>
表达式可以更复杂Q?

<textFieldExpression>
$F{FirstName} + " " + $F{LastName} + " was hired on " +
(new SimpleDateFormat("MM/dd/yyyy")).format($F{HireDate}) + "."
</textFieldExpression>
要在表达式中引用一个变量,必须变量名写在$V{和}W号之间Q如下:

<textFieldExpression>
"Total quantity : " + $V{QuantitySum} + " kg."
</textFieldExpression>
对于报表参数也是同样的语法,只不q参数名必须写在$P{和}W号之间Q?

<textFieldExpression>
"Max Order ID is : " + $P{MaxOrderID}
</textFieldExpression>

7Q?变量

报表变量是在表达式之前构建的专用对象。变量只声明一ơ,而可以在整个报表设计中重复用,q在对应的表辑ּ中完成大量的计算Q从而简化了报表设计。在表达式中Q一个变量可以引用其它变量,但是被引用变量必d引用变量之前声明。所以变量的声明序Ҏ表设计也是很重要的?

变量q可以声明来完成引擎内徏计算的求|如:count、sum、average、lowest、highest、variance{等。一个完成Quantity字段sum计算的变量定义如下:

<variable name="QuantitySum"

class="java.lang.Double" calculation="Sum">

<variableExpression>$F{Quantity}</variableExpression>

</variable>

我们q可以通过制定初始化别来改变计算q程Q默认的U别是Report是变量仅在报表开始处初始化一ơ,一直到报表l束完成计算。我们可以选择更低的别让变量在每个Page、Column或者GroupU别重新初始化。假如我们想计算计算每页的LQ变量声明如下:

<variable name="QuantitySum" class="java.lang.Double"
resetType="Page" calculation="Sum">
<variableExpression>$F{Quantity}</variableExpression>
<initialValueExpression>new Double(0) </initialValueExpression>
</variable>
变量在每一늚开始处被初始化??

引擎q提供了如下的内建变量可以在表达式中直接使用Q?

PAGE_NUMBER
COLUMN_NUMBER
REPORT_COUNT
PAGE_COUNT
COLUMN_COUNT
GroupName_COUNT

8Q?报表区域

在创建报表模板时Q我们需要定义报表区域的内容和风根{一个完全的报表模板包括如下几个区域Q?lt;title>, <pageHeader>, <columnHeader>, <groupHeader>, <detail>, <groupFooter>, <columnFoter>, <pageFooter>, <summary>。区域是报表的重要组成部分,它有指定的高度和宽度Qƈ且可以容U直Uѝ矩形、图片或者文本域{报表对象。我们用<band>标签在报表模板xml文g中定义报表区域的内容和风根{下面是一个PageHeader区域的定义,它仅仅包含一条直U和一个静态文本:

<pageHeader>
<band height="30">
<rectangle>
<reportElement x="0" y="0" width="555" height="25"/>
<graphicElement/>
</rectangle>
<staticText>
<reportElement x="0" y="0" width="555" height="25"/>
<textElement textAlignment="Center">
<font fontName="Helvetica" size="18"/>
</textElement>
<text>Northwind Order List</text>
</staticText>
</band>
</pageHeader>

9Q?分组

l表CZU分l组l数据的方式。填充报表数据时QJasperReport引擎计算所有定义的分组表达式检查是否出现组边界Q表辑ּ的值改变)Q如果遇到组边界则将<groupFooter>?lt;groupHeader>报表区域加入报表?

报表可以包含L多的分组Q组在报表中的声明顺序很重要Q因为组之间怺包含。一个组包含其后声明l依此类推,一个大的组遇到边界Q所有的子组都将被重新初始化。一个报表组跟其数据分组表达式一起定义,同时q需要定义两个报表分l区域:分组头区域和分组֌域?

关于分组的详l信息参考分l的报表CZ?

10Q?字体和Unicode支持

现在你可以用M语言来创建报表?lt;font>元素的新属性允许在Java字体和PDF字体间映。PDF使用特定的字体集使得以前的JasperReport版本没有办法使用它们。新的属性用户可以指定什么PDF字体用来昄不同的字W集QpdfFontName属性)Q什么编码类型(pdfEncoding属性)和是否将字体嵌入PDF文档QisPdfEmbeddedQ?

Z化字体集的用,增加了一个新属?lt;reportFont>。报表字体是报表U别的字体定义用来作为报表中其他昄对象的默认字体。因为对国际字符集的支持不知Z被绑定到iText库,你可以在iText documentation.文当中找到更多关于如何用不同的语a不同的字W集创徏PDF文档的信息?

11Q?Scriptlets

所有的报表昄数据来自报表变量和报表字D,q些数据可以用报表变量和表达式来处理?

有时候报表需要对变量q行Ҏ处理Q一些变量可能在报表的某个事件中Q报表开始、换|者换列)被重新初始化Q而且Q变量在每次从数据源中获得数据时Q每一行)都被计算。而仅仅用单变量表辑ּ无法实现所有的复杂功能Q这时就要用Scriptlet?

因ؓScriptlet主要和报表变量一起工作,完全控制scriptlet的执行时机非帔R要。JasperReport允许Ҏ报表事g定制Java~码BEFORE或者AFTERQReport、Page、Column和Group的初始化来执行Scriptlet?

要用ScriptletQ开发者只需要通过l承net.sf.jasperreports.engine.JRAbstractScriptlet或者net.sf.jasperreports.engine.JRDefaultScriptlet来创建ScritpletcR该定制的ScriptletcM被指定ؓ<jasperReport>的scritpletClass属性的倹{创建Scriptlet时开发这需要实现或者重载如beforeReportInit(), afterReportInit(), beforePageInit(), afterPageInit(), beforeGroupInit(), afterGroupInit(),{方法。这些方法将在填充数据时被引擎在适当的时候调用?

有一个叫做REPORT_SCRIPTLET的默认报表参数表C对报表引擎在填充数据时实例化的Scriptlet对象的引用。它可以在整个报表的M表达式中使用来调用Scriptlet的特定方法整个报表机制更加灉|?

12Q?子报?
子报表是报表工具的重要特性,它允许创建更复杂的报表ƈ化设计工作。自报表在创Z从报表时特别有用?/span>

soufan 2006-12-21 17:13 发表评论
]]>
讉Kweb.xml中的初始化参?/title><link>http://www.tkk7.com/soufan/archive/2006/12/19/88846.html</link><dc:creator>soufan</dc:creator><author>soufan</author><pubDate>Tue, 19 Dec 2006 08:25:00 GMT</pubDate><guid>http://www.tkk7.com/soufan/archive/2006/12/19/88846.html</guid><wfw:comment>http://www.tkk7.com/soufan/comments/88846.html</wfw:comment><comments>http://www.tkk7.com/soufan/archive/2006/12/19/88846.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/soufan/comments/commentRss/88846.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/soufan/services/trackbacks/88846.html</trackback:ping><description><![CDATA[ <h1 class="pagename">如何在JSP面中访问web.xml中的初始化参? </h1> <div style="MARGIN-LEFT: 20px; MARGIN-RIGHT: 15px">你可以用预定义的JSF EL变量  initParam来访?<br />例如,如果你有: <pre><context-param> <param-name>productId</param-name> <h1 class="pagename">如何从java代码中访问web.xml 中的初始化参? </h1><div style="MARGIN-LEFT: 20px; MARGIN-RIGHT: 15px">你可以用externalContext?getInitParameter Ҏ得到他们.例如 如果你的参数如下: <pre><context-param> <param-name>connectionString</param-name> <param-value>jdbc:oracle:thin:scott/tiger@cartman:1521:O901DB</param-value> </context-param> </pre><p>你可以用下面代码访问connectionString : <br clear="all" /></p><div id="ckxlrkx" class="java" align="left"><table cellspacing="0" cellpadding="3" bgcolor="#fcfdfc" border="0"><tbody><tr><td valign="top" nowrap="" align="left"><code><font face="新宋?><font color="#000000">FacesContext fc = FacesContext.getCurrentInstance</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#000000">String connection = fc.getExternalContext</font><font color="#000000">()</font><font color="#000000">.getInitParameter</font><font color="#000000">(</font><font color="#2a00ff">"connectionString"</font><font color="#000000">)</font><font color="#000000">;</font></font></code></td></tr></tbody></table></div><p> </p></div></pre></div> <img src ="http://www.tkk7.com/soufan/aggbug/88846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/soufan/" target="_blank">soufan</a> 2006-12-19 16:25 <a href="http://www.tkk7.com/soufan/archive/2006/12/19/88846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何实现"L?.."面? http://www.tkk7.com/soufan/archive/2006/12/19/88843.htmlsoufansoufanTue, 19 Dec 2006 08:23:00 GMThttp://www.tkk7.com/soufan/archive/2006/12/19/88843.htmlhttp://www.tkk7.com/soufan/comments/88843.htmlhttp://www.tkk7.com/soufan/archive/2006/12/19/88843.html#Feedback0http://www.tkk7.com/soufan/comments/commentRss/88843.htmlhttp://www.tkk7.com/soufan/services/trackbacks/88843.html
在客L实现可能很简?你可以包装JSP面(或者你惌隐藏的一部分)C个div?然后你可以添加更多div,当用LL交按钮时q些div出现.q些div可以包含gif动画和其他内?
场景:当用LL?调用JS函数,该函数隐藏页面ƈ且显C?L?.."div.你可以用CSS来自定义外观:
下面是一个正常工作的例子:
<%@ 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">


soufan 2006-12-19 16:23 发表评论
]]>
如何在JSF中下载PDF文g? http://www.tkk7.com/soufan/archive/2006/12/19/88839.htmlsoufansoufanTue, 19 Dec 2006 08:20:00 GMThttp://www.tkk7.com/soufan/archive/2006/12/19/88839.htmlhttp://www.tkk7.com/soufan/comments/88839.htmlhttp://www.tkk7.com/soufan/archive/2006/12/19/88839.html#Feedback0http://www.tkk7.com/soufan/comments/commentRss/88839.htmlhttp://www.tkk7.com/soufan/services/trackbacks/88839.html下面是一个用action listener 的一个例?
d下面的代码到backing bean的action listener?
public void viewPdf(ActionEvent event) {
 String filename = "filename.pdf";

 // use your own method that reads file to the byte array
 byte[] pdf = getTheContentOfTheFile(filename)

 FacesContext faces = FacesContext.getCurrentInstance();
 HttpServletResponse response = (HttpServletResponsefaces.getExternalContext().getResponse();
 response.setContentType("application/pdf");
 response.setContentLength(pdf.length);
 response.setHeader"Content-disposition""inline; filename=\""+fileName+"\"");
 try {
  ServletOutputStream out;
  out = response.getOutputStream();
  out.write(pdf);
 catch (IOException e) {
  e.printStackTrace();
 }
 faces.responseComplete();
}


soufan 2006-12-19 16:20 发表评论
]]>
使用backing bean来添加UIComponents 到页面中http://www.tkk7.com/soufan/archive/2006/12/19/88834.htmlsoufansoufanTue, 19 Dec 2006 08:14:00 GMThttp://www.tkk7.com/soufan/archive/2006/12/19/88834.htmlhttp://www.tkk7.com/soufan/comments/88834.htmlhttp://www.tkk7.com/soufan/archive/2006/12/19/88834.html#Feedback0http://www.tkk7.com/soufan/comments/commentRss/88834.htmlhttp://www.tkk7.com/soufan/services/trackbacks/88834.html 使用backing bean来添加UIComponents 到页面中?
下面是一个例?

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;
 
import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.component.UIPanel;
import javax.faces.component.UIViewRoot;
import javax.faces.component.html.HtmlInputText;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.context.FacesContext;
 
public class Jsp1Bean
{
    UIComponent component = null;
    FacesContext facesContext = FacesContext.getCurrentInstance();
    UIViewRoot uIViewRoot = facesContext.getViewRoot();
    Application application = facesContext.getApplication();
 
    public Jsp1Bean()
    {
    }
 
    public UIComponent getComponent()
    {
        if (component == null)
        {
            component = new UIPanel();
        }
        return component;
    }
 
    public void setComponent(UIComponent component)
    {
        this.component = component;
    }
 
     //initialization block
    {
        try
        {
            //outputText1
            HtmlOutputText outputText1 = (HtmlOutputText
              facesContext.getApplication().createComponent(HtmlOutputText.COMPONENT_TYPE);
            outputText1.setValue("---the outputText1 value---");
            //inputText1
            HtmlInputText inputText1 = (HtmlInputText)
                facesContext.getApplication().createComponent(HtmlInputText.COMPONENT_TYPE);
            inputText1.setValue("---the inputText1 value---");
 
            //add outputText1 and inputText1 to component ("UIPanel")
            this.getComponent().getChildren().add(outputText1);
            this.getComponent().getChildren().add(inputText1);
        }
        catch (java.lang.Throwable t)
        {
            System.out.println("java.lang.Throwable exception encountered...t.getMessage()=" + t.getMessage());
            t.printStackTrace();
        }
    }
 
    public String doAction()
    {
        return "submit";
    }
}

 

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>


soufan 2006-12-19 16:14 发表评论
]]>
如何在BackBean中用SelectMany 对象? http://www.tkk7.com/soufan/archive/2006/12/19/88828.htmlsoufansoufanTue, 19 Dec 2006 08:12:00 GMThttp://www.tkk7.com/soufan/archive/2006/12/19/88828.htmlhttp://www.tkk7.com/soufan/comments/88828.htmlhttp://www.tkk7.com/soufan/archive/2006/12/19/88828.html#Feedback0http://www.tkk7.com/soufan/comments/commentRss/88828.htmlhttp://www.tkk7.com/soufan/services/trackbacks/88828.html 如何在BackBean中用SelectMany 对象?
Hi.

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;
import javax.faces.component.UISelectMany;
import javax.faces.component.UIComponent;

class Manager{
   
    private UISelectMany list;
       

      /*
       * Here we must create our list of objects
       * obviously we may add a cycle "while" or "for" 
       * if we wouldn't know the number of items
       */ 
    public UIComponentBase getList(){
      
         list=new UISelectMany();
         SelectItem item = new SelectItem"value""Description" );
         UISelectItem uiItem = new UISelectItem();
         uiItem.setValueitem );
         
         list.getChildren().adduiItem );
      
      return list;
    }

    public void setList(UIComponentBase list){
        this.list=(UISelectMany)list; 
    }
    
   public void actionListener(ActionEvent ev){
       
       Object obj [] = list.getSelectedValues();
       // obj is an array of string that contents the values of our selectItems
   }

}

 

JSP面的代码如? 

<h:selectManyMenu binding="#{Manager.list}">

如果你想使用CheckBox or a ListBox仅仅在JSF文g中该变标{ְ可以??<h:selectManyCheckBox> by either <h:selectManyListbox> or <h:selectManyCheckbox>, it is great!!



soufan 2006-12-19 16:12 发表评论
]]>
jsf foward to another JSP from http://www.tkk7.com/soufan/archive/2006/12/19/88824.htmlsoufansoufanTue, 19 Dec 2006 08:10:00 GMThttp://www.tkk7.com/soufan/archive/2006/12/19/88824.htmlhttp://www.tkk7.com/soufan/comments/88824.htmlhttp://www.tkk7.com/soufan/archive/2006/12/19/88824.html#Feedback0http://www.tkk7.com/soufan/comments/commentRss/88824.htmlhttp://www.tkk7.com/soufan/services/trackbacks/88824.html How to change destination JSP from within RENDER_RESPONSE phase?

public void 
beforePhase ( PhaseEvent arg0
{
if ( arg0.getPhaseId () == PhaseId.RENDER_RESPONSE )
{
   FacesContext facesContext = arg0.getFacesContext () ;
   ViewHandler vh  = facesContext.getApplication () .getViewHandler () ;
   UIViewRoot newRoot = vh.createView ( facesContext,  "/yourNew.jsp" ) ;
   facesContext.setViewRoot ( newRoot ) ;
}



How to foward to another JSP from an actionListener ActionEvent

有两U方?

单的Ҏ是在commandlink中添加一?action attribute  .然后你有一个actionListener ?an action Attribute, 两个都是可行?

但是你还可以使用下面的代?

String viewId = "/edit.jsp";
FacesContext context = FacesContext.getCurrentInstance();
UIViewRoot view = context.getApplication().getViewHandler().createView(context, viewId);
view.setViewId(viewId);
context.setViewRoot(view);
context.renderResponse();


如何从java代码中重定向一个JSF面

CZ代码如下:

public static void redirectPage(String szPage)
{
 FacesContext context = FacesContext.getCurrentInstance();
 javax.faces.application.Application app = context.getApplication();
 UIViewRoot view = app.getViewHandler().createView(context, szPage);
 context.setViewRoot(view);
 context.renderResponse();
}


soufan 2006-12-19 16:10 发表评论
]]>如何创徏自定义验证器http://www.tkk7.com/soufan/archive/2006/12/19/88821.htmlsoufansoufanTue, 19 Dec 2006 08:02:00 GMThttp://www.tkk7.com/soufan/archive/2006/12/19/88821.htmlhttp://www.tkk7.com/soufan/comments/88821.htmlhttp://www.tkk7.com/soufan/archive/2006/12/19/88821.html#Feedback0http://www.tkk7.com/soufan/comments/commentRss/88821.htmlhttp://www.tkk7.com/soufan/services/trackbacks/88821.html Q{Q?br />下面是一个email验证器的CZ:  

EmailValidator.java:

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
 
public class EmailValidator implements Validator {
 
    private String errorMessage = null;
 
    public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; }
 
    public void validate(FacesContext context, UIComponent component, Object value) {
        if (null == value) {
            return;
        }
 
        String email = (Stringvalue;
 
        if (-== email.indexOf('@'1|| -== email.indexOf('.')) {
            if (errorMessage != null) {
                throw new ValidatorException(new FacesMessage(Tags.eval(errorMessage)));
            else {
                // use default validator message
                throw new ValidatorException(null);
            }
        }
    }
}

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;
        }
    }
}

 

 

 

EmailValidatorTag.java:

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 = (EmailValidatorsuper.createValidator();
        validator.setErrorMessage(errorMessage);
 
        return validator;
    }
 
    public void release() {
        errorMessage = null;
    }
}

 

 

faces-config.xml:

<validator>
    <validator-id>Email</validator-id>
    <validator-class>EmailValidator</validator-class>
</validator>

mytags.tld:

<?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>

 

mypage.jsp:

<h:inputText id="email" required="true">
    <mytags:validateEmail errorMessage="#{bean.message}"/>
</h:inputText>


soufan 2006-12-19 16:02 发表评论
]]>
如何为每一个错误消息显CZ个图?/title><link>http://www.tkk7.com/soufan/archive/2006/12/19/88819.html</link><dc:creator>soufan</dc:creator><author>soufan</author><pubDate>Tue, 19 Dec 2006 07:59:00 GMT</pubDate><guid>http://www.tkk7.com/soufan/archive/2006/12/19/88819.html</guid><wfw:comment>http://www.tkk7.com/soufan/comments/88819.html</wfw:comment><comments>http://www.tkk7.com/soufan/archive/2006/12/19/88819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/soufan/comments/commentRss/88819.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/soufan/services/trackbacks/88819.html</trackback:ping><description><![CDATA[ <h1 class="pagename"> <a >如何为每一个错误消息显CZ个图?/a> </h1>使用CSS style来实现该功能.例如,你有如下的代码来昄消息: <pre><div align="center"> <h:messages id="errMsgs" styleClass="errorFeedback" layout="table" /> </div></pre><p>  errorFeedback style class 可能是下面的代码:<br /></p><pre>.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;} </pre><img src ="http://www.tkk7.com/soufan/aggbug/88819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/soufan/" target="_blank">soufan</a> 2006-12-19 15:59 <a href="http://www.tkk7.com/soufan/archive/2006/12/19/88819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://wwwfafa98.com" target="_blank">˳ëƬ߲</a>| <a href="http://234an.com" target="_blank">޾Ʒ߹ۿƵ</a>| <a href="http://yiqigxfc.com" target="_blank">޳aƬ߲</a>| <a href="http://js-jiarui.com" target="_blank">þþþþþ99Ʒ </a>| <a href="http://www79909c.com" target="_blank">˳aƬվ</a>| <a href="http://binz132.com" target="_blank">õƵƵ</a>| <a href="http://wwwff113.com" target="_blank">avһ</a>| <a href="http://hbgksy.com" target="_blank">AV</a>| <a href="http://gsonlinet.com" target="_blank">ޱٸ뼤</a>| <a href="http://xianliwang.com" target="_blank">ҹƷѹۿ</a>| <a href="http://thegaybdsm.com" target="_blank">ձϵ1ҳϵ</a>| <a href="http://wusongtv.com" target="_blank">һƵ</a>| <a href="http://huianpawn.com" target="_blank">ƷŮþþ</a>| <a href="http://kmrghj.com" target="_blank">AV˾Ʒ</a>| <a href="http://vip98888.com" target="_blank">ѹվ߹ۿ15</a>| <a href="http://wwwy66y6.com" target="_blank">޳AVۺ߹ۿ</a>| <a href="http://xxxxcccc.com" target="_blank">ëƬѹۿ</a>| <a href="http://0147222.com" target="_blank">ҳַȫѹۿ12վ </a>| <a href="http://imfever.com" target="_blank">Ʒ޲һ</a>| <a href="http://666za.com" target="_blank">һѹۿձwwwƵ </a>| <a href="http://koukoub.com" target="_blank">Ů˳Ժ˾޸</a>| <a href="http://8mav938.com" target="_blank">2019Ļ</a>| <a href="http://44168888.com" target="_blank">ձһƵۿ</a>| <a href="http://8mav938.com" target="_blank">þþþAVרɫ</a>| <a href="http://xmjcjc.com" target="_blank">߹ۿ˳Ƶڵ</a>| <a href="http://952268.com" target="_blank">޾ƷƵ߹ۿ</a>| <a href="http://eddiekidd.com" target="_blank">ҹƵѳ</a>| <a href="http://zzzttt669.com" target="_blank">Ƶ</a>| <a href="http://7uj3.com" target="_blank">˳ɼ߲</a>| <a href="http://yiqigxfc.com" target="_blank">պ޹ۺϾþþ</a>| <a href="http://theav25.com" target="_blank">Ƭѿ</a>| <a href="http://xxxxnii.com" target="_blank">޹˳þþƷ</a>| <a href="http://imqun.com" target="_blank">ѹۿһëƬa</a>| <a href="http://juguanghr.com" target="_blank">޵Ƶѹۿ1000</a>| <a href="http://lebaojj.com" target="_blank">պAvҹҹˬ</a>| <a href="http://selaohu.com" target="_blank">ٸ̫߳ˬ߹ۿ</a>| <a href="http://delvheng.com" target="_blank">91ƷվƷ</a>| <a href="http://91ptv.com" target="_blank">VVA</a>| <a href="http://qihongxia.com" target="_blank">žӰ߹ۿѸ </a>| <a href="http://xuanzhicity.com" target="_blank">A߹ۿվȫ</a>| <a href="http://4922000.com" target="_blank">eeussӰԺsscom</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>