??xml version="1.0" encoding="utf-8" standalone="yes"?>男人亚洲天堂,亚洲成人在线,在线精品小视频http://www.aygfsteel.com/soufan/zh-cnSun, 06 Jul 2025 19:08:39 GMTSun, 06 Jul 2025 19:08:39 GMT60Java 专业人士必备的书c和|站列表http://www.aygfsteel.com/soufan/archive/2007/01/18/94618.htmlsoufansoufanThu, 18 Jan 2007 05:39:00 GMThttp://www.aygfsteel.com/soufan/archive/2007/01/18/94618.htmlhttp://www.aygfsteel.com/soufan/comments/94618.htmlhttp://www.aygfsteel.com/soufan/archive/2007/01/18/94618.html#Feedback0http://www.aygfsteel.com/soufan/comments/commentRss/94618.htmlhttp://www.aygfsteel.com/soufan/services/trackbacks/94618.html

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

(zhn)必备的参考资?/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员来_(d)信息q量是一个真正的问题。每个新入行的程序员都要面(f)一个o(h)人畏~的挑战Q要q入的行业是一个具有v量知识的行业。要?jin)解的东西简直太多了(jin)。对于有l验的老手来说Q情况只有些微好转。知识量d增大Q仅仅跟上进度就是一个挑战。如果有一份专业h士必备的书籍和网站列表该有多好!本文是q个列表。它包含?jin)每个专业?Java 语言E序员在书架或浏览器书签中必备的最重要的书c和|站?/blockquote>

q些都是(zhn)书架上必备的书和应该经怋用的 Web 链接。时间是一w要的资源Q本文帮(zhn)回遉K些分?j)的事情Q把旉专注于最有益于?zhn)作?f)Java 语言E序员职业生涯的信息源。尽有多少E序员就有多他们最喜欢的参考资料,但本文收集的q些都是优中选优Q来源于我书架上的私家珍藏和许多 Java 专家的推荐?/p>

我考虑?jin)两U组l这份参考资料列表的Ҏ(gu)。我本可以通过主题领域来组l,q也许很有帮助,但主题列表很快就?x)变得不实用。相反,我选择?jin)另一U方法:(x)通过cd来组l,即书c和 Web 站点?/p>

ȝ来讲Q有l验的老手们用 Web 站点来跟t行业的走势。书c、文章和论文有助于跟上潮,但它们M上更适合于基学习(fn)。极富创造性的书籍偶尔?x)撼动一两个基础性的东西。这L(fng)书也在本列表之列?/p>

需要提出的一点警告是Q专注于 Java 语言的书c和 Web 站点数量巨大。?zhn)钟爱的未必在q䆾列表里。那q不意味着它们不好。它们只是不在这份列表里而已。可能是因ؓ(f)我还不知道它们。也可能是因为我不认为它们能够算得上是重要资源。不包含一些参考资料是一个评判问题,但如果不q样的话Q?zhn)也许p花几时来拖动滚动条Q还要花上成千上万美元来C。如果?zhn)作?f)一个专业的 Java E序员,有一些常用的优秀参考资料,一定要让我知道q些资料。这份列表一直都在更CQ?zhn)提出的那些也许就会(x)被收录q去?/p>

书籍

每个E序员都?x)有一些由于经常被当作专业资料参阅而磨坏的书。下列书c应该是 Java 语言E序员的书架上必备的。书很贵Q所以我有意这份列表弄得很短,仅限于重要书c?/p>

Thinking in Java (Bruce Eckel)

