<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    置頂隨筆

    [置頂]通過(guò)一個(gè)簡(jiǎn)單的登錄過(guò)程了解Struts的業(yè)務(wù)流程(Struts初學(xué)的請(qǐng)進(jìn))

    一個(gè)簡(jiǎn)單的登錄過(guò)程描述了一下Struts的業(yè)務(wù)流程,感覺(jué)挺容易懂的,摘出來(lái)大家分享:(1)用戶的請(qǐng)求以HTTP方式傳輸?shù)椒?wù)器上,接收請(qǐng)求的是ActionServlet。
    (2)ActionServlet接收到請(qǐng)求后,會(huì)查找struts-config.xml文件來(lái)確定服務(wù)器上是否有用戶請(qǐng)求的操作,此處用戶請(qǐng)求的操作應(yīng)為登錄操作。如果沒(méi)有,則返回一個(gè)用戶請(qǐng)求無(wú)效的出錯(cuò)信息。
    (3)當(dāng)ActionServlet找到用戶請(qǐng)求的Action后,首先將用戶輸入的表單參數(shù)打包成一個(gè)ActionForm對(duì)象,這個(gè)ActionForm對(duì)象其實(shí)也就是一個(gè)JavaBean,里面包含兩個(gè)字段,分別是用戶名和密碼。接著ActionServlet再根據(jù)struts-config.xml中的配置信息決定是否要執(zhí)行ActionForm對(duì)象中的Validate方法。若Validate方法執(zhí)行有錯(cuò),則返回;否則,繼續(xù)下一步。
    (4)系統(tǒng)生成一個(gè)用戶所請(qǐng)求的Action的實(shí)例對(duì)象,將前面的ActionForm對(duì)象傳遞給它,運(yùn)行它的execute()方法。這一步其實(shí)就是用戶登錄的控制器,在執(zhí)行execute()方法時(shí),可以調(diào)用后臺(tái)模型驗(yàn)證登錄名和密碼是否正確等信息。
    (5)execute()執(zhí)行結(jié)束前會(huì)生成一個(gè)ActionForward類型的對(duì)象并將之返回給ActionServlet,該對(duì)象的作用是告訴ActionServlet下一步應(yīng)該跳轉(zhuǎn)到哪里,假如后臺(tái)模型檢驗(yàn)用戶名和密碼正確,則ActionForward就代表跳轉(zhuǎn)到一個(gè)登錄成功的界面。ActionServlet將對(duì)之進(jìn)行分析,其實(shí)就相當(dāng)于接收到一個(gè)新的請(qǐng)求,重復(fù)(2)~(5)的過(guò)程,直到將某個(gè)界面返回用戶為止。
    以上就是Struts的基本工作流程,可以看出struts-config.xml在整個(gè)流程中起到了一個(gè)類似站點(diǎn)地圖的作用,它記錄了所有可能的請(qǐng)求跳轉(zhuǎn)。其實(shí),在Web容器加載Struts應(yīng)用程序后,struts-config.xml就被首先讀入內(nèi)存成為一個(gè)ActionMapping對(duì)象,前面所說(shuō)的查找struts-config.xml文件,實(shí)際上是查找ActionMapping對(duì)象。對(duì)于初學(xué)者來(lái)說(shuō)可以不必深究其中的細(xì)節(jié)……
    摘自清華大學(xué)出版社出版的《Struts-Web設(shè)計(jì)與開(kāi)發(fā)大全》

    posted @ 2008-04-04 23:27 伍興佳 閱讀(449) | 評(píng)論 (1)編輯 收藏

    2008年5月16日

    J2EE程序員之路之武功修為片

                                                             作者:EasyJF開(kāi)源團(tuán)隊(duì)(www.easyjf.com) 大峽

      經(jīng)常會(huì)跟一些朋友討論怎么樣才能學(xué)好Java,學(xué)到什么程度才算撐握了Java的問(wèn)題。其中有一個(gè)J2EE程序員層次及武功修為的問(wèn)題,有點(diǎn)意思。這里就把討論的內(nèi)容大致整理一下發(fā)出來(lái),大家繼續(xù)討論。  縱觀國(guó)內(nèi)的軟件行業(yè),靠Java吃飯的程序員還真不是少,而且Java程序員是有很大優(yōu)越感的,畢竟對(duì)于很多用b/s搞開(kāi)發(fā)的業(yè)內(nèi)朋友來(lái)說(shuō),Java技術(shù)意味著難度大、門(mén)檻高,因此相對(duì)來(lái)說(shuō)Java程序員比其它的程序員(如php、.net)收入高就理所當(dāng)然。然而J2EE所涉及到的范疇是很廣的,不能一個(gè)Java程序員就概括了事,而應(yīng)該具有層次及水平之分,很多時(shí)候經(jīng)常需要進(jìn)行分類或評(píng)級(jí),有時(shí)他評(píng)、有時(shí)自評(píng)。  談到國(guó)內(nèi)J2EE領(lǐng)域的程序員層次水平,當(dāng)前流行的稱謂及評(píng)級(jí)不外乎就下面幾種:  第一種是精通掌握記事本、Dreamweaver等工具來(lái)寫(xiě)JSP+JavaBean數(shù)據(jù)庫(kù)應(yīng)用的是J2EE程序員;
      第二種是用JBuilder、Eclipse等專用Java開(kāi)發(fā)工具寫(xiě)著一堆一堆過(guò)程式Java Bean,而且還能精通Struts+Spring+Hibernate等應(yīng)用框架的高級(jí)J2EE程序員;
      第三種是用Together建模,然后生成一堆Java接口或代碼,開(kāi)口閉口都是設(shè)計(jì)模式的資深Java程序同及高級(jí)系統(tǒng)分析、構(gòu)架師;
      最后還有一種是整天在BlogJava或JavaEye上談經(jīng)論道的大師們,這些大師技術(shù)水平難以觸摸,武功門(mén)派也各具特色,不好歸類,有時(shí)不好稱為程序員(因?yàn)橛械臅r(shí)候他們甚至不寫(xiě)或者寫(xiě)不出程序),但又做著與J2EE程序員密切相關(guān)的事情,我們暫且就歸為“牛牛”或“大師”。  稱謂畢竟只是稱謂,帶有點(diǎn)主觀或者功利色彩,有時(shí)很難鑒定一個(gè)人應(yīng)該屬于什么,因此,我們?cè)購(gòu)募兗夹g(shù)的角度,也即武功修為的角度,作了一個(gè)簡(jiǎn)單的分析及歸類,把2EE領(lǐng)域程序員大致分成以下幾個(gè)層次,可以作為大家自評(píng)的一個(gè)參考標(biāo)準(zhǔn):  第一個(gè)層次:精通掌握J(rèn)ava語(yǔ)法、能調(diào)試基本的程序錯(cuò)誤,精通掌握J(rèn)SP+Java Bean寫(xiě)一些N年前ASP、PHP翻版的Java Web應(yīng)用程序(如論壇、網(wǎng)站新聞發(fā)布系統(tǒng)、OA、網(wǎng)上商城等),精通JDBC使用、精通SQL語(yǔ)句、精通XML等。  第二個(gè)層次:掌握設(shè)計(jì)模式原理及應(yīng)用,掌握基于OO的分析及設(shè)計(jì)方法,并能精通熟練使用幾種Java專業(yè)設(shè)計(jì)及開(kāi)發(fā)工具,精通掌握流行的J2EE框架如Hibernate、EJB、Webwork、Spring的原理及應(yīng)用,精通J2EE中一兩個(gè)組成部分(如Servlet、EJB等)的工作原理及細(xì)節(jié)。  第三個(gè)層次:少林的高僧有兩種,禪僧及武僧。J2EE程序員的第三個(gè)層次也同樣有禪、武兩個(gè)分支,這里我們重點(diǎn)分析一下:  第一個(gè)分支屬于走的禪僧線路。在練完第二個(gè)層次中的各種武功基礎(chǔ)上,結(jié)合實(shí)際項(xiàng)目中的千奇百怪的用戶需求,游刃有余的選擇適合的技術(shù)方案為客戶解決問(wèn)題,并形成自己的一套解決方案。達(dá)到這一個(gè)層次的J2EE程序員已經(jīng)不在乎使用任何工具、任何框架了,而是根據(jù)不同的對(duì)手,使用不同的武器或招式來(lái)應(yīng)對(duì)。好比 小李飛刀一樣,只有達(dá)到了“手中無(wú)刀、心中有刀”的境界,才能達(dá)到“出手一刀,例不虛發(fā)”的效果。這一層次的武功屬于一個(gè)熟練度問(wèn)題,刀練得多了、遇到的對(duì)手多了,再加上前面的武功修為,就算做不到例不虛發(fā),也可達(dá)到十發(fā)九中。  第二個(gè)分支屬于走的武僧線路,在撐握熟悉第一二個(gè)層次中涉及到的內(nèi)容后,進(jìn)一步專研并撐握J(rèn)2EE底層開(kāi)發(fā),J2EE規(guī)范制訂、規(guī)范實(shí)現(xiàn)、Java虛擬機(jī)的工作原理、各種常見(jiàn)的J2EE服務(wù)器內(nèi)核工作機(jī)制、內(nèi)存管理、進(jìn)程機(jī)制、源代碼等。因?yàn)樯婕暗暮芏鄸|西都比較抽象,代碼也很多,練這一層的武功需要有很好的資質(zhì)及耐性、并具還得有一定的環(huán)境及條件。好比神雕大俠楊過(guò)拿起“玄鐵劍”,并練成“暗然銷魂掌”的成長(zhǎng)過(guò)程,需要前面的武功修為作基礎(chǔ),更需那只威力神武神雕的幫助指點(diǎn)及他處處為民、懲奸除惡的俠之心態(tài)。
      
      胡侃了這么多,現(xiàn)在來(lái)根據(jù)自己情況測(cè)算一下自己的份量,結(jié)果如下:  第一層 練到8成;
      第二層 練到5成;
      第三層 準(zhǔn)備走禪僧線路,當(dāng)前算是練到1成;
      
      唉,后面的武功提升越來(lái)越難,真不知道要到何年何月才能達(dá)到10成啊。你的武功練到哪一個(gè)層次了,不防亮出來(lái)大家切磋切磋。嘿嘿,要是有一天,咱們中國(guó)的Java程序員人手一把“玄鐵劍”、人人會(huì)使“暗然銷魂掌”,那還了得!汗...,寫(xiě)著寫(xiě)著居然做起白日夢(mèng)了,不好意思,就此打住。
      
      手中雞蛋先別扔,還要打個(gè)廣告:本人剛開(kāi)始涉足Java開(kāi)源,目前在EasyJF開(kāi)源團(tuán)隊(duì)中負(fù)責(zé)EasyJWeb(官網(wǎng)www.easyjf.com)項(xiàng)目,歡迎大家前來(lái)指導(dǎo)。
           很牛的一個(gè)人物啊!

    posted @ 2008-05-16 00:47 伍興佳 閱讀(227) | 評(píng)論 (0)編輯 收藏

    2008年4月5日

    純JAVA技術(shù)驗(yàn)證碼生成器(服務(wù)器端servlet實(shí)現(xiàn))(不是javascript哦~)

    java驗(yàn)證碼生成器,自認(rèn)為還算經(jīng)典import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    /**
    * @(#)VerifyCodeServlet.java Dec 9, 2007 8:14:14 PM
    *
    * @author Yuan
    * 驗(yàn)證碼生成器,使用此類需要將表單里的驗(yàn)證碼輸入框的name屬性設(shè)為"verifycode"
    */
    public class VerifyCodeGenerator {
        
        private static final VerifyCodeGenerator generator = new VerifyCodeGenerator();
        
        private final String ATTRIBUTE_NAME = "verifycode";
        //圖片的寬度
        private final int WIDTH = 15;
        //圖片的高度
        private final int HEIGHT = 22;
        //字符串長(zhǎng)度
        private final int CODE_LENGTH = 4;
        //隨機(jī)字符串范圍
        private final String RAND_RANGE = "abcdefghijklmnopqrstuvwxyz"
            + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            + "1234567890"
            + "@#quot;;
        
        private final char[] CHARS = RAND_RANGE.toCharArray();
        
        private Random random = new Random();
        
        private VerifyCodeGenerator(){
            //
        }
        
        public static VerifyCodeGenerator getInstance(){
            return generator;
        } 
         

        /**
         * 生成隨機(jī)字符串
         * @return 隨機(jī)字符串
         */
        private String getRandString(){
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < CODE_LENGTH; i++)
                sb.append(CHARS[random.nextInt(CHARS.length)]);
            return sb.toString();
        }
        
        /**
         * 生成隨機(jī)顏色
         * @param ll 產(chǎn)生顏色值下限(lower limit)
         * @param ul 產(chǎn)生顏色值上限(upper limit)
         * @return 生成的隨機(jī)顏色對(duì)象
         */
        private Color getRandColor(int ll, int ul){
            if (ll > 255) ll = 255;
            if (ll < 1) ll = 1;
            if (ul > 255) ul = 255;
            if (ul < 1) ul = 1;
            if (ul == ll) ul = ll + 1;
            int r = random.nextInt(ul - ll) + ll;
            int g = random.nextInt(ul - ll) + ll;
            int b = random.nextInt(ul - ll) + ll;
            Color color = new Color(r,g,b);
            return color;
        }
        
        /**
         * 生成指定字符串的圖像數(shù)據(jù)
         * @param verifyCode 即將被打印的隨機(jī)字符串
         * @return 生成的圖像數(shù)據(jù)
         * */
        private BufferedImage getImage(String verifyCode){
            
            BufferedImage image = new BufferedImage(WIDTH * CODE_LENGTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
            
            //獲取圖形上下文
            Graphics graphics = image.getGraphics();
            
            //設(shè)置背景色
            graphics.setColor(getRandColor(1,50));
            //填充背景色
            graphics.fillRect(0, 0, WIDTH * 4, HEIGHT);
            
            //設(shè)置邊框顏色
            graphics.setColor(new Color(0,255,0));
            //畫(huà)邊框
            for (int i=0; i<2; i++)
                graphics.drawRect(i, i, WIDTH * CODE_LENGTH - i * 2 - 1, HEIGHT - i * 2 - 1);
            
            //設(shè)置隨機(jī)干擾線條顏色
            graphics.setColor(getRandColor(50,100));
            //產(chǎn)生50條干擾線條
            for (int i=0; i<50; i++){
                int x1 = random.nextInt(WIDTH * CODE_LENGTH - 4) + 2;
                int y1 = random.nextInt(HEIGHT - 4) + 2;
                int x2 = random.nextInt(WIDTH * CODE_LENGTH - 2 - x1) + x1;
                int y2 = y1;
                graphics.drawLine(x1, y1, x2, y2);
            }
            
            //設(shè)置字體
            graphics.setFont(new Font("Times New Roman", Font.PLAIN, 18));
            //畫(huà)字符串
            for (int i=0; i<this.CODE_LENGTH; i++){
                String temp = verifyCode.substring(i, i+1);
                graphics.setColor(getRandColor(100,255));
                graphics.drawString(temp, 13 * i + 6, 16);
            } 
             
            //圖像生效
            graphics.dispose();
            
            return image;
        }
        
        /**
         * 將驗(yàn)證碼的圖像輸出
         * @param request 用戶的請(qǐng)求對(duì)象
         * @param response 用戶的響應(yīng)對(duì)象
         * */
        public void printImage(HttpServletRequest request,
                HttpServletResponse response){
            //將ContentType設(shè)為"image/jpeg",讓瀏覽器識(shí)別圖像格式。
            response.setContentType("image/jpeg");
            //設(shè)置頁(yè)面不緩存
            response.setHeader("Pragma", "No-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 2000);
            
            //獲得隨機(jī)驗(yàn)證碼
            String verifyCode = this.getRandString();
            String str = "ssss";
            for(int i=0; i<10; i++)
                str = str + str;
            //獲得驗(yàn)證碼的圖像數(shù)據(jù)
            BufferedImage bi = this.getImage(verifyCode);
            //把驗(yàn)證碼存入session
            request.getSession().setAttribute(ATTRIBUTE_NAME, verifyCode);
            try{
                //獲得Servlet輸出流
                ServletOutputStream outStream = response.getOutputStream();
                //創(chuàng)建可用來(lái)將圖像數(shù)據(jù)編碼為JPEG數(shù)據(jù)流的編碼器
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream);
                //將圖像數(shù)據(jù)進(jìn)行編碼
                encoder.encode(bi);
                //強(qiáng)行將緩沖區(qū)的內(nèi)容輸入到頁(yè)面
                outStream.flush();
                //關(guān)閉輸出流
                outStream.close();
            }catch(IOException ex){
                ex.printStackTrace();
            }
        }
        
        /**
         * 檢查輸入的驗(yàn)證碼是否正確,若用戶輸入的驗(yàn)證碼與生成的驗(yàn)證碼相符則返回true,否則返回false。
         * @param request 用戶的請(qǐng)求對(duì)象
         * @return 驗(yàn)證結(jié)果
         * */
        public boolean check(HttpServletRequest request){
            if (((String)request.getParameter(ATTRIBUTE_NAME))
                    .equalsIgnoreCase((String)request.getSession().getAttribute(ATTRIBUTE_NAME))){
                request.getSession().removeAttribute(ATTRIBUTE_NAME);
                return true;
            }
            return false;
        }
    }
    /**此代碼為我們?nèi)豪洗笊钋镄∮?br /> 所編寫(xiě),真的比較實(shí)用,來(lái)自qq群J道
    **/

    posted @ 2008-04-05 12:40 伍興佳 閱讀(5458) | 評(píng)論 (10)編輯 收藏

    一個(gè)小腳本測(cè)試

    為什么我寫(xiě)的一個(gè)顯示系統(tǒng)時(shí)間的小腳本不能在這里顯示出來(lái)?
    還有就是如何使用DOM的getelementbyid方法顯示系統(tǒng)時(shí)間?
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var timerID = null
    var timerRunning = false
    function showtime(){
      var today,hour,second,minute,year,month,date;
    var strDate ;
    today=new Date();
    var n_day = today.getDay();
    switch (n_day)
     {
    case 0:{
    strDate = "星期日"
           }break;
    case 1:{
    strDate = "星期一"
           }break;
    case 2:{
    strDate ="星期二"
           }break;
    case 3:{
    strDate = "星期三"
           }break;
    case 4:{
    strDate = "星期四"
           }break;
    case 5:{
    strDate = "星期五"
           }break;
    case 6:{
    strDate = "星期六"
           }break;
    case 7:{
    strDate = "星期日"
           }break;
    }
    year = today.getYear();
    month = today.getMonth()+1;
    date = today.getDate();
    hour = today.getHours();
    minute =today.getMinutes();
    second = today.getSeconds();
    if(month<10) month="0"+month;
    if(date<10) date="0"+date;
    if(hour<10) hour="0"+hour;
    if(minute<10) minute="0"+minute;
    if(second<10) second="0"+second;
     timeValue =year + " 年 " + month + " 月 " + date + " 日 " + strDate +" " + hour + ":" + minute + ":" + second
       document.GG.MM.value = timeValue
       wuxingjia= setTimeout("showtime()",1000)
     
    }

    //-->
    </SCRIPT>
    </HEAD> <BODY onLoad="showtime()">
    <FORM NAME="GG" onSubmit="0">
       <INPUT TYPE="text" NAME="MM" SIZE=40 >
    </FORM>

    posted @ 2008-04-05 01:18 伍興佳 閱讀(855) | 評(píng)論 (3)編輯 收藏

    sqlserver中,sql編程的幾個(gè)小常識(shí) 呵呵,容易出錯(cuò)的~

    sqlserver中,sql編程的幾個(gè)小常識(shí)

    1、取出剛剛插入(刪除)的數(shù)據(jù)SELECT 字段名 FROM INSERTED(DELETED)
    2、對(duì)于UPDATE實(shí)際上是先DELETE然后再I(mǎi)NSERT所以如果想得到UPDATE前后的數(shù)據(jù)值,應(yīng)該先從DELETED取出,然后從INSERTED取出;
    3、IF UPDATE(列名)可以判斷更新或插入哪一個(gè)字段的值;
    4、@@ROWCOUNT可以判斷上一行查詢操作得到的列數(shù);
    5、給變量賦值用SET @ZQB = 13;
    6、察看是否有符合條件的記錄IF EXISTS (SELECT name FROM sysobjects WHERE name = 'reminder' AND type = 'TR');
    7、定義游標(biāo),如下:
    DECLARE c1 CURSOR FOR
    SELECT emp_mgr.emp
    FROM emp_mgr, inserted
    WHERE emp_mgr.emp = inserted.mgr

    OPEN c1
    FETCH NEXT FROM c1 INTO @e--從游標(biāo)中取出數(shù)據(jù)
    WHILE @@fetch_status = 0--判斷是否到最后
    BEGIN
    UPDATE emp_mgr
    SET emp_mgr.NoOfReports = emp_mgr.NoOfReports + 1 -- Add 1 for newly
    WHERE emp_mgr.emp = @e -- added employee.

    FETCH NEXT FROM c1 INTO @e
    END
    CLOSE c1
    DEALLOCATE c1--刪除游標(biāo)引用

    posted @ 2008-04-05 00:38 伍興佳 閱讀(1002) | 評(píng)論 (2)編輯 收藏

    關(guān)于隱式挖掘網(wǎng)站用戶行為的分析

    關(guān)于隱式挖掘網(wǎng)站用戶行為的分析如何了解用戶和需求

      如何了解用戶需求?根據(jù)用戶是否主動(dòng)參與分為顯式與隱式兩種挖掘模式,因?yàn)轱@式的動(dòng)靜比較大,有很大局限性,所以為了保證結(jié)果準(zhǔn)確性以及提高用戶接受度,一般都采用隱式。

      用戶的日常交互行為會(huì)產(chǎn)生四類關(guān)鍵數(shù)據(jù):鼠標(biāo)移動(dòng)軌跡、鏈接點(diǎn)擊分布、頁(yè)面瀏覽流、頁(yè)面停留時(shí)間。通過(guò)用戶的行為能反映用戶的觀點(diǎn),同時(shí)利用訪問(wèn)的網(wǎng)頁(yè)次序可以找出網(wǎng)頁(yè)之間的隱性關(guān)系。

      收集數(shù)據(jù)

      Web服務(wù)器的日志(用戶會(huì)話記錄)

      Web trends或類似的第三方共享軟件(客戶端分析,流量分析,可用性分析)

      自己開(kāi)發(fā)的第三方軟件/插件(需求自定義)


      大型網(wǎng)站通常會(huì)把以上三種方法組合應(yīng)用,大致原理就是給進(jìn)入網(wǎng)站的用戶賦予身份識(shí)別,每次產(chǎn)生交互動(dòng)作就向服務(wù)器發(fā)回請(qǐng)求,通過(guò)時(shí)間和頁(yè)面判斷連接各個(gè)請(qǐng)求點(diǎn)并且記錄下來(lái)。(算法不討論)

      過(guò)濾數(shù)據(jù)

      明確目標(biāo),定義核心數(shù)據(jù)。

      界定用戶行為,利用多數(shù)人的行為來(lái)消除個(gè)人行為的主觀性。

      對(duì)用戶進(jìn)行歸類,確定數(shù)據(jù)類別。

      大型網(wǎng)站每天所產(chǎn)生的數(shù)據(jù)量是驚人的,所以常規(guī)需求一般都是定時(shí)或定量的分析。另外,額外的數(shù)據(jù)處理會(huì)減慢網(wǎng)站的速度,搜集的數(shù)據(jù)越多,潛在的負(fù)面影響越大。

      習(xí)慣分析

      對(duì)用戶瀏覽過(guò)的頁(yè)面進(jìn)行內(nèi)容分析,根據(jù)信息主題對(duì)頁(yè)面進(jìn)行聚類。

      聚類過(guò)程中除了考慮頁(yè)面內(nèi)容相近程度,還應(yīng)該考慮頁(yè)面路徑。

      把用戶瀏覽行為對(duì)其興趣的作用列入聚類結(jié)果,得到綜合評(píng)估模型。

      用戶興趣分偶然和穩(wěn)定兩種情況,其中偶然可以認(rèn)為是隨機(jī)變化的,穩(wěn)定的挖掘又有基于內(nèi)容和行為兩種方式,在內(nèi)容上表現(xiàn)有重復(fù)度、相似度等,在行為上表現(xiàn)有停留時(shí)長(zhǎng)、點(diǎn)此次數(shù)、拉動(dòng)滾動(dòng)條次數(shù)等。

      實(shí)際案例

      類似系統(tǒng)、瀏覽器、分辨率的客戶端分析,常見(jiàn)而且簡(jiǎn)單,略過(guò)。

      關(guān)于鼠標(biāo)軌跡、點(diǎn)擊分布的可用性例子:

      跟蹤用戶在進(jìn)行檢索時(shí)的鼠標(biāo)移動(dòng)軌跡,可以獲取用戶操作的先后順序、熱點(diǎn)功能、動(dòng)作曲線等一手?jǐn)?shù)據(jù),這些都是改善或簡(jiǎn)化表單的重要參考。
    在重要的頁(yè)面進(jìn)行詳細(xì)的點(diǎn)擊分布監(jiān)控統(tǒng)計(jì),主要檢查信息呈現(xiàn)的易用性,看看有沒(méi)有偏離設(shè)計(jì)初衷,經(jīng)常更新,找到規(guī)律。

      處理特定用戶行為、用戶群、用戶來(lái)路的任務(wù)流例子:

      監(jiān)控分布式注冊(cè)流程,能夠看到有多少用戶填了表單、填完了表單,或者在某個(gè)步驟有異常流失。


      監(jiān)控不同模塊入口過(guò)來(lái)的注冊(cè)用戶,能夠統(tǒng)計(jì)出各模塊導(dǎo)入的有效注冊(cè)量、百分比、成功率,以便合理調(diào)配資源。

      監(jiān)控投放廣告過(guò)來(lái)的注冊(cè)量、注冊(cè)成功率、轉(zhuǎn)換付費(fèi)用戶成功率,以便明確廣告的投入產(chǎn)出比。

      監(jiān)控用戶的縱深瀏覽行為,是測(cè)試導(dǎo)航可用性很好的辦法,也就是說(shuō)用戶會(huì)不會(huì)在你的網(wǎng)站內(nèi)迷路。

    posted @ 2008-04-05 00:06 伍興佳 閱讀(1149) | 評(píng)論 (7)編輯 收藏

    2008年4月4日

    通過(guò)一個(gè)簡(jiǎn)單的登錄過(guò)程了解Struts的業(yè)務(wù)流程(Struts初學(xué)的請(qǐng)進(jìn))

    一個(gè)簡(jiǎn)單的登錄過(guò)程描述了一下Struts的業(yè)務(wù)流程,感覺(jué)挺容易懂的,摘出來(lái)大家分享:(1)用戶的請(qǐng)求以HTTP方式傳輸?shù)椒?wù)器上,接收請(qǐng)求的是ActionServlet。
    (2)ActionServlet接收到請(qǐng)求后,會(huì)查找struts-config.xml文件來(lái)確定服務(wù)器上是否有用戶請(qǐng)求的操作,此處用戶請(qǐng)求的操作應(yīng)為登錄操作。如果沒(méi)有,則返回一個(gè)用戶請(qǐng)求無(wú)效的出錯(cuò)信息。
    (3)當(dāng)ActionServlet找到用戶請(qǐng)求的Action后,首先將用戶輸入的表單參數(shù)打包成一個(gè)ActionForm對(duì)象,這個(gè)ActionForm對(duì)象其實(shí)也就是一個(gè)JavaBean,里面包含兩個(gè)字段,分別是用戶名和密碼。接著ActionServlet再根據(jù)struts-config.xml中的配置信息決定是否要執(zhí)行ActionForm對(duì)象中的Validate方法。若Validate方法執(zhí)行有錯(cuò),則返回;否則,繼續(xù)下一步。
    (4)系統(tǒng)生成一個(gè)用戶所請(qǐng)求的Action的實(shí)例對(duì)象,將前面的ActionForm對(duì)象傳遞給它,運(yùn)行它的execute()方法。這一步其實(shí)就是用戶登錄的控制器,在執(zhí)行execute()方法時(shí),可以調(diào)用后臺(tái)模型驗(yàn)證登錄名和密碼是否正確等信息。
    (5)execute()執(zhí)行結(jié)束前會(huì)生成一個(gè)ActionForward類型的對(duì)象并將之返回給ActionServlet,該對(duì)象的作用是告訴ActionServlet下一步應(yīng)該跳轉(zhuǎn)到哪里,假如后臺(tái)模型檢驗(yàn)用戶名和密碼正確,則ActionForward就代表跳轉(zhuǎn)到一個(gè)登錄成功的界面。ActionServlet將對(duì)之進(jìn)行分析,其實(shí)就相當(dāng)于接收到一個(gè)新的請(qǐng)求,重復(fù)(2)~(5)的過(guò)程,直到將某個(gè)界面返回用戶為止。
    以上就是Struts的基本工作流程,可以看出struts-config.xml在整個(gè)流程中起到了一個(gè)類似站點(diǎn)地圖的作用,它記錄了所有可能的請(qǐng)求跳轉(zhuǎn)。其實(shí),在Web容器加載Struts應(yīng)用程序后,struts-config.xml就被首先讀入內(nèi)存成為一個(gè)ActionMapping對(duì)象,前面所說(shuō)的查找struts-config.xml文件,實(shí)際上是查找ActionMapping對(duì)象。對(duì)于初學(xué)者來(lái)說(shuō)可以不必深究其中的細(xì)節(jié)……
    摘自清華大學(xué)出版社出版的《Struts-Web設(shè)計(jì)與開(kāi)發(fā)大全》

    posted @ 2008-04-04 23:27 伍興佳 閱讀(449) | 評(píng)論 (1)編輯 收藏

    僅列出標(biāo)題  
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    這是伍嗲的純JAVA技術(shù)博客

    常用鏈接

    留言簿(1)

    隨筆檔案

    文章分類

    相冊(cè)

    技術(shù)鏈接

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 99ee6热久久免费精品6| 亚洲成a人片毛片在线| 国产午夜精品免费一区二区三区| 亚洲免费网站观看视频| 国产精品亚洲专区一区| 亚洲AV无一区二区三区久久| 中文字幕在线免费看线人| 中文字幕亚洲一区二区三区| 99热在线免费观看| 最新亚洲人成网站在线观看| 在线观看免费精品国产| 精品成人一区二区三区免费视频| 亚洲AV午夜福利精品一区二区| 国产免费av片在线看| 中文字幕在线观看免费| 亚洲大成色www永久网址| 亚洲一区二区三区在线观看精品中文 | 欧美a级成人网站免费| 特级毛片爽www免费版| 亚洲妓女综合网99| 相泽亚洲一区中文字幕| 成人黄页网站免费观看大全| a级午夜毛片免费一区二区| 精品无码专区亚洲| 亚洲精品人成电影网| 91麻豆国产自产在线观看亚洲| 久久不见久久见中文字幕免费 | 日韩亚洲人成在线综合| 亚洲精品人成电影网| 亚洲综合色婷婷七月丁香| 久久久久久99av无码免费网站| 久久精品成人免费观看97| 亚洲精品无码专区在线| 国产精品免费一级在线观看| 无码毛片一区二区三区视频免费播放| 在线电影你懂的亚洲| 成人爱做日本视频免费| 亚洲香蕉免费有线视频| 综合一区自拍亚洲综合图区| 亚洲国色天香视频| 婷婷精品国产亚洲AV麻豆不片|