隨筆-40  評(píng)論-66  文章-0  trackbacks-0
            2008年2月27日
          springside3背景struts2.1.2 spring2.5.6 Hibernate3.4GA


          1.struts2

          使用ZeroConfig + CodeBehind插件,實(shí)現(xiàn)約定大于配置的零配置文件風(fēng)格.

          根本不用配置struts.xml文件





          這里就是action實(shí)現(xiàn)annotation  CodeBehind。
          如方法


          通過(guò) /user/user!input.action訪問(wèn), 并轉(zhuǎn)到 /user/user-xxx.jsp頁(yè)面
          即namespace + action name + "-" + "xxx.jsp"


           另外其中 action中需要注入的 service 使用annotation ,在set方法前 加入@request 或 @ autowired 或 @resource
          注釋?zhuān)ň唧w是用那個(gè)暫時(shí)無(wú)法搞清楚,總之我用request 就不行,另外兩個(gè)都可以)



          有了這個(gè)代碼之后 就能注入spring 環(huán)境中的 id = userManager 的bean (我個(gè)人理解)

          而spring中  id = userManager 的bean  也是通過(guò)自動(dòng)注入完成的

          主要代碼是 applicationContext.xml文件中的
          代碼:




          2.spring

          spring2.5.6的annotation特性用的比較泛濫。 新手剛開(kāi)始看的一頭霧水很正常。

          xml文件中配置自動(dòng)注冊(cè)bean,通過(guò)掃描包中的帶注解的類(lèi)。即這個(gè)代碼:




          掃描到下面的類(lèi),就自動(dòng)注冊(cè)成 id=userManager





          3.hibernate
          使用hiberante3 注解,不要XML配置,實(shí)體類(lèi)注解不用多說(shuō)。

          需要注意的是entity類(lèi)的掃描配置




          看清楚是掃描包,不是掃描類(lèi)! 所以實(shí)體類(lèi)com.mylu.User是無(wú)法掃描到,要放在 com.mylu.xxx.User才能掃描到!




          下邊按照ss3風(fēng)格做的例子,去掉spring security 框架的, 結(jié)構(gòu)更清晰。

          下載:實(shí)例代碼


          附:
          類(lèi)庫(kù)
          posted @ 2009-01-08 17:01 Super·shen BLOG 閱讀(1799) | 評(píng)論 (2)編輯 收藏

          在jsp中,其實(shí)jsp就是servlet,jsp和servlet也都是一個(gè)class:

          1 .request.getRealPath(),這個(gè)方法已經(jīng)不推薦使用,在servlet后繼版本中將被取締。

          2.getServletContext().getRealPath("/")這個(gè)方法比較好用,可以直接在servlet和jsp中使用。

          3.request.getSession().getServletContext().getRealPath()也可以在jsp和servlet使用。

          4.this.getClass().getClassLoader().getResource("").getPath(),這個(gè)方法可以在任意jsp,servlet,java文件中使用,因?yàn)椴还苁莏sp,servlet其實(shí)都是java程序,都是一個(gè)class。所以它應(yīng)該是一個(gè)通用的方法。

          posted @ 2008-09-17 14:55 Super·shen BLOG 閱讀(506) | 評(píng)論 (0)編輯 收藏

          普遍的,簡(jiǎn)單的權(quán)限系統(tǒng)要求:

          1.系統(tǒng)所有資源定義 [資源表]   ( 還可以分為更小的權(quán)限表,操作表,這里通叫資源表)
          2.定義角色 [角色表]
          3.給角色指定資源(一個(gè)角色可以管理多個(gè)資源) [角色-資源表]
          4.定義用戶(hù)組 [用戶(hù)表]
          5.給用戶(hù)組指定角色(一個(gè)用戶(hù)組可以擁有多種角色) [用戶(hù)組-角色表]
          6.給用戶(hù)指定角色(一個(gè)用戶(hù)可以擁有多種角色,可以直接指定角色,也可以繼承用戶(hù)組的角色)[用戶(hù)-角色表]

           


          查找權(quán)限時(shí):

          根據(jù)用戶(hù)ID[用戶(hù)-角色表]或用戶(hù)組ID[用戶(hù)組-角色表],查到所有角色I(xiàn)D,再[角色-資源表]找到所有角色下的所有資源。

          此就是用戶(hù)擁有的資源。(資源一般為模塊,當(dāng)然也可以分更細(xì)的定義為頁(yè)面,操作方法等)


          此權(quán)限設(shè)計(jì)適合于模塊化訪問(wèn)系統(tǒng),如OA


          當(dāng)然很多系統(tǒng)因地而已,不可能完全滿足,按照自己系統(tǒng)需求設(shè)計(jì)是最合適的設(shè)計(jì)。



          posted @ 2008-08-18 16:17 Super·shen BLOG 閱讀(806) | 評(píng)論 (0)編輯 收藏
          提交頁(yè)面

          插入

          用戶(hù):
          密碼:
          處理頁(yè)面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"); //這里改了。要是按原先的,會(huì)提示stderr未定義,我不知道為什么。哪位朋友知道一定要告訴我哦。 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'}; //不能用指針! //插入數(shù)據(jù) 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("插入數(shù)據(jù)成功!\n"); int nrow = 0, ncolumn = 0; char **azResult; //二維數(shù)組存放結(jié)果 //查詢(xún)數(shù)據(jù) /* int sqlite3_get_table(sqlite3*, const char *sql,char***result , int *nrow , int *ncolumn ,char **errmsg ); result中是以數(shù)組的形式存放你所查詢(xún)的數(shù)據(jù),首先是表名,再是數(shù)據(jù)。 nrow ,ncolumn分別為查詢(xún)語(yǔ)句返回的結(jié)果集的行數(shù),列數(shù),沒(méi)有查到結(jié)果時(shí)返回0 */ 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 的內(nèi)存空間 sqlite3_free_table( azResult ); sqlite3_close(db); //關(guān)閉數(shù)據(jù)庫(kù) return 0; } 請(qǐng)注意數(shù)據(jù)庫(kù)文件 test.db的訪問(wèn)權(quán)限! 這里改成777!
          posted @ 2008-03-01 17:11 Super·shen BLOG 閱讀(1748) | 評(píng)論 (1)編輯 收藏

          [轉(zhuǎn)自] http://webdn.trueself.cn/archives/107

          posted @ 2008-02-28 14:19 Super·shen BLOG 閱讀(751) | 評(píng)論 (0)編輯 收藏

          ◆ 使用strtok函數(shù)分割。
               原型:char *strtok(char *s, char delim);
              strtok在s中查找包含在delim中的字符并用NULL('\0')來(lái)替換,直到找遍整個(gè)字符串。  
               功能:分解字符串為一組字符串。s為要分解的字符串,delim為分隔符字符串。
              說(shuō)明:首次調(diào)用時(shí),s指向要分解的字符串,之后再次調(diào)用要把s設(shè)成NULL。
                          strtok在s中查找包含在delim中的字符并用NULL('\0')來(lái)替換,直到找遍整個(gè)字符串。
              返回值:從s開(kāi)頭開(kāi)始的一個(gè)個(gè)被分割的串。當(dāng)沒(méi)有被分割的串時(shí)則返回NULL。
                            所有delim中包含的字符都會(huì)被濾掉,并將被濾掉的地方設(shè)為一處分割的節(jié)點(diǎn)。

          使用例:
          #include <stdio.h>
          #include <string.h>
          #include <stdio.h>
          #include <string.h>

          int main(int argc,char **argv)
          {
              char * buf1="aaa, ,a, ,,,bbb-c,,,ee|abc";

              /* Establish string and get the first token: */
              char* token = strtok( buf1, ",-|");
              while( token != NULL )
               {
                     /* While there are tokens in "string" */
                     printf( "%s ", token );
                    /* Get next token: */
                    token = strtok( NULL, ",-|");
               }
              return 0;
          }

          OUT 值:
          aaa

          a

          bbb
          c
          ee
          abc

          ◆ 使用strstr函數(shù)分割。

              原型:extern char *strstr(char *haystack,char *needle);

              用法:#include <string.h>
             功能:從字符串haystack中尋找needle第一次出現(xiàn)的位置(不比較結(jié)束NULL)
             說(shuō)明:返回指向第一次出現(xiàn)needle位置的指針,如果沒(méi)找到則返回NULL。

          使用例:
          #include <stdio.h>
          #include <string.h>

          int main(int argc,char **argv)
          {
               char *haystack="aaa||a||bbb||c||ee||";
               char *needle="||";
               char* buf = strstr( haystack, needle);
               while( buf != NULL )
               {
                   buf[0]='\0';
                   printf( "%s\n ", haystack);
                    haystack = buf + strlen(needle);
                    /* Get next token: */
                    buf = strstr( haystack, needle);
               }
               return 0;
          }

          OUT 值:
          aaa
          a
          bbb
          c
          ee

          ◆ strtok比較適合多個(gè)字符作分隔符的場(chǎng)合,而strstr適合用字符串作分隔符的場(chǎng)合。

          posted @ 2008-02-27 16:35 Super·shen BLOG 閱讀(1477) | 評(píng)論 (0)編輯 收藏
          我們來(lái)看看到底如何從POST表單收集數(shù)據(jù)到CGI程序,下面給出了一個(gè)比較簡(jiǎn)單的C源代碼:     
              
           

           

          #include<stdio.h>
          #include<stdlib.h>    
          #define MAXLEN 80    
          #define EXTRA 5
          /*   4個(gè)字節(jié)留給字段的名字"data",   1個(gè)字節(jié)留給"="   */
          #define   MAXINPUT   MAXLEN+EXTRA+2 
          /*   1個(gè)字節(jié)留給換行符,還有一個(gè)留給后面的NULL   */
          #define DATAFILE "../data/data.txt"
          /*   要被添加數(shù)據(jù)的文件   */

          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>表單提交錯(cuò)誤");
           else{
            FILE *f;
            fgets(input,   len+1,   stdin);
            unencode(input+EXTRA,   input+len,   data);

            f =fopen(DATAFILE, "a");
            if(f == NULL)    
             printf("<P>對(duì)不起,意外錯(cuò)誤,不能夠保存你的數(shù)據(jù)");    
            else
             fputs(data,   f);    
            fclose(f);
            printf("<P>非常感謝,您的數(shù)據(jù)已經(jīng)被保存<BR>%s",data);    
           }    
           return   0;    
          }    

              
                 從本質(zhì)上來(lái)看,程序先從CONTENT_LENGTH環(huán)境變量中得到數(shù)據(jù)的字長(zhǎng),然后讀取相應(yīng)長(zhǎng)度的字符串。因?yàn)閿?shù)據(jù)內(nèi)容在傳輸?shù)倪^(guò)程中是經(jīng)過(guò)了編碼的,所以必須進(jìn)行相應(yīng)的解碼。編碼的規(guī)則很簡(jiǎn)單,主要的有這幾條:     

          1.   表單中每個(gè)每個(gè)字段用字段名后跟等號(hào),再接上上這個(gè)字段的值來(lái)表示,每個(gè)字段之間的內(nèi)容用&連結(jié);    2.   所有的空格符號(hào)用加號(hào)代替,所以在編碼碼段中出現(xiàn)空格是非法的;    
          3.   特殊的字符比如標(biāo)點(diǎn)符號(hào),和一些有特定意義的字符如“+”,用百分號(hào)后跟其對(duì)應(yīng)的ACSII碼值來(lái)表示。    

          例如:如果用戶(hù)輸入的是:     
             
          Hello   there!    

          那么數(shù)據(jù)傳送到服務(wù)器的時(shí)候經(jīng)過(guò)編碼,就變成了data=Hello+there%21   上面的unencode()函數(shù)就是用來(lái)把編碼后的數(shù)據(jù)進(jìn)行解碼的。在解碼完成后,數(shù)據(jù)被添加到data.txt文件的尾部,并在瀏覽其中回顯出來(lái)。    

          把文件編譯完成后,把它改名為collect.cgi后放在CGI目錄中就可以被表單調(diào)用了。下面給出了其相應(yīng)的表單:    

          <FORM   ACTION="/cgi-bin/collect.cgi"   METHOD="POST"   >
          <P>請(qǐng)輸入您的留言(最多80個(gè)字符):<BR>
          <INPUT   NAME="data"   SIZE="60"   MAXLENGTH="80"   ><BR>
          <INPUT   TYPE="SUBMIT"   VALUE="確定">
          </FORM   >    
             
             
                 事實(shí)上,這個(gè)程序只能作為例子,是不能夠正式的使用的。它漏掉了很關(guān)鍵的一個(gè)問(wèn)題:當(dāng)有多個(gè)用戶(hù)同時(shí)像文件寫(xiě)入數(shù)據(jù)是,肯定會(huì)有錯(cuò)誤發(fā)生。而對(duì)于一個(gè)這樣的程序而言,文件被同時(shí)寫(xiě)入的幾率是很大的。因此,在比較正式的留言版程序中,都需要做一些更多的考慮,比如加入一個(gè)信號(hào)量,或者是借助于一個(gè)鑰匙文件等。因?yàn)槟侵皇蔷幊痰募记蓡?wèn)題,在這兒就不多說(shuō)了。

          posted @ 2008-02-27 13:52 Super·shen BLOG 閱讀(2779) | 評(píng)論 (1)編輯 收藏

          ①主動(dòng)出擊,馬上行動(dòng)
          ②每年100本書(shū)以上
          ③一輩子在推銷(xiāo)自己
          ④形象 良好的態(tài)度
          ⑤非常明確自己想要的是什么。
          ⑥連續(xù)15年拜訪一個(gè)顧客,連續(xù)15年主動(dòng)出擊
          ⑦成功 = 知識(shí)+人脈
          ⑧六出祁山,那是責(zé)任。
          <2008年2月>
          272829303112
          3456789
          10111213141516
          17181920212223
          2425262728291
          2345678

          常用鏈接

          留言簿(6)

          隨筆分類(lèi)(28)

          隨筆檔案(40)

          文章分類(lèi)

          個(gè)人主頁(yè)

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 金乡县| 定安县| 和林格尔县| 文山县| 巍山| 沙河市| 蒙山县| 余干县| 旺苍县| 定襄县| 濮阳市| 麟游县| 大同市| 哈尔滨市| 清丰县| 射阳县| 响水县| 吉林省| 崇阳县| 荆门市| 望江县| 乌拉特后旗| 阿城市| 利津县| 沭阳县| 宽甸| 江达县| 谷城县| 乌什县| 广水市| 彰化县| 米易县| 宜川县| 鄂托克前旗| 滦平县| 浦江县| 台山市| 遵义市| 关岭| 呼伦贝尔市| 寻乌县|