Thinking in Java, 3rd edition QBruce Eckel; Prentice Hall PTRQ?002 q_(d)(j)
Java ~程思想Q第3?/font> Q陈昊鹏 {译; 机械工业出版C,2005 q_(d)(j)
Eckel 的书对于学习(fn)如何?Java 语言环境中用好面向对象技术极其实用。书中大量的代码样例解释?jin)他所介绍的概c(din)文字出自一个ƈ不认?Java 技术L正确{案的hQ所以相当地实用。Eckel h多种语言的大量经验,q有用面向对象方式进行思考的扎实技能。本书将q些技能放到实用的 Java 语言环境中。他q在写一本新书,名ؓ(f) Thinking in Enterprise Java?/p>

Effective Java (Joshua Bloch)

Effective Java: Programming Language Guide QJoshua Bloch; Addison-WesleyQ?001 q_(d)(j)
Effective Java 中文?/font> Q潘爱民 ? 机械工业出版C,2003 q_(d)(j)
本书是理解优U Java E序设计原则的最佳书c。大多数材料从其他的 “学?Java ?的书中根本找不到。例如,Bloch 书中关于覆盖 equals() q一章是我读q的最好的参考资料之一。他也在书中包括?jin)很实用的徏议?x)用接口替代抽象类和灵zM用异常。Bloch ?Sun 公司 Java q_库的架构师,所以他透彻C(jin)解这门语a。事实上Q他~写?jin)该语言中大量有用的库。本书必读!

The Java Programming Language (Ken Arnold, James Gosling, David Holmes)

The Java Programming Language QKen ArnoldQJames GoslingQDavid Holmes; Addison-WesleyQ?000 q_(d)(j)
Java ~程语言Q第 3 版)(j) Q虞万荣 {译Q中国电(sh)力出版社Q?003 q_(d)(j)
q也许是能弄到的最好的 Java 入门ȝ。它q不是一个标准规范,而是一本介l每门语aҎ(gu)的可读书籍。这本书在严谨性和教育性方面权衡得很好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_(d)(j)
Java q发~程—设计原则与模式Q第二版Q?/font> Qn?{译Q中国电(sh)力出版社Q?004 q_(d)(j)
不是每个开发h员都需要如此细致地?jin)解q发性,也不是每个工E师都能辑ֈ本书的水准,但却没有比本书更好的关于q发性编E的概述?jin)。如果?zhn)?gu)感兴,请从q里开始。Lea ?SUNY 的一名专业程序员Q他的和q发性有关的作品和想法都包含在了(jin) JDK 5.0 规范Q引?JSR166Q中Q所以?zhn)大可攑ֿ?j)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魏 译,?sh)子工业出版C,2003 q_(d)(j)
对于刚接?J2EE 的h来说Q这是唯一的一本如实反映这Ҏ(gu)术的书。本书收录了(jin)多年的成功经验和p|l验Q不同于其他许多作者,Johnson 乐于失败的l验公诸于众。J2EE 常常都被q度使用。Johnson 的书能帮(zhn)避免这一炏V?

Refactoring (Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts)

