隨筆-54  評論-0  文章-2  trackbacks-0
            2010年3月3日
          巴巴運動網(wǎng)的權(quán)限模塊總結(jié)
            因為巴巴運動網(wǎng)的權(quán)限設(shè)計模塊對我來說,可以實現(xiàn),打算好好整理一下思路,面試時說不定還能起點作用,看了兩遍,自己總結(jié)下:
          權(quán)限定義/權(quán)限組(角色)模塊
          1.對系統(tǒng)的所有功能定義相應(yīng)的權(quán)限
          2.由網(wǎng)管針對不同部門不同員工分配權(quán)限組(角色),在分配角色時,
            可以選擇該角色具有的權(quán)限
          3.權(quán)限攔截模塊
           
          具體步驟:
           1.設(shè)計權(quán)限實體
              聯(lián)合主鍵(SystemPrivilegePK),該類有module和privilage兩個屬性
           2.初始化權(quán)限
           3.設(shè)計權(quán)限組(角色)PrivilegeGroup實體,如果我們希望通過修改權(quán)限組添加或刪除權(quán)限,那么權(quán)限和角色之間的多對多關(guān)系的維護(hù)端由角色來維護(hù)
              private String groupid;
              private String name;
              private Set<SystemPrivilege> privileges = new HashSet<SystemPrivilege>();
          同時加上到數(shù)據(jù)庫表的映射
          當(dāng)然由于權(quán)限和角色之間的多對多關(guān)系是雙向關(guān)聯(lián),所以要在SystemPrivilege實體bean中加上和PrivilegeGroup實體Bean之間的映射

          4.實現(xiàn)權(quán)限組的添刪改
          路徑:/control/
           新建接口PrivilegeGroupService,繼承Dao<PrivilegeGroupService>,
           新建PrivilegeGroupService,繼承DaoSupport
          當(dāng)然這些Bean都需要交給Spring管理,加上相應(yīng)的注解即可
          5.實現(xiàn)權(quán)限組的分頁,這個簡單
          6.實現(xiàn)添加權(quán)限,分頁列表上的Action,新建Action,名稱為PrivilegeGroupManageAction,
            ①.第一個方法是AddUI,主要是顯示頁面
            接下來就是增刪該操作了(...)

          7.權(quán)限做完后要新建一個Action用于完成SystemPrivilege,權(quán)限組,超級管理員的初始化,初始化完成后點擊“確定”,進(jìn)入登陸頁面


           權(quán)限模塊的核心:                        權(quán)限攔截模塊

          1.員工要訪問control開頭的路徑,必須登陸,即粗粒度的權(quán)限攔截,這是通過Fileter實現(xiàn)的,這里我們定義為PrivilegeFilter,先從session范圍中得到employee對象,如果對象為空,就瀏覽器重定向到登陸界面,,如果登陸了,就chain.doFilter(request,response);之后在web.xml配置,這樣就實現(xiàn)粗粒度的權(quán)限控制了3
          2.對于界面上的某些功能,不是每一個登陸到系統(tǒng)的員工對頁面的功能都有操作權(quán)限,這就是細(xì)粒度的權(quán)限攔截
          關(guān)鍵是怎樣細(xì)粒度的權(quán)限控制
          怎樣實現(xiàn)細(xì)粒度的權(quán)限控制?
          每點擊頁面上的按鈕,都會提交給相應(yīng)的Action處理,細(xì)粒度的權(quán)限攔截就是對Action攔截,在不修改原代碼情況下,增加攔截代碼,使用的是AOP技術(shù)
           每一個功能Action都有相應(yīng)的方法處理,我們用JDK5中的注解為Action中的方法注解相應(yīng)的權(quán)限,因為我們有時會修改方法名稱,用注解維護(hù)起來比較方便比如:
          @Permission(module="order",privilege="modify")
          public ActionForward OrderModify(){}
           
          實現(xiàn)過程:
          ①.新建注解Permission,
                     @Retention(PetentionPolicy.RUNTIME)
                     @Target(ElementType.METHOD)
                       public @interface Permission{
                           String module();
                            String privilege();
                       }
                為Action中的方法,加上注解
              只有攔截到Action中的這個方法,才能實現(xiàn)權(quán)限攔截,現(xiàn)在我們的Action已經(jīng)交給Spring管理,所以我們可以使用Spring的AOP技術(shù)進(jìn)行權(quán)限攔截,有必要復(fù)習(xí)一下AOP的知識:
           在Action類上加一個注解如下:@Aspect,當(dāng)然要使這個注解起作用,我們必須在Spring的配置文件里配置:
            <aop:aspectj-autoproxy> <!--注解解析器-->
          要實現(xiàn)切面編程,抽象過程體現(xiàn)在代碼上, 就是一個采用類來描述,要是這個類起作用,我們必須要把它交給Spring管理,很郁悶
          @Aspect@Component
          public class Interceptor{
           @Pointcut("exception(org.apache.struts.action.ActionForward  cn.itcast.web.action.. * *(org.apache.struts.actionMapping,...))")
           private void actionMethod(){}
          @Around("actionMethod")
          public Object interceptor(ProceedingJoinPoint pjp) throw Throwable{
            System.out.println("攔截到了"+pjp.getSignature().getName()+"方法");
            return pjp.proceed();
           }

          注意:
          通知:
          前置通知,在攔截的方法前加通知,這個通知執(zhí)行后,被攔截的方法仍然會執(zhí)行。
          所以使用環(huán)繞通知,但是這樣的攔截只能是攔截Action實現(xiàn)的,他不能攔截繼承自DispatchAction
          原因:Spring的動態(tài)代理技術(shù)的問題
          Spring不能對通過反射調(diào)用的方法應(yīng)用上通知(Advice)
          當(dāng)Spring發(fā)現(xiàn)我們的繼承的DispatchAction的那個類符合他攔截的要求,就會生成一個代理對象,因為無接口,默認(rèn)使用cglib為這個Action生成代理對象,根據(jù)cglib生成代理對象的特點,繼承目標(biāo)類,并且重寫所有非final的方法來實現(xiàn)
           
          注:spring只會為本類定義的方法應(yīng)用通知



          posted @ 2010-04-01 07:10 d66380022| 編輯 收藏
           今天初步學(xué)習(xí)了一下Struts2,對于Struts2,企業(yè)中已應(yīng)用十分廣泛,由于他是在Struts基礎(chǔ)上發(fā)展而來,技術(shù)上比struts高,比如struts2對同一個路徑的每個請求分別使用一個獨立Action實例對象,所有使用struts2不用考慮線程安全問題,還有就是修改下配置文件,不用重啟服務(wù)器
          1.struts2的建立過程:
          配置過程:
          1.新建web項目
          2.導(dǎo)入struts2類庫. [blank項目中含有最少的jar文件]
          3.配置web.xml
          <filter>[...SrutsPrepareAndExecuteFilter]
          4.寫Action類
          public class HelloWorldAction {
          public String execute(){
          System.out.println("hello world!");
          try {
          ServletActionContext.getResponse().getWriter().printf("hello!");
          } catch (Exception e) {
          e.printStackTrace();
          }
          return null ;
          }
          }
          5.創(chuàng)建struts.xml
          ①.struts2默認(rèn)在類路徑下查找struts.xml文件
          關(guān)于struts.xml配置,可以參看struts2-blank-2.1.8.1.war解壓后的配置
          設(shè)置環(huán)境為開發(fā)模式.設(shè)置為開發(fā)模式,有利于編程和調(diào)試,
          <constant name="struts.devMode" value="true" />
          3.讓struts.xml中的Package繼承struts-default.xml中的默認(rèn)包.
          所有的默認(rèn)包中的元素配置就引入進(jìn)來.
          4.配置默認(rèn)值.
          <action name="HelloWorldAction" class="cn.itcast.struts2.helloworld.HelloWorldAction">
          <result name="success">
          <param name="location">/index.jsp</param>
          </result>
          </action>

          5.strtus2中的action不是單例的,它會為每個請求單獨分配一個action實例,所以可以在action類中聲明實體屬性.
          Struts2的Action是模型層,不是控制層,原因它是需要攜帶業(yè)務(wù)數(shù)據(jù)的.
          6.struts2中的攔截器是負(fù)責(zé)每個獨立的一項任務(wù).例如,參數(shù)傳遞,國際化,異常處理,StrutsPrepareAndExecuteFilter是Struts 2框架的核心控制器,它負(fù)責(zé)攔截由<url-pattern>/*</url-pattern>指定的所有用戶請求,當(dāng)用戶請求到達(dá)時,該Filter會過濾用戶的請求。
          7.在struts2的jsp中輸出數(shù)據(jù),借助于struts-tag.tld標(biāo)簽庫.該庫在[struts-core.jar/META-INF/struts-tag.tld,但是其重要作用還是用于回顯數(shù)據(jù)

          8.Struts2可以數(shù)據(jù)的范圍:ActionContext request session application
          ActionContext是數(shù)據(jù)中心,ValueStack不過是該數(shù)據(jù)中心中的一個特殊對象.
          在jsp中訪問ActionContext中的數(shù)據(jù)的話,可以使用OGNL語言.
          9.struts2中包的名字空間搜索原則:

          1.<package name="xxPkg">
          2.<package name="xxPkg" namespace="">
          3.<package name="xxPkg" namespace="/">
          4.<package name="xxPkg" namespace="/HelloWorld">

          1.和2.效果一樣,都是默認(rèn)的包.
          2.都會自后向前搜索,直到找到為止,"/" 和 "/HelloWorld"唯一不同就是也可以作為搜索目錄.
          3.空包是默認(rèn)包,如果每個包都沒有找到相應(yīng)的action的話,就去默認(rèn)包下去找.
          10.struts2中進(jìn)行動態(tài)方法調(diào)用.
          http://localhost:8085/struts2/Hell/HelloWorldAction!toRewView.do
          11.struts2中使用標(biāo)簽庫
          <s:form action="HelloWorldAction_doReg" [namespace=""]>
          <s:textfield name="name" label="UserName" />
          <s:submit />
          </s:form>
          namespace:如果不寫,會使用當(dāng)期的名字空間.
          struts給的所有控件標(biāo)簽,主要目的用于回顯數(shù)據(jù).
          12.struts2中進(jìn)行基本的校驗,需要Validateable和ValidationAware兩個接口的支持,同時還需要
          workflow攔截器的支持.
          13.在struts2中,默認(rèn)的表達(dá)式語言是OGNL,Object Graphic Navigation Language(對象圖導(dǎo)航語言)的縮寫,它是一個開源項目。 Struts 2框架使用OGNL作為默認(rèn)的表達(dá)式語言。相對EL表達(dá)式,它提供了平時我們需要的一些功能,如:支持對象方法調(diào)用,支持類靜態(tài)方法調(diào)用和值訪問,操作集合對象。例如():

          訪問值棧中的action的普通屬性: username = <s:property value="username"/>

          由于下午有公司來面試,耽誤了一些時間,老徐說明天再多補(bǔ)一個小時,太敬業(yè)了啊,佩服!

          posted @ 2010-03-25 16:39 d66380022| 編輯 收藏

            在線支付時針對易寶支付的網(wǎng)關(guān)而開設(shè)的,眾所周知,易寶已是三大網(wǎng)上支付平臺之一,正好明天易寶來招聘,正好練練,呵呵,下午是面試技巧

            好好學(xué)習(xí),畢業(yè)倒計時:15

          1.支付寶是不能立即拿到現(xiàn)錢的,這也是商家喜歡在線支付的一個原因吧,在線支付是直接和銀行對接的,這樣商家可以立即拿到現(xiàn)錢,避免了和買家產(chǎn)生矛盾后,錢被封的風(fēng)險。

          下面就來實現(xiàn)在線支付吧,首先提出請求,如果通過,會得到賬號和密鑰

           我們要做的事有兩項                                              

            1.向支付網(wǎng)關(guān)發(fā)起請求,就是向http發(fā)起請求,所謂請求就是我們平常使用Http請求(http://www.xxx.cn/xxx.do),請求方式:Get/Post

            <form method=”” action=”https://www.yeepay.com/app-method”>

               <input name=”?”,value=””/>

               <input name=”url” value=”http://www.itcast.cn/re.do”/>

               <input name=”hmac” value=””>

               …..

              Hmac = MD5(pd_FrpId + p0_Cmd + p8_Url,key);32位,不可逆

              支付網(wǎng)關(guān):其實就是一個http路徑

            2.接收支付網(wǎng)關(guān)返回的支付結(jié)果信息

             第一次使用瀏覽器重定向技術(shù),

           把支付信息發(fā)送給:http://www.itcast.cn/re.do?id=21432&result=1

            

          2.相關(guān)知識點:

          .接入方式:兩種接入方案

          .直接與銀行對接

          優(yōu)點因為直接與銀行進(jìn)行財務(wù)結(jié)算,交易資金結(jié)算比較安全

          缺點:開發(fā)工作量比較大,而且銀行會不定期升級交易系統(tǒng),隨著銀行系統(tǒng)的升級,企業(yè)也需要作相應(yīng)改動,所以維護(hù)工作量也是比較大的,而且企業(yè)每年還需要向銀行交納一定數(shù)量的接口使用費。

           

          .通過中間公司間接與銀行對接

          優(yōu)點:開發(fā)工作量較少,因為使用的是中間企業(yè)提供的接入規(guī)范,所以銀行升級系統(tǒng),不需要企業(yè)作相應(yīng)修改,除非中間企業(yè)的接入規(guī)范發(fā)生了改變,企業(yè)才作相應(yīng)修改。

          缺點:因為是與中間企業(yè)進(jìn)行資金結(jié)算,目前所有中間企業(yè)都是私企,資金安全是個大問題。

           3. 對支付數(shù)據(jù)進(jìn)行Md5加密

          4. 支付流程:

          通過http請求方式向易寶支付網(wǎng)關(guān)發(fā)起一個支付請求,請求可以是getpost方式提交。

          易寶支付網(wǎng)關(guān)對企業(yè)發(fā)來的數(shù)據(jù)使用用戶的密鑰生成MD5-hmac碼,然后跟企業(yè)發(fā)來的MD5-hmac(即上面表單由hmac字段提供的值)比較是否相同,如果相同即把請求轉(zhuǎn)發(fā)到銀行網(wǎng)關(guān),當(dāng)用戶支付完成后,銀行網(wǎng)關(guān)會引導(dǎo)用戶的瀏覽器重定向到易寶支付網(wǎng)關(guān),然后易寶支付網(wǎng)關(guān)再引導(dǎo)用戶的瀏覽器重定向到企業(yè)提供的url(即上面表單由p8_Url提供的地址)

           

          接下來我們只需處理結(jié)果了

           

          下午是面試技巧:

          薪水:一定要寫 ,不要寫區(qū)間 4000  

          心得體會:具體點

          責(zé)任描述:多寫,詳細(xì),寫開發(fā)難點,描述清楚,介紹清楚

            對某一模塊詳細(xì)描述,對難點的解決過程

          描述自己負(fù)責(zé)的模塊,抓住一點,詳細(xì)說,千千不要泛泛而談

          不能寫培訓(xùn)經(jīng)驗

           

          三好學(xué)生,寫一等獎學(xué)金是應(yīng)屆的

          愛好還是要寫的

          身份證不能造假,教育經(jīng)歷,通常企業(yè)篩選簡歷過程:

           1-2千封中選,讓前臺做/人力去篩選簡歷,要求:

             A.只提取兩年工作年限以上(一般企業(yè)都是這樣干的)

             B.連人力都能判斷出造假的簡歷,排除

             C.經(jīng)過人力,剩下100

             D.面試官

           

          88年可以寫兩年,教育經(jīng)歷:把畢業(yè)信息提前,證書造假

          簡歷上可適當(dāng)造假

          薪水:

          2年,月薪(北京,上海,廣州):

          初級:3000 – 4000 4500  -- 8-12

          中級:4500 – 6000 7K 其中5K-6K比較多 --

          高級:7000 – 1.2W  3-5

           

          從事Android,薪水如下:

          Android 2 最長就2

          原來做過j2se開發(fā)3-4 8K-1.2W

          android 3個月(j2ee 1-26K

          Android 干半年 4.5K

          如果我們老老實實干半年,編碼能力就會沒問題

           

          工作經(jīng)驗:

          1.為什么離職?

          我在深圳那邊4K,也不知道北京這邊的行情。

          2.當(dāng)公司準(zhǔn)備要你的時候,會讓你填以前公司的地址信息,聯(lián)系人信息

           造假唄,找個外地的同學(xué)

          3.入職后,離職證明,隨便蓋個章,離職證明模版網(wǎng)上有一大堆

           新公司不想惹麻煩,已經(jīng)和原來公司解除了勞動合同

           

          4.關(guān)于android面試

           基礎(chǔ):

          多線程(并發(fā)控制),Socket通信,http通信

           android

          android的什么項目

          項目針對那些手機(jī)型號的手機(jī)HTC

          如何適應(yīng)各個分辨率的問題,大分辨率靠前

          ContentProvider(難度),共享數(shù)據(jù)

          聯(lián)系人(如何獲取聯(lián)系人)

          Activity的生命周期:運行 暫停 停止

          前臺生命周期

          完整生命周期

             

          意圖:隱,顯式

          組件:廣播,內(nèi)容提供者,Service 四大組件

          MMI:多媒體接口

          SQLite:數(shù)據(jù)庫訪問

          項目開發(fā)

            3   2-3

          公司部門           人員

          研發(fā)部/技術(shù)部     50-60

          測試部            8-10

          客服部/售后服務(wù)

          市場部           

          行政部

          posted @ 2010-03-24 00:49 d66380022| 編輯 收藏

          今天學(xué)習(xí)從網(wǎng)上獲得數(shù)據(jù),以xml文件輸出。流程:android客戶端 -----已經(jīng)開發(fā)好的CRM(220.113.15.23) -----[客戶資料]--à屏幕

          用的是struts1.3的環(huán)境

          1.搭建環(huán)境

          1.web.xml配置struts servlet

          2.添加jar

          3.復(fù)制struts-config.xml

          環(huán)境搞定后,新建jsp文件,寫好文件頭:<?xml version="1.0" encoding="UTF-8"?> 注意

          接著新建一個ContactAction

          最后配置struts-config.xml文件

          新建contact.jsp文件,得到數(shù)據(jù)

          訪問路徑,測試得到的數(shù)據(jù),以驗證是否正確,若正確的話,第一步完成

          下面是Android應(yīng)用

          2 ..設(shè)計要顯示的界面

            .新建service,可以調(diào)用

          關(guān)鍵代碼:

          String path = “http://192.168.1.100:8080/crm/contacts.do”;

          URL url = new URL(path);

          HttpURLConnection conn = (HttpURLConnection)url.openConnection();

          conn.setConnectionTimeout(5*1000);

          conn.setRequestMethod(“POST”);

          return conn.getInputStream();

          在該類中還應(yīng)該新建sax解析方法,解析文檔,保存數(shù)據(jù)

          .新建android測試類,以日志形式打印出xml文件中的數(shù)據(jù)

          3.應(yīng)用HttpURLConnection對象,我們可以向網(wǎng)絡(luò)發(fā)送請求參數(shù).下面以POST發(fā)送為例,寫一些關(guān)鍵代碼點

          Map<String, String> params = new HashMap<String, String>();

          params.put("age", "22");

          params.put("name", "浪淘沙");

           StringBuilder params = new StringBuilder();

          for(Map.Entry<String, String> entry : params.entrySet()){

               params.append(entry.getKey());

               params.append("=").append(URLEncoder.encode(entry.getValue(), "UTF-8"));

               params.append("&");

          }

          if (params.length() > 0) params.deleteCharAt(params.length() - 1);

          byte[] data = params.toString().getBytes();

           

          4. 為應(yīng)用添加新的Activity

          ①:新建一個繼承Activity的類

          ②:需要在功能清單AndroidManifest.xml文件中添加進(jìn)上面Activity配置代碼

           

          打開新的Activity,不傳遞參數(shù)

          通過意圖打開ActivityIntent,用于激活Activity的,在組件之間傳遞數(shù)據(jù)

          在新的Activity中接收前面Activity傳遞過來的參數(shù):

          添加參數(shù)的另一種方法:Bundle

          Bundle類用作攜帶數(shù)據(jù),它類似于Map,用于存放key-value名值對形式的值。相對于Map,它提供了各種常用類型的putXxx()/getXxx()方法, putXxx()用于往Bundle對象放入數(shù)據(jù),getXxx()方法用于從Bundle對象里獲取數(shù)據(jù)。Bundle的內(nèi)部實際上是使用了HashMap<String, Object>類型的變量來存放putXxx()方法放入的值:

           

          5. Intent過濾器

          Android鼓勵減少組件間的耦合,因此Android提供了Intent (意圖) Intent提供了一種通用的消息系統(tǒng),它允許在你的應(yīng)用程序與其它的應(yīng)用程序間傳遞Intent來執(zhí)行動作和產(chǎn)生事件。使用Intent可以激活Android應(yīng)用的三個核心組件:活動、 服務(wù)和廣播接收器。

          Intent可以劃分成顯式意圖和隱式意圖。

           

           

          posted @ 2010-03-20 23:30 d66380022| 編輯 收藏

          使用SharedPreferences進(jìn)行數(shù)據(jù)存儲,是專門用來向用戶提供軟件參數(shù)設(shè)置功能,

          1.       SharedPreferences類,它是適合用于保存軟件配置參數(shù)。使用SharedPreferences保存數(shù)據(jù),其背后是用xml文件存放數(shù)據(jù)。

          2. SharedPreferences使 用xml文件保存 數(shù)據(jù),getSharedPreferences(name,mode)方法的第一個參數(shù)用于指定該文件的名稱,不用帶后綴,后綴由Android自動加上,方法的第二個參數(shù)指 定文件的操作模式,共有四種操作模式。

          3.設(shè)置軟件參數(shù)過程:

           ①.當(dāng)用戶點擊保存按鈕時,就激發(fā)保存事件

               Activity中的匿名內(nèi)部類中,得到用戶輸入值

               需要注意的是:android.content.SharedPreferences.Editor用于保存參數(shù),該editor最后要commit一下。

               最后要Toast.makeText(PreferencesActivity.this, "保存參數(shù)成功", 1).show();用于提示保存參數(shù)成功

          .如果訪問其他應(yīng)用中的Preference,前提條件是:該preference創(chuàng)建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE權(quán)限。如:有個<package name>cn.itcast的應(yīng)用使用下面語句創(chuàng)建了preference

          getSharedPreferences("itcast", Context.MODE_WORLD_READABLE);

          其他應(yīng)用要訪問上面應(yīng)用的preference,首先需要創(chuàng)建上面應(yīng)用的Context,然后通過Context 訪問preference ,訪問preference時會在應(yīng)用所在包下的shared_prefs目錄找到preference

          Context otherAppsContext = createPackageContext("cn.itcast",

          Context.CONTEXT_IGNORE_SECURITY);

          4. 使 用SQLite數(shù) 據(jù)庫存儲數(shù)據(jù)

          Android平臺上,集成了一個嵌入式關(guān)系型數(shù)據(jù)庫—SQLiteSQLite3支持 NULLINTEGERREAL(浮點數(shù)字)、TEXT(字符串文本)BLOB(二進(jìn)制對象)數(shù)據(jù)類型,雖然它支持的類型只有五種, SQLite最大的特點是你可以保存任何類型的數(shù)據(jù)到任何字段中,無論這 列聲明的數(shù)據(jù)類型是什么。SQLite可以解析大部分標(biāo)準(zhǔn)SQL語句。

          5.開發(fā)3g數(shù)據(jù)庫 軟件需求:

           ①.用戶初次使用軟件,初始化數(shù)據(jù)庫

           ②.用戶升級軟件,自動更新數(shù)據(jù)庫

           為此,類對應(yīng)提供了兩個重要的方 法,分別是onCreate(SQLiteDatabase db)onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

          6.利用繼承自SQLiteOpenHelperDatabaseHelper類實現(xiàn)增刪改查,和我們以前的用JDBC實現(xiàn)的增刪改查語法基本一樣,舉例:

           SQLiteDatabase db = ....;

          db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"傳智播客", 4});

          db.close();

           需要注意的是SQLiteDatabaserawQuery() 用于 執(zhí)行select語句

          7.將數(shù)據(jù)動態(tài)顯示在手機(jī)屏幕上,用SimpleAparter實現(xiàn)


          今天到此結(jié)束!

             

                

          posted @ 2010-03-17 23:53 d66380022| 編輯 收藏

          3G的第二天,單元測試,老黎講的東西當(dāng)天基本可以掌握,很喜歡

          1.單元測試步驟:

          第一步:首先在AndroidManifest.xml中加入下面紅色代碼:

          ①.<application>中加入:

          <uses-library android:name="android.test.runner" />

          ②.在最后的標(biāo)簽前加上:

          <instrumentation android:name="android.test.InstrumentationTestRunner"

               android:targetPackage="cn.itcast.action" android:label="Tests for My App" />

          注意:上面targetPackage指定的包要和應(yīng)用的package相同。

          第二步:編寫單元測試代碼(選擇要測試的方法,右鍵點擊“Run As”--“Android Junit Test” ):

          2.數(shù)據(jù)存儲和訪問

           軟件需要對處理后的數(shù)據(jù)存儲,Android為數(shù)據(jù)存儲提供了5種方式:

               文件,SharedPreferencesSQLite數(shù)據(jù)庫,內(nèi)容提供者(Content provider),網(wǎng)絡(luò)

          使用文件對數(shù)據(jù)進(jìn)行存儲,Activity提供了openFileOutput()方法可以用于把數(shù)據(jù)輸出到文件中。openFileOutput()方法的第二參數(shù)用于指定操作模式,有四種模式,分別為:

          Context.MODE_PRIVATE

          Context.MODE_APPEND 

          Context.MODE_WORLD_READABLE

          Context.MODE_WORLD_WRITEABLE

          3.SAX解析XML

          SAX是一個解析速度快并且占用內(nèi)存少的xml解析器,解析采用的是事件驅(qū)動,這些方法定義在ContentHandler接口中,下面是一些ContentHandler接口常用的方法:

          startDocument()

          當(dāng)遇到文檔的開頭的時候,調(diào)用這個方法,可以在其中做一些預(yù)處理的工作。

          endDocument()

          和上面的方法相對應(yīng),當(dāng)文檔結(jié)束的時候,調(diào)用這個方法,可以在其中做一些善后的工作。

          startElement(String namespaceURI, String localName, String qName, Attributes atts)

          當(dāng)讀到一個開始標(biāo)簽的時候,會觸發(fā)這個方法。

          endElement(String uri, String localName, String name)

          這個方法和上面的方法相對應(yīng),在遇到結(jié)束標(biāo)簽的時候,調(diào)用這個方法。

          characters(char[] ch, int start, int length)

          這個方法用來處理在XML文件中讀到的內(nèi)容,第一個參數(shù)為文件的字符串內(nèi)容,后面兩個參數(shù)是讀到的字符串在這個數(shù)組中的起始位置和長度,使用new String(ch,start,length)就可以獲取內(nèi)容。

          4.使用Pull解析器讀取XML文件

          如果需要生成一個XML文件,生成XML文件的方法有很多,如:可以只使用一個StringBuilder組拼XML內(nèi)容,然后把內(nèi)容寫入到文件中;

          或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,推薦使用Pull解析器。

           

          最后,

          巴巴運動網(wǎng),好好學(xué)習(xí)權(quán)限和優(yōu)化等技術(shù),面試特別有幫助

                                                                                                                                                                                                                    

          posted @ 2010-03-16 00:29 d66380022| 編輯 收藏

              今天是黎老師的3G應(yīng)用開發(fā)Android項目的第一天,Android相當(dāng)火,從事Android開發(fā)的人員不太多,接下來開始Android之旅。

          1.3G簡介:

           3G,即3rd Generation,目前中國聯(lián)通使用的是WCDMA,中國電信使用的是CDMA2000 中國,移動使用的是具有自主知識產(chǎn)權(quán)的TD-SCDMA3G的最大優(yōu)點:速度上的提升

          2.wml標(biāo)簽,比Html標(biāo)簽簡單,1-2天就可以搞定,工作中用到再學(xué),因為他是2.5G中用到的技術(shù),如果3G普及的話,這門技術(shù)就Over了。

          3.智能手機(jī)操作平臺

           我們學(xué)Android操作系統(tǒng),RIM BlackBerry,黑莓我比較喜歡,但在國內(nèi)還不怎么流行, Symbian手機(jī)硬件比較好,所以占用很大市場,在3G時代,手機(jī)基本上可以當(dāng)做電腦,用戶更看重手機(jī)是否能滿足日常生活和工作的需要。這就好像大多電腦 用戶都安裝了Windows操作系統(tǒng),很少安裝Linux系統(tǒng)。開發(fā)Android的人員的增多,必然會帶來手機(jī)軟件的增多,軟件的多少會決定以后操作系統(tǒng)的市場份額,windows mobileAndroidiPhone的界面差遠(yuǎn)了。我們關(guān)注:AndroidiPhoneSymbian智能手機(jī)平臺,因為我們搞Java開發(fā),只能學(xué)Android

          4.Android資料

           Android手機(jī)就買多普達(dá)和Moto的,質(zhì)量好。Android最好的資料是android.pdfGoogle Android SDK開發(fā)范例大全提供了Android的全部功能,在學(xué)完課程之后可以看

          5. 開發(fā)環(huán)境的搭建: 

           JDK 5 JDK 6 (僅有JRE不夠)

          Eclipse 3.5 (galileo)

          ①.下載ADT Eclipse 插件

          http://dl.google.com/android/ADT-0.9.5.zip

          ②.安裝 Eclipse 插件 (ADT)

          啟動 Eclipse,選擇 Help > Install New Software,在出現(xiàn)的對話框里,點擊Add按鈕,在對話框的name一欄輸入“ADT” 然后點擊Archive...,瀏覽和選擇已經(jīng)下載的ADT插件壓縮文件。

          點擊 OK.。返回可用軟件的視圖,你會看到這個插件,然后選擇Developer Tools (會選中下 面的“Android Developer Tools” “Android Editors“),點擊 Next,最后重啟 Eclipse

          ③.下載Android SDK

          http://dl.google.com/android/android-sdk_r04-windows.zip

          下載完SDK后,把.zip文件解壓到你電腦上合適位置。啟動 Eclipse,選擇window->preferences, 在打開的視圖左邊點擊android,在右邊的SDK Location中選擇Android SDK所在位置。

          6.開發(fā)Android的第一個應(yīng)用:

          1.點擊工具欄上手機(jī)形狀的虛擬設(shè)備管理器(簡稱“AVD“)

          2.在打開的虛擬設(shè)備管理器中創(chuàng)建一個虛擬手機(jī)

          3.在項目上右鍵點擊run as ?Android application

          OK,第一個應(yīng)用就OK

          7.端口號:127.0.0.1:5554

          8.Activity

           就像struts中的Action,處理用戶請求,除此之外,Activity還代表一個用戶界面

          9. Android應(yīng)用程序架構(gòu)

                 src/ java原代碼存放目錄

                 gen/ 自動生成目錄

                 gen 目錄中存放所有由Android開發(fā)工具自動生成的文件。目錄中最重要的就是R.java文件。 這個文件 由Android開 發(fā)工具自動產(chǎn)生的。Android開發(fā)工具會自動根據(jù)你放入res目錄的xml界面文件、圖標(biāo)與常量,同步更新修改R.java文件。

                 res/ 資源(Resource)目錄

                 在這個目錄中我們可以存放應(yīng)用使用到的各種資源,如xml界面文件,圖片或數(shù)據(jù)。具體請看ppt下方備注欄。

                 AndroidManifest.xml 功能清單文件

                  這個文件列出了應(yīng)用程序所提供的功 能,相當(dāng)于strutsconfig文件,只有配置好后,才能調(diào)用此Activity

                 default.properties 項目環(huán)境信息,一般是不需要修改此文件中

          10.短信發(fā)送器

           注意:因為應(yīng)用要使用手機(jī)的短信服務(wù),所以要在清單文件AndroidManifest.xml中添 加短信服務(wù)權(quán)限:

          11.通知

           關(guān)于這些東西,還是看看文檔,拷過來運行一下,測試測試看看效果就差不多了。


          posted @ 2010-03-16 00:20 d66380022| 編輯 收藏

          .使用poi

            1.參見poi的文檔,添加jar

            2.workbook表示一個Excel文檔

            3.下載Excel模版,必須按格式

               1.創(chuàng)建workbook對象

                 2.創(chuàng)建下載Excel文件的第一行

                  3.從數(shù)據(jù)庫中讀取到需要的Employee列表

               5.利用Servlet Api 對準(zhǔn)備好的Excel下載

            4.上傳excel        

                .配置Action

                .導(dǎo)入兩個jarcommons-iocommons-fileupload.jar

                .上傳

                   1.根據(jù)ActionFormFormFile屬性讀取上傳數(shù)據(jù),獲得Workbook對象

                         2.讀取Workbook對象中的內(nèi)容:遍歷Workbook對象除標(biāo)題行以外的行

                   3.把每一行都轉(zhuǎn)換為一個Employee對象

                   4.調(diào)用方法,把Employee對象的集合保存到數(shù)據(jù)庫中,注意:有可能不能保存,其原因可能違反格式或者違反數(shù)據(jù)庫的唯一性約束

                      

          .PDF文檔輸出

            1.iText介紹:iText是著名的開放源碼的站點sourceforge一個項目, 是用于生成 PDF 文檔的一個java類庫. 

          2.Pdf 文件輸出的 5 個步驟

          1. 創(chuàng)建一個 Document 對象.

          public Document()

          public Document(Rectangle pageSize): 定義頁面的大小

          public Document(Rectangle pageSize, int marginLeft, int marginRight, int marginTop, int marginBottom): 定義頁面的大小, 后邊的四個參數(shù)分別指定左, , , 下頁邊距

          2.建立一個書寫器 (Writer) document對象關(guān)聯(lián), 通過書寫器(Writer)可以將文檔寫入到磁盤中

          3. 打開文檔

          4. 在文檔中添加文字

          5. 關(guān)閉文檔 

          其中:

           

          ①。設(shè)定文檔屬性

          當(dāng)新的頁面產(chǎn)生之前, 可以設(shè)定頁面的大小、書簽、腳注(HeaderFooter)等信息,調(diào)用的方法是:

           

          ②。添加文檔內(nèi)容

          所有向文檔添加的內(nèi)容都是以對象為單位的, PhraseParagraphTable. 比較常用的是段落(Paragraph)對象, 用于向文檔中添加一段文字

          ③。文本處理

          iText中用文本塊(Chunk)、短語(Phrase)和段落(paragraph)處理文本。

          文本塊(Chunk)是處理文本的最小單位, 由一串帶格式(包括字體、顏色、大小)的字符串組成:

           

           

          注意: iText 中沒有行的概念, 一個表格里直接放單元格, 如果一個 3 列的表格中放進(jìn) 6 個單元格, 那就是兩行的表格. 如果放入 5 個基本的沒有任何跨列設(shè)置的單元格, 表格就會出錯. 此時表格不會添加到文檔中, 并且沒有任何提示

           

          .面試

             老佟給我們找了一個簡歷,介紹了一些面試的注意點,要點:

               1.符合自身條件,各種技術(shù)。

               2.最好寫點權(quán)限設(shè)計,Compass+Lucene實現(xiàn)全文搜索,流程采用JBPM管理。

               3.項目三個:小湯的OA和老佟的權(quán)限整合為一個項目,網(wǎng)上商城(巴巴運功網(wǎng)),3g,數(shù)據(jù)采集

          OA用到的技術(shù):SSH

          jQuery + Ajax

          jbpm 完成審批流程

          spring-security

          lucence :全文檢索

           

          posted @ 2010-03-13 23:40 d66380022| 編輯 收藏
           接著昨天的實現(xiàn)將攔截的url,權(quán)限信息,用戶信息放到數(shù)據(jù)庫中,并將spring-security集成到項目中

          1. 實現(xiàn)資源信息存放到數(shù)據(jù)庫中:

          訪問資源時, spring-security 能區(qū)分出訪問該資源需要哪些權(quán)限
            1. 自定義ObjectDefinitionSource 接口的實現(xiàn)類, 將該類的實例裝配給 FilterSecurityInterceptor 的 objectDefinitionSource 的屬性. 即可實現(xiàn)自定義的資源獲取.

            2. 通過繼承 DefaultFilterInvocationDefinitionSource 類的方法定義ObjectDefinitionSource 接口的實現(xiàn)類有困難, 因為 DefaultFilterInvocationDefinitionSource中沒有無參的構(gòu)造器

             3.通過查看 spring-security 核心 jar 包的 META-IN 下 的 spring.handlers 找到 SecurityNamespaceHandler, 在該類中查看 registerBeanDefinitionParser(Elements.HTTP, new HttpSecurityBeanDefinitionParser()); 方法在 HttpSecurityBeanDefinitionParser 類中可以看到如何創(chuàng)建 DefaultFilterInvocationDefinitionSource 實例.

             4. 通過 FactoryBean 在 IOC 容器中注冊  DefaultFilterInvocationDefinitionSource 實例   

             5. 實現(xiàn)ResourceDetailsService 接口    

          2.關(guān)于MD5加密:

          1.網(wǎng)上的關(guān)于MD5已經(jīng)很多了,MD5算法對密碼進(jìn)行摘要加密,這是一種單項加密手段,無法通過加密后的結(jié)果反推回原來的密碼明文。

          為了使用MD5對密碼加密,我們需要修改一下配置文件
          <authentication-provider>
              <password-encoder hash="md5" >
              <jdbc-user-service data-source-ref="dataSource" >
          < authentication-provider>  
          上述代碼中新增的黃色部分,將啟用md5算法。

          3.管理會話(HttpSession)
              多個用戶不能使用同一個賬號同時登陸系統(tǒng)。
          添加監(jiān)聽器
          在web.xml中添加一個監(jiān)聽器,這個監(jiān)聽器會在session創(chuàng)建和銷毀的時候通知Spring Security。
          這種監(jiān)聽session生命周期的監(jiān)聽器主要用來收集在線用戶的信息,比如統(tǒng)計在線用戶數(shù)之類的事。后登陸的將先登錄的踢出系統(tǒng)默認(rèn)情況下,后登陸的用戶 會把先登錄的用戶踢出系統(tǒng)。

          ============================================================================================
                                        集成spring-security框架

          1. 集成 spring-security 框架

              1. 加入 spring-security 的兩個 jar 包
              2. 在 web.xml 文件中加入加入 spring-security 框架的過濾器
              3. 新建 applicationContext-security.xml 配置文件,并且把 security 作為默認(rèn)的命名空間, 并將其導(dǎo)入到 applicationContext.xml 中
              4. 設(shè)計領(lǐng)域模型:
                 Authority -- 權(quán)限
                 Resource -- 資源
                 Role -- 角色
                 Employee -- 添加 Set<Role> roleSet 屬性

                 Resource 和 Authority 為多對多的對應(yīng)關(guān)系
                 Authority 和 Role 為多對多的對應(yīng)關(guān)系
                 Role 和 Employee 為多對多的對應(yīng)關(guān)系
          需要 3 個關(guān)聯(lián)表
              5.
                 1. 修改當(dāng)前系統(tǒng)的 login.jsp 頁面, 改為 spring-security 的登錄頁面, 并且在 <http> 節(jié)點中進(jìn)行配置.
          注意: spring-security 在登錄成功后, 利用 "重定向" 轉(zhuǎn)到 form-login 節(jié)點對應(yīng)的 default-target-url 屬性對應(yīng)的頁面. 所以不能直接將其配置為 WEB-INF 目錄下的任何頁面
                2. 新建 UserDetailsService 接口的實現(xiàn)類, 以實現(xiàn)從數(shù)據(jù)庫中獲取用戶信息(需要查詢 Employee, Role, Authority, 參見 spring-security-2 的UserDetailsServiceImpl, 基于 Hibernate 實現(xiàn)),并把該類的 Bean 引用裝配給 <authentication-provider> 節(jié)點的 user-service-ref 屬性 
              6. 向 ems_resource_table, ems_authority_table, ems_resource_authority_table 數(shù)據(jù)表中添加數(shù)據(jù)
              7. 新建 ResourceDetailsService 接口的實現(xiàn)類, 實現(xiàn)從數(shù)據(jù)庫中讀取需要被保護(hù)的資源信息及其可以訪問這些資源的權(quán)限信息
              8. 利用 FactoryBean 新建 DefaultFilterInvocationDefinitionSource 接口的 Bean, 并把  ResourceDetailsService 的 Bean 注入進(jìn)來, 再把該 Bean 配置為 filterSecurityInterceptor 過濾器的 objectDefinitionSource 屬性

          2. 實現(xiàn)權(quán)限模塊:
           1. 實現(xiàn) Role 的增, 刪, 改, 查

                  角色的添加:

                頁面 UI:
                        a. 對字段的 jQuery validation 驗證
                        b. struts validator 驗證 **
                        c. Action的復(fù)雜驗證: 角色名不能重復(fù) **.
                        d. 角色名的 ajax 驗證, 角色名不能重復(fù) **.
                        e. 勾選權(quán)限時的級聯(lián)選擇. 例如: 勾選 "員工刪除" 的同時必須勾選 "員工查詢", 即不能讓用戶只有 "員工刪除" 權(quán)限, 而沒有 "員工查詢" 權(quán)限.
                        f. 使用到 Authority 的如下兩個字段: relatedAuthorites(與當(dāng)前權(quán)限關(guān)聯(lián)的權(quán)限信息, 多個權(quán)限使用 "," 分隔), parentAuthority(當(dāng)前權(quán)限的父權(quán)限)
          subAuthorities(當(dāng)前權(quán)限的子權(quán)限)            
                 若驗證都通過, 在 Action 中受理請求, 錄入角色
             
          注意:

                 不能通過以下代碼獲取 parentAuthority 為 null 的 Authority 集合
                 List list = authorityDao.findBy("parentAuthority", null);
                 System.out.println(list.size());
          而應(yīng)該使用:

                 List list = authorityDao.find("FROM Authority auth WHERE auth.parentAuthority IS null");
              為 #select 添加 change 相應(yīng)事件, 當(dāng)選取某個父權(quán)限時, 子權(quán)限顯示


          今天就此為止,明天繼續(xù)!
          posted @ 2010-03-13 23:21 d66380022| 編輯 收藏

            

          今天主要實現(xiàn)的是員工信息的修改和權(quán)限管理基礎(chǔ),修改用AJAX實現(xiàn)的,權(quán)限看了不少的源代碼,感覺蠻難的,不過今天只是初步介紹,還有時間再學(xué)習(xí)一下!

           

          1.員工信息的修改

           1.struts對表單信息的回顯

           2.對可以進(jìn)行修改的字段

          1.當(dāng)該字段值發(fā)生改變時,confirm”確定修改該信息嗎?

             點擊取消:使該字段恢復(fù)為以前的默認(rèn)值,不做改變,需要使用隱藏域

                  

           點擊“確定”:用AJAX改變字段,在配置文件中不需返回任何信息                              

             <script type=”text/javascript”>

              $(function(){

               $(“:text,select”).change(function(){

                 var flag = confirm(“確定要修改” + $(this).prev(“label”).text()+”信息嗎?”);

                  ...

          });

          }):

          </script>

          信息

          2.集成spring-security 框架

           1. Spring Security 能用 于保護(hù)各種 Java 應(yīng) 用程序(權(quán)限管理框架).

           2.spring-security入門

             需 求:1. Spring-security 應(yīng)用的根目錄下有兩個 Jsp 頁面: index.jsp admin.jsp. admin 用戶有權(quán)限訪問這兩個頁面, user 用戶只能訪問 index.jsp

          2.提供”登出”功能

             搭建環(huán)境:

                首先添加spring環(huán)境

          1.加入spring-security jar 包:

          spring-security-2.0.5"dist"spring-security-core-2.0.5.RELEASE.jar

          2.web.xml 文件中加入加入spring-security 框架的過濾器

          3.新建applicationContext-security.xml 配置文件,并且把security 作為默認(rèn)的命名

          空間, 并將其導(dǎo)入到applicationContext.xml

          applicationContext-security.xml,有幾種重要配置:

          1. 配置 spring-security http 安全屬性   

                 <http auto-config="true">

                 2. 配置需要保護(hù)那些 資源, 以及訪問這些資源 所需要的權(quán)限, 若有多個 權(quán)限使用 ',' 分隔   

                        <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN"/>

                        <intercept-url pattern="/index-1.jsp" access="ROLE_USER"/>

                 3.配置登出服務(wù)   

                        <logout logout-url="/logout"

                               logout-success-url="/loguot-success.jsp"

                               invalidate-session="false" />

                 4.配置登錄頁面,

                               default-target-url: 若直接請求登錄頁面, 那么該屬性配置登錄成功之后的相應(yīng)頁面  

                               always-use-default-target: 若請求的目標(biāo)頁面受保護(hù), spring-security 會相應(yīng) login-page 屬性對應(yīng)的頁面, 默認(rèn)情況下, 若登錄成功將相應(yīng)剛才請求的目標(biāo)頁面,

          但這相當(dāng)麻煩,每次都要配置不少信息。下面 有更好的實現(xiàn),即

          把需要攔截的url,權(quán)限,用戶信息放到放數(shù)據(jù)庫中,實現(xiàn)如下:

          1.實體類:

          Authority -- 權(quán)限

          Resource -- 資源

          Role -- 角色

          Employee -- 添加Set<Role> roleSet 屬性

          2.關(guān)系

          Resource Authority 為多對多的對應(yīng)關(guān)系

          Authority Role 為多對多的對應(yīng)關(guān)系

          Role Employee 為多對多的對應(yīng)關(guān)系

          所以還需要3 個額外的關(guān)聯(lián)表


          3.實現(xiàn)把用戶信息,權(quán)限信息存放到數(shù)據(jù)庫中

            1. 實現(xiàn)把用戶信息, 權(quán)限信息存放到數(shù)據(jù)庫中

                 1). 自定義 UserDetailsService 接口的實現(xiàn)類, 將該類配置到 Spring IOC 容器中, 并在

                     <authentication-provider user-service-ref=""> 節(jié)點的 user-service-ref 屬性中引用該 Bean.

                 2). 通過 debug 查看 UserDetailsService 接口的實現(xiàn)類返回的 UserDetails 對象     

          4. 實現(xiàn)資源信息存放到數(shù)據(jù)庫中: 訪問資源時, spring-security 能區(qū)分出訪問該資源需要哪些權(quán)限

                 1). 自定義 ObjectDefinitionSource 接口的實現(xiàn)類, 將該類的實例裝配給 FilterSecurityInterceptor objectDefinitionSource 的 屬性.即可實現(xiàn)自定義的資 源獲取.

                 2). 通過繼承 DefaultFilterInvocationDefinitionSource 類的方法定義    ObjectDefinitionSource 接口的實現(xiàn)類有困難, 因為 DefaultFilterInvocationDefinitionSource

                            中沒有無參的構(gòu) 造器, 該構(gòu)造器有兩個參 數(shù): UrlMatcher urlMatcher, LinkedHashMap requestMap.

                     urlMatcher 參數(shù)可 以通過 bean 的形式 事先配置, requestMap 參數(shù)類似于: {[/admin.jsp]=[ROLE_ADMIN], [/index.jsp]=[ROLE_USER]}, 需要訪問數(shù)據(jù)庫才能對其初始化, 但這不可能.

                 3). 通過查看 spring-security 核心 jar 包的 META-IN spring.handlers 找到 SecurityNamespaceHandler, 在該類中查看 registerBeanDefinitionParser(Elements.HTTP, new HttpSecurityBeanDefinitionParser()); 方法

                           HttpSecurityBeanDefinitionParser 類 中可以看到如何創(chuàng)建 DefaultFilterInvocationDefinitionSource 實例.

                 4). 通過 FactoryBean IOC 容器中注冊 DefaultFilterInvocationDefinitionSource 實例        

           


          posted @ 2010-03-10 01:00 d66380022| 編輯 收藏

          今天主要實現(xiàn)的是員工信息的翻頁設(shè)計,用AJAX實現(xiàn)的,接著實現(xiàn)了員工信息的刪除實現(xiàn),總結(jié) 一天的知識,感覺jQuery確實是十分有用的一門技術(shù)。

          1.帶復(fù)雜條件的分頁:(AJAX分頁)

           

          直接把deptid屬性過濾加上會導(dǎo)致出現(xiàn):org.hibernate.QueryException:

          這時因為在 Employee 實體類中根本就沒有 deptid 屬性(并非指在 Employee 類中有該屬性,而是要在映射文件中映射該屬性).

          解決方法:

          EmployeeDao 中重寫 Page<T> findPage(final Page<T> page, final List<PropertyFilter> filters) 方法, 以解決表單頁 面的 deptid實體類的

          dept屬性的對應(yīng)問題

              注 意1.增強(qiáng) for 循環(huán)時, 不能 remove 其元素

                  2.在 循環(huán)時刪除集合的元素, 會改變集合的 size 屬性

          2.AJAX分頁設(shè)計

           1.需要在EmployeeAction的對應(yīng)方法中,返回JSON數(shù)據(jù),在頁面上進(jìn)行解析即可

           2.實現(xiàn)過程:

               1.點擊上一頁連接時,需要使用AJAX分頁:因為ajax分頁時,頁面沒有刷新,

           下一頁連接添加AJAX支持

          <script type=”text/javascript”>

          $(function(){

           $(“#nextpage”).click(function(){

           Var url=”${cp}/employee-list-2.do?pageNo=” + (parseInt($(“#pageNo”).val()) + 1);

          var args = $(“:hidden:not(#pageNo)”).serialize();

          $.getJSON(url,args,function(data){

          $(“.pagebanner”).html(“”+data.totalCount+”條記錄&nbsp;”);

          $(“#pageNo”).val(data.pageNo);

          });

          return false;

          });

          });

          </script>


          服務(wù)器端實現(xiàn)(employeeList2

          1.獲取請求參數(shù)

          String pageNoStr = request.getParameter(“pageNo”);

          2.從頁面獲取PropertyFilter集合

          3.調(diào)用servicefindPage方法,得到分頁數(shù)據(jù)Page對象

          4.page對象轉(zhuǎn)化為對應(yīng)的JSON數(shù)據(jù)格式。那么需要轉(zhuǎn)化為什么樣的JSON數(shù)據(jù)

          {totalCount:,totalPages:,pageNo:,employees:[{employeid,:loginName:,gender:,...}] }

           5.返回JSON數(shù)據(jù)

          response.setContentType(“text/javascript”);

          response.getWritter().print(jsonResult);

           

          3.員工信息 刪除功能

          1.AjAX刪除功能的實現(xiàn):

           1.若當(dāng)前頁已經(jīng)是最后一頁,且當(dāng)前記錄是當(dāng)前頁的最后一條記錄,則不能再請求當(dāng)前頁的信息, totalPages不能代表服務(wù)器端的總頁數(shù)

          2.Ajax 刪除要實現(xiàn)的功能:

          1. 彈出confirm(): 確 定要刪除嗎?

          2. 若點擊"", 則文本框或下拉框的值恢復(fù)為剛才的默認(rèn) 值: 使用隱藏域.

          3. 若點擊"", 進(jìn)行ajax 刪除

          4. 若 員工信息有外鍵關(guān)聯(lián)時,注 意:通過 ajaxError 函數(shù)進(jìn)行提示彈出“不能刪除該記錄”

              關(guān)鍵代碼:

          4.查看員工的詳細(xì)信息

           這樣的功能實現(xiàn)在現(xiàn)在來說,已不難實現(xiàn),我實現(xiàn)了一下,不難!還用了下插件!顯示Employee 的頭像!

          posted @ 2010-03-07 23:03 d66380022| 編輯 收藏

           

                                         員工的錄入和查詢(帶 條件查詢)

            今天做的是員工信息錄入和服務(wù)器端的驗證,目標(biāo)是使用jQuery更熟悉,掌握分頁設(shè)計,更好理解Hibernate的一些以前未用過的類中的一些方法。

           一. 員工的錄入,并進(jìn)行驗證

          1.顯示員工的錄入頁面

          1.jQuery validator 為表單做前臺驗證

          2.對登錄名的Ajax 校驗

          3.使用jQuery blockUI 插件提示Ajax 操作

          4.錄入員工信息

          2.服務(wù)器端的簡單驗證

           1.使用strutsvalidator框架

           2.email為例,email非空,且符合email格式

          3.員工錄入服務(wù)器端的復(fù)雜驗證

           1.數(shù)據(jù)庫,EmployeeAction中,得到登錄名

           2.對登錄名的可用性進(jìn)行驗證,驗證登錄名在數(shù)據(jù)庫中是否存在

           3.這時可以采用struts的聲明式異常

          4.使用py4j 解決把漢字轉(zhuǎn)為對應(yīng)的拼音: 佟剛--> tg, 張孝祥--> zxx, 黎活明--> lhm

           二.員工的查詢

          1.顯示員工信息:AJAX分頁

          使用displaytag 分頁顯示員工信息,記 錄不超過百萬條。簡單,使用。比如OA

          1.在tomcatwebapps目錄下展示其實例。

          2. OpenSessionInView

          1使用OpenSessionInView

           Hibernate中某一個類的引用屬性(也 包括集合屬性)采取懶加載策略,則可能出現(xiàn)懶加載異常,但沒有對其懶加載屬性進(jìn)行初始化,此時關(guān)閉Session,然后再來獲取屬性,就會異常

          聲明使用spring的聲明式事務(wù):

          <aop:config>

           <aop:pointcut expression="execution(* cn.itcast.ems.service.*.*(..))" id="emsTxPointcut"/>

           <aop:advisor advice-ref="emsTxAdvice" pointcut-ref="emsTxPointcut"/>

          </aop:config>

          OpenSessionInView可以解決這個問題,因為OpenSessionInView的使用流程是:

           request à open session 并開始transaction –>controller à view(jsp)à

          2.如何使用:

          web.xml配置:

          3.缺點:

          如果流程中的某一步被阻塞, 而這期間的 connection 卻一直被占用不被釋放. 例如輸出頁面時, 一方面可能是頁面內(nèi)容大, response.write的時間長; 另一方面可能是網(wǎng)速慢, 服務(wù)器與用戶間傳輸時間久. 當(dāng)大量這樣的情況出現(xiàn)時,就有連接池連接不足, 造成頁面假死現(xiàn) 象. 所以在內(nèi)容多流量大的網(wǎng)站需慎用.

          3.翻頁相關(guān)的類:

          1.Page: 與具體 ORM 實現(xiàn)無關(guān)的分頁參數(shù)及查詢結(jié)果封裝

                 2. PropertyFilter: 與具體 ORM 實現(xiàn)無關(guān)的屬性過濾條件封裝類, 主要記錄頁面中簡單的搜索過濾條件

                 3. HibernateDao: 擴(kuò)展 SimpleHibernateDao, 功能包括分頁查詢, 按屬性過濾條件列表:

                        1.不帶任何查詢條件時, 需要使用的方法:

                               --countCriteriaResult

                               --setPageParameter

                               --findPage(Page<T> page, Criterion...criterions)

          HibernateWebUtils

          分頁:

          不帶查詢的分頁

          employee-list-1.do --> Action --> Service --> DAO   

          2.查詢條件的翻頁:使用jQuery 的一個thickbox 插件完成查詢頁面的彈出

           1.jQuery的分頁插件

           2.在獲取第一頁的內(nèi)容以后,如何 把查詢條件帶到第二頁

               --把封裝了查詢條件的List放到session域中,下一次從session中取。

                 --把查詢條件放在隱藏域中

          3.攜帶查詢條件

           使用jQuery提供的serialize()方法攜帶查詢條件(行不通)

             var url = this.href + “&” + $(“:hidden”).serialize();

              window.location.href=url;

           注意:上述方法在第一次不能起作用: 即不能再第一次把隱藏域中的參數(shù)帶過去, 因為在第一次點擊該鏈接時, href 的屬性值已經(jīng)固定了, 不能再發(fā)生變化,

          而第二次點擊時, 因為第一次已經(jīng)改變了該屬性的值, 所以好用

          所以必須在第一次點擊該鏈接之前讓 this.href = this.href + "&" + $(":hidden").serialize(); 起作用

          解決方案:

          $("#criteria").attr("href", $("#criteria").attr("href") + "&" + $(":hidden").serialize());

          今天就到這兒,明天continue!

          posted @ 2010-03-06 23:50 d66380022| 編輯 收藏



              今天接著昨天的整合,由佟老師總指揮,基于xml配置的Action,這涉及struts整合.今天先把登陸實現(xiàn)了,最后使用兩個插件把員工信息錄入功能 實現(xiàn),頁面效果在當(dāng)今還是主流的。

          2.服務(wù)器端驗證
            1.查詢數(shù)據(jù)庫,得到信息
            2.若用戶名不存在,則提示用戶名不存在
                     errors.add("",new ActionMessage(" "));
               若用戶名和密碼不匹配,則提示用戶名和密碼不匹配
               若errors.isEmpty()為true,則登陸,并將其保存在session中,
                   
               方法:
                  使用 struts 的聲明式異常來轉(zhuǎn)發(fā)頁面和顯示提示信息.
                  
                  詳細(xì)解決:
                  由 EmployeeService 的方法拋出異常, Action 不進(jìn)行處理, 而由 struts 框架根據(jù)當(dāng)前的 action 節(jié)點配置來進(jìn)行相應(yīng)的處理:
                         如果出現(xiàn)對應(yīng)的異常, 會利用當(dāng)前 excpeption 配置節(jié)點的 key 生成對應(yīng)的 ActionMessage 對象, 再放入 ActionMessages 中,
                        把頁面派發(fā)到 input 對應(yīng)的頁面中,  在前臺頁面利用 <html:errors property="key"> 進(jìn)行顯示      
                  

          4.ReflectUtils類的作用:
            1.convertValue:beanUtils1.8提供了DateConverter
            2. PropertyUtils: 提供了讀寫 Bean 的屬性的方法
            3. fetchElementPropertyToString: StringUtils.join 方法可以把指定集合的元素用分隔符鏈接起來
            4. getSuperClassGenricType: ParameterizedType


          5.SimpleHibernateDao 類介紹:SimpleHibernateDao<T,PK extends Serializable> 說明:該類在service層中使用,
               T:Dao操作的對象類型
               PK:主鍵類型
            1.getIdName():
            2.distinct(List list):通過 Set 將不唯一的對象列表唯一化,主      要用于 HQL/Criteria 預(yù)加載關(guān)聯(lián)集合形成重復(fù)記    錄, 又不方便使用 distinct 查詢語句時
               
          6.CreateCriteria:
               createQuery(String queryString, Object... values)
          7. ReflectionUtils
              1 convertValue: beanUtils 1.8 提供了 DateConverter
              2. PropertyUtils: 提供了讀寫 Bean 的屬性的方法
              3. fetchElementPropertyToString: StringUtils.join 方法可以把指定集合的元素用分隔符鏈接起來
              4. getSuperClassGenricType: ParameterizedType

          8. SimpleHibernateDao:
              1. getIdName: ClassMetadata 該類可以獲取到對應(yīng)的 class 的 hbm 配置文件的幾乎所有信息
              2. 標(biāo)準(zhǔn)查詢:
                  -->創(chuàng)建 Criteria 對象: session.createCriteria(clazz);
                  -->為 Criteria 對象添加查詢條件: criteria.add(criterion);
                  -->獲取 Criterion 對象: 通過 Restrictions 來獲取

          9.struts的導(dǎo)航組件:struts-menu的使用方法:
               1. 把 struts-menu.war 文件復(fù)制到服務(wù)器下, 運行
              2. 在 struts-config.xml 文件中加入 struts-menu 插件
              3. 復(fù)制 struts-menu\WEB-INF\menu-config.xml 到 conf 目錄下.
              4. 復(fù)制 struts-menu-2.4.3\struts-menu-2.4.3.jar 到 classpath 下
              5. struts-menu 的去除默認(rèn)背景色問題:
                  ①. 通過 jQuery: 把 left.jsp 頁面的第三個 table 的 style="background-color:lightgrey" 屬性清除
                  ②. 通過修改默認(rèn)的配置文件: 修改 struts-menu=2.4.3.jar net.sf.navigator.displayer 包的的 DisplayerStrings.properties 文件,
                            把  dd.menu.top=<table width\="150" style\="background-color\:lightgrey" cellpadding\=1 cellspacing\=1><tr align\=left><td nowrap class\=normal><b>
                      的 style\="background-color\:lightgrey" 去除


          10.員工錄入前臺驗證,用的是jQuery的插件jquery-validate

          5.對輸入的登陸名進(jìn)行ajax驗證:驗證該登錄名在數(shù)據(jù)庫中是否存在。

          11.在loginname字段已經(jīng)給出對應(yīng)的“該登錄名已經(jīng)被占用”的基礎(chǔ)上,再一次點擊“提交”按鈕,則需要進(jìn)行服務(wù)器端驗證,再返回錄入頁面

          12.若驗證都通過,則需要進(jìn)行服務(wù)器端的驗證。

          13.員工的錄入操作:
              1). 顯示員工的錄入頁面
                  ①. 查詢數(shù)據(jù)庫, 獲取所有的部門信息和職位信息, 并在頁面上加以顯示
                  ②. 頁面使用 jQuery 的 validator 插件作為表單的前臺驗證
                      1. 在當(dāng)前 jsp 頁面中導(dǎo)入 jquery.validate.js
                      2. 為需要驗證的字段添加 class 屬性, 在其中指定驗證規(guī)則, 獲取添加 minlength 等屬性

            今天就到此了!   

          posted @ 2010-03-05 23:16 d66380022| 編輯 收藏

              

                                       SVN版本控制

          今天有毛偉老 師講版本控制,版本控制(Revision control)是維護(hù)工程藍(lán)圖的標(biāo)準(zhǔn)做法,能追蹤工程藍(lán)圖從誕生一直到定案的過程,確保由不同人員所編輯的同一文 件檔案都能得以同步。最新的Spring3.0已經(jīng)提供了更高級的版本控制,但是國內(nèi)沒幾個用,先掌握SVN,以后有機(jī)會再用高級的。下面詳細(xì)總結(jié) 一下:

          1.Subversion介紹:是一種開放源碼的全新版本控制系統(tǒng)是新一代的版本控 制工具,他不但提供了常見的比較、修補(bǔ)、標(biāo)記、提交、回復(fù)和分支功能,適于 Web 開發(fā)和其他 在傳統(tǒng)方式下未采納版本控制功能的領(lǐng)域

          2.svn安裝

           1.運行svnserver端,運行setup.exe,OK

           檢驗安裝好了:

           運行dos窗口 ,輸入svn ,回車,出現(xiàn)svn help 提示,安裝成功

           2.svn服務(wù)器啟動(我安裝目錄:D:"Program Files"Subversion"bin

           cmd

           svn根目錄 svnserve -d D:"Program Files"Subversion"bin>svnserve –d

          是否啟動成功

          .當(dāng)前是否啟動3690端口號

          3.版本庫目錄介紹:

            dav目錄:是提供給Apachemod_dav_svn使用的目錄,讓它們存儲內(nèi)部數(shù)據(jù),當(dāng)前我們使用的版本沒有這個目錄(與你下載的Subversion版 本有關(guān)系)。

              db目錄:就是所有版本控制的數(shù)據(jù)存放文件。

              hooks目錄:放置hook腳本文件的目錄。

              locks目錄:用來放置Subversion文件庫鎖定數(shù)據(jù)的目錄,用來追蹤存取文件庫的客戶端。

              format文件是一個文本文 件,里面只放了一個整數(shù),表示當(dāng)前文件庫配置的版本號。

              conf目錄:是這個倉庫的配置文件(倉庫的用戶訪問帳號、權(quán)限等)。

          4.創(chuàng)建版本庫、導(dǎo)入、檢出

          1、創(chuàng)建版本庫

                 右鍵--->TortoiseSVN--->Create repository here

          2.導(dǎo)

                 右鍵--->TortoiseSVN--->導(dǎo)入(一般在項目創(chuàng)建初始化數(shù)據(jù)時使用,當(dāng)然也可用于把任意文件或目錄從外部導(dǎo)入到指定倉庫中)

          3.檢出(提醒:檢出項目后客戶端文件夾 的變化.svn

                右鍵--->SVN Checkout...

          5.SVN基本功能:

          清理、更新到指定版本

          日志記錄、提交日志限定必填。

          鎖定、解鎖:基本權(quán)限控制(可以限制被鎖定的文件只能由被鎖定用戶修改提交)

          誤刪除恢復(fù)操作:直接重更新或通過日志列表

          單個文件過濾:選中文件-->TortoiseSVN---->增加到忽略列表

          導(dǎo)出:使項目脫離版本控制。

          6.總結(jié)SVN的使用:

          在其文件夾上右鍵 "SVN Checkout..."寫上對應(yīng)SVN地址

           在其文件夾上右鍵 "SVN Update" 來更新我們的本地版本

          在其文件夾上右鍵 "SVN Commit" 提交我們的本地版本

           在其文件夾上右鍵 "TortoiseSVN" --> "Export..." 來 發(fā)布、導(dǎo)出

          在其文件上右鍵 "TortoiseSVN" --> 增加(A)" 向版本庫中增加一 個受版本控制的文件

          7.關(guān)于SVN的各種顏色提示說明:



          CVS客戶端的使用基本上同SVN客戶端一樣,更簡單些,就不多說了



          posted @ 2010-03-03 00:02 d66380022| 編輯 收藏
          主站蜘蛛池模板: 银川市| 阜阳市| 临猗县| 屏东县| 商丘市| 宜川县| 江陵县| 子洲县| 全南县| 大荔县| 扶余县| 青河县| 淮南市| 郑州市| 景东| 罗山县| 墨脱县| 东至县| 武定县| 容城县| 康平县| 沅江市| 桑植县| 淮滨县| 安阳市| 会理县| 平乐县| 肥城市| 福海县| 伊宁县| 大名县| 裕民县| 博爱县| 长治县| 武邑县| 万宁市| 甘南县| 恩平市| 河曲县| 繁昌县| 宁津县|