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


          1.struts2

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

          根本不用配置struts.xml文件





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


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


           另外其中 action中需要注入的 service 使用annotation ,在set方法前 加入@request 或 @ autowired 或 @resource
          注釋(具體是用那個暫時無法搞清楚,總之我用request 就不行,另外兩個都可以)



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

          而spring中  id = userManager 的bean  也是通過自動注入完成的

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




          2.spring

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

          xml文件中配置自動注冊bean,通過掃描包中的帶注解的類。即這個代碼:




          掃描到下面的類,就自動注冊成 id=userManager





          3.hibernate
          使用hiberante3 注解,不要XML配置,實體類注解不用多說。

          需要注意的是entity類的掃描配置




          看清楚是掃描包,不是掃描類! 所以實體類com.mylu.User是無法掃描到,要放在 com.mylu.xxx.User才能掃描到!




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

          下載:實例代碼


          附:
          類庫
          posted @ 2009-01-08 17:01 Super·shen BLOG 閱讀(1800) | 評論 (2)編輯 收藏

          在jsp中,其實jsp就是servlet,jsp和servlet也都是一個class:

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

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

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

          4.this.getClass().getClassLoader().getResource("").getPath(),這個方法可以在任意jsp,servlet,java文件中使用,因為不管是jsp,servlet其實都是java程序,都是一個class。所以它應(yīng)該是一個通用的方法。

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

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

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

           


          查找權(quán)限時:

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

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


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


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



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

          插入

          用戶:
          密碼:
          處理頁面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"); //這里改了。要是按原先的,會提示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é)果 //查詢數(shù)據(jù) /* int sqlite3_get_table(sqlite3*, const char *sql,char***result , int *nrow , int *ncolumn ,char **errmsg ); result中是以數(shù)組的形式存放你所查詢的數(shù)據(jù),首先是表名,再是數(shù)據(jù)。 nrow ,ncolumn分別為查詢語句返回的結(jié)果集的行數(shù),列數(shù),沒有查到結(jié)果時返回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ù)庫 return 0; } 請注意數(shù)據(jù)庫文件 test.db的訪問權(quán)限! 這里改成777!
          posted @ 2008-03-01 17:11 Super·shen BLOG 閱讀(1753) | 評論 (1)編輯 收藏

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

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

          ◆ 使用strtok函數(shù)分割。
               原型:char *strtok(char *s, char delim);
              strtok在s中查找包含在delim中的字符并用NULL('\0')來替換,直到找遍整個字符串。  
               功能:分解字符串為一組字符串。s為要分解的字符串,delim為分隔符字符串。
              說明:首次調(diào)用時,s指向要分解的字符串,之后再次調(diào)用要把s設(shè)成NULL。
                          strtok在s中查找包含在delim中的字符并用NULL('\0')來替換,直到找遍整個字符串。
              返回值:從s開頭開始的一個個被分割的串。當(dāng)沒有被分割的串時則返回NULL。
                            所有delim中包含的字符都會被濾掉,并將被濾掉的地方設(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)
             說明:返回指向第一次出現(xiàn)needle位置的指針,如果沒找到則返回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比較適合多個字符作分隔符的場合,而strstr適合用字符串作分隔符的場合。

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

           

          #include<stdio.h>
          #include<stdlib.h>    
          #define MAXLEN 80    
          #define EXTRA 5
          /*   4個字節(jié)留給字段的名字"data",   1個字節(jié)留給"="   */
          #define   MAXINPUT   MAXLEN+EXTRA+2 
          /*   1個字節(jié)留給換行符,還有一個留給后面的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>表單提交錯誤");
           else{
            FILE *f;
            fgets(input,   len+1,   stdin);
            unencode(input+EXTRA,   input+len,   data);

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

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

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

          例如:如果用戶輸入的是:     
             
          Hello   there!    

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

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

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

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

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

          常用鏈接

          留言簿(6)

          隨筆分類(28)

          隨筆檔案(40)

          文章分類

          個人主頁

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 田林县| 云林县| 兴城市| 金寨县| 平山县| 六安市| 宾川县| 右玉县| 泌阳县| 万盛区| 清涧县| 新竹市| 鸡西市| 右玉县| 馆陶县| 康平县| 洛南县| 四川省| 乐业县| 淮安市| 乌兰浩特市| 繁峙县| 孟村| 华蓥市| 瓦房店市| 门源| 黄石市| 南皮县| 巴塘县| 灵石县| 屏山县| 金秀| 乐昌市| 子长县| 景东| 郯城县| 从化市| 尼玛县| 晴隆县| 三江| 图片|