Refactoring: Improving the Design of Existing Code QMartin FowlerQKent BeckQJohn BrantQW(xu)illiam OpdykeQDon Roberts; Addison-WesleyQ?999 q_(d)(j)
重构Q改善既有代码的设计Q中文版Q?/font> Q侯?{译Q中国电(sh)力出版社 Q?003 q_(d)(j)
Fowler 写了(jin)几本现已出版的最行的编E书Q包?Analysis Patterns。他的关?i>重构 的书是这一主题的基本书c。重构代码是被程序员忽略的训l,但却是程序员最直观的想法。重构是在不改变代码l果的前提下改进现有代码的设计。这是保持代码整z的最x式,用这U方法设计的代码L很容易修攏V什么时候进行重构呢Q当代码“散发出味道”时。Fowler 的书里满?Java 语言代码的例子。许?Java 语言集成开发环境(IDEQ(包括?IBM ?EclipseQ都?Fowler 的重构包含了(jin)q去Q每一个都使用他的重构名命名,所以熟(zhn)如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_(d)(j)
设计模式Q可复用面向对象软g的基 Q李英军 {译Q机械工业出版社 Q?005 q_(d)(j)
q是一本在专业E序员圈子里更ؓ(f)有名的书Q基于作者共同的l号Q这本书被认为是 “四人帮QGOFQ之书”。模式是思考和解决普通编E问题时可以重用的方式。学?fn)模式是一门学U。用好模式Q或知道什么时?i>?/i> 使用模式Q是一Ҏ(gu)能。忽略模式则是错误的。书中所有的例子都以 C++ 表示Q但 Java 语言是从那里诞生的,?Java 语言E序员由此联pd如何?Java 语言中实现这些模式相对简单一些。熟(zhn)模式ƈ?jin)解如何使用好模式ɾ~程更加单。这使得和其他程序员交流也更单,因ؓ(f)在针寚w用问题的通用解决Ҏ(gu)中,模式是描q解x案中彼此协作的大量相关编E概늚快捷方式。一些更为通用的方式,?i>工厂Ҏ(gu) 则是普便存在的,甚至存在?Java 语言本n。关于明Z用模式的q个主题Q也可以阅读 Joshua Kerievsky ?Refactoring to PatternsQ该书称可以让代码来告诉(zhn)何时实现模式?/p>

Patterns of Enterprise Application Architecture (Martin Fowler)

Patterns of Enterprise Application Architecture QMartin Fowler; Addison-WesleyQ?002 q_(d)(j)
企业应用架构模式 Q王怀?{译Q机械工业出版社 Q?004 q_(d)(j)
比v型、一ơ性项目来_(d)企业开发当然代表了(jin)更大的挑战。那q不意味着企业开发带来的所有挑战都是新挑战。事实上有些时候,q项开?i>已经 是以前完成过的了(jin)。Fowler 做了(jin)很多个这L(fng)目。他的书提到?jin)一些通用解决Ҏ(gu)Qƈ提供?jin)关于用、折中和可选方案的指导。Fowler 在书中包含了(jin)一些熟(zhn)的模式Q如模型视图控制器(MVCQ,他也提供?jin)一些?zhn)也许不?jin)解的模式Q如处理 Web 站点上特定页面请求或行ؓ(f)h?Page Controller 模式。正如?zhn)对待大多数模式一P一旦?zhn)读过许多模式Q?zhn)׃?x)认ؓ(f) “我已经知道那个模式?jin)?。也许是q样Q但有一个用来引用模式的通用表达方式q是很有帮助的。在有多个组Ӟ׃同h开发)(j)的大型项目中Q该cd用是一很好的帮助?/p>

UML Distilled (Martin Fowler)

UML Distilled: A Brief Guide to the Standard Object Modeling Language QMartin Fowler; Addison-Wesley 2003 q_(d)(j)
UML_a(b)Q标准对象语a明指南(W?版)(j) Q徐家福 译,清华大学出版C?Q?005 q_(d)(j)
对于专业的程序员来说QUML 是一门很重要的通用可视化沟通语aQ但是它被过度用和草率地滥用了(jin)。?zhn)无需对?UML 沟通了(jin)解太多。Martin ?UML 的提gؓ(f)(zhn)提供了(jin)最核心(j)的东ѝ事实上Q前后的页提供?jin)常规基上可能用到的所有东ѝ该书中 UML 例子的代码都?Java 代码?/p>

Test-Driven Development: By Example (Kent Beck)

Test-Driven Development: By Example QKent Beck; Addison-Wesley 2002 q_(d)(j)
试驱动开发(中文版)(j) Q崔?译,中国?sh)力出版C?Q?004 q_(d)(j)
试优先~程ɾ~程发生革命性变化,能助(zhn)成为更好的E序员。在写代码之前编写测试开始很难,但却是一威力强大的技能。通过优先~写试Q可使代码更加简单,q确保从一开始它?yu)p工作QBeck 实践着他提倡的试优先Q与人合写了(jin) JUnitQ这?Java 语言最行的测试框Ӟ(j)。Beck 的书是权威的参考资料,扩展?jin)?Money 例子也用 Java 语言写成。Beck 详述?jin)如何用试优先q行 思?/b>Q这也许是许多程序员首先遇到的障)(j)?/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_(d)(j)
E序员修g道——从工C?Q马l达 译,?sh)子工业出版C?Q?004 q_(d)(j)
做一个纯_的面向对象开发h员有其优势所在。在当今复杂的社?x)中Q作?Java 语言开发h员,为完成Q务常要妥协。Hunt ?Thomas 探讨?jin)如何不真正重要的东西妥协掉而完成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_(d)(j)
ZgQ第2版)(j) QUMLChina 译l?译,清华大学出版C?Q?003 q_(d)(j)
q䆾列表中的其他所有书c都臛_和技术有些相兟뀂这本书却不是。在所有技术行话和首字母羃略词的vz中Q有时Y件开发h员和l理们会(x)忘记Q是?/i> 刉了(jin)软g。DeMarco ?Lister 向我们提醒了(jin)q一事实Q也向我们提醒了(jin)形成q一区别的原因。这不是一本关于一门特定编E语a的书c,但却是每?Java 语言E序员都应该ȝ书。关?“篏ȝ序员如何让经理们适得其反?q有许多其他的好书,但这是最好的一本?/p>



