µÚÎåÕÂ
DiscRack Ó¦ÓóÌÐò
ÕâÒ»Õ½éÉÜÁËDiscRackÓ¦ÓóÌÐò,ÓÃÕâ¸ö×ÛºÏÐÔµÄÀý×ÓÀ´½²ÊöEnhydraÓ¦ÓóÌÐò¿ª·¢µÄ¹Ø¼üÄÚÈÝ
EnhydraÖаüº¬ÁË DiscRackÓ¦ÓóÌÐò,Ëü±»°²×°ÔÚ<enhydra_root>/examples/DiscRack
Ŀ¼ÏÂ.ÔÚÕâÒ»ÕÂÖÐ,ÎÒÃÇÓÃ
<DiscRack_root>
À´±íʾ DiscRack³ÌÐòµÄ¸ùĿ¼.
ΪÁ˱àÒë²¢ÔËÐÐDiscRack,ÄãÐèÒª¶Ô°²×°Îļþ×÷ÈçÏÂÐÞ¸Ä:
¿ª·¢Ó¦ÓóÌÐòµÄ²½ÖèºÍ³õ²½ÖªÊ¶
- ´ò¿ª
<
DiscRack_root
>
Ŀ¼ÖеÄconfig.local.mk.in
½«ENHYDRA_DIRºÍJDKDIR
±äÁ¿·Ö±ðÉèÖóÉÄãµÄEnhydra ºÍjdkµÄ·¾¶
- ½«
<DiscRack_root>
Ŀ¼ÖеÄ
config.local.mk.inÎļþ¸üÃûΪconfig.local.mk
- ´ò¿ª´<
<DiscRack_root>/discRackĿ¼ÖеÄÄ£°åÅäÖÃÎļþdiscRack.conf.in
,È·±£ËùÓеÄÊý¾Ý¿â¹ÜÀíÆ÷ÅäÖÃÊÇÕýÈ·µÄ. ¼û¸½Â¼AÖеÄ"ÅäÖÃÊý¾Ý¿â¹ÜÀíÆ÷" ºÍ"Êý¾Ý¿âÅäÖÃ."- ÔÚ<DiscRack_root>Ŀ¼ÏÂÊäÈë make ±àÒëÕû¸öÓ¦ÓóÌÐò.
±àÒëÓ¦ÓóÌÐò½«»á²úÉúDiscRack³ÌÐòËùÐèÒªµÄÀàºÍ°ü
×¢Òâ: DiscRack³ÌÐòÓõ½µÄÊý¾Ý¿âºÍÏàÓ¦µÄdata²ã´úÂëÓëµÚËÄÕÂ"½¨Á¢enhydraÓ¦ÓóÌÐò"Öн²µÄÊÇÒ»ÑùµÄ,µ«°üµÄÃüÃû³ýÍâ.ȱʡÇé¿öÏÂÔØÈëµÄÊý¾Ý¿âΪInstantDB .µ«ÊÇÄãÒ²¿ÉÒÔÓÃ΢ÈíµÄAccessÊý¾Ý¿â,Êý¾Ý¿âÎļþΪ<DiscRack_root>/discRack/data/discRack.mdb, µ«ÐèÒª¶ÔÓ¦ÓóÌÐòÅäÖÃÎļþÖйØÓÚÊý¾Ý¿â¹ÜÀíÆ÷µÄ²¿·Ö×öһЩ¸ü¸Ä,¾ßÌåÇë²Î¿¼¸½Â¼A, "Êý¾Ý¿âÅäÖÃ," À´µÃµ½¸ü¶àµÄ¹ØÓÚÔÚÄãµÄÓ¦ÓóÌÐòÖÐʹÓà Access µÄÐÅÏ¢.
- ΪÁËʹÓÃInstantDB Êý¾Ý¿â, ½«InstantDBµÄJAR Îļþ:idb.jar ºÍjta-spec1_0_1.jar¸´ÖƵ½<DiscRack_root>/lib Ŀ¼.
InstantDB µÄÇý¶¯³ÌÐò»á±» DiscRackµÄstart ½Å±¾×Ô¶¯×°ÔØ.
- ÔÚÃüÁîÐÐÉÏÊäÈëÏÂÃæµÄÃüÁîÔËÐÐDiscRack:
cd <DiscRack_root>/output
./start- ÔÚä¯ÀÀÆ÷ÖÐÊäÈëhttp://Localhost:5555À´·ÃÎÊÓ¦ÓóÌÐò
ä¯ÀÀÆ÷»áÏÔʾÈçÏÂͼ:
ͼÐÎ5.1 ÔÚä¯ÀÀÆ÷ÖÐÏÔʾDiscRack µÄµÇ½½çÃæ
![]()
²Ù×÷Ò»ÏÂÕâ¸öÓ¦ÓóÌÐò,¿´Ò»ÏÂËüÊÇÔõÑù¹¤×÷µÄ:
1.µã»÷Register °´Å¥,×¢²áÒ»¸öÓû§, ½«Ò»Ð©¹âÅ̼ÓÈëµ½ÄãµÄ²Ö¿âÖÐ.2.¿´Ò»ÏÂÄãµÄ²Ö¿â,²¢±à¼ÆäÖеÄÒ»¸öÅÌ.
--------------------------------------------------------------------------------
ÔÚÌÖÂÛDiscRackÕâ¸öÓ¦ÓóÌÐòÔõÑù¹¤×÷ÒÔǰ,ÖªµÀÒ»°ãÇé¿öÏÂÔõÑù¿ª·¢EnhydraÓ¦ÓóÌÐòÊǷdz£ÓÐÓõÄ,Äã¿ÉÒÔ²ÉÈ¡´«Í³µÄÈí¼þ¿ª·¢·½Ê½À´¿ª·¢EnhydraÓ¦ÓóÌÐò,±£Ö¤:1.Ó¦ÓóÌÐòÄܹ»ÏñÔ¤ÏëµØÄÇÑù¹¤×÷.
2.ÏîÄ¿Íê³É±ØÐ뼰ʱcost-effective
3.Ó¦ÓóÌÐòÈÝÒ×ά»¤ºÍÉý¼¶
ÉîÈëÌÖÂÛÈí¼þ¿ª·¢·½·¨ÒѾ³¬³öÁ˱¾ÊéµÄ·¶Î§,µ«ÊÇÃ÷°×Æä»ù±¾ÔÀíºÍËüÔõÑùÓ¦ÓÃÓÚDiscRackÓ¦ÓóÌÐòÊǷdz£ÓÐÒæµÄ.µ±Ä㿪·¢Ò»¸ö¸ü¸´ÔÓµÄÏÖʵµÄÓ¦ÓóÌÐòʱ,Äã»áÊÜÒæ·Çdz.
ÏÂÃæµÄ²½Öè×ñÑ Lutris Technologies' Structured Delivery Process '(SDP), ÕâÊÇLutris¹«Ë¾¿ª·¢Ñ§¶àÏîÄ¿µÄ¹ý³ÌÖÐʹÓõÄÒ»¸öÑϸñµÄ·½·¨. Õâ¸ö¼ò»¯µÄ²½Öè·Ç³£ÊʺÏСÐÍÏîÄ¿µÄ¿ª·¢. ÒªÏëµÃµ½¸ü¶àµÄ¹ØÓÚ´óÐ͵ÄÍŶӺÏ×÷µÄÏîÄ¿µÄÐÅÏ¢, ²Î¼ûLutris¹«Ë¾ÍøÕ¾ÉϵÄSDP ÐÅÏ¢:http://www.lutris.com.Ò»¸ö¼ò»¯µÄÓ¦ÓóÌÐò¿ª·¢²½Öè°üº¬ÏÂÁм¸²½:
1.¶¨ÒåÐèÇóÖ»Òª¿ÉÄܵϰ,¶ÔÓ¦ÓóÌÐò½«ÒªÍê³ÉµÄ¹¦ÄÜ×öÒ»¸öÏêϸµÄ×ÛÊö,Õâ¸ö×ÛÊö±¾ÖÊÉ϶¨ÒåÁËÓ¦ÓóÌÐòµÄ×ÜÌåÄ¿±ê.
2.¹¦ÄÜ˵Ã÷ÃèÊöÓ¦ÓóÌÐòÔõÑù½â¾öÐèÇó¶¨ÒåÖÐÁгöµÄÎÊÌâ
3.Éè¼ÆºÍstoryboardÉè¼ÆÓ¦ÓóÌÐòµÄpresentation, data, ºÍbusiness ²ã, È»ºó´´½¨storyboard.
4.¿ª·¢²âÊÔ±àд´úÂë²¢²âÊÔÓ¦ÓóÌÐò.
5.²¿Êð½«Ó¦ÓóÌÐò´ò°ü²¢°²×°ÔÚÆä²Ù×÷»·¾³ÖÐ.
Õâ¸ö¼ò»¯µÄ·½·¨ÃèÊöÁË¿ª·¢¹ý³ÌµÄ¹Ø¼ü·½Ãæ. ¸´ÔÓµÄʵ¼ÊµÄÓ¦ÓóÌÐòÒªÇó¸ü×ۺϵIJ½Öè:°üÀ¨ ÏîÄ¿½ø¶È¿ØÖÆ, ³É±¾·ÖÎö, ÎĵµµÈµÈ.ϼ¸½Ú½²ÊöÁËÕâЩ¼ò¶ÌµÄ²½Öè.
DiscRack µÄÐèÇó¶¨Òå
--------------------------------------------------------------------------------
Otter¼Ò×åÐèÒªÒ»¸ö·½·¨À´¸ú×ÙËûÃǵÄÊղصÄcd.ÿ¸ö¼ÒÍ¥³ÉÔ±¶¼ÓÐÆä×Ô¼ºµÄÊÕ²Ø,ÓÐʱºòËûÃÇ¿ÉÄÜÓÐЩ»ìÏý: Otters Íü¼ÇÁËÄÄЩÊÇËûµÄ. ËûÃÇÈÏΪÓÃÒ»¸öEnhydraÓ¦ÓóÌÐòÀ´¹ÜÀíËûÃǵÄCD½«ÊÇÒ»¸öÍêÃÀµÄ·½·¨. ¾¹ýÌÖÂÛÒÔºó,ËûÃǵóöÁËÒ»¸öÐèÇó·ÖÎö:DiscRack½«ÈÃÿһ¸öÓû§Í¨¹ýÔö¼Ó,±à¼,ɾ³ýÀ´¹ÜÀí×Ô¼ºµÄCD.Ó¦ÓóÌÐò½«»ákeep track of ËùÓеÄÓëCDÓйصÄÐÅÏ¢, °üÀ¨ÒÕÊõ¼ÒºÍÌâÄ¿.
DiscRack ¹¦ÄÜ˵Ã÷
--------------------------------------------------------------------------------
¼òÒªµÄ˵,¶ÔDiscRackÓÐÈçÏÂÒªÇó:
±£´æÓû§ÃûºÍÃÜÂëÓû§±ØÐëÓÃÓû§ÃûºÍÃÜÂëµÇ½²ÅÄÜ·ÃÎÊËûÃǵÄCDĿ¼.
ÔÊÐíÓû§Í¨¹ýÊäÈëËûÃǵÄÐÕÃû,Óû§Ãû,ÃÜÂëÀ´×¢²á.Ò»µ©µÇ½³É¹¦,Óû§¿ÉÒÔ¿´µ½ËüµÄcdĿ¼,²¢ÇÒ¿ÉÒÔ:
ÏòĿ¼ÖÐÔö¼Ócd.±à¼´æÔÚµÄcd.
ÔÚÈ·ÈϵÄÌáʾÏÂ,ɾ³ýËûÃǵÄcd.
ÿ¸öcdÏÔʾµÄÐÅÏ¢°üÀ¨:ÒÕÊõ¼Ò, ÌâÄ¿, ÖÖÀà,ÒÔ¼°Óû§ÊÇ·ñϲ»¶Õâ¸öcd.
Éè¼ÆºÍÑÝÊ¾Ãæ°å
--------------------------------------------------------------------------------
Õâ×î¹Ø¼üµÄÒ»²½Ö÷ÒªÊǼ¼ÊõÉϵÄÉè¼Æ:°üÀ¨Êý¾Ý¿âµÄÉè¼ÆºÍÏàÓ¦µÄdata²ã,business²ã,presentation²ãµÄ´úÂë. Óû§½çÃæµÄÉè¼Æ¿ÉÒÔ·â×°µ½Ò»¸östoryboard.
ÑÝʾͼ°å(storyboard)ÊÇÓû§Á˽â³ÌÐòÁ÷³ÌµÄÐÎÏ󻯹¤¾ß. ËüÌṩÁËÓ¦ÓóÌÐòÓû§½çÃæµÄÂÖÀªºÍÓ¦ÓóÌÐòÉè¼ÆÄܹ»½øÐеĿò¼Ü.It provides an outline of the application's user interface, and a framework from which the rest of the application design can proceed.
Ò»¸ö¸ÅÄîÉϵÄÑÝʾͼ°å¾ÍÊÇÓ¦ÓóÌÐòµÄÁ÷³Ìͼ.A conceptual storyboard, which is largely an application flowchart, is sometimes referred to as a site map, in contrast to a mocked-up HTML storyboard. This book refers to both as a storyboard. DiscRack µÄÑÝʾͼ°å¼ûͼÐÎ5.2.Äã¿ÉÒÔ¿´µ½ÑÝʾͼ°åÖй²ÓÐ5¸öhtmlÒ³Ãæ,ÏÔʾCDĿ¼µÄDiscCatalogÒ³ÃæÊdzÌÐòµÄÖÐÐÄÒ³Ãæ,µÚÒ»Ò³ÊÇ
Login Ò³Ãæ; ×îºóÒ»¸öÒ³ÃæLogout Ò³Ãæ.
DiscRack ÔÚresourcesĿ¼ÏÂÓÐÒ»¸ö¿ÉÒÔ¹¤×÷µÄÑÝʾͼ°å (»ò½Ð×öÓ¦ÓóÌÐòÄ£ÐÍ) . Ëü°üÀ¨Ò»Ð©Áеľ²Ì¬HTML Ò³ÃæÀ´ÃèÊöÓ¦ÓóÌÐòÔõÑù¹¤×÷. ΪÁËÄÜ¿´µ½ÑÝʾͼ°å,ÔÚä¯ÀÀÆ÷Öдò¿ªÏÂÃæµÄÒ³Ãæ:
<DiscRack_root>/discrack/resources/personMgmt/Login.html
ä¯ÀÀÆ÷½«ÏÔʾDiscRackµÄlogin Ò³Ãæ.
µã»÷Login °´Å¥¾Í»áתµ½¹âÅÌÄ¿Â¼Ò³Ãæ.µã»÷Sign Up °´Å¥½«»áÏÔʾע²áÒ³Ãæ.
µã»÷Ò³ÃæÆäËüµÄÁ¬½ÓÄã»á¿´µ½ÑÝʾͼ°å(storyboard)µÄÊ£Óಿ·Ö.
ͼÐÎ5.2ËùʾµÄHTMLÒ³ÃæÃ»Óкǫ́µÄ³ÌÐòÀ´¼¤»îËü,ËùÓеÄÒ³Ãæ¶¼ÊǾ²Ì¬µÄ. µ«ÊÇÕâ¸öÑÝÊ¾Ãæ°å¿ÉÒÔÈÃÄãºÜºÃµÄÁ˽âÓ¦ÓóÌÐòÊÇÔõÑù¹¤×÷µÄ.
ͼÐÎ5.2 DiscRack ÑÝÊ¾Ãæ°å
¿ª·¢²âÊԺͲ¿Êð
--------------------------------------------------------------------------------
ΪÁËÍê³ÉÓ¦ÓóÌÐò,Ê£ÓàµÄ¼¸²½°üÀ¨¿ª·¢,²âÊÔºÍ×îÖյIJ¿Êð.
µ±ÄãÔÚÓ¦ÓóÌÐò¸ùĿ¼Ï±àÒëʱ, make ½«»á´´½¨Ò»¸öoutputĿ¼,Õâ¸öĿ¼Öаüº¬ÁËÓ¦ÓóÌÐòµÄÅäÖÃÎļþºÍ start ½Å±¾. ͬÑùËüÒ²»á´´½¨Ò»¸ölibĿ¼,ÆäÖаüº¬Ò»¸ö.jar Îļþ,Õâ¸öÎļþÖаüº¬ÁËÓ¦ÓóÌÐòµÄËùÓÐÀàºÍÆäËüһЩÎļþ (ÀýÈç, GIFÎļþ»òÑùʽ±íÎļþ).
ΪÁ˲¿ÊðÓ¦ÓóÌÐò,ÄãÐèÒª¿½±´ÕâЩÎļþµ½ÐèÒªÕâ¸ö³ÌÐòÔËÐеķþÎñÆ÷ÉÏ, ÓÉÓڸıäÁ˵ط½,ËùÒÔÐèÒª¶ÔÅäÖÃÎļþ×÷Êʵ±µÄÐÞ¸Ä.µ±È», Õâ¸ö·þÎñÆ÷ÉϱØÐë°²×°ÁËEnhydra ,»¹ÓÐÆäËü¸¨ÖúµÄ¿â(ÀýÈçÊý¾Ý¿âµÄJDBC Çý¶¯³ÌÐò¿â) .
ÕâÒ»ÕµÄÊ£Óಿ·Ö½«½²ÊöDiscRackÓ¦ÓóÌÐò±¾Éí.DiscRack ×ÛÊö
--------------------------------------------------------------------------------
»ù±¾µÄDiscRack Ó¦ÓóÌÐò°üº¬ 9¸ö°üÖеÄ23¸öÀà. ±í¸ñ5.1ÃèÊöÁË»ù±¾µÄ°üºÍÀàµÄ¹¦ÄÜ:
±í¸ñ5.1 DiscRack Ó¦ÓóÌÐò×ÛÊö
discRack °ü DiscRack
Ó¦ÓóÌÐò¶ÔÏó DiscRackException
Ò»¸ö¼òµ¥µÄ»ù±¾Òì³£Àà Presentation ²ã/°ü BasePO
ËùÓбíÏÖ²ã¶ÔÏóµÄ³éÏó»ù±¾Àà DiscRackSessionData
session Êý¾ÝµÄÈÝÆ÷ ErrorHandler
¶ÔÓ¦ÓóÌÐòÆäËüµØ·½Ã»±»²¶»ñµÄÒì³£µÄ´¦ÀíÀà DiscRackPresentationException
±íÏó²ãµÄÒì³£Àà presentation.personMgmt
°ü°üº¬ Register
ºÍLogin
Àà:¹ÜÀíÓë PERSON±íÓйصÄÐÅÏ¢µÄ±íÏÖ²ãÀàpresentation.discMgmt
°ü°üº¬ Edit
ºÍDiscCatalog
Àà:¹ÜÀíÓëDISC ±íÓйصÄÐÅÏ¢µÄ±íÏÖ²ãÀàBusiness ²ã/°ü DiscRackBusinessException
Business ²ãµÄÒì³£´¦ÀíÀà business.person
°üÕâ¸ö°ü°üº¬Á½¸÷Àà: business.disc
°üÕâ¸ö°ü°üº¬Á½¸÷Àà: Data ²ã ²Î¼û"Loading the schema." WAP ²ã/°ü The DiscRack example application for Lutris Enhydra includes presentation templates and code for wireless access. These additional presentation templates and code comprise what is referred to as wireless profiles. Refer to Appendix C, "Using the DiscRack wireless profiles," in the Wireless Application Developer's Guide for additional information about DiscRack's wireless profiles. resourcesĿ¼ÏÂÓÐ6¸öHTMLÎļþ. ÕâЩÎļþ¶ÔÓ¦ÓÚÑÝÊ¾Ãæ°åÖеÄ5¸öÒ³ÃæºÍÒ»¸öerrorÒ³Ãæ,µ±Ò»¸öÒ쳣û±»²¶»ñʱ,Õâ¸öerrorÒ³Ãæ»áÏÔʾËù·¢ÉúµÄ´íÎó.
±íÏÖ(Presentation)²ã±íÏÖ²ã°üÀ¨ËùÓÐÓ¦ÓóÌÐòÓû§½çÃæÓõ½µÄµÄHTML, Java, ºÍJavaScript Îļþ.
±íÏÖ²ã»ù±¾Àà
DiscRackÖÐËùÓеıíÏÖ²ã¶ÔÏóÅÉÉúÓÚÒ»¸ö»ù±¾Àà: BasePO, Õâ¸öÀàʵÏÖÁËEnhydraÖеÄHttpPresentation½Ó¿Ú. Õâ¸ö½Ó¿ÚÓÐÒ»¸ö·½·¨:run(), Õâ¸ö·½·¨½«HTTPÇëÇó×÷Ϊһ¸ö²ÎÊý.
Ò»¸ö±íÏÖ²ã»ù±¾ÀཫӦÓóÌÐòͨÓõŦÄܷŵ½Ò»¸öµØ·½.×¢Òâ BasePO ÊÇÒ»¸ö³éÏóÀà, ËùÒÔÆä±¾Éí²»ÄÜʵÀý»¯,Ö»ÄÜ×ÓÀ໯.ͬÑùÆäÖеÄÐí¶à·½·¨Ò²ÊdzéÏóµÄ, ËùÒÔ×ÓÀàÓ¦¸ÃʵÏÖËüÃÇ.
BasePO ÓÐÐí¶à´¦ÀíDiscRackÖйؼüÈÎÎñµÄ·½·¨:1.¼ìÑéÓû§ÊÇ·ñµÇ½¼° session ά»¤
2:ʼþ´¦Àí,¸ù¾Ýhtml²úÉúµÄ·½·¨µ÷ÓÃ×ÓÀà¶ÔÏóÖеķ½·¨Event handling and calling the HTML generation methods in the subclass presentation objects
×¢Òâ: It is important to realize that you are not required to use a base presentation class. An alternative is to use the Enhydra Application object to perform common tasks.
BasePO ÖеĹؼü·½·¨ÊÇ run(), Ëüͨ¹ý·½·¨µ÷ÓÃÀ´ÊµÏÖ sessionά»¤ºÍʼþ´¦Àí:
public void run(HttpPresentationComms comms) throws Exception {
// Initialize new or get the existing session data
initSessionData(comms);
// Check if the user needs to be logged in for this request.
if(this.loggedInUserRequired()) {
checkForUserLogin();
}
// Handle the incoming event request
handleEvent(comms);
}
ÿһ´Î¿Í»§¶Ëä¯ÀÀÆ÷¶Ô±íÏÖ²ã¶ÔÏóURL·¢³öÇëÇóʱ,ËüµÄ´¦Àí·Ç³£¼òµ¥:
ͨ¹ýµ÷ÓÃinitSessionData()³õʼ»¯»òÕߵõ½session Êý¾Ý.µ±Õâ¸ö±íÏÖ²ã¶ÔÏóÒªÇóÓû§±ØÐëµÇ½ʱ(¾ö¶¨ÓÚloggedInUserRequired(),ÕâÊÇÒ»¸ö³éÏóµÄ·½·¨,ÿһ¸ö±íÏÖ²ã¶ÔÏó¶¼ÊµÏÖËü), µ÷ÓÃcheckForUserLogin() À´¼ì²âÓû§ÊÇ·ñÒѾµÇ½.Èç¹ûûÓÐ,ä¯ÀÀÆ÷¾Í»áÖØ¶¨Ïòµ½ login Ò³Ãæ.
µ÷ÓÃhandleEvent() ´¦Àí HTMLÒ³ÃæÖвúÉúµÄµ±Ç°Ê¼þ.
ϼ¸½Ú½«¾ßÌå½éÉÜÕ⼸¸ö·½·¨.
run() ·½·¨ÓÐÒ»¸ö²ÎÊý, comms, ÕâÊÇÒ»¸ö°üº¬ÁËHTTPÇëÇóÐÅÏ¢µÄ¶ÔÏó, ÆäÊôÐÔÓÐÓ¦ÓóÌÐò(application),Òì³£(exception), ÇëÇó(request), »ØÓ¦(response), session, ºÍsessionÊý¾Ý. ÕâÁù¸öÊôÐÔ°üÀ¨ÁËÇëÇóÖеÄËùÓÐÐÅÏ¢.
ÀýÈç, Äã¿ÉÒÔͨ¹ý getComms().sessionData.get()µÃµ½sessionÊý¾Ý,ͨ¹ýgetComms().request.getParameter()²éѯ×Ö·û´®²ÎÊý.
Session Êý¾ÝºÍµÇ½ÐÅÏ¢
Enhydra session ά»¤µÄ»ù´¡ÖªÊ¶ÒѾÔÚ"Maintaining session state."½éÉܹýÁË,Ïà¶ÔÓÚÄǸöÀý×ÓÖеÄsession ÐÅÏ¢´¦ÀíµÄ·½·¨, DiscRack ½«ÆäËùÓеÄsession ÐÅÏ¢·Åµ½Ò»¸ö DiscRackSessionData¶ÔÏóÖÐ,²¢½«Õâ¸ö¶ÔÏó·Åµ½Óû§µÄsessionÖÐ.
DiscRackSessionData ÊÇÒ»¸ö¼òµ¥µÄÈÝÆ÷Àà,°üº¬ get ºÍset ÏÂÁгÉÔ±ÊôÐԵķ½·¨:1.Ò»¸ö Person ¶ÔÏó,±íʾһ¸öÓû§
2. Ò»¸öÃûΪuserMessageµÄ String¶ÔÏó, ±£´æ³ö´íÐÅÏ¢,ÀýÈç"Please choose a valid disc to edit"
½«sessionÊý¾Ý·Åµ½Ò»¸ö¶ÔÏóÖÐÓÐÏÂÁÐһЩÓŵã:
1.¿ÉÒÔ¼¯ÖпØÖÆsession ÐÅÏ¢.µ±¶à¸ö±íÏÖ²ã¶ÔÏó·ÃÎÊͬһ¸ösession Êý¾Ýʱ,Õ⽫·Ç³£ÓÐÓÃ.
2.·Ç³£°²È«.ÓÉÓÚSession.getSessionData() ·µ»ØÒ»¸öÒ»°ãµÄObject,Èç¹ûÄ㽫sessionÊý¾Ý·Ö±ð´æ´¢, ÄãÐèÒª½«Ã¿¸öÊý¾Ýת»»³ÉÊʵ±µÄÀàÐÍ,ÄÇÑù¿ÉÄܻᵼÖÂÔËÐÐÆÚ´íÎó,·Ç³£ÄÑÒÔµ÷ÊÔ.
3.±ãÓÚsession Êý¾Ýά»¤.Èç¹ûÓдóÁ¿µÄsessionÊý¾Ý,Äã¿ÉÒÔÖÜÆÚÐÔÇå³ý²»±ØÒªµÄÊý¾Ý.ÀýÈçΪÁ˼ÓËÙ·ÃÎÊ,Äã¿ÉÄܽ«ºÜ¶à¹âÅ̵ÄÒ»¸öÊý×é·Åµ½Óû§µÄsession ÀïÃæ, µ«ÊÇÄã¿ÉÄܲ»±ØµÈÓû§Í˳öʱ²ÅÇå³ýÕâЩ¹âÅÌÊý¾Ý. ͨ¹ýÒ»¸ösession Êý¾Ý¶ÔÏó, Äã¿ÉÒÔºÜÈÝÒ×µÄʵÏÖÒ»¸ö·½·¨À´Çå³ýsessionÖв»±ØÒªµÄÊý¾Ý.
initSessionData() ·½·¨
±íÏÖ²ã¶ÔÏó×öµÄµÚÒ»¼þʾÍÊǵ÷ÓÃinitSessionData(). Õâ¸ö·½·¨µÄÖ÷Òª²¿·ÖÈçÏÂ:
Object obj = getComms().sessionData.get(DiscRackSessionData.SESSION_KEY);
if(null != obj) {
this.mySessionData = (DiscRackSessionData)obj;
} else {
this.mySessionData = new DiscRackSessionData();
getComms().sessionData.set(DiscRackSessionData.SESSION_KEY, this.mySessionData);
}
Õâ¶Î´úÂëµÄµÚÒ»¸öÓï¾ä¾ÍÊÇͨ¹ýsession ¹Ø¼ü×Ö"DiscRackSessionData"µÃµ½session Êý¾Ý¶ÔÏó, Èç¹ûsession Êý¾Ý¶ÔÏó´æÔÚ, ½«Æäת»»³ÉDiscRackSessionData¶ÔÏó; ·ñÔò, ´´½¨Ò»¸öеÄDiscRackSessionData ¶ÔÏó, ͨ¹ýset()·½·¨½«Æä´æÓÚÓû§µÄsessionÀïÃæ.
loggedInUserRequired() ·½·¨
BasePO ÀàÓÐÒ»¸ö³éÏóµÄ·½·¨:loggedInUserRequired(),Ëü·µ»ØÒ»¸ö boolean Öµ, Ëü±íʾÓû§·ÃÎÊÏà¹ØµÄÒ³ÃæÊ±Óû§ÊÇ·ñÐèÒªµÇ½. ÕâÑù,ÿһ¸ö±íÏÖ²ã¶ÔÏóÐèҪʵÏÖÕâ¸ö·½·¨.
ÔÚBasePOµÄrun()·½·¨ÖÐ,Èç¹ûÕâ¸ö·½·¨·µ»Øtrue, checkForUserLogin() ·½·¨¾Í»á±»µ÷ÓÃ.
checkForUserLogin() ·½·¨
checkForUserLogin() ·½·¨¼ì²âÓû§ÊÇ·ñÒѾÕýÈ·µØµÇ½. Èç¹ûûÓеϰ, ¾Í»áÔÚä¯ÀÀÆ÷ÖÐÖØ¶¨Ïòµ½Login Ò³Ãæ:
...
Person user = getUser();
if (null == user) {
...
throw new ClientPageRedirectException(LOGIN_PAGE);
}
...
ΪÁËʹÕâ¶Î´úÂë¸üÇåÎú,½« debugÐÅϢдÈë log channelµÄ¼¸¸öÓï¾äÒѾ±»É¾³ýÁË.
µ÷ÓÃgetUser() ÊÂʵÉÏÊǵ÷ÓÃgetSessionData().getUser(), Ëü·µ»Ø±£´æÔÚµ±Ç°sessionÖеÄÒ»¸öPerson ¶ÔÏó. Èç¹ûÓû§Ã»Óеǽ, »òsession ÒѾ¹ýÆÚ, Õâ¸ö·½·¨·µ»Ønull, ͬʱÅ׳öÒ»¸öClientPageRedirectException ,Õâ¸öÒì³£ÓÃloginÒ³ÃæµÄurl×÷ΪÆä²ÎÊý.
µ±ä¯ÀÀÆ÷±»ClientPageRedirectExceptionÖØ¶¨Ïòʱ, any parameters from a query string that were available to the original presentation object are lost. ËùÒÔÈç¹ûÄãÏë´«µÝÒ»¸ö´íÎóÐÅÏ¢, Äã±ØÐ뽫Æä·Åµ½sessionÀïÃæor directly into the query string of the redirected URL.ʼþ´¦Àí
--------------------------------------------------------------------------------
Äã¿ÉÒÔΪӦÓóÌÐòÖеÄÿ¸öÈÎÎñ´´½¨Ò»¸ö¶ÀÁ¢µÄ±íÏÖ²ã¶ÔÏó, µ«ºÜ¶àÇé¿öÏÂÓÃÒ»¸ö±íÏÖ²ã¶ÔÏó´¦Àí¶à¸öʼþ¸üÓÐÒâÒå. ÀýÈç:
Edit ±íÏÖ²ã¶ÔÏóÄܹ»ÏìÓ¦4¸öʼþ--ÏÔʾÔö¼ÓÒ³Ãæ, ÏÔʾ±à¼Ò³Ãæ, ½«disc¼ÓÈëµ½Êý¾Ý¿â, ´ÓÊý¾Ý¿âÖÐɾ³ýdisc .Login ±íÏÖ²ã¶ÔÏó´¦Àí3¸öʼþ--ÏÔÊ¾Ò³Ãæ, µÇ½, Í˳ö.
×¢Òâ: ÔÚÕâÀï,ʼþ(event)ÊÇÖ¸Óû§ÕýÔÚ´¦ÀíµÄÈÎÎñ.
ÉèÖÃʼþ²ÎÊý(event parameter)
DiscRack ͨ¹ýʼþ²ÎÊýÀ´¸ú×ÙËüÕýÔÚ´¦ÀíµÄʼþ,²ÎÊý·ÅÔÚÇëÇóµÄ×Ö·û´®ÖÐ.ͨ¹ýʼþ²ÎÊýÀ´¸ú×ÙÕýÔÚ´¦ÀíµÄʼþ. ÀýÈç, ÏÂÃæÕâURLÖ¸¶¨Ê¼þ(event)ΪshowAddPage:
http://Localhost:8000/discMgmt/Edit.po?event=showAddPage
DiscRack ½²ÊöÁ˺ü¸ÖÖÉèÖÃʼþµÄ·½·¨:
1.showAddPage ʼþ¶¨ÒåÔÚDiscCatalog.html Ò³ÃæÖÐ,ͨ¹ýJavaScriptµÄonClick ʼþÀ´´¦Àí Add Ò»¸öйâÅ̵İ´Å¥.Õ⽫»áµ÷ÓÃJavaScriptÖÐµÄ showAddPage()º¯Êý, Õâ¸öº¯Êý½«Ê¼þ¼Óµ½ÇëÇóµÄURLÀïÃæ:
document.location='Edit.po?event=showAddPage'
Õâ¸öº¯Êý¶¨ÒåÔÚpresentation/discMgmt/DiscCatalogScript.htmlÖÐ, ²»ÊÇDiscCatalog Ò³Ãæ, ¾ßÌå½âÊͼû"Replacing JavaScript."
2.add ʼþ(½«Ò»¸ödisc¼ÓÈëµ½Êý¾Ý¿â) ͨ¹ýÒ»¸öÒþ²ØµÄform field¶¨ÒåÔÚEdit.html Ò³Ãæ:
<input type="hidden" name="event" value="add" id="EventValue">
µ±Óû§µã»÷Add°´Å¥Ê± , event=add ºÍÆäËüÓû§ÊäÈëµÄformÊý¾ÝÒ»Æð¼Óµ½µÝ½»ÇëÇóÖÐ(submission request) .
3.exit ʼþͨ¹ýDiscCatalog.htmlÒ³ÃæÖеڶþ¸öformµÄACTIONÊôÐÔ¶¨Òå:
"../personMgmt/Exit.html"
±àÒëʱ, Õâ¸öURL, ¾ÍÏñ"URL mapping,"Öн²µÄ±»Ì滻Ϊ:
'../personMgmt/Login.po?event=logout'
¾¡¹Ü DiscRack ûÓÐʵÏÖ, µ«Äã¿ÉÒÔÔÚÅ׳öÒ»¸öPageRedirectExceptionʱÉèÖÃʼþ. Äã¿ÉÒÔÓÃÕâ¸öÒ쳣ʵÏÖÔÚÒ»¸ö±íÏÖ²ã¶ÔÏóÖпØÖÆÆäËüµÄ±íÏÖ²ã¶ÔÏó. ½«ÏÂÃæµÄ×Ö·û´®¼Óµ½´«µÝ¸øPageRedirectException¹¹ÔìÆ÷µÄurl×Ö·û´®ÖÐ,ÕâÑù¾Í¿ÉÒÔÖ¸¶¨Ê¼þ:
"?event=someEvent"
handleEvent() ·½·¨
Ò»µ©Ê¼þ(event)±»É趨ºÃ, BasePOÖеÄhandleEvent()·½·¨½«»á½«»á½øÐÐÕæÕýµÄʼþ´¦Àí:
String event = getComms().request.getParameter(EVENT);
String returnHTML = null;if (event == null || event.length() == 0) {
returnHTML = handleDefault();
} else {
returnHTML = getPageContentForEvent(event);
}
getComms().response.writeHTML(returnHTML);
Õâ¸ö·½·¨µÃµ½ÇëÇó×Ö·û´®ÖеÄʼþ²ÎÊý²¢µ÷ÓÃÏàÓ¦µÄʼþ´¦Àí·½·¨. Èç¹û·¢ÏÖÇëÇóÖÐûÓÐʼþ²ÎÊý, ¾Íµ÷ÓÃhandleDefault(), ÕâÊÇBasePOÖеÄÒ»¸ö³éÏóµÄ·½·¨,ËùÒÔBasePO µÄËùÓÐ×ÓÀà¶¼»áʵÏÖËü. ·ñÔò, µ÷ÓÃgetPageContentForEvent(), Õâ¸ö·½·¨·µ»ØÖ¸¶¨Ê¼þºÍPOµÄ×Ö·ûÄÚÈÝ.
Õâ¸ö·½·¨°üº¬ÏÂÃæÈýÐÐ:
Method method = this.getClass().getMethod(toMethodName(event), null);
String thePage = (String)method.invoke(this, null);
return thePage;
Õâ¶Î´úÂëʹÓÃreflection (¶¨ÒåÔÚjava.lang.reflect °üÖÐ)¸ù¾Ýµ±Ç°Ê¼þµ÷ÓÃÏàÓ¦µÄ±íÏÖ²ãÖеķ½·¨. Reflection ¿ÉÒÔÈÃÄãÔÚÔËÐÐʱ¸ù¾Ý·½·¨Ãûµ÷ÓÃÒ»¸ö·½·¨.
µ÷ÓÃtoMethodName() ʱ·µ»ØÒ»¸ö×Ö·û´®, handleXxx, Xxx Ö¸µ±Ç°Ê¼þ(ÀýÈç, handleShowAddPage ±íʾ´¦ÀíshowAddPageʼþ). method.invoke() È»ºóµ÷ÓÃÕâ¸ö·½·¨.
Reflection ÔÊÐíBasePO µ÷ÓÃÆä×ÓÀàÖеķ½·¨,¶ø²»±ØÖªµÀ·½·¨Ãû. Ö»Òª±íÏó²ã¶ÔÏó´úÂëÖÐÓÐÏàÓ¦µÄÃüÃûת»»Õâ¸ö·½°¸¾Í»á¹¤×÷:¶ÔÓÚÿһ¸öʼþ"foo," ±íÏÖ²ã¶ÔÏóÀàÖбØÐëÓÐÒ»¸ö handleFoo() ·½·¨¶Ôʼþ½øÐд¦Àí.
HTML Ò³Ãæ
--------------------------------------------------------------------------------
Äã»áÔÚ<discRack_root>/discRack/resourcesĿ¼ÖÐÕÒµ½DiscRackËùÐèµÄHTML Ò³Ãæ. ½«HTMLÒ³Ãæ·ÅÔÚÄǶù¶ø²»ÊÇ presentation Ŀ¼,ÕâÊÇΪÁ˽«HTML ÎļþºÍJavaÎļþ¸üºÃµÄ·ÖÀ뿪À´.¾¡¹Ü¶ÔÓÚСµÄÓ¦ÓóÌÐòÀ´ËµÕâʱ¶àÓàµÄ,µ«¶ÔÓÚÓÉÒ»¸öͼÐÎÉè¼ÆÍŶӺÍÒ»¸ö±à³ÌÍŶӺÏ×÷¿ª·¢µÄ´óÐÍÓ¦ÓÃÊǷdz£Óкô¦µÄ..
±íÏÖ²ãµÄmakeÎļþ¿ØÖÆÓ¦ÓóÌÐòÔõÑùʹÓà HTML Îļþ. ±íÏÖ²ã×ܹ²ÓÐ3¸ömakeÎļþ--¶¥²ãĿ¼ÓÐÒ»¸ö,ÿ¸ö×ÓĿ¼ҲÓÐÒ»¸ö.
ΪÁ˽«HTMLÎļþ·ÅÔÚÒ»¸öµ¥¶ÀµÄĿ¼¶øÓë±íÏÖ²ãµÄÀà·ÖÀë, make ÎļþʹÓÃÁËHTML_DIR ±êʾ, Ëü±íʾhtmlÎļþ´æ·ÅµÄĿ¼. ÀýÈç, ÔÚpresentation/MakefileÎļþÖÐ, Äã»á¿´µ½:
HTML_DIR = ../resources
ÔÚpresentation/discMgmt/MakefileÎļþÖÐ:
HTML_DIR = ../../resources/discMgmt
make ¹æÔò½«»áÕÒµ½½«»áÕÒµ½presentationĿ¼ÖеÄHTML Îļþ(ÀýÈç, discMgmt/DiscCatalogScript.html).
HTML_CLASSES ±êʾ ±íÃ÷ XMLC´´½¨µÄÀàµÄÃû×Ö, ¾ÍÏñ"Adding a new page to the application."Öн²µÄ.
×¢Òâpresentation/media Ŀ¼Öаüº¬ÁËÒ»¸ömakeÎļþ. This directory mirrors the final package structure for the .jar file. make ÎļþÖеÄÏÂÃæÒ»Ðн«.gifÎļþ¸´ÖƵ½×îÖÕµÄd .jar ÎļþÖÐ:
JAR_INSTALL = \ ../../resources/media/*.gif
ά»¤ÑÝÊ¾Ãæ°å(storyboard)
--------------------------------------------------------------------------------
ÑÝÊ¾Ãæ°å¿ªÊ¼Ê±Ö»ÊÇÓ¦ÓóÌÐòµÄÒ»¸öÄ£ÐÍ.µ«ÊÇͨ¹ý¼òµ¥µÄ¼¸¸ö²½Öè,Äã¿ÉÒÔÔÚÕû¸ö¿ª·¢¹ý³ÌÖÐά»¤Ò»¸ö¿ÉÒÔ¹¤×÷µÄÑÝÊ¾Ãæ°å.µ±ÓÃÒ»¸öͼÐÎÉè¼ÆÍŶӺÍÒ»¸ö±à³ÌÍŶӺÏ×÷¿ª·¢´óÐÍÓ¦ÓÃʱÕâÖÖÄÜÁ¦ÓÈÎªÖØÒª. ÿ¸öÍŶӶ¼¿ÉÒÔ¶ÀÁ¢µØ×ö×Ô¼ºµÄ¹¤×÷¶ø²»ÊÜÆäËüÍŶӵÄÓ°Ïì.
µ±Í¼ÐÎÉè¼ÆÍŶÓÍê³ÉÁËËûÃǵŤ×÷ÒÔºó,Äã¾Í¿ÉÒÔÓÃеĸĽøµÄ½çÃæÈ¡´ú¾ÉµÄ,Ä£ÐÍ»¯µÄ½çÃæ, нçÃæÖаüÀ¨¸üºÃµÄͼÐÎ,JavaScript ÌØÐ§, Ñùʽ±í(stylesheets)µÈµÈ. "Replacing the user interface."ÖÐÒѾ½²ÊöÁËÕâÑùµÄÒ»¸öÀý×Ó.
ΪÁ˱£³Ö HTMLÎļþºÍJava´úÂëµÄ¶ÀÁ¢, ¾ÍÏñǰһ½Ú½²µÄ, ÔÚ¿ª·¢¹ý³ÌÖÐÄã±ØÐë×ñÑÏÂÃæÈý²½À´Î¬»¤ÑÝÊ¾Ãæ°å:
1.¶¨ÒåurlÖ®¼äµÄÓ³Éä,ÀýÈç Login.html Ó³ÉäΪLogin.po2.ɾ³ýHTMLÎļþÖеĶàÓàÊý¾Ý
3.Èç¹ûÐèÒªµÄ»°,Ìæ»»JavaScript
ÕâÈý²½ÖеÄÿһ²½ÔÚÏÂÃæµÄ¼¸½ÚÖж¼ÓÐÏêϸµÄÃèÊö:
URL Ó³Éä
ÔÚ¿ÉÒÔ¹¤×÷µÄÑÝÊ¾Ãæ°åÖÐ, ÏñÈκξ²Ì¬htmlÒ³ÃæÒ»Ñù, ³¬Îı¾Á¬½ÓÖ¸ÏòÆäËüµÄhtmlÎļþ. Ò²¾ÍÊÇ˵,³¬Îı¾Á¬½ÓÖÐµÄ URL ÒÔ.html½áβ.µ«ÊÇÔÚ¿ÉÒÔ¹¤×÷µÄÓ¦ÓóÌÐòÖÐ, ¶¯Ì¬Ò³ÃæµÄÁ¬½ÓÖ¸ÏòÒÔ.po½áβµÄ±íÏÖ²ã¶ÔÏó . ËùÒÔ, ÄãÐèÒª×öһЩ¹¤×÷½«ÑÝÊ¾Ãæ°åÖеÄ"Õý³£µÄ" URLת»»Îª.po .
Äã¿ÉÒÔʹÓÃXMLCµÄ-urlmapping Ñ¡Ïһ¸öURL Ó³ÉäΪÁíÒ»¸ö,Ó÷¨ÈçÏÂ:
-urlmapping oldURL newURL
ΪÁËÔÚ±àÒë¹ý³ÌÖÐʹÓÃÕâ¸öÑ¡Ïî, ÄãÐèÒª´´½¨Ò»¸öXMLC Ñ¡ÏîÎļþ, È»ºóͨ¹ýmakeÎļþÖеÄXMLC_HTML_OPTS_FILE±êʾʶ±ð³öÕâ¸öÑ¡ÏîÎļþ. ÀýÈç:
XMLC_HTML_OPTS_FILE = options.xmlc
ÔÚpresentation/discMgmt/options.xmlc ÎļþÖаüº¬ÏÂÃæ¼¸ÐÐ:
-urlmapping 'Edit.html' 'Edit.po'
-urlmapping 'DiscCatalog.html' 'DiscCatalog.po'
-urlmapping '../personMgmt/Exit.html' '../personMgmt/Login.po?event=logout'
µ±XMLC ÔÚÕâ¸öĿ¼ÖбàÒëÎļþʱ, Ëü½«³¬Îı¾Á¬½ÓÖеÄurlºÍFORMÖÐACTIONÊôÐÔÖеĵÚÒ»¸ö×Ö·û´®(ÀýÈç, Edit.html) Ìæ»»ÎªµÚ¶þ¸ö×Ö·û´®(ÀýÈç, Edit.po) .
ɾ³ý¶àÓàÊý¾Ý
HTML ÎļþÖо³£°üº¬"¶àÓàµÄ" Êý¾Ý,ÕâÊÇΪÁËÈÃÑÝÊ¾Ãæ°åÖеÄÒ³Ãæ¸üÏñËüÃÇÔËÐÐʱµÄÍâ¹Û.ÄãÐèÒªÔÚÓ¦ÓóÌÐòÖÐɾ³ýÕâЩ¶àÓàµÄÊý¾Ý.
¿´Ò»ÏÂpresentation/discMgmt/options.xmlc Îļþ. ÌØ±ð×¢ÒâÏÂÃæÕâÒ»ÐÐ:
-delete-class discardMe
-delete-class Ñ¡Ïî¸æËßXMLC ɾ³ýËùÓÐCLASSÊôÐÔΪdiscardMeµÄ±ê¼Ç (»¹ÓÐËüÃǵÄÄÚÈÝ) .ÀýÈç,Èç¹ûÄ㿴һϠresources/discMgmt/DiscCatalog.htmlÎļþ, Äã»á¿´µ½ÏÂÃæµÄhtml´úÂë:
<tr class="discardMe">
<td>Sonny and Cher</td>
<td>Greatest Hits</td>
<td>Boring Music</td>
<td>Not</td>
</tr>
²»ÊÇÎÒÃDz»Ï²»¶ Sonny ºÍCher, È»¶ø,±í¸ñÐÐÖеÄCLASSÊôÐÔ±íÃ÷ÕâÐн«»á±»É¾³ý.
²»ÏñIDÄÇÑù, Ò»¸öÒ³ÃæÖÐCLASS ÊôÐÔµÄÖµ¿ÉÒÔ²»Î¨Ò». Äã¿ÉÒÔÓÃͬһ¸öÖµ:discardMeÀ´É¾³ýËùÓеĶàÓàµÄÊý¾Ý.
Ìæ»»JavaScript
³ýÁËÌæ»»URLÍâ, Äã»á¾³£ÓóÌÐòÖÐʵ¼ÊÓõ½µÄJavaScriptÀ´Ìæ»»µôÑÝÊ¾Ãæ°åÖеÄJavaScript .ÀýÈç, resources/DiscCatalog.htmlÎļþÖаüº¬ÁËÏÂÃæµÄ ½Å±¾:
<SCRIPT id="DummyScript">
<!--
function doDelete()
{
document.EditForm.action='DiscCatalog.html';
if(confirm('Are your sure you want to delete this disc?')) {
document.EditForm.submit();
}
}
function showAddPage()
{
document.location='Edit.html';
}
//-->
</SCRIPT>
ÕâЩº¯Êý°ïÖúÑÝÊ¾Ãæ°åÄܹ»¹¤×÷. ÔËÐÐʱ,Ó¦ÓóÌÐò½«»áʹÓÃÕæÕýµÄº¯Êý,Õâ¸öº¯Êý¶¨ÒåÔÚpresentation/DiscCatalogScript.htmlÎļþÖÐ. ÀýÈç:
...
function showAddPage()
{
document.location='Edit.po?event=showAddPage';
}
...
ÓÉÓÚXMLC ½«JavaScript¿´×÷×¢ÊÍ, URLÓ³ÉäÑ¡Ï²»»áÓ°Ïìµ½ JavaScriptº¯ÊýÖеÄÕâ¸öURL. ËùÒÔÔÚÔËÐÐʱ, Äã±ØÐëÔÚDiscCatalog.javaÖÐÓÃÏÂÃæµÄ´úÂëÌæ»»Ëü:
DiscCatalogHTML page = new DiscCatalogHTML();
HTMLScriptElement script = new DiscCatalogScriptHTML().getElementRealScript();
XMLCUtil.replaceNode(script, page.getElementDummyScript());
ÕâÊÇÓÃÆäËüÎĵµÖеÄÒ»¸ö½ÚµãÌæ»»Ò»¸ö½ÚµãµÄÀý×Ó.¾ßÌåʵÏÖÓõ½ÁËXMLCUtil Àà.
×¢Òâ: ÓÉÓÚÕâ¸öÐÐΪÔÚÔËÐÐʱ·¢Éú, ¿ÉÄܶÔÐÔÄÜÓкÜСµÄÒ»µãÓ°Ïì. Èç¹ûÐÔÄÜÊÇ×î¹Ø¼üµÄ,Äã¿ÉÄÜ»áÔÚÓ¦ÓóÌÐòµÄ×îÖÕ²¿Êð°æ±¾ÖÐÌæ»» JavaScript .
ά»¤ÑÝÊ¾Ãæ°å¿ÉÄÜ¿´ÆðÀ´ÊǶàÓàµÄ,û±ØÒªµÄ¹¤×÷, but it is worth the effort when your HTML is evolving in parallel with the Java code. As an example of the power of a working storyboard, you can exchange the HTML in DiscRack from the basic HTML to designed HTML.
Ìæ»»Óû§½çÃæ
Ò»µ©Í¼ÐÎÉè¼ÆÍê³É,Äã¿ÉÒÔ½«Ó¦ÓóÌÐòµÄÓû§½çÃæÌæ»»ÎªÆä×îÖյİ汾y. DiscRack Öаüº¬ÁËÒ»¸öresources_finished Ŀ¼,Õâ¸öĿ¼Öаüº¬ÁË×îÖÕ°æ±¾µÄ" HTML Ò³Ãæ, »¹ÓÐͼÐκÍÑùʽ±í
ΪÁ˽«ÒÔǰµÄÑÝÊ¾Ãæ°åµÄÄÚÈÝÌæ»»Îª×îÖÕµÄ,ÄãÐèÒª:
1.½«resources Ŀ¼¸ÄÃûΪresources_old.2.½« resources_finished Ŀ¼¸ÄÃûΪresources.
±à¼<DiscRack_root>/discRack/presentation/media/MakefileÎļþÖеÄJAR_INSTALL±êʾ,ɾ³ýÆäÇ°ÃæµÄÁ½¸ö×¢ÊͺŠ(#) ,ÔÚµÚÒ»ÐкóÃæ¼ÓÈëÒ»¸öÁ¬½Ó·û(\) ,ÈçÏÂËùʾ:
JAR_INSTALL = \
../../resources/media/*.gif \
../../resources/media/*.css \
../../resources/media/*.jpg
Õâ¾Í±£Ö¤ÁËеÄ.jpeg ͼÐκÍÑùʽ±íÎļþ»á·ÅÈëÓ¦ÓóÌÐòµÄ´ò°üÎļþ.jar ÖÐ.
ÔÚ±íÏÖ²ãĿ¼<DiscRack_root>/discRack/presentationÖÐÊäÈëÏÂÃæµÄÃüÁîÀ´ÖØÐ±àÒë:
make clean
make
make clean ÃüÁî»áɾ³ýËùÓоɵÄÀà, make ½«´ÓÍ·¿ªÊ¼ÖØÐ±àÒëÓ¦ÓóÌÐò.
ÏÖÔÚ, ÖØÐÂÆô¶¯Ó¦ÓóÌÐò²¢·ÃÎÊËü.Äã»á¿´µ½¸Ä½øÁ˵ÄÓû§½çÃæ:ͼÐÎ5.3 ÏÔʾ¸Ä½øºóµÄµÇÂ½Ò³Ãæ
Ìî³äÁбí¿ò
--------------------------------------------------------------------------------
DiscCatalog Ò³ÃæÃèÊöÁËÔõÑùÌî³äÒ»¸öÑ¡ÔñÁбí¿ò, ÕâÊÇÒ»¸öºÜ³£¼ûµÄ¹¤×÷. Ê×ÏÈ, ¿´Ò»ÏÂDiscCatalog.htmlÖÐSELECT±ê¼ÇµÄHTML´úÂë:
<SELECT id="TitleList" Name="discID">
<OPTION selected VALUE="invalidID">Select One</OPTION>
<OPTION id="templateOption">Van Halen: Van Halen One</OPTION>
<OPTION class="discardMe">Sonny and Cher: Greatest Hits</OPTION>
<OPTION class="discardMe">Sublime: 40 oz. to Freedom</OPTION>
</SELECT>
ÏÖÔÚ¿´Ò»ÏÂDiscCatalog.java ÖÐÌî³äÁбí¿òµÄ´úÂë.
HTMLOptionElement templateOption = page.getElementTemplateOption();
Node discSelect = templateOption.getParentNode();
µÚÒ»Ðиù¾ÝtemplateOPTION±ê¼ÇµÃµ½Ò»¸öDOM¶ÔÏó. µÚ¶þÐе÷ÓÃgetParentNode() µÃµ½SELECT±ê¼ÇµÄÈÝÆ÷. ÓÉÓÚSELECT ±ê¼ÇÓÐID ÊôÐÔ, ÕâÒ»ÐÐÒ²¿ÉÒÔÕâôд:
Node discSelect = page.getElementTitleList();
È»ºó½ÓÏÂÀ´µÄ¼¸ÐдúÂë»áÌî³ä±í¸ñ, ÏÂÃæÕâÒ»ÐÐÓÃÀ´É¾³ýÄ£°æÐÐ.
templateOption.removeChild(templateOption.getFirstChild());
ÆäËü°üº¬CLASS="discardMe"µÄOPTION ±ê¼Ç, XMLC »áÔÚÔËÐÐʱɾ³ýËüÃÇ,¾ÍÏñ"ɾ³ý¶àÓàÊý¾Ý"Öн²µÄ.
È»ºó, ͨ¹ýÒ»¸ö for Ñ»·²»¶ÏµÄµÃµ½ÊôÓÚµ±Ç°Óû§µÄ¹âÅÌ, ÏÂÃæµÄ´úÂëÕæÕýµÄÌî³äÁбí¿ò:
HTMLOptionElement clonedOption = (HTMLOptionElement)
templateOption.cloneNode(true);
clonedOption.setValue( currentDisc.getHandle() );
Node optionTextNode =
clonedOption.getOwnerDocument().createTextNode(currentDisc.getArtist()
+ ": " + currentDisc.getTitle());
clonedOption.appendChild(optionTextNode);
discSelect.appendChild(clonedOption);
µÚÒ»ÐдúÂ뿽±´(¿Ë¡) Ä£°æÑ¡ÏîÔªËØÎªÒ»¸öÀàÐÍΪHTMLOptionElementµÄDOM ¶ÔÏó . µÚ¶þÐиù¾ÝgetHandle()·µ»ØµÄÖµÉèÖÃÆäÖµ , Õâ¸öÖµ¾ÍÊǹâÅ̵ÄOBJECTID, Ò»¸öΨһµÄ±êʾ·û.
µÚÈýÐÐ(·Ç³£³¤)´´½¨Ò»¸ö°üº¬ÒÕÊõ¼ÒÃûºÍ±êÌâµÄÎı¾½Úµã. ×îÖÕ, ×îºóµÄÁ½Ðн«Îı¾½ÚµãÌí¼Óµ½Ñ¡Ïî½ÚµãÖÐ,ÔÙ½«Ñ¡Ïî½ÚµãÌí¼Óµ½Ñ¡Ôñ½ÚµãÖÐ.
ÔËÐÐʱµÄHTML´úÂë»áÏñÏÂÃæÕâÑù:
<SELECT name='discID' id='TitleList'>
<OPTION value='invalidID' selected>Select One</OPTION>
<OPTION value='1000001'>Funky Urchin: Lovely Spines</OPTION>
<OPTION value='1000021'>The Seagulls: Screaming Fun</OPTION>
</SELECT>
¾¡¹ÜÕâ¸öÀý×Ó²»Ê®·ÖÃ÷ÏÔ, ÇÒÏ൱¶Ì,µ«Äã¿ÉÒÔ¶ÔÆä½øÐÐÀ©Õ¹Ê¹ÆäÄÜ´¦Àí¸ü¸´ÔÓµÄÇéÐÎ. ÀýÈç, you can modify it to set the default selection based on a second query.Ìî³äform
--------------------------------------------------------------------------------
µ±Óû§ÔÚÁбí¿òÖÐÑ¡ÔñÁËÒ»¸ö¹âÅ̲¢µ¥»÷Edit Disc °´Å¥Ê±, ä¯ÀÀÆ÷½«»áÏÔʾһ¸ö form. Èçͼ5.4Ëùʾ, ±à¼±íµ¥(edit form)±»Ñ¡ÖеĹâÅÌÒÑÓеÄÖµÌî³ä.Óû§¿ÉÒԸıäÕâЩֵ,²¢½«¸ÄºóµÄÖµÌá½»µ½Êý¾Ý¿â.ͼÐÎ5.4 DiscRack ¹âÅÌµÄ±à¼±íµ¥
ÏÂÃæÊÇEdit.htmlÖÐ±íµ¥ÔªËØµÄhtml´úÂë.ΪÁËÇåÎú, TABLE ±ê¼ÇÒѾ±»Ê¡È¥ÁË:
<INPUT TYPE="hidden" NAME="discID" VALUE="invalidID" ID="DiscID">
Artist: <input name="artist" id="Artist" >
Title: <input name="title" id="Title" >
Genre: <input name="genre" id="Genre" >
Do you like this disk?
<input TYPE="checkbox" name="like" CHECKED ID="LikeBox">
<INPUT TYPE="submit" VALUE="Save This Disc Info">
ÔÚEdit.javaÖÐ, ʼþ´¦Àí·½·¨handleDefault() µ÷Óôønull²ÎÊýµÄshowEditPage()À´½«Ñ¡ÖйâÅ̵ÄÖµÌî³äµ½±íµ¥ÖÐ. ͨ³£, ½öÓеÄÇëÇó²ÎÊý(³ýÁËÆäËüʼþÀàÐÍ) ¾ÍÊǹâÅ̵ÄID, ͨ¹ýÏÂÃæÕâ¸öÓï¾äµÃµ½:
String discID = this.getComms().request.getParameter(DISC_ID);
ÏÂÃæÕâЩÓï¾äµÃµ½ÆäËüµÄ²ÎÊý, µ«ÊÇͨ³£ËüÃÇΪ¿Õ(but see the error-handling case discussed later):
String title = this.getComms().request.getParameter(TITLE_NAME);
String artist = this.getComms().request.getParameter(ARTIST_NAME);
String genre = this.getComms().request.getParameter(GENRE_NAME);
È»ºó, µ÷ÓÃfindDiscByID() ¸ù¾ÝIDµÃµ½ Disc Êý¾Ý¶ÔÏó:
disc = DiscFactory.findDiscByID(discID);
½ÓÏÂÀ´µÄһϵÁÐÓï¾ä»á¼ì²étitle, artist, genre, ºÍisLikedµÄÖµ, ͨ³£ÕâЩֵΪ¿Õ. Òò´Ë,ÏÂÃæµÄÓï¾ä»á±»Ö´ÐÐ(the surrounding if statements are not shown for brevity):
page.getElementDiscID().setValue(disc.getHandle());
page.getElementTitle().setValue(disc.getTitle());
page.getElementArtist().setValue(disc.getArtist());
page.getElementGenre().setValue(disc.getGenre());
page.getElementLikeBox().setChecked(disc.isLiked());
ÕâЩÓï¾äͨ¹ýxmlcµ÷ÓÃÀ´ÉèÖÃ±íµ¥ÔªËØµÄÖµ,ÕâЩֵ¶¼ÊÇ´ÓDisc¶ÔÏóÖÐÈ¡µÃ.
µ±Óû§Íê³É±à¼²¢µã»÷ Save this Disc Info°´Å¥Ê±, handleEdit() ½«»á´¦Àí±à¼ºóµÄ¹âÅÌÐÅÏ¢.Õâ¸ö·½·¨µ÷Óà saveDisc()·½·¨,ÊÔͼ½«ÐµÄÖµ´æÈëÊý¾Ý¿â:Èç¹û³É¹¦µÄ»°, ¿Í»§¶Ë½«»áÖØ¶¨Ïòµ½DiscCatalog Ò³Ãæ.
Èç¹ûÈκÎÒ»¸öÐÂֵΪ¿Õ, saveDisc() ½«»áÅ׳öÒ»¸öÒì³£.
catch Óï¾ä»áµ÷ÓÃÒÔ³ö´íÐÅÏ¢×÷Ϊ²ÎÊýµÄshowEditPage() ·½·¨.
×¢Òâ: ClientPageRedirectExceptionÊÇjava.lang.ErrorµÄÒ»¸ö×ÓÀà,ËùÒÔÅ׳öÒ쳣ʱËü²»»á±»catchÓï¾ä²¶»ñ.
try {
saveDisc(disc);
throw new ClientPageRedirectException(DISC_CATALOG_PAGE);
} catch(Exception ex) {
return showEditPage("You must fill out all fields to edit this disc");
}
The result is that when a user tries to edit a disc and delete some of the values, the edit page redisplays, maintaining all the non-null form element values and restoring the previous values to the null-valued form elements. The page also displays the error string.
Business ²ã
DiscRackµÄbusiness ²ã·Ç³£¼òµ¥, Ö÷Òª°üÀ¨:
Á½¸ö°ü--Disc ºÍPerson
Á½¸öfactory Àà--DiscFactory ºÍPersonFactory.
Ò»¸öfactoryÊÇÕâÑùµÄÒ»¸ö¶ÔÏó:Ö÷Òª×÷ÓþÍÊÇ´´½¨ÆäËü¶ÔÏó.
Business ¶ÔÏó
business ¶ÔÏóDisc ºÍPerson Ö÷Òª·â×°ÁËÏàÓ¦µÄdata²ãÀà: DiscDO ºÍPersonDO, data¶ÔÏóÖеÄÿ¸öÊôÐÔ(»òÊý¾Ý¿â±íÖеÄÁÐ)¶¼ÓÐget ºÍset ·½·¨. ÀýÈç, Disc ¶ÔÏóÓÐgetArtist() ºÍsetArtist() ·½·¨.
business ²ãµÄ¶ÔÏóÍê³ÉËùÓеÄÓëdata²ãµÄÁ¬½Ó.ËùÒÔ, Èç¹ûdata ²ãÐèÒª¸Ä±ä, presentation ²ã½«²»»áÊÜÓ°Ïì. ͬÑù, Èç¹ûpresentation ²ã¸Ä±äÁË, data ²ãÒ²²»»áÊÜÓ°Ïì.
DiscFactory ÓÐÁ½¸ö¾²Ì¬·½·¨:
findDiscsForPerson() ·µ»ØÊôÓÚÖ¸¶¨Person¶ÔÏóËùÓµÓеÄDisc¶ÔÏóµÄÒ»¸öÊý×é.findDiscByID() ¸ù¾ÝÖ¸¶¨µÄID·µ»ØÒ»¸ö Disc ¶ÔÏó.
PersonFactory ÓÐÒ»¸ö¾²Ì¬·½·¨: findPerson(). Ëü¸ù¾ÝÖ¸¶¨µÄÓû§Ãû·µ»ØÒ»¸ö Person ¶ÔÏó. Èç¹ûÕâ¸ö·½·¨´ÓÊý¾Ý¿âÕÒµ½¶à¸öPerson, Ëü»á½«´íÎóÐÅϢдµ½log channelÖв¢Å׳öÒì³£.
ʹÓÃdata ¶ÔÏó
--------------------------------------------------------------------------------
ΪÁ˰ïÖúÄãÃ÷°×DiscRackÔõÑùʹÓà DODS ²úÉúµÄdata ²ã´úÂë, ¿´Ò»ÏÂPersonFactoryÖеÄfindPerson() ·½·¨.ΪÁËÇåÎú,×¢ÊÍÒѾ±»É¾³ýÁË.
public static Person findPerson(String username)
throws DiscRackBusinessException
{
try {
PersonQuery query = new PersonQuery();
query.setQueryLogin(username);
query.requireUniqueInstance();
PersonDO[] foundPerson = query.getDOArray();
if(foundPerson.length != 0) {
return new Person(foundPerson[0]);
} else {
return null;
}
} catch(NonUniqueQueryException ex) {
...Ê×ÏÈ, Õâ¸ö·½·¨´´½¨Ò»¸öPersonQuery ¶ÔÏó. PersonQuery ÊÇÒ»¸ödata²ã¶ÔÏó,ÓÃÀ´¹¹½¨ºÍÖ´ÐжÔperson±íµÄ²éѯ. ËüÓÐÐí¶àsetQueryxxx()·½·¨Ö¸¶¨²éѯ²ÎÊý(Ò²¾ÍÊÇ˵, ÔÚSELECTÓï¾äÖеÄWHERE×Ó¾äÖÐÉ趨ÏàÆ¥ÅäµÄÖµ). ÀýÈç, ÉÏÃæµÄ´úÂëÓÃusername×÷Ϊ²ÎÊýµ÷Óà setQueryLogin() À´ÉèÖÃÓëLOGINÁÐÏàÆ¥ÅäµÄÖµ. ½ÓÏÂÀ´, µ÷ÓÃrequireUniqueInstance()·½·¨,Õâ¸ö·½·¨±íʾ²éѯ½á¹ûÖ»ÄÜÊÇÒ»ÁÐ, ·ñÔò½«»áÅ׳öÒì³£. È»ºóµ÷ÓÃgetDOArray(), Õâ¸ö·½·¨Ö´ÐÐÒ»¸ö²éѯ, ·µ»ØÒ»¸öPersonDO¶ÔÏóµÄÊý×é. ×îºó, ¸ù¾Ý²éѯ·µ»ØÒ»¸öPerson ¶ÔÏó; Èç¹û²éѯûÓÐÕÒµ½ÈκÎÐÐ, Õâ¸ö·½·¨·µ»Ønull.