🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: cn.bbs.comp.lang.java
Article #12009

����һ��jsf�����ۣ�������

#12009
From: ���Ӵ���~ϲ��C++������
Date: Sun, 15 Aug 2004 02:55
94 lines
6377 bytes
My JSF Experience Category: Java 

Of all the MVC Frameworks I've developed with in the last few weeks (Struts, 
Spring MVC, WebWork and Tapestry) - JSF was by far the worst. And it's not 
the implementations that are the problem, it's the spec itself (as far as I 
can tell). Plain and simple, it does not simplify web development. 

I spent 3 days developing a simple JSF app - most of it which I had done in 
the first day. The last 2 days have been spent migrating to MyFaces and 
trying to find clean ways to do things. My perspective on JSF after this 
experience? Run away. Run far, far away. All of the above mentioned 
frameworks are MUCH superior to this technology. Let's get on with the 
things I learned. 

MyFaces handles duplicate posts nicely. If you hit "reload" on your browser 
after saving a record, you get presented with an empty form rather than a 
duplicate record. I believe I got a duplicate record with Sun's RI.
The ability to specify an "action" attribute on a button (or a link) and 
them map that action to a page (in faces-config.xml) is pretty cool. 
Every button or link clicked results in a form post. That's just wrong - 
why can't I have true links like the web is supposed to? So much for 
bookmarks. 
Saving state on the client results in enormously long URLs and/or hidden 
fields. 
JSF support is fairly non-existent. Unlike the other MVC frameworks, the 
MyFaces mailing list has hardly any traffic and the Sun forums aren't much 
better.
The MyFaces website seems to be down whenever I want to look something up 
on it, like right now.
I did find some CRUD examples, like this this one, but was disappointed to 
find that i18n is not considered for setting success messages. I ended up 
using the solution described in this post. 6 lines of code to set a success 
message - you've got to be kidding me! Most frameworks have a simple 1-2 
liner.
Waiting for JSPs to compile the first time has surprisingly become painful 
after using Tapestry, Velocity and FreeMarker for the last 2 weeks.
Integration with Spring is fairly easy (code is in CVS), but MyFaces spits 
out an error when it shouldn't be.
Validation messages are ugly. For instance, when a required field isn't 
filled in, I get: "lastName": Value is required. I was able to override the 
default messages, but I was never able to use the label of the field (vs. 
the field's id). 
The <h:messages> tag is practically worthless. Sure it's great for 
displaying messages (error and success), but that's about it. It has a 
"layout" attribute that doesn't even work in Sun's RI, and in MyFaces it 
just wraps a <span> with a <ul><li> or a <table>. Both of these layouts are 
useless b/c you can't set a css class on them. I ended up using "table" and 
having to set a generic CSS rule (width: 100%) in order to get the 
message/error bar to show across the top of my page. This tag also doesn't 
allow you to escape HTML. 
The <h:dataTable> component is nothing like the displaytag. MyFaces claims 
to have a pageable/sortable component, but it requires custom logic/methods 
in your managed-bean. Yuck. I ended up using <h:dataTable>, which has 
neither sorting or paging. This is only because I couldn't get an 
<h:commandLink> working inside a displaytag column.
JSF-created apps are pretty much untestable. Managed-beans are testable, 
but the UI seems really difficult with jWebUnit and Canoo's WebTest. IMO, 
it should be possible to specify a URL to edit a record (i.e. 
editUser.html?id=2). With JSF and my master/detail app, the link to edit 
actually sets about 5 hidden form fields with JavaScript and then submits 
the form. I could probably figure the URL out, but it'd be ugly. Also, the 
MyFaces <h:dataTable> will not render an "id" attribute if you specify one. 
This is needed to verify tables and their data with jWebUnit. 
When using "ant reload" to reload my application (using Tomcat's Ant 
Tasks), I kept encountering a ThreadDeath error. This seems to be specific 
to MyFaces as I never saw it with other frameworks or Sun's RI.
Like Tapestry, I felt like I was banging my head against the wall a fair 
amount. However, with Tapestry (and all the other frameworks), I was able 
to get exactly the behavior I wanted w/o too much work. I could produce 
clean and user-friendly error messages - (Tapestry already had clean 
required messages built in). I was able to write a jUnitWebTest to test all 
CRUD activities. With JSF, I was able to test one thing - adding a new 
record. I couldn't edit it b/c the JavaScript support (which I tend to not 
use) puked every time it encountered a JSF-generated JavaScript function.

My opinion after all of this? If you know Struts, Spring MVC and WebWork 
are fairly easy to learn. WebWork is simpler and elegant, but Spring MVC 
supports more view options out-of-the-box. Tapestry is cool, but you'll 
have to invest a lot of time into learning it and you'll probably get 
caught up in its cult and forever be claiming "Tapestry Rocks!" which can 
get annoying to your fellow developers.  Finally, I can confirm that 
SiteMesh rocks - it worked for all the frameworks I used and I never had to 
change a single line of code. 

Whatever you do, don't use JSF. Not yet anyway.
 
--
Linking...
LIBCD.lib(love.obj) : error LNK2001: unresolved external symbol _LOVE
Debug/LOVE.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

LOVE.exe - 2 error(s), 0 warning(s)
�� ��Դ:����ˮ˼Դ bbs.sjtu.edu.cn��[FROM: С�ٺ�BBS]
Technical Details
Message-ID: <4Dd02e$9yR@bbs.sjtu.edu.cn>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!news.glorb.com!wn13feed!worldnet.att.net!63.223.20.72!sjc1.usenetserver.com!news.usenetserver.com!news.bylinux.net!netnews.sdu.edu.cn!SJTU

Show Full Headers
Complete Article Headers
X-Google-Thread: f6cb0,6c5ac84e48d33535,start
X-Google-Attributes: gidf6cb0,public
X-Google-Language: ENGLISH,GB
Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!news.glorb.com!wn13feed!worldnet.att.net!63.223.20.72!sjc1.usenetserver.com!news.usenetserver.com!news.bylinux.net!netnews.sdu.edu.cn!SJTU
From: DancingCode.bbs@bbs.sjtu.edu.cn (���Ӵ���~ϲ��C++������)
Newsgroups: cn.bbs.comp.lang.java
Subject: ����һ��jsf�����ۣ�������
Date: 15 Aug 2004 02:55:32 GMT
Organization: ��ˮ˼Դ
Message-ID: <4Dd02e$9yR@bbs.sjtu.edu.cn>
Mime-Version: 1.0
Content-Type: text/plain; charset="gb2312"
Content-Transfer-Encoding: 8bit
X-Filename: Java/M.1092538504.A
Lines: 94