回页?/font>


Web 站点

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

Sun ?Java 技术站?/font>

Sun ?Java 语言站点
q是 Sun ?Java 语言ȝ。作?Java 语言开发h员,(zhn)会(x)发现自己频繁地访问此站点。下列链接特别重要,特别是对新入行的 Java 语言开发h员:(x)

  • New to Java Center
    New to Java Center
    New to Java Center 存放?jin)许多@序渐q的 Java 技术资源链接。如果?zhn)刚接触这门语aQ这是一个好的v炏V?
  • 教程和代码库
    Java Tutorial
    q里有大名鼎鼎的 Java TutorialQ以?qing)关?Java 语言各个斚wQ例?CollectionQ的其他教程?

IBM developerWorks

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

Apache Software Foundation

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

Eclipse.org

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

Eclipse 插g中心(j)?Eclipse 插g

Eclipse 插g中心(j) ?Eclipse 插g
Eclipse Z插g架构。事实上Q插件是 Eclipse ?Java 语言开发组件。但有差不多上千个插Ӟ?Web 开发的插g到在 Eclipse 环境中玩游戏的插件。这两个站点分类列出?jin)大多数插gQ可以进行搜索。它们是很棒的资源。如果?zhn)惛_ Eclipse 开发环境中弄点C西,q运的话有某个插件可能已l实玎ͼ从这两个站点能找到想要的插g。这两个站点都允许评论插Ӟq样(zhn)就可以知道哪些插g好,哪些值得一试?/p>

JUnit.org

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

TheServerSide.com

TheServerSide.com
如果(zhn)要(或将?从事服务器端 Java 语言的开发,此站Ҏ(gu)一处D重的资源。?zhn)可以到这里找到有?JBoss、J2EE、LDAP、Struts 和大量其他主题的文章Qƈ且都是完全可(g)索的。这些文章不仅仅是简单描q?Java 语言的特征或者支持的库。它们更q一步地描述?jin)库的新奇用法(如?Jakarta Velocity 作ؓ(f)规则引擎Q而不是模板引擎)(j)。它们也提供?jin)有?Java 语言现状的连l评论(当前的一文章是?Tim Bray 所写的 Java is boring Q。该站点更好的通用功能之一是对 Java 语言工具和品(应用服务器等Q的矩阵式比较?

Bruce Eckel's MindView, Inc.

Bruce Eckel's MindView, Inc.
Eckel 写了(jin)几本 “用 …?q行思考?的书Q内容关?Java 语言、Python ?C++ Q当我学?Java 语言Ӟ他的 Thinking in Java Ҏ(gu)其有帮助。它很实用ƈ切中要害Q在“在 Java 语言环境中如何面向对象思考”方面具有卓识。?zhn)可以从此站点免费下蝲他所有书c的?sh)子版。他也写?jin)许多好文章Qƈ且他把这些文章的链接都放C(jin)q里Q包括关?Jython、Java ?.NET 比较{内容的文章Q?/p>

ONJava.com

ONJava.com
O'Reilley 历年来出版了(jin)一些有关编E语a和工L(fng)优秀书籍。他们的专注?Java 语言的网站也不错。它有些有关各种 Java 语言工具Q如 JDOM ?HibernateQ、Java q_Q如 J2SE ?J2EEQ不同领域不同部分的文章。全部都可以被检索到。他们有优秀的文章和教程。该站点按主题排列。例如有 Java ?XML、Java Security、Wireless Java ?Java SysAdmin。该站点也有?O'Reilley Learning Lab 的链接,在那里?zhn)能获得在U参考资料(Java 语言相关和其他的Q。那些不是免费的Q但是许多都面向大学认证。因此?zhn)可以以一U很方便的方式来学习(fn)技能,q得C些认证?

java.net

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





回页?/font>


l束?/span>

