ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>都市激情久久久久久久久久久,美日韩黄色大片,性欧美高清comehttp://www.aygfsteel.com/Supershen/Java JavaEE Jsp Struts1.x Struts2.x Hibernate Spring2.0 EJB3.0 ASP .NET Php Flexzh-cnTue, 20 May 2025 11:21:27 GMTTue, 20 May 2025 11:21:27 GMT60springside mini-web学习æ€È»“ã€?/title><link>http://www.aygfsteel.com/Supershen/archive/2009/01/08/250512.html</link><dc:creator>Super·shen BLOG </dc:creator><author>Super·shen BLOG </author><pubDate>Thu, 08 Jan 2009 09:01:00 GMT</pubDate><guid>http://www.aygfsteel.com/Supershen/archive/2009/01/08/250512.html</guid><wfw:comment>http://www.aygfsteel.com/Supershen/comments/250512.html</wfw:comment><comments>http://www.aygfsteel.com/Supershen/archive/2009/01/08/250512.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Supershen/comments/commentRss/250512.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Supershen/services/trackbacks/250512.html</trackback:ping><description><![CDATA[springside3背景struts2.1.2 spring2.5.6 Hibernate3.4GA<br /> <br /> <br /> <span style="font-family: 黑体"><strong>1.struts2 <br style="font-family: " /> </strong></span><br /> 使用ZeroConfig + CodeBehind插äšg,实现¾U¦å®šå¤§äºŽé…ç½®çš„零配置文äšg风格.<br /> <br /> æ ÒŽœ¬ä¸ç”¨é…ç½®struts.xmlæ–‡äšg <br /> <br /> <br /> <br /> <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/supershen/s1.jpg" border="0" /><br /> <br /> ˜q™é‡Œž®±æ˜¯action实现annotation  CodeBehindã€?br /> 如方æ³?br /> <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/supershen/2s.jpg" border="0" /><br /> <br /> 通过 /user/user!input.action讉K—®åQ?òq¶è{åˆ?/user/user-xxx.jsp™åµé¢<br /> 即namespace + action name + "-" + "xxx.jsp"<br /> <br /> <br />  å¦å¤–其中 action中需要注入的 service 使用annotation åQŒåœ¨setæ–ÒŽ³•å‰?加入@request æˆ?@ autowired æˆ?@resource<br /> 注释åQˆå…·ä½“是用那个暂时无法搞清楚åQŒæ€ÖM¹‹æˆ‘用request ž®×ƒ¸è¡Œï¼Œå¦å¤–两个都可以)<br /> <br /> <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/supershen/222.jpg" border="0" /><br /> <br /> 有了˜q™ä¸ªä»£ç ä¹‹åŽ ž®Þpƒ½æ³¨å…¥spring 环境中的 id = userManager çš„bean åQˆæˆ‘个äh理解åQ?br /> <br /> 而springä¸?nbsp; id = userManager çš„bean  也是通过自动注入完成çš?br /> <br /> 主要代码æ˜?applicationContext.xmlæ–‡äšg中的<br /> 代码åQ?br /> <br /> <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/supershen/2222.jpg" border="0" /><br /> <br /> <br /> <span style="font-family: 黑体"><strong>2.spring<br /> </strong></span><br /> spring2.5.6çš„annotationç‰ÒŽ€§ç”¨çš„æ¯”较泛滥ã€?新手刚开始看的一头雾水很正常ã€?br /> <br /> xmlæ–‡äšg中配¾|®è‡ªåŠ¨æ³¨å†ŒbeanåQŒé€šè¿‡æ‰«æåŒ…中的带注解的类。即˜q™ä¸ªä»£ç åQ?br /> <br /> <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/supershen/2222.jpg" border="0" /><br /> <br /> <br /> 扫描åˆîC¸‹é¢çš„¾c»ï¼Œž®Þp‡ªåŠ¨æ³¨å†Œæˆ id=userManager<br /> <br /> <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/supershen/223.jpg" border="0" /><br /> <br /> <br /> <br /> <span style="font-family: 黑体"><strong>3.hibernate <br /> </strong></span>使用hiberante3 注解åQŒä¸è¦XML配置åQŒå®žä½“类注解不用多说ã€?br /> <br /> 需要注意的是entity¾cÈš„æ‰«æé…ç½®<br /> <br /> <br /> <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/supershen/33.jpg" border="0" /><br /> <br /> 看清楚是扫描包,不是扫描¾c»ï¼ 所以实体类com.mylu.User是无法扫描到åQŒè¦æ”‘Öœ¨ com.mylu.xxx.User才能扫描刎ͼ<br /> <br /> <br /> <br /> <br /> 下边按照ss3风格做的例子åQŒåŽ»æŽ‰spring security 框架的, ¾l“构更清晰ã€?br /> <br /> <a title="按照springside3风格做的例子 无安全框架的" href="/Files/Supershen/s2s2.rar">下蝲åQšå®žä¾‹ä»£ç ?/a><br /> <br /> <br /> 附:<br /> ¾cÕdº“<br /> <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/supershen/211.jpg" border="0" /> <img src ="http://www.aygfsteel.com/Supershen/aggbug/250512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Supershen/" target="_blank">Super·shen BLOG </a> 2009-01-08 17:01 <a href="http://www.aygfsteel.com/Supershen/archive/2009/01/08/250512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java jsp servlet 获得¾lå¯¹è·¯å¾„的方æ³?/title><link>http://www.aygfsteel.com/Supershen/archive/2008/09/17/229425.html</link><dc:creator>Super·shen BLOG </dc:creator><author>Super·shen BLOG </author><pubDate>Wed, 17 Sep 2008 06:55:00 GMT</pubDate><guid>http://www.aygfsteel.com/Supershen/archive/2008/09/17/229425.html</guid><wfw:comment>http://www.aygfsteel.com/Supershen/comments/229425.html</wfw:comment><comments>http://www.aygfsteel.com/Supershen/archive/2008/09/17/229425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Supershen/comments/commentRss/229425.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Supershen/services/trackbacks/229425.html</trackback:ping><description><![CDATA[<p>在jsp中,其实jspž®±æ˜¯servletåQŒjspå’Œservlet也都是一个classåQ?/p> <p>1 .request.getRealPath()åQŒè¿™ä¸ªæ–¹æ³•å·²¾lä¸æŽ¨èä½¿ç”¨åQŒåœ¨servlet后ç‘ô版本中将被取¾~”ã€?/p> <p>2.getServletContext().getRealPath("/")˜q™ä¸ªæ–ÒŽ³•比较好用åQŒå¯ä»¥ç›´æŽ¥åœ¨servletå’Œjsp中ä‹É用ã€?/p> <p>3.request.getSession().getServletContext().getRealPath()也可以在jspå’Œservlet使用ã€?/p> <p>4.this.getClass().getClassLoader().getResource("").getPath()åQŒè¿™ä¸ªæ–¹æ³•可以在ä»ÀL„jspåQŒservletåQŒjavaæ–‡äšg中ä‹Éç”¨ï¼Œå› äØ“ä¸ç®¡æ˜¯jspåQŒservlet其实都是java½E‹åºåQŒéƒ½æ˜¯ä¸€ä¸ªclass。所以它应该是一个通用的方法ã€?/p> <img src ="http://www.aygfsteel.com/Supershen/aggbug/229425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Supershen/" target="_blank">Super·shen BLOG </a> 2008-09-17 14:55 <a href="http://www.aygfsteel.com/Supershen/archive/2008/09/17/229425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>½Ž€å•权限系¾lŸè®¾è®¡éœ€æ±?/title><link>http://www.aygfsteel.com/Supershen/archive/2008/08/18/222806.html</link><dc:creator>Super·shen BLOG </dc:creator><author>Super·shen BLOG </author><pubDate>Mon, 18 Aug 2008 08:17:00 GMT</pubDate><guid>http://www.aygfsteel.com/Supershen/archive/2008/08/18/222806.html</guid><wfw:comment>http://www.aygfsteel.com/Supershen/comments/222806.html</wfw:comment><comments>http://www.aygfsteel.com/Supershen/archive/2008/08/18/222806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Supershen/comments/commentRss/222806.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Supershen/services/trackbacks/222806.html</trackback:ping><description><![CDATA[<p>普遍的,½Ž€å•的权限¾pȝ»Ÿè¦æ±‚åQ?br /> <br /> 1.¾pȝ»Ÿæ‰€æœ‰èµ„源定ä¹?[资源表]   ( ˜q˜å¯ä»¥åˆ†ä¸ºæ›´ž®çš„æƒé™è¡¨ï¼Œæ“ä½œè¡¨ï¼Œ˜q™é‡Œé€šå«èµ„源è¡?<br /> 2.定义角色 [角色表]<br /> 3.¾l™è§’色指定资源(一个角色可以管理多个资源) [角色-资源表]<br /> 4.定义用户¾l?[用户表]<br /> 5.¾l™ç”¨æˆïL»„指定角色åQˆä¸€ä¸ªç”¨æˆïL»„可以拥有多种角色åQ?[用户¾l?角色表]<br /> 6.¾l™ç”¨æˆähŒ‡å®šè§’è‰ÔŒ¼ˆä¸€ä¸ªç”¨æˆ·å¯ä»¥æ‹¥æœ‰å¤š¿Uè§’è‰ÔŒ¼Œå¯ä»¥ç›´æŽ¥æŒ‡å®šè§’色åQŒä¹Ÿå¯ä»¥¾l§æ‰¿ç”¨æˆ·¾l„的角色åQ‰[用户-角色表]</p> <p> </p> <p><br /> 查找权限æ—Óž¼š</p> <p>æ ÒŽ®ç”¨æˆ·ID[用户-角色表]或用æˆïL»„ID[用户¾l?角色表]åQŒæŸ¥åˆ°æ‰€æœ‰è§’色IDåQŒå†[角色-资源表]扑ֈ°æ‰€æœ‰è§’色下的所有资源ã€?</p> <p>此就是用æˆäh‹¥æœ‰çš„èµ„æºã€‚ï¼ˆèµ„æºä¸€èˆ¬äØ“æ¨¡å—åQŒå½“然也可以分更¾l†çš„定义为页面,操作æ–ÒŽ³•½{‰ï¼‰</p> <br /> 此权限设计适合于模块化讉K—®¾pȝ»ŸåQŒå¦‚OA<br /> <br /> <br /> 当然很多¾pȝ»Ÿå› åœ°è€Œå·²åQŒä¸å¯èƒ½å®Œå…¨æ»¡èƒöåQŒæŒ‰ç…§è‡ªå·Þq³»¾lŸéœ€æ±‚设计是最合适的设计ã€?br /> <br /> <br /> <br /> <img src ="http://www.aygfsteel.com/Supershen/aggbug/222806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Supershen/" target="_blank">Super·shen BLOG </a> 2008-08-18 16:17 <a href="http://www.aygfsteel.com/Supershen/archive/2008/08/18/222806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>½W¬ä¸€ä¸?CGIC sqlite3 代码http://www.aygfsteel.com/Supershen/archive/2008/03/01/183156.htmlSuper·shen BLOG Super·shen BLOG Sat, 01 Mar 2008 09:11:00 GMThttp://www.aygfsteel.com/Supershen/archive/2008/03/01/183156.htmlhttp://www.aygfsteel.com/Supershen/comments/183156.htmlhttp://www.aygfsteel.com/Supershen/archive/2008/03/01/183156.html#Feedback1http://www.aygfsteel.com/Supershen/comments/commentRss/183156.htmlhttp://www.aygfsteel.com/Supershen/services/trackbacks/183156.html

          插入

          用户:
          密码:
          Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÃÅÍ·¹µÇø| ºÓÔ´ÊÐ| Äþ»¯ÏØ| °×ÒøÊÐ| ´ó¸ÛÇø| ¾²ÄþÏØ| ÒÁ½ð»ôÂåÆì| ¡µÂÏØ| ºôÂêÏØ| ÇàÑôÏØ| ±£¿µÏØ| ÐÂÖ£ÊÐ| ¾Ą̊ÊÐ| Á¹É½| ×ñÒåÊÐ| ¶«Ô´ÏØ| Í©ÏçÊÐ| Âò³µ| ²©°®ÏØ| Í»ÈªÏØ| ÐÝÄþÏØ| Âó¸ÇÌáÏØ| äü¹ØÏØ| Èý½­| ÓãÌ¨ÏØ| ËçµÂÏØ| ËÑË÷| ºîÂíÊÐ| ÌúÁ¦ÊÐ| ÀϺӿÚÊÐ| ÇúË®ÏØ| ͨÖÝÇø| ¾ÅÁú³ÇÇø| ÑôÇúÏØ| Çì³ÇÏØ| ÒÇÂ¤ÏØ| ÈýÑÇÊÐ| ÐÅ·áÏØ| °²ÒåÏØ| ·½ÕýÏØ| ÏÉÓÎÏØ| 处理™åµé¢add2.cgi 代码 #include #include #include #include "sqlite3.h" #include "cgic.h" int cgiMain() { printf("Content-type:text/html\n\n"); printf(" "); sqlite3 *db=NULL; char *zErrMsg = 0; int rc; rc = sqlite3_open("test.db", &db); if(rc){ printf("Can't open database\n"); //˜q™é‡Œæ”¹äº†ã€‚要是按原先的,会提½Cºstderr未定义,我不知道ä¸ÞZ»€ä¹ˆã€‚哪位朋友知道一定要告诉我哦ã€? sqlite3_close(db); exit(1); } else printf("open test.db successfully!\n"); char username[241]; cgiFormString("username", username, 241); fprintf(cgiOut, "username:
          \n");
          cgiHtmlEscape(username);
          fprintf(cgiOut, "
          \n"); char password[241]; cgiFormString("password", password, 241); fprintf(cgiOut, "password:
          \n");
          cgiHtmlEscape(password);
          fprintf(cgiOut, "
          \n"); char sql[300]={'\0'}; //不能用指é’? //插入数据 sprintf(sql, "INSERT INTO \"user\" VALUES('%s', '%s');", username,password); //sql = "INSERT INTO \"user\" VALUES('username', 'password');" ; sqlite3_exec( db , sql , 0 , 0 , &zErrMsg ); printf(sql); printf("插入数据成功!\n"); int nrow = 0, ncolumn = 0; char **azResult; //二维数组存放¾l“æžœ //查询数据 /* int sqlite3_get_table(sqlite3*, const char *sql,char***result , int *nrow , int *ncolumn ,char **errmsg ); result中是以数¾l„的形式存放你所查询的数据,首先是表名,再是数据ã€? nrow ,ncolumn分别为查询语句返回的¾l“果集的行数åQŒåˆ—敎ͼŒæ²¡æœ‰æŸ¥åˆ°¾l“果时返å›? */ char *sql2 = "SELECT * FROM user"; sqlite3_get_table( db , sql2 , &azResult , &nrow , &ncolumn , &zErrMsg ); int i = 0 ; printf( "row:%d column=%d
          " , nrow , ncolumn ); printf( "\nThe result of querying is : \n" ); for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ ) printf( "azResult[%d] = %s
          ", i , azResult[i] ); //释放æŽ?azResult 的内存空é—? sqlite3_free_table( azResult ); sqlite3_close(db); //关闭数据åº? return 0; } è¯äh³¨æ„æ•°æ®åº“æ–‡äšg test.db的访问权é™? ˜q™é‡Œæ”ÒŽˆ777!

          ]]>
          CGIC½Ž€æ˜Žæ•™½E?/title><link>http://www.aygfsteel.com/Supershen/archive/2008/02/28/182683.html</link><dc:creator>Super·shen BLOG </dc:creator><author>Super·shen BLOG </author><pubDate>Thu, 28 Feb 2008 06:19:00 GMT</pubDate><guid>http://www.aygfsteel.com/Supershen/archive/2008/02/28/182683.html</guid><wfw:comment>http://www.aygfsteel.com/Supershen/comments/182683.html</wfw:comment><comments>http://www.aygfsteel.com/Supershen/archive/2008/02/28/182683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Supershen/comments/commentRss/182683.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Supershen/services/trackbacks/182683.html</trackback:ping><description><![CDATA[<p>[转自] http://webdn.trueself.cn/archives/107</p> <img src ="http://www.aygfsteel.com/Supershen/aggbug/182683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Supershen/" target="_blank">Super·shen BLOG </a> 2008-02-28 14:19 <a href="http://www.aygfsteel.com/Supershen/archive/2008/02/28/182683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c字符串处理函æ•?/title><link>http://www.aygfsteel.com/Supershen/archive/2008/02/27/182513.html</link><dc:creator>Super·shen BLOG </dc:creator><author>Super·shen BLOG </author><pubDate>Wed, 27 Feb 2008 08:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/Supershen/archive/2008/02/27/182513.html</guid><wfw:comment>http://www.aygfsteel.com/Supershen/comments/182513.html</wfw:comment><comments>http://www.aygfsteel.com/Supershen/archive/2008/02/27/182513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Supershen/comments/commentRss/182513.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Supershen/services/trackbacks/182513.html</trackback:ping><description><![CDATA[<p>◆ 使用strtok函数分割ã€?br />      原型åQšchar *strtok(char *s, char delim); <br />     strtok在s中查扑֌…含在delim中的字符òq¶ç”¨NULL('\0')来替æ?直到æ‰ùNæ•´ä¸ªå­—符丌Ӏ?nbsp; <br />      功能åQšåˆ†è§£å­—½W¦ä¸²ä¸ÞZ¸€¾l„å­—½W¦ä¸²ã€‚s䏸™¦åˆ†è§£çš„å­—½W¦ä¸²åQŒdelim为分隔符字符丌Ӏ?<br />     说明åQšé¦–‹Æ¡è°ƒç”¨æ—¶åQŒs指向要分解的字符ä¸ÔŒ¼Œä¹‹åŽå†æ¬¡è°ƒç”¨è¦æŠŠs设成NULLã€?<br />                 strtok在s中查扑֌…含在delim中的字符òq¶ç”¨NULL('\0')来替换,直到æ‰ùNæ•´ä¸ªå­—符丌Ӏ?<br />     ˜q”回å€û|¼šä»Žs开头开始的一个个被分割的丌Ӏ‚当没有被分割的串时则返回NULLã€?<br />                   所有delim中包含的字符都会被æ×o掉,òq¶å°†è¢«æ×oæŽ‰çš„åœ°æ–¹è®¾äØ“ä¸€å¤„åˆ†å‰²çš„èŠ‚ç‚¹ã€?<br /> <br /> 使用例:<br /> #include <stdio.h><br /> #include <string.h><br /> #include <stdio.h><br /> #include <string.h><br /> <br /> int main(int argc,char **argv)<br /> {<br />     char * buf1="aaa, ,a, ,,,bbb-c,,,ee|abc";<br /> <br />     /* Establish string and get the first token: */<br />     char* token = strtok( buf1, ",-|");<br />     while( token != NULL )<br />      {<br />            /* While there are tokens in "string" */<br />            printf( "%s ", token );<br />           /* Get next token: */<br />           token = strtok( NULL, ",-|");<br />      }<br />     return 0;<br /> }<br /> <br /> OUT å€û|¼š <br /> aaa<br /> <br /> a</p> <p>bbb<br /> c<br /> ee<br /> abc</p> <p>◆ 使用strstr函数分割ã€?/p> <p>    原型åQšextern char *strstr(char *haystack,char *needle);<br /> <br />     用法åQ?include <string.h> <br />    功能åQšä»Žå­—符串haystack中寻找needle½W¬ä¸€‹Æ¡å‡ºçŽ°çš„ä½ç½®åQˆä¸æ¯”较¾l“束NULL) <br />    说明åQšè¿”回指向第一‹Æ¡å‡ºçްneedle位置的指针,如果没找到则˜q”回NULLã€?<br /> <br /> 使用例:<br /> #include <stdio.h><br /> #include <string.h></p> <p>int main(int argc,char **argv)<br /> {<br />      char *haystack="aaa||a||bbb||c||ee||";<br />      char *needle="||";<br />      char* buf = strstr( haystack, needle);<br />      while( buf != NULL )<br />      {<br />          buf[0]='\0';<br />          printf( "%s\n ", haystack);<br />           haystack = buf + strlen(needle);<br />           /* Get next token: */<br />           buf = strstr( haystack, needle);<br />      }<br />      return 0;<br /> }</p> <p>OUT å€û|¼š <br /> aaa<br /> a<br /> bbb<br /> c<br /> ee</p> <p>◆ strtok比较适合多个字符作分隔符的场合,而strstr适合用字½W¦ä¸²ä½œåˆ†éš”符的场合ã€?/p><img src ="http://www.aygfsteel.com/Supershen/aggbug/182513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Supershen/" target="_blank">Super·shen BLOG </a> 2008-02-27 16:35 <a href="http://www.aygfsteel.com/Supershen/archive/2008/02/27/182513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言CGI½E‹åº POST表单处理 http://www.aygfsteel.com/Supershen/archive/2008/02/27/182480.htmlSuper·shen BLOG Super·shen BLOG Wed, 27 Feb 2008 05:52:00 GMThttp://www.aygfsteel.com/Supershen/archive/2008/02/27/182480.htmlhttp://www.aygfsteel.com/Supershen/comments/182480.htmlhttp://www.aygfsteel.com/Supershen/archive/2008/02/27/182480.html#Feedback1http://www.aygfsteel.com/Supershen/comments/commentRss/182480.htmlhttp://www.aygfsteel.com/Supershen/services/trackbacks/182480.html     
           

           

          #include<stdio.h>
          #include<stdlib.h>    
          #define MAXLEN 80    
          #define EXTRA 5
          /*   4个字节留¾l™å­—ŒD늚„名字"data",   1个字节留¾l?="   */
          #define   MAXINPUT   MAXLEN+EXTRA+2 
          /*   1个字节留¾l™æ¢è¡Œç¬¦åQŒè¿˜æœ‰ä¸€ä¸ªç•™¾l™åŽé¢çš„NULL   */
          #define DATAFILE "../data/data.txt"
          /*   要被æ·ÕdŠ æ•°æ®çš„æ–‡ä»?nbsp;  */

          void   unencode(char   *src,   char   *last,   char   *dest)
          {
           for(; src != last; src++, dest++)
            if(*src == "+")
             *dest = " ";
            else if(*src == "%") {    
             int   code;    
             if(sscanf(src+1,"%2x",&code)!=1)code="?";
             *dest=code;
             src   +=2;}
            else
             *dest=*src;
            *dest=" ";
            *++dest="";    
          }    

          int   main(void)    
          {    
           char *lenstr;
           char input[MAXINPUT], data[MAXINPUT];
           long len;
           
           printf("%s%c%c", "Content-Type:text/html;charset=gb2312",13,10);
           printf("<TITLE>Response</TITLE>");

           lenstr=getenv("CONTENT_LENGTH");
           if(lenstr==NULL || sscanf(lenstr,"%ld",&len)!=1 || len>MAXLEN)
            printf("<P>表单提交错误");
           else{
            FILE *f;
            fgets(input,   len+1,   stdin);
            unencode(input+EXTRA,   input+len,   data);

            f =fopen(DATAFILE, "a");
            if(f == NULL)    
             printf("<P>å¯¹ä¸èµøP¼Œæ„å¤–错误åQŒä¸èƒ½å¤Ÿä¿å­˜ä½ çš„æ•°æ®");    
            else
             fputs(data,   f);    
            fclose(f);
            printf("<P>非常感谢åQŒæ‚¨çš„æ•°æ®å·²¾lè¢«ä¿å­˜<BR>%s",data);    
           }    
           return   0;    
          }    

              
                 从本质上来看åQŒç¨‹åºå…ˆä»ŽCONTENT_LENGTH环境变量中得到数据的字长åQŒç„¶åŽè¯»å–相应长度的字符丌Ӏ‚因为数据内容在传输的过½E‹ä¸­æ˜¯ç»˜q‡äº†¾~–码的,所以必™å»è¿›è¡Œç›¸åº”的解码。编码的规则很简单,主要的有˜q™å‡ æ?     

          1.   表单中每个每个字ŒD는¨å­—æ®µååŽè·Ÿç­‰åøP¼Œå†æŽ¥ä¸Šä¸Š˜q™ä¸ªå­—段的值来表示åQŒæ¯ä¸ªå­—ŒDµä¹‹é—´çš„内容ç”?amp;˜qžç»“åQ?nbsp;   2.   所有的½Iºæ ¼½W¦å·ç”¨åŠ å·ä»£æ›¿ï¼Œæ‰€ä»¥åœ¨¾~–码码段中出现空格是非法的;    
          3.   ç‰ÒŽ®Šçš„å­—½W¦æ¯”å¦‚æ ‡ç‚¹ç¬¦åøP¼Œå’Œä¸€äº›æœ‰ç‰¹å®šæ„ä¹‰çš„å­—½W¦å¦‚“+”åQŒç”¨ç™‘Öˆ†å·åŽè·Ÿå…¶å¯¹åº”çš„ACSII码值来表示ã€?nbsp;   

          例如åQšå¦‚æž?a class="qs_highlight1" id="hl_5" onmouseover="window.clearTimeout(_ht[5]);qs_show_frame(event,this,5);" style="font-size: 1em" onclick="_write_cookie('click46',5);" onmouseout="_on_div[5]=false;_ht[5]=window.setTimeout('qs_is_on_div(5)',500);" target="_blank">用户输入的是åQ?nbsp;    
             
          Hello   there!    

          那么数据传送到服务器的时候经˜q‡ç¼–码,ž®±å˜æˆäº†data=Hello+there%21   上面的unencodeåQˆï¼‰å‡½æ•°ž®±æ˜¯ç”¨æ¥æŠŠç¼–码后的数据进行解码的。在解码完成后,数据被添加到data.txtæ–‡äšg的尾部,òq¶åœ¨‹¹è§ˆå…¶ä¸­å›žæ˜¾å‡ºæ¥ã€?nbsp;   

          把文件编译完成后åQŒæŠŠå®ƒæ”¹åäØ“collect.cgi后放在CGI目录中就可以被表单调用了。下面给å‡ÞZº†å…¶ç›¸åº”的表单åQ?nbsp;   

          <FORM   ACTION="/cgi-bin/collect.cgi"   METHOD="POST"   >
          <P>误‚¾“入您的留­a€åQˆæœ€å¤?0个字½W¦ï¼‰åQ?lt;BR>
          <INPUT   NAME="data"   SIZE="60"   MAXLENGTH="80"   ><BR>
          <INPUT   TYPE="SUBMIT"   VALUE="¼‹®å®š">
          </FORM   >    
             
             
                 事实上,˜q™ä¸ª½E‹åºåªèƒ½ä½œäؓ例子åQŒæ˜¯ä¸èƒ½å¤Ÿæ­£å¼çš„使用的。它漏掉了很关键的一个问题:当有多个用户同时像文件写入数据是åQŒè‚¯å®šä¼šæœ‰é”™è¯¯å‘生。而对于一个这æ ïLš„½E‹åºè€Œè¨€åQŒæ–‡ä»¶è¢«åŒæ—¶å†™å…¥çš„几率是很大的。因此,在比较正式的留言版程序中åQŒéƒ½éœ€è¦åšä¸€äº›æ›´å¤šçš„考虑åQŒæ¯”如加入一个信号量åQŒæˆ–者是借助于一个钥匙文件等。因为那只是¾~–程的技巧问题,在这儿就不多说了ã€?br />



          Super·shen BLOG 2008-02-27 13:52 发表评论
          ]]>
          C语言¾~–写CGI½E‹åº http://www.aygfsteel.com/Supershen/archive/2008/02/26/182230.htmlSuper·shen BLOG Super·shen BLOG Tue, 26 Feb 2008 07:37:00 GMThttp://www.aygfsteel.com/Supershen/archive/2008/02/26/182230.htmlhttp://www.aygfsteel.com/Supershen/comments/182230.htmlhttp://www.aygfsteel.com/Supershen/archive/2008/02/26/182230.html#Feedback0http://www.aygfsteel.com/Supershen/comments/commentRss/182230.htmlhttp://www.aygfsteel.com/Supershen/services/trackbacks/182230.html
          ½Ž€å•输å‡ÞZ»£ç ?br />

          #include <stdio.h>
          #include <stdlib.h>
          #include <string.h>
          void main()
          {
          printf("Content-type:text/html\n\n");

          printf("hello world!");

          fflush(stdout);

          }



          处理get代码

          #include <stdio.h>
          #include <stdlib.h>
          int zmain(void)
          {char *data;
          long m,n;
          printf("%s%c%c\n","Content-Type:text/html;charset=iso-8859-1",13,10);
          printf("<TITLE>Multiplication results</TITLE>\n");
          printf("<H3>Multiplication results</H3>\n");
          data = getenv("QUERY_STRING");
          if(data == NULL) 
          printf("<P>Error! Error in passing data from form to script.");
          else if(sscanf(data,"m=%ld&n=%ld",&m,&n)!=2) 
          printf("<P>Error! Invalid data. Data must be numeric.");
          else 
          printf("<P>The product of %ld and %ld is %ld.",m,n,m*n);
          return 0;
          }


          处理post代码

          #include<stdio.h>
          #include<stdlib.h>
          void main()
          {
           int i,n;
           printf("Content-type:text/html\n\n");
           n=0;
           if(getenv("CONTENT_LENGTH"))
            n=atoi(getenv("CONTENT_LENGTH"));
           printf("%d",n);
           for(i=0;i<n;i++)
            putchar(getchar());
           putchar('\n');
           fflush(stdout);
          }



          ˜q˜æ˜¯ä»£ç 


          #include <stdio.h>
          #include <stdlib.h>
          #include <string.h>

          /* 转换函数声明 */
          int htoi(char *);

          /*  ä¸Õd‡½æ•?*/
          void zmain() {
           int i,n;
           char c;
           printf ("Content-type: text/html\n\n");
           n=0;
           if (getenv("CONTENT_LENGTH"))
            n=atoi(getenv("CONTENT_LENGTH"));
           for (i=0; i<n;i++){
            
            int is_eq=0; //判断是否有等于号ã€?br />   
            c=getchar();
            switch(c){
            case '&':
             c='\n';
             break;
            case '+':
             c='+';
             break;
            case '%':
             {
              char s[3];
              s[0]=getchar();
              s[1]=getchar();
              s[2]=0;
              c=htoi(s);
              i+=2;
             }
             break;
            case '=':
             c='=';
             is_eq=1;
             break;
            };
            
            putchar(c);
            //if (is_eq) putchar(' ');
           }
           putchar ('\n');
           fflush(stdout);
          }

          /* 转换为小�*/
          int islower (int ch ) 

          {
              return (unsigned int) (ch - 'a') < 26u;
          }


          /* convert hex string to int 16˜q›åˆ¶è½¬æ¢æˆ?0˜q›åˆ¶ */
          int htoi(char *s)

          {
           
           char *digits="0123456789ABCDEF";
           
           if(islower(s[0])) s[0]=toupper(s[0]);
           if(islower(s[1])) s[1]=toupper(s[1]);
           
           return 16 * (strchr(digits, s[0]) -strchr(digits,'0') ) +(strchr(digits,s[1])-strchr(digits,'0'));
           
          }


          #include<stdio.h>
          #include<stdlib.h>
          void zzzmain()
          {
           int i,n;
           printf("Content-type:text/html\n\n");
           n=0;
           if(getenv("CONTENT_LENGTH"))
            n=atoi(getenv("CONTENT_LENGTH"));
           printf("%d",n);
           for(i=0;i<n;i++)
            putchar(getchar());
           putchar('\n');
           fflush(stdout);
          }

           



          Super·shen BLOG 2008-02-26 15:37 发表评论
          ]]>
          dwr教程2http://www.aygfsteel.com/Supershen/archive/2008/01/18/176287.htmlSuper·shen BLOG Super·shen BLOG Fri, 18 Jan 2008 09:14:00 GMThttp://www.aygfsteel.com/Supershen/archive/2008/01/18/176287.htmlhttp://www.aygfsteel.com/Supershen/comments/176287.htmlhttp://www.aygfsteel.com/Supershen/archive/2008/01/18/176287.html#Feedback0http://www.aygfsteel.com/Supershen/comments/commentRss/176287.htmlhttp://www.aygfsteel.com/Supershen/services/trackbacks/176287.html

          Super·shen BLOG 2008-01-18 17:14 发表评论
          ]]>
          DWR实例教程http://www.aygfsteel.com/Supershen/archive/2008/01/18/176207.htmlSuper·shen BLOG Super·shen BLOG Fri, 18 Jan 2008 06:43:00 GMThttp://www.aygfsteel.com/Supershen/archive/2008/01/18/176207.htmlhttp://www.aygfsteel.com/Supershen/comments/176207.htmlhttp://www.aygfsteel.com/Supershen/archive/2008/01/18/176207.html#Feedback27http://www.aygfsteel.com/Supershen/comments/commentRss/176207.htmlhttp://www.aygfsteel.com/Supershen/services/trackbacks/176207.html
          以上摘自open-openåQŒå®ƒé€šè¿‡åå°„åQŒå°†java¾˜»è¯‘成javascriptåQŒç„¶åŽåˆ©ç”¨å›žè°ƒæœºåˆÓž¼Œè½ÀL¾å®žçŽ°äº†javascript调用Java代码ã€?br />
          其大概开发过½E‹å¦‚下:
          1.¾~–写业务代码åQŒè¯¥ä»£ç æ˜¯å’Œdwr无关的ã€?br /> 2.¼‹®è®¤ä¸šåŠ¡ä»£ç ä¸­å“ªäº›ç±»ã€å“ªäº›æ–¹æ³•æ˜¯è¦ç”±javascript直接讉K—®çš„ã€?br /> 3.¾~–写dwr¾l„äšgåQŒå¯¹æ­¥éª¤2的方法进行封装ã€?br /> 4.配置dwr¾l„äšg到dwr.xmlæ–‡äšg中,如果有必要,配置convertåQŒè¿›è¡Œjavaå’Œjavascript¾cÕdž‹äº’è{ã€?br /> 5.通过反射机制åQŒdwrž®†æ­¥éª?的类转换成javascript代码åQŒæä¾›ç»™å‰å°™åµé¢è°ƒç”¨ã€?br /> 5.¾~–写¾|‘页åQŒè°ƒç”¨æ­¥éª?çš„javascript中的相关æ–ÒŽ³•åQˆé—´æŽ¥è°ƒç”¨æœåŠ¡å™¨ç«¯çš„ç›¸å…³¾cÈš„æ–ÒŽ³•åQ‰ï¼Œæ‰§è¡Œä¸šåŠ¡é€»è¾‘åQŒå°†æ‰§è¡Œ¾l“果利用回调函数˜q”回ã€?br /> 6.在回调函æ•îC¸­åQŒå¾—到执行结果后åQŒå¯ä»¥ç‘ô¾l­ç¼–写业务逻辑的相关javascript代码ã€?br />
          下面以用æˆäh³¨å†Œçš„例子åQŒæ¥è¯´æ˜Žå…¶ä‹É用。(注意åQŒæœ¬‹Æ¡ä¾‹å­åªæ˜¯ç”¨äºŽæ¼”½Cºï¼Œè¯´æ˜ŽDWRçš„ä‹É用,¾c»è®¾è®¡åƈ不是最优的åQ‰ã€?br />
          1.先介¾lä¸‹ç›¸å…³çš„Java¾c?br />
            User: 用户¾c»ï¼Œ
            public class User {
          //登陆IDåQŒä¸»é”®å”¯ä¸€
          private String id;
          //姓名
          private String name;
          //口ä×o
          private String password;
          //电子邮äšg
          private String email;
                  
          //以下包含getXXXå’ŒsetXXXæ–ÒŽ³•
          .......
            }

            UserDAOåQšå®žçްUser的数据库讉K—®åQŒè¿™é‡Œä½œä¸ÞZ¸€ä¸ªæ¼”½Cºï¼Œ¾~–写‹¹‹è¯•代码
            public class UserDAO {
              //存放保存的数æ?br />     private static Map dataMap = new HashMap();

              //持久用户
              public boolean save(User user) {
                if (dataMap.containsKey(user.getId()))
                  return false;
                System.out.println("下面开始保存用æˆ?);
                System.out.println("idåQ?+user.getId());
                System.out.println("passwordåQ?+user.getPassword());
                System.out.println("nameåQ?+user.getName());
                System.out.println("emailåQ?+user.getEmail());
                dataMap.put(user.getId(), user);
                System.out.println("用户保存¾l“束");
                return true;
              }

              //查找用户
              public User find(String id) {
                return (User)dataMap.get(id);
              }
          }

            DWRUserAccessåQšDWR¾l„äšgåQŒæä¾›ç»™javascript讉K—®çš„ã€?br />
            public class DWRUserAccess {

                UserDAO userDAO = new UserDAO();

                public boolean save(User user) {
                  return userDAO.save(user);
                }

                public User find(String id) {
                  return userDAO.find(id);
                }
            }
            

            ä¸‹é¢è¯´æ˜Žä¸‹ç¨‹åºæ‰§è¡Œçš„‹¹ç¨‹

            1.用户在页面上输入相关注册信息åQŒid、name、password、emailåQŒç‚¹å‡?#8220;提交”按钮
            2.javascript代码开始执行,æ ÒŽ®ç”¨æˆ·å¡«å†™ç›¸å…³ä¿¡æ¯åQŒé€šè¿‡dwr提供的DWRUserAccess.js里save的方法,调用服务器端的DWRUserAccess¾c»saveæ–ÒŽ³•åQŒå°†æ³¨å†Œä¿¡æ¯ä¿å­˜ã€?br />   3.通过DWRUserAccess.jsp里的findæ–ÒŽ³•åQŒè°ƒç”¨æœåŠ¡å™¨ç«¯DWRUserAccess¾c»é‡Œçš„findæ–ÒŽ³•åQŒæ‰§è¡Œç”¨æˆ·ä¿¡æ¯æŸ¥æ‰¾ã€?br />
            æ³¨æ„åQŒåœ¨ä»¥ä¸Šçš„æ‰§è¡Œè¿‡½E‹ä¸­åQŒDWRUserAccess是供DWR调用的,是DWR¾l„äšgåQŒå› æ­¤éœ€è¦å°†DWRUserAccess¾c»é…¾|®åˆ°dwr中ã€?br />
            æŽ¥ä¸‹æ¥è®²è§£æœ¬‹Æ¡dwr‹¹‹è¯•环境的配¾|®ã€?br />
            1.新徏一个webappåQŒå‘½åäØ“testApp
            2.ž®†dwr.jar拯‚´åˆ°testAppçš„WEB-INFçš„lib目录ä¸?br />   3.¾~–译上面的UseråQŒUserDAOåQŒDWRUserAccess¾c»ï¼Œæ”‘Öˆ°classes目录ä¸?br />   4.在web.xml中配¾|®servlet,适配路径到dwr目录ä¸?如下所½C?br />     <servlet>
              <servlet-name>dwr-invoker</servlet-name>
              <display-name>DWR Servlet</display-name>
              <description>Direct Web Remoter Servlet</description>
              <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
              <init-param>
                <param-name>debug</param-name>
                <param-value>true</param-value>
              </init-param>
              <init-param>
                <param-name>scriptCompressed</param-name>
                <param-value>false</param-value>
              </init-param>
              <load-on-startup>1</load-on-startup>
            </servlet>

            <servlet-mapping>
              <servlet-name>dwr-invoker</servlet-name>
              <url-pattern>/dwr/*</url-pattern>
            </servlet-mapping>

            ä»¥ä¸Šçš„配¾|®å¯ä»¥æ‹¦æˆªtestApp下所有指向dwr的请求,关于˜q™ä¸ªæ‹¦æˆªå™¨ï¼Œæˆ‘们会在后面介绍ã€?br />
            5.WEB-INF下新å»ÞZ¸€ä¸ªdwr.xmlæ–‡äšgåQŒå†…容如下:
            < xml version="1.0" encoding="UTF-8" >
          <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">

          <dwr>
            <allow>
          <create creator="new" javascript="DWRUserAccess">
                <param name="class" value="test.DWRUserAccess"/>
              </create>
          <convert converter="bean" match="test.User"/>
            </allow>
          </dwr>

            ˜q™é‡Œæˆ‘们把DWRUserAccess配置åˆîCº†dwr中,create元素中,creater="new"表示每调用一‹Æ¡DWRUserAccessæ—Óž¼Œéœ€è¦new一个这æ ïLš„¾c»ï¼›javascript="DWRUserAccess"åQŒè¡¨½Cºæä¾›ç»™å‰å°™åµé¢è°ƒç”¨çš„javascirptæ–‡äšg是DWRUserAccess.jsã€?br />
            convert元素用于数据¾cÕdž‹è½¬æ¢åQŒå³java¾cÕd’Œjavascriptä¹‹é—´ç›æ€º’转换åQŒå› ä¸ºå’Œå‰å°äº¤æ¢çš„æ˜¯User对象åQŒå› æ­¤éœ€è¦å¯¹æ­¤ä‹É用bean转换åQŒæˆ‘们将在后面介¾lè¿™ä¸ªç±»ã€?br />
            4.¾~–写‹¹‹è¯•çš„HTML™åµé¢ test.html
             <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
          <HTML>
          <HEAD>
          <TITLE>DWR‹¹‹è¯•</TITLE>
          <meta http-equiv=Content-Type content="text/html; charset=gb2312">
          <script src="/oblog312/dwr/engine.js"></script>
          <script src="/oblog312/dwr/util.js"></script>
          <script src="/oblog312/dwr/interface/DWRUserAccess.js"></script>
          </HEAD>
          <BODY>
          <B>用户注册</B><br>
          ------------------------------------------------
          <Br>
          <form name="regForm">
          登陆IDåQ?lt;input type="text" name="id"><br>
          å?nbsp; ä»¤ï¼š<input type="password" name="password"><br>
          å§?nbsp; åï¼š<input type="text" name="name"><br>
          电子邮äšgåQ?lt;input type="text" name="email"><br>
          <input type="button" name="submitBtn" value="提交" onclick="OnSave()"><br>
              </form>

          <br>
          <br><B>用户查询</B><br>
          ------------------------------------------------
          <Br>
          <form name="queryForm">
          登陆IDåQ?lt;input type="text" name="id"><br>
          <input type="button" name="submitBtn" value="提交" onclick="OnFind()"><br>
          </form>
          <br>
          </BODY>
          </HTML>
          <SCRIPT LANGUAGE="JavaScript">
          <!--
          function saveFun(data) {
          if (data) {
            alert("注册成功åQ?);
          } else {
            alert("登陆ID已经存在åQ?);
          }
          }

          function OnSave() {
          var userMap = {};
          userMap.id = regForm.id.value;
          userMap.password = regForm.password.value;
          userMap.name = regForm.name.value;
          userMap.email = regForm.email.value;
          DWRUserAccess.save(userMap, saveFun);
          }

          function findFun(data) {
          if (data == null) {
            alert("无法扑ֈ°ç”¨æˆ·åQ?+queryForm.id.value);
            return;
          }

          alert("扑ֈ°ç”¨æˆ·åQŒnidåQ?+data.id+"åQŒnpasswordåQ?+data.password+"åQŒnnameåQ?+data.name+"åQŒnemailåQ?+data.email);

          }

          function OnFind() {
          DWRUserAccess.find(queryForm.id.value, findFun);
          }
          //-->
          </SCRIPT>


          以下寚w¡µé¢çš„javascript˜q›è¡Œè§£é‡Š

          <script src="/oblog312/dwr/engine.js"></script>
          <script src="/oblog312/dwr/util.js"></script>
          ˜q™ä¸¤ä¸ªæ˜¯dwr提供的,用户可以不必兛_¿ƒåQŒåªéœ€è¦å¯¼å…¥å³å?br />
          <script src="/oblog312/dwr/interface/DWRUserAccess.js"></script>
          是我们编写的DWRUserAccess¾c»ï¼Œ¾ldwr反射后,生成的javascript代码åQŒå®ƒå’ŒDWRUserAccess.java是对应的åQŒä¾›ç”¨æˆ·è°ƒç”¨åQŒå®žé™…上我们ž®±æ˜¯é€šè¿‡˜q™ä¸ªjsæ–‡äšg去调用服务器端的DWRUserAccess¾cȝš„ã€?br />
          <SCRIPT LANGUAGE="JavaScript">
          <!--
          function saveFun(data) {
          if (data) {
            alert("注册成功åQ?);
          } else {
            alert("用户名已¾lå­˜åœ¨ï¼");
          }
          }

          function OnSave() {
          var userMap = {};
          userMap.id = regForm.id.value;
          userMap.password = regForm.password.value;
          userMap.name = regForm.name.value;
          userMap.email = regForm.email.value;
          DWRUserAccess.save(userMap, saveFun);
          }

          function findFun(data) {
          if (data == null) {
            alert("无法扑ֈ°ç”¨æˆ·åQ?+queryForm.id.value);
            return;
          }

          alert("扑ֈ°ç”¨æˆ·åQŒnidåQ?+data.id+"åQŒnpasswordåQ?+data.password+"åQŒnnameåQ?+data.name+"åQŒnemailåQ?+data.email);

          }

          function OnFind() {
          DWRUserAccess.find(queryForm.id.value, findFun);
          }
          //-->
          </SCRIPT>

          ˜q™æ®µjavascirpt代码åQŒæˆ‘们来看下OnSave函数åQŒé¦–先它构造一个mapåQŒå°†è¡¨å•数据都设¾|®åˆ°map中,然后调用DWRUserAccess.save(userMap, saveFun)åQŒæ‰§è¡Œsave操作。大家可以注意到åQŒæœåŠ¡å™¨ç«¯çš„DWRUserAccess中的saveæ–ÒŽ³•是这æ ïLš„åQšboolean save(User user)åQŒå…¶å‚数是一个User对象åQŒè¿”回一个booleanå€û|¼›è€Œå®¢æˆïL«¯çš„æ–¹æ³•是˜q™æ ·çš„:save(userMap,saveFun)åQŒç¬¬ä¸€ä¸ªå‚æ•°userMap是javascirpt中的map对象åQŒåœ¨˜q™é‡Œç›¸å½“于服务器端的User对象åQˆåœ¨æœåŠ¡å™¨ç«¯æ‰§è¡Œæ—Óž¼Œä¼šé€šè¿‡convert转换成User对象åQ‰ï¼Œå‰é¢æˆ‘们提到dwr是利用回调函数来˜q”回执行¾l“果的,½W¬äºŒä¸ªå‚æ•°saveFunåÏx˜¯ä¸€ä¸ªå›žè°ƒå‡½æ•°ã€‚在函数function saveFun(data)中,data是执行结果,˜q™é‡Œæ˜¯ä¸€ä¸ªboolå€û|¼Œéžå¸¸½Ž€å•çš„åQŒæˆ‘们通过判断data是否为真åQŒå¯ä»¥çŸ¥é“用户名是否重复åQŒç”¨æˆäh˜¯å¦æ³¨å†ŒæˆåŠŸã€?br />
          看一下OnFind查找函数åQŒæ‰§è¡Œç»“果在回调函数findFun(data)ä¸­ï¼Œå› äØ“æœåŠ¡å™¨ç«¯˜q”回的是一个User对象åQŒé€šè¿‡convertåQŒå°†ä¼šè{换成javascript的一个map对象åQ?br /> 于是在findFun中,通过data.id、data.name、data.password、data.email我们可以è½ÀL¾çš„访问到˜q™ä¸ªUser对象ã€?br />

          好了配置完毕åQŒå¯åŠ¨æœåŠ¡å™¨åQŒåœ¨ç›®å½•中打入localhost/testApp/test.htmlã€?br />
          1.åœ?#8220;用户注册”表单中,id框中输入adminåQŒpassword中输å…?23456åQŒname中输入chenbugåQŒemail中输入chenbug@zj.comåQŒç‚¹å‡ÀLäº¤æŒ‰é’®ï¼Œå¼¹å‡ºå¯¹è¯æ¡†ï¼š“注册成功”åQŒåœ¨æœåŠ¡å™¨åŽå°å¯ä»¥çœ‹åˆîC¿¡æ¯å¦‚下:

          下面开始保存用æˆ?br /> idåQšadmin
          passwordåQ?23456
          nameåQšchenbug
          emailåQšchenbug@zj.com
          用户保存¾l“束

          再次点击提交按钮åQŒå¼¹å‡ºå¯¹è¯æ¡†“登陆ID已经存在”ã€?br />
          2.åœ?#8220;用户查询”对话框中åQŒè¾“入登陆ID为adminåQŒç‚¹å‡ÀLäº¤æŒ‰é’®ï¼Œæç¤ºæ‰‘Öˆ°ç”¨æˆ·åQŒåƈ昄¡¤ºç›¸å…³ä¿¡æ¯åQŒè¾“å…¥admin123åQŒç‚¹å‡ÀLäº¤æŒ‰é’®ï¼Œæç¤ºæ— æ³•扑ֈ°ç”¨æˆ·ã€?br />
          è‡Ïx­¤åQŒæµ‹è¯•结束ã€?br />

          后箋åQ?br /> 1。拦截器 uk.ltd.getahead.dwr.DWRServlet
          该类拦截所有指向dwr目录下的è¯äh±‚åQŒåƈ调用Processorçš„handleræ–ÒŽ³•˜q›è¡Œå¤„理åQŒåœ¨uk.ltd.getahead.dwr.impl.DefaultProcessor下,我们可以看到详细的处理过½E‹ã€?br /> if (pathInfo.length() == 0 ||
                      pathInfo.equals(HtmlConstants.PATH_ROOT) ||
                      pathInfo.equals(req.getContextPath()))
                  {
                      resp.sendRedirect(req.getContextPath() + servletPath + HtmlConstants.FILE_INDEX);
                  }
                  else if (pathInfo.startsWith(HtmlConstants.FILE_INDEX))
                  {
                      index.handle(req, resp);
                  }
                  else if (pathInfo.startsWith(HtmlConstants.PATH_TEST))
                  {
                      test.handle(req, resp);
                  }
                  else if (pathInfo.startsWith(HtmlConstants.PATH_INTERFACE))
                  {
                      iface.handle(req, resp);
                  }
                  else if (pathInfo.startsWith(HtmlConstants.PATH_EXEC))
                  {
                      exec.handle(req, resp);
                  }
                  else if (pathInfo.equalsIgnoreCase(HtmlConstants.FILE_ENGINE))
                  {
                      file.doFile(req, resp, HtmlConstants.FILE_ENGINE, HtmlConstants.MIME_JS);
                  }
                  else if (pathInfo.equalsIgnoreCase(HtmlConstants.FILE_UTIL))
                  {
                      file.doFile(req, resp, HtmlConstants.FILE_UTIL, HtmlConstants.MIME_JS);
                  }
                  else if (pathInfo.equalsIgnoreCase(HtmlConstants.FILE_DEPRECATED))
                  {
                      file.doFile(req, resp, HtmlConstants.FILE_DEPRECATED, HtmlConstants.MIME_JS);
                  }
                  else
                  {
                      log.warn("Page not found (" + pathInfo + "). In debug/test mode try viewing /[WEB-APP]/dwr/"); //$NON-NLS-1$ //$NON-NLS-2$
                      resp.sendError(HttpServletResponse.SC_NOT_FOUND);
                  }

          通过判断requestè¯äh±‚çš„servlet路径åQŒè¿›è¡Œå¤„理,大家可以自己åŽÕd‚看,˜q™é‡Œä¸è¯¦¾l†è®¨è®ºã€?br />

          2.bean转换器,<convert converter="bean" match="test.User"/>
          ž®†dwr.jar解压¾~©ï¼Œåœ¨èµ\径ukltdgetaheaddwr下可以看到dwr.xmlåQŒè¿™é‡Œé…¾|®äº†¾pȝ»Ÿé»˜è®¤çš„一些è{换器åQ?br /> <converter id="bean" class="uk.ltd.getahead.dwr.convert.BeanConverter"/>åÏx˜¯åˆšæ‰ç”¨åˆ°User¾cȝš„转换器,˜q›å…¥ä»£ç æˆ‘们来看看它是如何在javascriptå’Œjava间进行è{换的ã€?br />
          打开BeanConverter代码åQŒå®šä½åˆ°å‡½æ•°

          public Object convertInbound(Class paramType, InboundVariable iv, InboundContext inctx) throws ConversionException

          åÏx˜¯ž®†javascript对象转换成java对象的,其中
          paramType即Class¾cÕdž‹åQŒåœ¨ä¸Šé¢çš„例子中是test.UseråQ?br /> InboundVariable ivåQŒæ˜¯ä¼ å…¥çš„å€û|¼Œé€šè¿‡iv.getValue可以得到传入的javascriptå€ég¸²
          InboundContext inctxåQŒæ˜¯å…¥å£å‚数上下文,用于保存转换的后java对象ã€?br />
          å› äØ“å‰å°ä¼ å…¥çš„æ˜¯ä¸€ä¸ªjavascriptçš„map¾cÕdž‹åQŒè€Œmap肯定是以{开始和以}¾l“束的,于是在这个函æ•îC¸€å¼€å§‹è¿›è¡Œäº†åˆ¤æ–­
          if (!value.startsWith(ConversionConstants.INBOUND_MAP_START))
                  {
                      throw new IllegalArgumentException(Messages.getString("BeanConverter.MissingOpener", ConversionConstants.INBOUND_MAP_START)); //$NON-NLS-1$
                  }

                  if (!value.endsWith(ConversionConstants.INBOUND_MAP_END))
                  {
                      throw new IllegalArgumentException(Messages.getString("BeanConverter.MissingCloser", ConversionConstants.INBOUND_MAP_START)); //$NON-NLS-1$
                  }

          javascript中,map里各个项是用逗号˜qžæŽ¥çš„,如var userMap = {id:'admin',password:'123456',name:'chenbug',email:'chenbug@zj.com'};而每个项的键值对是用冒号˜qžæŽ¥çš„,
          在convertInbound函数的接下来的处理中åQŒå³æ˜¯é€šè¿‡åˆ†æžmap字串åQŒé€šè¿‡paramType构造java实例åQˆå³User¾c»ï¼‰åQŒç„¶åŽé€šè¿‡åå°„åQŒå°†˜q™äº›é”®å€¼å¯¹è®„¡½®åˆ°java实例中,òq¶è¿”回ã€?br /> ˜q™æ ·ž®±å®Œæˆäº†javascript到javaçš„è{换ã€?br />

          另一个函�br /> public String convertOutbound(Object data, String varname, OutboundContext outctx) throws ConversionException

          åÏx˜¯ž®†java对象转换为javascript对象åQˆå…¶å®žæ˜¯å£°æ˜Žå’Œèµ‹å€ÆD¯­å¥ï¼‰ã€?br /> Object data åQŒæ˜¯å¾…è{换的java对象
          String varnameåQŒæ˜¯javascript中的该对象的变量å?br /> OutboundContext outctxåQŒä¼ å‡ºå‚æ•îC¸Šä¸‹æ–‡åQŒç”¨äºŽä¿å­˜è{换后的javascriptå€?br />
          StringBuffer buffer = new StringBuffer();
                  buffer.append("var "); //$NON-NLS-1$
                  buffer.append(varname);
                  buffer.append("={};"); //$NON-NLS-1$
          ˜q™é‡Œå£°æ˜Žäº†map¾cÕdž‹çš„变量ã€?br />
          即下来来的代码即是通过反射˜q›è¡Œå˜é‡èµ‹å€û|¼Œå¦‚下
            buffer.append(varname);
                              buffer.append('.');
                              buffer.append(name);
                              buffer.append('=');
                              buffer.append(nested.getAssignCode());
                              buffer.append(';');
          大家可以自己åŽÕd‚看更多的代码ã€?br />
          3.dwr本èín提供了一个测试环境,大家在配¾|®å®ŒåŽï¼Œå¯ä»¥åœ¨IE中输入地址http://localhost/testApp/dwr/index.htmlåQŒçœ‹åˆ°é…¾|®çš„各DWR¾l„äšgåQŒåƈ˜q›è¡Œç›¸å…³‹¹‹è¯•ã€?

          Super·shen BLOG 2008-01-18 14:43 发表评论
          ]]>