??xml version="1.0" encoding="utf-8" standalone="yes"?>91久久高清国语自产拍,国产aⅴ精品一区二区三区黄,岛国精品视频在线播放http://www.aygfsteel.com/Supershen/Java JavaEE Jsp Struts1.x Struts2.x Hibernate Spring2.0 EJB3.0 ASP .NET Php Flexzh-cnMon, 16 Jun 2025 21:52:36 GMTMon, 16 Jun 2025 21:52:36 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讉KQ?q{?/user/user-xxx.jsp面<br /> 即namespace + action name + "-" + "xxx.jsp"<br /> <br /> <br />  另外其中 action中需要注入的 service 使用annotation Q在setҎ?加入@request ?@ autowired ?@resource<br /> 注释Q具体是用那个暂时无法搞清楚QM我用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中配|自动注册beanQ通过扫描包中的带注解的类。即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 /> 需要注意的是entitycȝ扫描配置<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 /> cd<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是servletQjsp和servlet也都是一个classQ?/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这个方法可以在LjspQservletQjava文g中用,因ؓ不管是jspQservlet其实都是javaE序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[用户-角色表]或用LID[用户l?角色表]Q查到所有角色IDQ再[角色-资源表]扑ֈ所有角色下的所有资源?</p> <p>此就是用h有的资源。(资源一般ؓ模块Q当然也可以分更l的定义为页面,操作Ҏ{)</p> <br /> 此权限设计适合于模块化讉KpȝQ如OA<br /> <br /> <br /> 当然很多pȝ因地而已Q不可能完全满Q按照自ql需求设计是最合适的设计?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里改了。要是按原先的,会提Cstderr未定义,我不知道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 />      原型Qchar *strtok(char *s, char delim); <br />     strtok在s中查扑֌含在delim中的字符q用NULL('\0')来替?直到N整个字符丌Ӏ?nbsp; <br />      功能Q分解字W串Zl字W串。s分解的字W串Qdelim为分隔符字符丌Ӏ?<br />     说明Q首ơ调用时Qs指向要分解的字符Ԍ之后再次调用要把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>    原型Qextern char *strstr(char *haystack,char *needle);<br /> <br />     用法Q?include <string.h> <br />    功能Q从字符串haystack中寻找needleW一ơ出现的位置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语言CGIE序 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   上面的unencodeQ)函数是用来把编码后的数据进行解码的。在解码完成后,数据被添加到data.txt文g的尾部,q在览其中回显出来?nbsp;   

          把文件编译完成后Q把它改名ؓcollect.cgi后放在CGI目录中就可以被表单调用了。下面给Z其相应的表单Q?nbsp;   

          <FORM   ACTION="/cgi-bin/collect.cgi"   METHOD="POST"   >
          <P>误入您的留aQ最?0个字W)Q?lt;BR>
          <INPUT   NAME="data"   SIZE="60"   MAXLENGTH="80"   ><BR>
          <INPUT   TYPE="SUBMIT"   VALUE="定">
          </FORM   >    
             
             
                 事实上,q个E序只能作ؓ例子Q是不能够正式的使用的。它漏掉了很关键的一个问题:当有多个用户同时像文件写入数据是Q肯定会有错误发生。而对于一个这LE序而言Q文件被同时写入的几率是很大的。因此,在比较正式的留言版程序中Q都需要做一些更多的考虑Q比如加入一个信号量Q或者是借助于一个钥匙文件等。因为那只是~程的技巧问题,在这儿就不多说了?br />



          Super·shen BLOG 2008-02-27 13:52 发表评论
          ]]>
          C语言~写CGIE序 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 16q制转换?0q制 */
          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-openQ它通过反射Q将java译成javascriptQ然后利用回调机ӞL实现了javascript调用Java代码?br />
          其大概开发过E如下:
          1.~写业务代码Q该代码是和dwr无关的?br /> 2.认业务代码中哪些类、哪些方法是要由javascript直接讉K的?br /> 3.~写dwrlgQ对步骤2的方法进行封装?br /> 4.配置dwrlg到dwr.xml文g中,如果有必要,配置convertQ进行java和javascriptcd互{?br /> 5.通过反射机制Qdwr步?的类转换成javascript代码Q提供给前台面调用?br /> 5.~写|页Q调用步?的javascript中的相关ҎQ间接调用服务器端的相关cȝҎQ,执行业务逻辑Q将执行l果利用回调函数q回?br /> 6.在回调函CQ得到执行结果后Q可以l编写业务逻辑的相关javascript代码?br />
          下面以用h册的例子Q来说明其用。(注意Q本ơ例子只是用于演C,说明DWR的用,c设计ƈ不是最优的Q?br />
          1.先介l下相关的Javac?br />
            User: 用户c,
            public class User {
          //登陆IDQ主键唯一
          private String id;
          //姓名
          private String name;
          //口o
          private String password;
          //电子邮g
          private String email;
                  
          //以下包含getXXX和setXXXҎ
          .......
            }

            UserDAOQ实现User的数据库讉KQ这里作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("idQ?+user.getId());
                System.out.println("passwordQ?+user.getPassword());
                System.out.println("nameQ?+user.getName());
                System.out.println("emailQ?+user.getEmail());
                dataMap.put(user.getId(), user);
                System.out.println("用户保存l束");
                return true;
              }

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

            DWRUserAccessQDWRlgQ提供给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.用户在页面上输入相关注册信息Qid、name、password、emailQ点?#8220;提交”按钮
            2.javascript代码开始执行,Ҏ用户填写相关信息Q通过dwr提供的DWRUserAccess.js里save的方法,调用服务器端的DWRUserAccesscsaveҎQ将注册信息保存?br />   3.通过DWRUserAccess.jsp里的findҎQ调用服务器端DWRUserAccessc里的findҎQ执行用户信息查找?br />
            注意Q在以上的执行过E中QDWRUserAccess是供DWR调用的,是DWRlgQ因此需要将DWRUserAccessc配|到dwr中?br />
            接下来讲解本ơdwr试环境的配|?br />
            1.新徏一个webappQ命名ؓtestApp
            2.dwr.jar拯到testApp的WEB-INF的lib目录?br />   3.~译上面的UserQUserDAOQDWRUserAccessc,攑ֈ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文gQ内容如下:
            < 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配置Cdwr中,create元素中,creater="new"表示每调用一ơDWRUserAccessӞ需要new一个这Lc;javascript="DWRUserAccess"Q表C提供给前台面调用的javascirpt文g是DWRUserAccess.js?br />
            convert元素用于数据cd转换Q即javacdjavascript之间怺转换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">
          登陆IDQ?lt;input type="text" name="id"><br>
          ?nbsp; 令:<input type="password" name="password"><br>
          ?nbsp; 名:<input type="text" name="name"><br>
          电子邮gQ?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">
          登陆IDQ?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("扑ֈ用户QnidQ?+data.id+"QnpasswordQ?+data.password+"QnnameQ?+data.name+"QnemailQ?+data.email);

          }

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


          以下寚w面的javascriptq行解释

          <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>
          是我们编写的DWRUserAccessc,ldwr反射后,生成的javascript代码Q它和DWRUserAccess.java是对应的Q供用户调用Q实际上我们是通过q个js文g去调用服务器端的DWRUserAccesscȝ?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("扑ֈ用户QnidQ?+data.id+"QnpasswordQ?+data.password+"QnnameQ?+data.name+"QnemailQ?+data.email);

          }

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

          q段javascirpt代码Q我们来看下OnSave函数Q首先它构造一个mapQ将表单数据都设|到map中,然后调用DWRUserAccess.save(userMap, saveFun)Q执行save操作。大家可以注意到Q服务器端的DWRUserAccess中的saveҎ是这LQboolean 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二个参数saveFunx一个回调函数。在函数function saveFun(data)中,data是执行结果,q里是一个bool|非常单的Q我们通过判断data是否为真Q可以知道用户名是否重复Q用h否注册成功?br />
          看一下OnFind查找函数Q执行结果在回调函数findFun(data)中,因ؓ服务器端q回的是一个User对象Q通过convertQ将会{换成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框中输入adminQpassword中输?23456Qname中输入chenbugQemail中输入chenbug@zj.comQ点L交按钮,弹出对话框:“注册成功”Q在服务器后台可以看C息如下:

          下面开始保存用?br /> idQadmin
          passwordQ?23456
          nameQchenbug
          emailQchenbug@zj.com
          用户保存l束

          再次点击提交按钮Q弹出对话框“登陆ID已经存在”?br />
          2.?#8220;用户查询”对话框中Q输入登陆ID为adminQ点L交按钮,提示扑ֈ用户Qƈ昄相关信息Q输入admin123Q点L交按钮,提示无法扑ֈ用户?br />
          xQ测试结束?br />

          后箋Q?br /> 1。拦截器 uk.ltd.getahead.dwr.DWRServlet
          该类拦截所有指向dwr目录下的hQƈ调用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);
                  }

          通过判断requesth的servlet路径Q进行处理,大家可以自己d看,q里不详l讨论?br />

          2.bean转换器,<convert converter="bean" match="test.User"/>
          dwr.jar解压~,在\径ukltdgetaheaddwr下可以看到dwr.xmlQ这里配|了pȝ默认的一些{换器Q?br /> <converter id="bean" class="uk.ltd.getahead.dwr.convert.BeanConverter"/>x刚才用到Usercȝ转换器,q入代码我们来看看它是如何在javascript和java间进行{换的?br />
          打开BeanConverter代码Q定位到函数

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

          xjavascript对象转换成java对象的,其中
          paramType即ClasscdQ在上面的例子中是test.UserQ?br /> InboundVariable ivQ是传入的|通过iv.getValue可以得到传入的javascriptg
          InboundContext inctxQ是入口参数上下文,用于保存转换的后java对象?br />
          因ؓ前台传入的是一个javascript的mapcdQ而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即Userc)Q然后通过反射Q将q些键值对讄到java实例中,q返回?br /> q样完成了javascript到java的{换?br />

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

          xjava对象转换为javascript对象Q其实是声明和赋D句)?br /> Object data Q是待{换的java对象
          String varnameQ是javascript中的该对象的变量?br /> OutboundContext outctxQ传出参C下文Q用于保存{换后的javascript?br />
          StringBuffer buffer = new StringBuffer();
                  buffer.append("var "); //$NON-NLS-1$
                  buffer.append(varname);
                  buffer.append("={};"); //$NON-NLS-1$
          q里声明了mapcd的变量?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.htmlQ看到配|的各DWRlgQƈq行相关试?

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