M “好的”、“关键性的?或?“重要的?参考资料列表都注定是不完整的,本文的列表也未能例外?Java 语言的书c数目众多,当然Q万l网也很庞大。除本文所列的参考资料之外,q有很多用于学习(fn) Java 语言的参考资料。但如果(zhn)拥有了(jin)q里所提到的所有书c、网站、文章或者教E,(zhn)应当已l拥有了(jin)一个(zhn)良好开端ƈ助?zhn)d入室的实用宝库?/p>

最后,要成Z个能力日增和高效?Java 语言开发h员,Ҏ(gu)是用它工作Q动手来试。如果有一个教E详l介l了(jin)所需创徏的Y件的每一部分Q?zhn)很可能ƈ没得到多好处。有Ӟ(zhn)可能得走自q路。在成功地尝试了(jin)一些新的东西之后,(zhn)可能想要写一文章、教E或者一本书来分享?zhn)所学到的?/p>

参考资?



关于作?/span>

Roy Miller 是一名独立Y件开发培训师、程序员gӞ他在充满挑战、快节奏的咨询公叔R从事?jin)十多年软g开发和目理工作。他最初在 Andersen ConsultingQ现在是 AccentureQ公司工作,在那里,他管理团队实C(jin)许多pȝQ从L记帐pȝ到星形模式数据集?jng)。最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他写了(jin) Managing Software for Growth: Without Fear, Control and the Manufacturing Mindset 一书,来帮助经理和理层理解:(x)?XP q样的敏h建方法ؓ(f)什么比传统的方法更有效?003 q_(d)他创办了(jin)自己的公司:(x)The Other RoadQ该公司帮助其他公司?jin)解如何?XP 和被他称?Extreme Business (XB) 的方法{换?/p>



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


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

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

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

要填充报表,可以使用JasperManagercȝfillReportXXX()Ҏ(gu)。这些方法接受一个参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?x)被~译以准备报表填充操作?

创徏一个报表设计(模版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ؓ(f)报表引擎传递它无法在数据源中找到的数据是非常有用的。例如,我们可以登陆执行报表填充操作的用户名传l引擎,q样我们可以在报表上昄制表人或者动态改变报表的标题?

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

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

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

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

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

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

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

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

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

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

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

REPORT_PARAMETERS_MAP

REPORT_CONNECTION

REPORT_DATA_SOURCE

REPORT_SCRIPTLET

4Q?数据?

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

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

5Q?字段

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

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

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

<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中没有对应的列,则会(x)在运行时抛出异常。当然ResultSet中的列没有被声明为报表字D不?x)?jing)响报表的数据填充Q但是他们仍然是可以讉K的?

6Q?表达?

表达式是JasperReport的一个很强大有用的特性。用表达式可以:(x)声明报表变量来完成各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如下:(x)

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

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

7Q?变量

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

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

<variable name="QuantitySum"

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

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

</variable>

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

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

引擎q提供了(jin)如下的内建变量可以在表达式中直接使用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和一个静(rn)态文本:(x)

<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表辑ּ的值改变)(j)Q如果遇到组边界则将<groupFooter>?lt;groupHeader>报表区域加入报表?

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

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

10Q?字体和Unicode支持

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

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

11Q?Scriptlets

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

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

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

要用ScriptletQ开发者只需要通过l承net.sf.jasperreports.engine.JRAbstractScriptlet或者net.sf.jasperreports.engine.JRDefaultScriptlet来创建ScritpletcR该定制的ScriptletcM(x)被指定ؓ(f)<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.aygfsteel.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.aygfsteel.com/soufan/archive/2006/12/19/88846.html</guid><wfw:comment>http://www.aygfsteel.com/soufan/comments/88846.html</wfw:comment><comments>http://www.aygfsteel.com/soufan/archive/2006/12/19/88846.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/soufan/comments/commentRss/88846.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.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 Ҏ(gu)得到他们.例如 如果你的参数如下: <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="wmqeeuq" 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.aygfsteel.com/soufan/aggbug/88846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/soufan/" target="_blank">soufan</a> 2006-12-19 16:25 <a href="http://www.aygfsteel.com/soufan/archive/2006/12/19/88846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何实现"L(fng)?.."面? http://www.aygfsteel.com/soufan/archive/2006/12/19/88843.htmlsoufansoufanTue, 19 Dec 2006 08:23:00 GMThttp://www.aygfsteel.com/soufan/archive/2006/12/19/88843.htmlhttp://www.aygfsteel.com/soufan/comments/88843.htmlhttp://www.aygfsteel.com/soufan/archive/2006/12/19/88843.html#Feedback0http://www.aygfsteel.com/soufan/comments/commentRss/88843.htmlhttp://www.aygfsteel.com/soufan/services/trackbacks/88843.html
在客L(fng)实现可能很简?你可以包装JSP面(或者你惌隐藏的一部分)C个div?然后你可以添加更多div,当用L(fng)?yn)L交按钮时q些div出现.q些div可以包含gif动画和其他内?
场景:当用L(fng)?yn)L?调用JS函数,该函数隐藏页面ƈ且显C?L(fng)?.."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(fng)?.."?当表单提交后该图片应该从新加?因此,再一ơ指定图片的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.aygfsteel.com/soufan/archive/2006/12/19/88839.htmlsoufansoufanTue, 19 Dec 2006 08:20:00 GMThttp://www.aygfsteel.com/soufan/archive/2006/12/19/88839.htmlhttp://www.aygfsteel.com/soufan/comments/88839.htmlhttp://www.aygfsteel.com/soufan/archive/2006/12/19/88839.html#Feedback0http://www.aygfsteel.com/soufan/comments/commentRss/88839.htmlhttp://www.aygfsteel.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.aygfsteel.com/soufan/archive/2006/12/19/88834.htmlsoufansoufanTue, 19 Dec 2006 08:14:00 GMThttp://www.aygfsteel.com/soufan/archive/2006/12/19/88834.htmlhttp://www.aygfsteel.com/soufan/comments/88834.htmlhttp://www.aygfsteel.com/soufan/archive/2006/12/19/88834.html#Feedback0http://www.aygfsteel.com/soufan/comments/commentRss/88834.htmlhttp://www.aygfsteel.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.aygfsteel.com/soufan/archive/2006/12/19/88828.htmlsoufansoufanTue, 19 Dec 2006 08:12:00 GMThttp://www.aygfsteel.com/soufan/archive/2006/12/19/88828.htmlhttp://www.aygfsteel.com/soufan/comments/88828.htmlhttp://www.aygfsteel.com/soufan/archive/2006/12/19/88828.html#Feedback0http://www.aygfsteel.com/soufan/comments/commentRss/88828.htmlhttp://www.aygfsteel.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.aygfsteel.com/soufan/archive/2006/12/19/88824.htmlsoufansoufanTue, 19 Dec 2006 08:10:00 GMThttp://www.aygfsteel.com/soufan/archive/2006/12/19/88824.htmlhttp://www.aygfsteel.com/soufan/comments/88824.htmlhttp://www.aygfsteel.com/soufan/archive/2006/12/19/88824.html#Feedback0http://www.aygfsteel.com/soufan/comments/commentRss/88824.htmlhttp://www.aygfsteel.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方?

单的Ҏ(gu)是在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.aygfsteel.com/soufan/archive/2006/12/19/88821.htmlsoufansoufanTue, 19 Dec 2006 08:02:00 GMThttp://www.aygfsteel.com/soufan/archive/2006/12/19/88821.htmlhttp://www.aygfsteel.com/soufan/comments/88821.htmlhttp://www.aygfsteel.com/soufan/archive/2006/12/19/88821.html#Feedback0http://www.aygfsteel.com/soufan/comments/commentRss/88821.htmlhttp://www.aygfsteel.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.aygfsteel.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.aygfsteel.com/soufan/archive/2006/12/19/88819.html</guid><wfw:comment>http://www.aygfsteel.com/soufan/comments/88819.html</wfw:comment><comments>http://www.aygfsteel.com/soufan/archive/2006/12/19/88819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/soufan/comments/commentRss/88819.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.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.aygfsteel.com/soufan/aggbug/88819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/soufan/" target="_blank">soufan</a> 2006-12-19 15:59 <a href="http://www.aygfsteel.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"> <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>