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

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

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

    每日一得

    不求多得,只求一得 about java,hibernate,spring,design,database,Ror,ruby,快速開發(fā)
    最近關心的內(nèi)容:SSH,seam,flex,敏捷,TDD
    本站的官方站點是:顛覆軟件

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      220 隨筆 :: 9 文章 :: 421 評論 :: 0 Trackbacks

    #

    Q1.怎樣創(chuàng)建表?
    A. CREATE TABLE ROYAL_MTABLE
    (
    RM_INT_FIELD INTEGER,
    RM_STR_FIELD VARCHAR2(64)
    )
    CREATE TABLE ROYAL_DTABLE
    (
    RD_INT_FIELD INTEGER,
    RD_STR_FIELD VARCHAR2(32)
    )
    Q2.怎樣刪除表?
    A. DROP TABLE ROYAL_DTABLE;
    Q3.怎樣創(chuàng)建視圖?
    A. CREATE OR REPLACE VIEW ROYAL_MDVIEW AS
    SELECT T1.RM_STR_FIELD AS F1, T2.RD_STR_FIELD AS F2 FROM ROYAL_MTABLE T1, ROYAL_DTABLE T2
    WHERE T1.RM_INT_FIELD = T2.RM_INT_FIELD
    Q4.怎樣刪除視圖?
    A. DROP VIEW ROYAL_MDVIEW;
    Q5.怎樣給表添加字段?
    A. ALTER TABLE ROYAL_DTABLE ADD RM_INT_FIELD INTEGER;
    Q6.怎樣刪除表中某個字段?
    A. ALTER TABLE ROYAL_DTABLE DROP COLUMN RM_INT_FIELD;
    Q7.怎樣給某個字段添加約束?
    A. ALTER TABLE ROYAL_MTABLE MODIFY RM_STR_FIELD NOT NULL;
    Q8.怎樣去除某個字段上的約束?
    A. ALTER TABLE ROYAL_MTABLE MODIFY RM_STR_FIELD NULL;
    Q9.怎樣給表加上主鍵?
    A. ALTER TABLE ROYAL_MTABLE ADD CONSTRAINT PK_ROYAL_MTABLE PRIMARY KEY (RM_INT_FIELD);
    Q10.怎樣刪除表的主鍵?
    A. ALTER TABLE ROYAL_MTABLE DROP CONSTRAINT PK_ROYAL_MTABLE CASCADE;
    Q11.怎樣給表添加一個外鍵?
    A. ALTER TABLE ROYAL_DTABLE ADD CONSTRAINT FK_ROYAL_DTABLE FOREIGN KEY (RM_INT_FIELD) REFERENCES ROYAL_MTABLE (RM_INT_FIELD) ON DELETE CASCADE;
    Q12.怎樣刪除表的一個外鍵?
    A. ALTER TABLE ROYAL_DTABLE DROP CONSTRAINT FK_ROYAL_DTABLE;
    Q13.怎樣給字段加上CHECK?
    A. ALTER TABLE ROYAL_MTABLE ADD CONSTRAINT CHK_RM_STR_FIELD CHECK (RM_STR_FIELD IN ('Y','N'));
    Q14.怎樣去掉字段上的CHECK?
    A. ALTER TABLE ROYAL_MTABLE DROP CONSTRAINT CHK_RM_STR_FIELD;
    Q15.怎樣給字段設置默認值?
    A. ALTER TABLE ROYAL_DTABLE MODIFY RD_STR_FIELD DEFAULT 'ROYAL';
    Q16.怎樣移去字段的默認值?
    A. ALTER TABLE ROYAL_DTABLE MODIFY RD_STR_FIELD DEFAULT NULL;
    Q17.怎樣創(chuàng)建索引?
    A. CREATE UNIQUE INDEX IDX_ROYAL_DTABLE ON ROYAL_DTABLE (RM_INT_FIELD);
    Q18.怎樣刪除索引?
    A. DROP INDEX IDX_ROYAL_DTABLE;
    Q19.怎樣創(chuàng)建用戶?
    A. CREATE USER TESTUSER IDENTIFIED EXTERNALLY DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP PROFILE DEFAULT;
    Q20.怎樣刪除用戶?
    A. DROP USER TESTUSER CASCADE;
    21.怎樣將對象權限(object privileges)授予用戶?
    A. GRANT SELECT, INSERT, UPDATE, DELETE, ALTER ON ROYAL_MTABLE TO TESTUSER;
    GRANT INSERT, UPDATE, DELETE ON ROYAL_DTABLE TO TESTUSER;
    GRANT SELECT, ALTER ON ROYAL_DTABLE TO TESTUSER WITH GRANT OPTION;
    Q22.怎樣從用戶收回對象權限?
    A. REVOKE SELECT, INSERT, UPDATE, DELETE, ALTER ON ROYAL_DTABLE FROM TESTUSER;
    Q23.怎樣將角色權限(role privileges)授予用戶?
    A. GRANT CONNECT TO TESTUSER WITH ADMIN OPTION;
    GRANT DBA TO TESTUSER;
    Q24.怎樣從用戶收回角色權限?
    A. REVOKE DBA FROM TESTUSER;
    Q25.怎樣將系統(tǒng)權限(system privileges)授予用戶?
    A. GRANT ALTER ANY TABLE TO TESTUSER WITH ADMIN OPTION;
    Q26.怎樣從用戶收回系統(tǒng)權限?
    A. REVOKE ALTER ANY TABLE FROM TESTUSER;
    Q27.怎樣創(chuàng)建序列?
    A. CREATE SEQUENCE RM_INT_FIELD_SEQ
    MINvalue 1
    MAXvalue 999999999999999999999999999
    START WITH 1
    INCREMENT BY 1
    CACHE 10
    ORDER;
    Q28.怎樣刪除序列?
    A. DROP SEQUENCE RM_INT_FIELD_SEQ;
    Q29.怎樣獲取序列值?
    A. SELECT RM_INT_FIELD_SEQ.NEXTVAL FROM DUAL;
    Q30.怎樣創(chuàng)建角色?
    A. CREATE ROLE TESTROLE;
    Q31.怎樣刪除角色?
    A. DROP ROLE TESTROLE;
    Q32.怎樣將對象權限(object privileges)授予角色?
    A. GRANT SELECT, INSERT, UPDATE, DELETE, ALTER ON ROYAL_MTABLE TO TESTROLE;
    Q33.怎樣從角色收回對象權限?
    A. REVOKE SELECT, INSERT, UPDATE, DELETE, ALTER ON ROYAL_MTABLE FROM TESTROLE;
    Q34.怎樣將角色權限(role privileges)授予角色?
    A. GRANT DBA TO TESTROLE;
    Q35.怎樣從角色收回角色權限?
    A. REVOKE DBA FROM TESTROLE;
    Q36.怎樣將系統(tǒng)權限(system privileges)授予角色?
    A. GRANT CREATE TABLE TO TESTROLE;
    Q37.怎樣從角色收回系統(tǒng)權限?
    A. REVOKE CREATE TABLE FROM TESTROLE;
    Q38.不等于條件有哪幾種寫法?(茴香豆問題
    A. SELECT * FROM ROYAL_MTABLE WHERE RM_STR_FIELD != 'Y';
    SELECT * FROM ROYAL_MTABLE WHERE RM_STR_FIELD ^= 'Y';
    SELECT * FROM ROYAL_MTABLE WHERE RM_STR_FIELD <> 'Y';
    Q39.like子句的用法?
    A. SELECT * FROM ROYAL_DTABLE WHERE RD_STR_FIELD LIKE '%Y%';
    SELECT * FROM ROYAL_DTABLE WHERE RD_STR_FIELD LIKE '_Y%';
    Q40.請舉出一個where子查詢簡單例子?
    A. SELECT * FROM ROYAL_DTABLE WHERE RM_INT_FIELD IN (SELECT RM_INT_FIELD FROM ROYAL_MTABLE WHERE RM_STR_FIELD NOT IN ('Y','B'));
    Q41.Oracle常用字符串處理函數(shù)有哪些?
    A. || 連接兩個字符串; LENGTH 字符串長度; TRIM/LTRIM/RTRIM 截斷串左(右)指定字符串(包括空串); LOWER/UPPER 將字符串轉(zhuǎn)換為小/大寫,等等。
    例如:SELECT RM_INT_FIELD||'--'||RM_STR_FIELD||'YES' FROM ROYAL_MTABLE;
    Q42.Oracle支持哪些數(shù)字處理函數(shù)?
    A. Oracle支持所有常用數(shù)字函數(shù),包括(但不限于)+、-、*、/、ABS、COS、EXP、LN、LOG、MOD、POWER、ROUND、SIN、 SINH、SQRT、TAN、TRUNC、AVG、COUNT、MAX、MIN、SUM、GREATEST、LEAST等等。
    例如:
    SELECT GREATEST(3, 4, 5)*4 FROM DUAL;
    SELECT POWER(2,3) FROM DUAL;
    Q43.怎樣取得數(shù)據(jù)庫服務器當前日期、時間?
    A. SELECT SYSDATE FROM DUAL;
    SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH:MI:SS') FROM DUAL;
    Q44.怎樣將字符串轉(zhuǎn)換為日期、時間格式?
    A. SELECT TO_DATE('2002-11-27', 'YYYY-MM-DD') FROM DUAL;
    SELECT TO_DATE('2002-11-27 09:28:55', 'YYYY-MM-DD HH:MI:SS') FROM DUAL;
    Q45.常用日期函數(shù)有哪些?
    A. NEXT_DAY LAST_DAY ADD_MONTHS MONTHS_BETWEEN等等。
    例如:SELECT LAST_DAY(SYSDATE) FROM DUAL;
    Q46.能給出一個DECODE函數(shù)用法的例子嗎?
    A. DECODE函數(shù)的格式為DECODE(value, if1, then1, if2, then2...,else)。假設表ROYAL_DTABLE中有如下數(shù)據(jù):
    RD_INT_FIELD RD_STR_FIELD RM_INT_FIELD
    -------------------------------------
    1 royal 1
    2 bill 2
    3 joy 1

    請觀察如下SQL語句輸出結(jié)果。
    SELECT DECODE(RD_STR_FIELD, 'royal', 'royaltest', 'bill', 'billgates', RD_STR_FIELD) AS DC FROM ROYAL_DTABLE;
    DC
    ---------
    royaltest
    billgates
    joy

    Q47.能給出一個group by、having和order by用法的例子嗎?
    A. SQL> SELECT * FROM ROYAL_MTABLE;
    RM_INT_FIELD RM_STR_FIELD
    -------------------------
    1 Y
    2 N
    3 Y
    SQL> SELECT * FROM ROYAL_DTABLE;
    RD_INT_FIELD RD_STR_FIELD RM_INT_FIELD
    --------------------------------------
    1 royal 1
    2 bill 2
    3 joy 1
    SQL> SELECT RM_INT_FIELD, SUM(RD_INT_FIELD) FROM ROYAL_DTABLE GROUP BY RM_INT_FIELD HAVING SUM(RD_INT_FIELD) >= 2 ORDER BY SUM(RD_INT_FIELD) ASC;

    RM_INT_FIELD SUM(RD_INT_FIELD)
    ------------------------------
    2 2
    1 4
    Q48.Oracle有哪些常用數(shù)據(jù)字典?
    A. USER_TABLES(TABS)、USER_TAB_COLUMNS(COLS)、USER_VIEWS、USER_SEQUENCES(SEQ)、 USER_CONSTRAINTS、USER_CONS_COLUMNS、USER_TAB_COMMENTS、USER_COL_COMMENTS、 USER_INDEXES(IND)、USER_IND_COLUMNS、USER_USERS、DBA_USERS、ALL_USERS、 USER_TABLESPACES等等。
    例如:SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_ROYAL_DTABLE';
    Q49.怎樣將日期、時間插入date型字段中?
    A. INSERT INTO ROYAL_MTABLE (RM_INT_FIELD, RM_STR_FIELD, RM_DATE_FIELD) valueS (9, 'Y', TO_DATE('2002-05-23', 'YYYY-MM-DD'));
    INSERT INTO ROYAL_MTABLE (RM_INT_FIELD, RM_STR_FIELD, RM_DATE_FIELD) valueS (10, 'Y', TO_DATE('2002-10-10 8:23:33', 'YYYY-MM-DD HH:MI:SS'));
    Q50.能介紹一下connect by的用法嗎?
    A. connect by子句提供了遍歷“樹”的手段。
    假設有這樣一個表:CREATE TABLE ROYAL_TREETABLE (ID INTEGER, PARENT_ID INTEGER, NAME VARCHAR2(32));
    表中有如下數(shù)據(jù):
    ID PARENT_ID NAME
    -----------------
    2 1 AAA
    3 1 BBB
    4 2 CCC
    5 2 DDD
    6 4 EEE
    8 7 GGG
    假如我們現(xiàn)在需要從NAME = 'EEE'的記錄開始,向上查找所有有父子關系的記錄,可執(zhí)行如下SQL語句:
    SELECT * FROM ROYAL_TREETABLE START WITH NAME = 'EEE' CONNECT BY ID = PRIOR PARENT_ID;
    ID PARENT_ID NAME
    -----------------
    6 4 EEE
    4 2 CCC
    2 1 AAA
    posted @ 2006-06-12 13:52 Alex 閱讀(406) | 評論 (0)編輯 收藏

         摘要: key words: wiki tiddlyWiki 客戶端wiki 今天的主角是 tiddlywiki這個玩意真不錯,N多時候其實說實在的,用服務器并不方便,能有一個放在我自己筆記本硬盤里的wiki,那是多么幸福的事啊? :)今天真的有這樣的wiki,純粹用javaScript + css + html實現(xiàn)的wiki,功能強大,可配置性好,你只需要在里面增加某個標題的內(nèi)容,就可以實現(xiàn)樣式,功能,...  閱讀全文
    posted @ 2006-06-11 15:38 Alex 閱讀(3011) | 評論 (3)編輯 收藏

    key words: jsp驗證碼 jcaptcha

    原文參考 這里

    安裝

    Add jcaptcha-all.jar (provided in bin-distribution) and ehcache.jar (not provided see ehcache site) to your application class path, ie in you WEB-INF/lib folder.

    實例一個jcaptcha服務,注意,必須是單例模式的
    import?com.octo.captcha.service.image.ImageCaptchaService;
    import?com.octo.captcha.service.image.DefaultManageableImageCaptchaService;

    public?class?CaptchaServiceSingleton?{
    ????
    ????
    private?static?ImageCaptchaService?instance?=?new?DefaultManageableImageCaptchaService();
    ????
    ????
    public?static?ImageCaptchaService?getInstance(){
    ????????
    return?instance;
    ????}
    }

    注:以上是默認的一個實現(xiàn),下面是其他更多的實現(xiàn)
    • SimpleListSoundCaptchaEngine?? //還可以用聲音,真爽哦
    • SpellerSoundCaptchaEngine
    • SpellerSoundCaptchaEngine
    • DefaultGimpyEngineCaptcha??? ??? ???
    • BaffleListGimpyEngineCaptcha??? ??? ???
    • BasicListGimpyEngineCaptcha??? ??? ???
    • DeformedBaffleListGimpyEngineCaptcha??? ??? ???
    • DoubleRandomListGimpyEngineCaptcha??? ??? ???
    • SimpleListImageCaptchaEngineCaptcha??? ??? ???
    • SimpleFishEyeEngineCaptcha
    具體請參考官方說明

    編寫一個產(chǎn)生圖片的servlet


    import?com.octo.captcha.service.CaptchaServiceException;
    import?com.sun.image.codec.jpeg.JPEGCodec;
    import?com.sun.image.codec.jpeg.JPEGImageEncoder;

    import?javax.servlet.ServletConfig;
    import?javax.servlet.ServletException;
    import?javax.servlet.ServletOutputStream;
    import?javax.servlet.http.HttpServlet;
    import?javax.servlet.http.HttpServletRequest;
    import?javax.servlet.http.HttpServletResponse;
    import?java.awt.image.BufferedImage;
    import?java.io.ByteArrayOutputStream;
    import?java.io.IOException;


    public?class?ImageCaptchaServlet?extends?HttpServlet?{


    ????
    public?void?init(ServletConfig?servletConfig)?throws?ServletException?{

    ????????
    super.init(servletConfig);

    ????}


    ????
    protected?void?doGet(HttpServletRequest?httpServletRequest,?HttpServletResponse?httpServletResponse)?throws?ServletException,?IOException?{
    ????????
    ???????
    byte[]?captchaChallengeAsJpeg?=?null;
    ???????
    //?the?output?stream?to?render?the?captcha?image?as?jpeg?into
    ????????ByteArrayOutputStream?jpegOutputStream?=?new?ByteArrayOutputStream();
    ????????
    try?{
    ????????
    //?get?the?session?id?that?will?identify?the?generated?captcha.?
    ????????
    //the?same?id?must?be?used?to?validate?the?response,?the?session?id?is?a?good?candidate!
    ????????String?captchaId?=?httpServletRequest.getSession().getId();
    ????????
    //?call?the?ImageCaptchaService?getChallenge?method
    ????????????BufferedImage?challenge?=
    ????????????????????CaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId,
    ????????????????????????????httpServletRequest.getLocale());
    ????????????
    ????????????
    //?a?jpeg?encoder
    ????????????JPEGImageEncoder?jpegEncoder?=
    ????????????????????JPEGCodec.createJPEGEncoder(jpegOutputStream);
    ????????????jpegEncoder.encode(challenge);
    ????????}?
    catch?(IllegalArgumentException?e)?{
    ????????????httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
    ????????????
    return;
    ????????}?
    catch?(CaptchaServiceException?e)?{
    ????????????httpServletResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    ????????????
    return;
    ????????}

    ????????captchaChallengeAsJpeg?
    =?jpegOutputStream.toByteArray();

    ????????
    //?flush?it?in?the?response
    ????????httpServletResponse.setHeader("Cache-Control",?"no-store");
    ????????httpServletResponse.setHeader(
    "Pragma",?"no-cache");
    ????????httpServletResponse.setDateHeader(
    "Expires",?0);
    ????????httpServletResponse.setContentType(
    "image/jpeg");
    ????????ServletOutputStream?responseOutputStream?
    =
    ????????????????httpServletResponse.getOutputStream();
    ????????responseOutputStream.write(captchaChallengeAsJpeg);
    ????????responseOutputStream.flush();
    ????????responseOutputStream.close();
    ????}
    }


    為servlet修改web.xml配置文件
    <servlet>
    ????????
    <servlet-name>jcaptcha</servlet-name>
    ????????
    <servlet-class>ImageCaptchaServlet</servlet-class>
    ????????
    <load-on-startup>0</load-on-startup>
    ????
    </servlet>


    <servlet-mapping>
    ????????
    <servlet-name>jcaptcha</servlet-name>
    ????????
    <url-pattern>/jcaptcha</url-pattern>
    </servlet-mapping>


    編寫你的客戶端的展示
    <img?src="jcaptcha">
    <input?type='text'?name='j_captcha_response'?value=''>

    上面的src="jcaptcha"? 就是調(diào)用了上面的servlet,text里是用戶填寫的確認驗證碼

    后臺邏輯驗證
    Boolean?isResponseCorrect?=Boolean.FALSE;
    ???????????
    //remenber?that?we?need?an?id?to?validate!
    ???????????String?captchaId?=?httpServletRequest.getSession().getId();
    ???????????
    //retrieve?the?response
    ???????????String?response?=?httpServletRequest.getParameter("j_captcha_response");
    ???????????
    //?Call?the?Service?method
    ????????????try?{
    ????????????????isResponseCorrect?
    =?CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId,
    ????????????????????????response);
    ????????????}?
    catch?(CaptchaServiceException?e)?{
    ?????????????????
    //should?not?happen,?may?be?thrown?if?the?id?is?not?valid?
    ????????????}


    OK,大功告成了.

    posted @ 2006-06-11 13:11 Alex 閱讀(21030) | 評論 (28)編輯 收藏

    key words: HttpClient LDAP LDAP驗證

    LDAP目前應用得非常廣泛,在企業(yè)環(huán)境里可以供各種應用統(tǒng)一用戶驗證數(shù)據(jù)。

    以下是一個客戶端在正常訪問的時候插入驗證代碼,將用戶提交的用戶名和密碼提交給ldap驗證
    HttpClient?hc?=?new?HttpClient();
    ????????????GetMethod?method?
    =?new?GetMethod("http://www.yoursite.com/auth/your_auth.html");
    ????????????String?inputUserName?
    =?JOptionPane.showInputDialog("Input?your?User?Name:");
    ????????????String?inputPassWord?
    =?JOptionPane.showInputDialog("Input?your?password:");
    ????????????UsernamePasswordCredentials?upc?
    =?new?UsernamePasswordCredentials(inputUserName,?inputPassWord);
    ????????????hc.getState().setCredentials(
    null,?null,?upc);
    ????????????
    int?status?=?hc.executeMethod(method);
    ????????????method.releaseConnection();
    ????????????
    if(status?==?200)
    ????????????{
    ????????????????System.out.println(
    "login?successful!");
    ??????????????? //do your business things

    ????????????}?
    else
    ????????????{
    ????????????????System.out.println(
    "Login?failed!??Please?check?your?userName?and?Password!");
    ????????????}


    http://www.yoursite.com/auth/your_auth.html如果直接訪問會彈出對話框讓你輸入用戶名密碼


    posted @ 2006-06-11 12:31 Alex 閱讀(1059) | 評論 (0)編輯 收藏

    key words: Oracle自增長 sequence

    SqlServer 和MySql都有自增長的功能,Oracle必須建一個對應的sequence,有時候感覺不是很方便 。

    這次要實現(xiàn)在SqlServer中插入一條記錄的時候自動在Oracle中增加一條對應的記錄,sequence就有問題。

    最后用觸發(fā)器搞定:

    create?or?replace?trigger mytable_trig_autoinc
    before?insert?on
    mytable
    for?each?row
    begin
    ??if?(:new.id?is?null)?then
    ????select
    mytable_seq.nextval?into?:new.id?from?dual;
    ??end?if;
    end;

    posted @ 2006-06-08 18:07 Alex 閱讀(2853) | 評論 (0)編輯 收藏

    首先讓我們看一下服務器/客戶機的交互原理。服務器提供某特定功能的服務總是由特定的后臺程序提供的。在TCP/IP網(wǎng)絡中,常常把這個特定的服務綁定到 特定的TCP或UDP端口。之后,該后臺程序就不斷地監(jiān)聽(listen)該端口,一旦接收到符合條件的客戶端請求,該服務進行TCP握手后就同客戶端建 立一個連接,響應客戶請求。與此同時,再產(chǎn)生一個該綁定的拷貝,繼續(xù)監(jiān)聽客戶端的請求。

    舉一個具體的例子:假設網(wǎng)絡中有一臺服務器A (IP地址為1.1.1.1)提供WWW服務,另有客戶機B(2.2.2.2)、C(3.3.3.3)。首先,服務器A運行提供WWW服務的后臺程序(比 如Apache)并且把該服務綁定到端口80,也就是說,在端口80進行監(jiān)聽。當B發(fā)起一個連接請求時,B將打開一個大于1024的連接端口(1024內(nèi) 為已定義端口),假設為1037。A在接收到請求后,用80端口與B建立連接以響應B的請求,同時產(chǎn)生一個80端口綁定的拷貝,繼續(xù)監(jiān)聽客戶端的請求。假 如A又接收到C的連接請求(設連接請求端口為1071),則A在與C建立連接的同時又產(chǎn)生一個80端口綁定的拷貝繼續(xù)監(jiān)聽客戶端的請求。如下所示,因為系 統(tǒng)是以源地址、源端口、目的地址、目的端口來標識一個連接的,所以在這里每個連接都是唯一的。

    服務器 客戶端
    連接1:a.b.c.1:80 <=> a.b.c.4:1037
    連接2:a.b.c.1:80 <=> a.b.c.7:1071

    每 一種特定的服務都有自己特定的端口,一般說來小于1024的端口多為保留端口,或者說是已定義端口,低端口分配給眾所周知的服務(如WWW、FTP等 等),從512到1024的端口通常保留給特殊的UNIX TCP/IP應用程序,具體情況請參考/etc/services文件或RFC1700。

    假設網(wǎng)絡環(huán)境如下:某一單位,租用DDN專線上網(wǎng),網(wǎng)絡拓撲如下:

    +--------------+
    | 內(nèi)部網(wǎng)段 | eth1+--------+eth0 DDN
    | +------------|firewall|<===============>Internet
    | 198.168.80.0 | +--------+
    +--------------+
    eth0: 198.199.37.254
    eth1: 198.168.80.254

    以上的IP地址都是Internet上真實的IP,故沒有用到IP欺騙。并且,我們假設在內(nèi)部網(wǎng)中存在以下服務器:
    www服務器:www.yourdomain.com 198.168.80.11
    ftp服務器:ftp.yourdomain.com 198.168.80.12
    email服務器:mail.yourdomain.com 198.168.80.13

    下面我們將用iptables一步一步地來建立我們的包過濾防火墻,需要說明的是,在這個例子中,我們主要是對內(nèi)部的各種服務器提供保護。

    1. 在/etc/rc.d/目錄下用touch命令建立firewall文件,執(zhí)行chmod u+x firewll以更改文件屬性 ,編輯/etc/rc.d/rc.local文件,在末尾加上 /etc/rc.d/firewall 以確保開機時能自動執(zhí)行該腳本。

    2. 刷新所有的鏈的規(guī)則
    #!/bin/sh

    echo "Starting iptables rules..."

    #Refresh all chains

    /sbin/iptables -F

    3. 我們將首先禁止轉(zhuǎn)發(fā)任何包,然后再一步步設置允許通過的包。
    所以首先設置防火墻FORWARD鏈的策略為DROP:

    /sbin/iptables -P FORWARD DROP

    4.設置關于服務器的包過慮規(guī)則:

    在這里需要注意的是,服務器/客戶機交互是有來有往的,也就是說是雙向的,所以我們不僅僅要設置數(shù)據(jù)包出去的規(guī)則,還要設置數(shù)據(jù)包返回的規(guī)則,我們先建立針對來自Internet數(shù)據(jù)包的過慮規(guī)則。

    WWW服務:服務端口為80,采用tcp或udp協(xié)議。規(guī)則為:eth0=>允許目的為內(nèi)部網(wǎng)WWW服務器的包。

    ###########################Define HTTP packets####################################

    #Allow www request packets from Internet clients to www servers
    /sbin/iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j ACCEPT

    FTP 服務:FTP服務有點特別,因為需要兩個端口,因為FTP有命令通道和數(shù)據(jù)通道。其中命令端口為21,數(shù)據(jù)端口為20,并且有主動和消極兩種服務模式,其 消極模式連接過程為:FTP客戶端首先向FTP服務器發(fā)起連接請求,三步握手后建立命令通道,然后由FTP服務器請求建立數(shù)據(jù)通道,成功后開始傳輸數(shù)據(jù), 現(xiàn)在大多數(shù)FTP客戶端均支持消極模式,因為這種模式可以提高安全性。FTP服務采用tcp協(xié)議。規(guī)則為:eth0=>僅允許目的為內(nèi)部網(wǎng)ftp服 務器的包。

    ############################Define FTP packets#####################################

    #Allow ftp request packets from Internet clients to Intranet ftp server
    /sbin/iptables -A FORWARD -p tcp -d 198.168.80.12 --dport ftp -i eth0 -j ACCEPT


    EMAIL服務:包含兩個協(xié)議,一是smtp,一是pop3。出于安全性考慮,通常只提供對內(nèi)的pop3服務,所以在這里我們只考慮針對smtp的安全性問題。smtp端口為21,采用tcp協(xié)議。eth0=>僅允許目的為email服務器的smtp請求。

    ###########################Define smtp packets####################################
    /sbin/iptables -A FORWARD -p tcp -d 198.168.80.13 --dport smtp -i eth0 -j ACCEPT

    5. 設置針對Intranet客戶的過慮規(guī)則:

    在 本例中我們的防火墻位于網(wǎng)關的位置,所以我們主要是防止來自Internet的攻擊,不能防止來自Intranet的攻擊。假如我們的服務器都是基于 linux的,也可以在每一部服務器上設置相關的過慮規(guī)則來防止來自Intranet的攻擊。對于Internet對Intranet客戶的返回包,我們 定義如下規(guī)則。

    #############Define packets from Internet server to Intranet#######################
    /sbin/iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 198.168.80.0/24 -i eth0 -j ACCEPT
    /sbin/iptables -A FORWARD -p tcp -d 198.168.80.0/24 ! -syn -i eth0 -j ACCEPT
    /sbin/iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT

    說明:第一條允許Intranet客戶采用消極模式訪問Internet的FTP服務器;第二條接收來自Internet的非連接請求tcp包;最后一條接收所有udp包,主要是針對oicq等使用udp的服務。

    6. 接受來自整個Intranet的數(shù)據(jù)包過慮,我們定義如下規(guī)則:

    #############Define packets from Internet server to Intranet server###############
    /sbin/iptables -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT

    7. 處理ip碎片

    我們接受所有的ip碎片,但采用limit匹配擴展對其單位時間可以通過的ip碎片數(shù)量進行限制,以防止ip碎片攻擊。

    #################################Define fregment rule##################################
    /sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

    說明:對不管來自哪里的ip碎片都進行限制,允許每秒通過100個ip碎片,該限制觸發(fā)的條件是100個ip碎片。

    8. 設置icmp包過濾

    icmp包通常用于網(wǎng)絡測試等,故允許所有的icmp包通過。但是黑客常常采用icmp進行攻擊,如ping of death等,所以我們采用limit匹配擴展加以限制:

    #################################Define icmp rule##################################
    /sbin/iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

    說明:對不管來自哪里的icmp包都進行限制,允許每秒通過一個包,該限制觸發(fā)的條件是10個包。


    通 過以上個步驟,我們建立了一個相對完整的防火墻。只對外開放了有限的幾個端口,同時提供了客戶對Internet的無縫訪問,并且對ip碎片攻擊和 icmp的ping of death提供了有效的防護手段。以下是完整的腳本文件內(nèi)容,希望通過這個實例能是對iptables的用法有所了解:

    #!/bin/sh

    echo "Starting iptables rules..."

    #Refresh all chains

    /sbin/iptables -F

    ###########################Define HTTP packets####################################

    #Allow www request packets from Internet clients to www servers
    /sbin/iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j ACCEPT

    ############################Define FTP packets#####################################

    #Allow ftp request packets from Internet clients to Intranet ftp server
    /sbin/iptables -A FORWARD -p tcp -d 198.168.80.12 --dport ftp -i eth0 -j ACCEPT

    ###########################Define smtp packets####################################
    /sbin/iptables -A FORWARD -p tcp -d 198.168.80.13 --dport smtp -i eth0 -j ACCEPT

    #############Define packets from Internet server to Intranet#######################
    /sbin/iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 198.168.80.0/24 -i eth0 -j ACCEPT
    /sbin/iptables -A FORWARD -p tcp -d 198.168.80.0/24 ! -syn -i eth0 -j ACCEPT
    /sbin/iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT

    #############Define packets from Intranet to Internet###############
    /sbin/iptables -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT

    #################################Define fregment rule##################################
    /sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

    #################################Define icmp rule##################################
    /sbin/iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
    posted @ 2006-06-06 17:05 Alex 閱讀(269) | 評論 (0)編輯 收藏

    key words: iptables linux防火墻 防火墻設置


    [作者序]:本來是要翻譯http://www.justlinux.com/nhf/Security/IPtables_Basics.html這篇文章的,可惜當年實在是沒有學好語法,許多句子按照原文翻譯,如何也理不通順。只好按照自己的理解重新組織了,但愿不會有太大的偏差。好在,無論如何,現(xiàn)在讀起來,基本通順了。

    Iptables用三種鏈來管理放出、進入或經(jīng)過你計算機的(數(shù)據(jù))包。INPUT鏈管理進入你計算機的包,OUTPUT鏈管理你計算機放出的包,F(xiàn)ORWARD鏈管理經(jīng)過你的計算機轉(zhuǎn)送到另一臺計算機的包。

    所以,設置iptables的過程事實上就是定義一些規(guī)則來決定如何處理這三種包的過程。

    例如,如果你訪問http://www.yahoo.com,你的計算機將放出一個包向Yahoo!請求。這個包就要經(jīng)過OUTPUT鏈的審核。內(nèi)核會瀏覽OUTPUT鏈,看看是否有某條規(guī)則不允許放出這個包,如果有的話,就拒絕放出。

    現(xiàn)在讓我們來處理一些實際問題。比如你想阻塞所有來自200.200.200.1的包。首先你需要用-s選項來指明源IP地址或DNS:
    CODE:
    iptables -s 200.200.200.1

    然后可以用-j選項來說明如何處理這個包。最常用的處理方式有三種:ACCEPT、DENY和DROP。ACCEPT顧名思義表示接受包,DENY不接受同時回送一條拒絕信息,而DROP則根本對包不予理睬。如果確信某個IP可疑,那么最好選擇DROP而不是DENY:
    CODE:
    iptables -s 200.200.200.1 -j DROP

    但是僅僅使用上面這條命令,我們的計算機會無所適從,因為它不知道該用哪條鏈來處理這項規(guī)則。這就要用到-A選項,它表示把某條規(guī)則追加到某個鏈的末尾。我們打算拒絕所有來自200.200.200.1的包,所以使用:
    CODE:
    iptables -A INPUT -s 200.200.200.1 -j DROP

    選項的順序不會影響最終的處理結(jié)果,-j DROP也可以放在-s 200.200.200.1的前面,只不過放在后面似乎更容易理解。
    現(xiàn)在擴展一下,假設我們不想發(fā)送任何包給200.200.200.1該如何做呢?很簡單,只要把INPUT換成OUTPUT,同時用-d替換-s就可以了:
    CODE:
    iptables -A OUTPUT -d 200.200.200.1 -j DROP

    那 么,如果我們打算忽略來自這臺機器的telnet請求該怎么辦呢?你可能知道telnet使用的是23端口,但是如果你愿意,你也可以在iptables 中使用telnet關鍵字而不是端口號。Telnet,像大多數(shù)服務一樣,運行于TCP協(xié)議之上。我們可以使用-p選項來指明所用的協(xié)議。但是只指明協(xié)議 不會有任何作用,還需要使用—destination-port來指出我們要為哪個目標端口指定規(guī)則。與之相對應,--source-prot用來指明源 端口,確信別把二者弄混了。所以我們可以這樣拒絕某臺機器的telnet請求:
    CODE:
    iptables -A INPUT -s 200.200.200.1 -p tcp --destination-port telnet -j DROP

    擴展一下,如果你想拒絕一個網(wǎng)段的telnet請求,可以使用200.200.200.0/24來代替上面的200.200.200.1,它匹配任何200.200.200.*這樣的IP地址。

    再復雜一些。假設我們同時可以連接到本地局域網(wǎng)和internet,eth0網(wǎng)卡用來連接本地局域網(wǎng),ppp0用來撥號到internet。我們可能只想 為本地局域網(wǎng)提供telnet服務而不想為不安全的internet提供此項服務。有兩種選擇:在OUTPUT鏈上用-o選項阻塞設備輸出數(shù)據(jù),但更好的 是在INPUT鏈上用-i選項阻塞設備輸入數(shù)據(jù)。因此,這條規(guī)則可以這樣設置:
    CODE:
    iptables -A INPUT -p tcp --destination-port telnet -i ppp0 -j DROP

    這將關閉一切來自internet的telnet請求但是開放局域網(wǎng)同樣的請求。

    規(guī)則可以使用-A選項來追加在規(guī)則列表之后 ,也可以使用-I選項插入在某條規(guī)則之前。例如,如果我們想把一條規(guī)則放在INPUT鏈的最前面,我們可以使用“-I INPUT 1”。其中的1代表規(guī)則列表的第一行,你也可以把它換成其它的數(shù)字。除此之外,我們還可以使用-R選項來替換某條規(guī)則(它將刪除原來的規(guī)則),-D選項來 刪除某條規(guī)則,-L選項來列出所有已經(jīng)設置的規(guī)則,-F選項來初始化所有規(guī)則。

    現(xiàn)在,再深入一步。網(wǎng)絡中的數(shù)據(jù)包通常使用某種協(xié)議,如果這種協(xié)議是TCP,它還會使用某個端口。你可能想干脆關閉所有端口拒絕進來的包,但是記著,如果 你的計算機同另一臺計算機會話,另一臺計算機肯定會發(fā)送反饋信息。如果你關閉了所有進來的端口,那本質(zhì)上就表示你的連接就沒有用了。而且對于大多數(shù)非服務 程序來說,你無法預知它們使用哪個端口進行會話。但是仍然有一種辦法。當兩臺計算機在TCP連接上進行會話時,連接一定會首先被初始化。完成這項任務的包 叫作SYN。一個SYN包簡單的表明另一臺計算機已經(jīng)做好了會話的準備。只有發(fā)出服務請求的計算機才發(fā)送SYN包。所以如果你僅拒絕進來的SYN包,它將 終止其它計算機打開你計算機上的服務,但是不會終止你使用其它計算機上的服務,如果它沒有拒絕你發(fā)送的SYN包的話。這是一種折衷的辦法,但是可以完成許 多我們想完成的任務。這個選項是--syn,用在你指明的TCP協(xié)議之后。所以制定一條規(guī)則阻塞所有來自internet的連接會是這樣:
    CODE:
    iptables -A INPUT -i ppp0 -p tcp --syn -j DROP

    這是一條非常有用的規(guī)則除非你的計算機運行有web服務。如果你僅打算開放一個端口,比如說80(HTTP),有種簡單的辦法。和許多編程語言一樣,可以用一個驚嘆號表示“非”。例如,你打算阻塞所有80端口以外的SYN包,我想會是這樣:
    CODE:
    iptables -A INPUT -i ppp0 -p tcp --syn --destination-port ! 80 -j DROP

    這稍微有點復雜但并不難理解。

    最后,如何改變鏈的現(xiàn)有規(guī)則呢?INPUT鏈和OUTPUT鏈通常默認被設置為ACCEPT而FORWARD鏈默認則被設置為DENY。如果你打算把一臺 計算機作為路由器,你可能要設置FORWARD規(guī)則為ACCEPT。如何做這個?事實上很簡單。只要使用-P選項,在它后面跟上鏈的名字和你制定的新規(guī)則 就可以了。例如,把FORWARD鏈改為ACCEPT規(guī)則,我們這樣做:
    CODE:
    iptables -P FORWARD ACCEPT
    posted @ 2006-06-06 16:58 Alex 閱讀(282) | 評論 (0)編輯 收藏

    ??? key words: "? shared memory realm does not exist"? Oracle10g啟動錯誤

    上次安裝的Oracle10g啟動出現(xiàn)了問題,提示:
    ORACLE?not?available
    ORA-
    27101:?shared?memory?realm?does?not?exist
    Linux?Error:?
    2:?No?such?file?or?directory



    google了一下,有人有如下提議:
    make sure that both ORACLE_HOME and ORACLE_SID are written correctly.
    In past, I've got same error because ORACLE_HOME in init script was
    /opt/oracle/9iR1/ but the real ORACLE_HOME was /opt/oracle/9iR1 without ending slash.
    Yes, a simple slash implies two different installation.
    If in your scritps/programs you use sometime /opt/oracle/9iR1 and sometime /opt/oracle/9iR1/
    (with ending slash) you'll fall in troubble!.
    When u got "shared memory realm does not exist " at first check du a "ps -fe | grep ora"
    in order to make sure if the instance is running.
    also, if you want see that "shared memory realm" you can type "ipcs". If oracle is alive you can see a
    huge segment of memory (aslo know as SGA)



    最后檢查結(jié)果好像也不是這個,是配置文件出錯,即服務名不一致:

    其中SERVICE_NAME與SID_NAME一定要和.bash_profile中的ORACLE_SID相一致,否則無法啟動

    posted @ 2006-06-06 16:02 Alex 閱讀(416) | 評論 (0)編輯 收藏

    key words:? css


    轉(zhuǎn)自:http://www.blueidea.com/tech/site/2004/1928.asp

    在了解XHTML代碼規(guī)范后,我們就要進行CSS布局。首先先介紹一些CSS的入門知識。如果你已經(jīng)很熟悉了,可以跳過這一節(jié),直接進入下一節(jié)。

    CSS是Cascading Style Sheets(層疊樣式表)的縮寫。是一種對web文檔添加樣式的簡單機制,屬于表現(xiàn)層的布局語言。

    1.基本語法規(guī)范

    分析一個典型CSS的語句:

    p?{COLOR:#FF0000;BACKGROUND:#FFFFFF}

    • 其中"p"我們稱為"選擇器"(selectors),指明我們要給"p"定義樣式;
    • 樣式聲明寫在一對大括號"{}"中;
    • COLOR和BACKGROUND稱為"屬性"(property),不同屬性之間用分號";"分隔;
    • "#FF0000"和"#FFFFFF"是屬性的值(value)。

    2.顏色值

    顏色值可以用RGB值寫,例如:color : rgb(255,0,0),也可以用十六進制寫,就象上面例子color:#FF0000。如果十六進制值是成對重復的可以簡寫,效果一樣。例如:#FF0000可以寫成#F00。但如果不重復就不可以簡寫,例如#FC1A1B必須寫滿六位。

    3.定義字體

    web標準推薦如下字體定義方法:

    body?{?font-family?:?"Lucida?Grande",?Verdana,?Lucida,?Arial,?Helvetica,?宋體,sans-serif;?}

    • 字體按照所列出的順序選用。如果用戶的計算機含有Lucida Grande字體,文檔將被指定為Lucida Grande。沒有的話,就被指定為Verdana字體,如果也沒有Verdana,就指定為Lucida字體,依此類推,;
    • Lucida Grande字體適合Mac OS X;
    • Verdana字體適合所有的Windows系統(tǒng);
    • Lucida適合UNIX用戶
    • "宋體"適合中文簡體用戶;
    • 如果所列出的字體都不能用,則默認的sans-serif字體能保證調(diào)用;

    4.群選擇器

    當幾個元素樣式屬性一樣時,可以共同調(diào)用一個聲明,元素之間用逗號分隔,:

    p,?td,?li?{?font-size?:?12px?;?}

    5.派生選擇器

    可以使用派生選擇器給一個元素里的子元素定義樣式,例如這樣:

    li?strong?{?font-style?:?italic;?font-weight?:?normal;}

    就是給li下面的子元素strong定義一個斜體不加粗的樣式。

    6.id選擇器

    用CSS布局主要用層"div"來實現(xiàn),而div的樣式通過"id選擇器"來定義。例如我們首先定義一個層

    <div id="menubar"></div>

    然后在樣式表里這樣定義:

    #menubar?{MARGIN:?0px;BACKGROUND:?#FEFEFE;COLOR:?#666;}

    其中"menubar"是你自己定義的id名稱。注意在前面加"#"號。

    id選擇器也同樣支持派生,例如:

    #menubar?p?{?text-align?:?right;?margin-top?:?10px;?}

    這個方法主要用來定義層和那些比較復雜,有多個派生的元素。

    6.類別選擇器

    在CSS里用一個點開頭表示類別選擇器定義,例如:

    .14px?{color?:?#f60?;font-size:14px?;}

    在頁面中,用class="類別名"的方法調(diào)用:

    <span class="14px">14px大小的字體</span>

    這個方法比較簡單靈活,可以隨時根據(jù)頁面需要新建和刪除。

    7.定義鏈接的樣式

    CSS中用四個偽類來定義鏈接的樣式,分別是:a:link、a:visited、a:hover和a : active,例如:

    a:link{font-weight?:?bold?;text-decoration?:?none?;color?:?#c00?;}
    a:visited?
    {font-weight?:?bold?;text-decoration?:?none?;color?:?#c30?;}
    a:hover?
    {font-weight?:?bold?;text-decoration?:?underline?;color?:?#f60?;}
    a:active?
    {font-weight?:?bold?;text-decoration?:?none?;color?:?#90?;}

    以上語句分別定義了"鏈接、已訪問過的鏈接、鼠標停在上方時、點下鼠標時"的樣式。注意,必須按以上順序?qū)懀駝t顯示可能和你預想的不一樣。記住它們的順序是“LVHA”。

    呵呵,看了這么多,有點頭暈吧,實際上CSS的語法規(guī)范還有很多,這里列的只是一些常用的,畢竟我們是循序漸進,不可能一口吃成胖子:)

    posted @ 2006-06-05 09:53 Alex 閱讀(300) | 評論 (0)編輯 收藏

         摘要: key words: IE打印 web打印 頁面打印 最近又碰到了頁面打印,順便記錄一下,本來下午寫完了,可惜最近blogjava最近總是出現(xiàn)問題,提交居然失敗,只好再來一次.Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->function?SaveD...  閱讀全文
    posted @ 2006-05-26 23:08 Alex 閱讀(570) | 評論 (1)編輯 收藏

    現(xiàn)在瀏覽器端以 JavaScript 為核心,基于各種 Web 標準(即:早已完成標準化的XHTML/CSS/DOM/XML/XSLT 和正在進行標準化的XMLHTTP)的技術正在加速整合,Ajax 就是這一系列技術的一個統(tǒng)稱。

    雖 然網(wǎng)絡上已經(jīng)有大量的相關資源,但是為了打好基礎,認真讀上幾本書還是很有必要的。好在 Ajax 并不是什么全新的技術,它僅僅是傳統(tǒng)技術的發(fā)展和增值,是對于這些基于 Web 標準的傳統(tǒng)技術的重新包裝,使其更加適合于企業(yè)應用,并且和服務器端結(jié)合地更加緊密。因此學習 Ajax,首先就要從深入學習這些傳統(tǒng)的技術開始。我由淺入深地列出一些我讀過的書籍,提供給大家做參考:

    1、XHTML 教程(XHTML)

    作者:Chelsea Valentine, Chris Minnick

    New Riders 原版,人民郵電出版社中文版

    是的,今天你最應該學習的是 XHTML,而不是 HTML。HTML 4.x 已經(jīng)是一個被廢棄了的標準,今天的標準是 XHTML 1.0。XHTML 1.0 也不是 XHTML 最新的版本,但是它是目前唯一得到瀏覽器廣泛支持和唯一實用的 XHTML 版本。

    2、JavaScript 權威指南第四版(JavaScript: The Definitive Guide)

    作者:David Flanagan

    O'Reilly 原版,中國電力出版社中文版

    JavaScript 愛好者親切地稱之為“犀牛書”,因為 O'Reilly 以犀牛作為這本書的封面。這是目前 JavaScript 領域最深入和最權威的入門書。與其它 JavaScript 相關書籍的區(qū)別是這本書一半以上的篇幅著重于深入介紹 JavaScript 語言本身的基礎知識,而不是象其它的書一樣把基礎知識和與 HTML 相結(jié)合做 Web 開發(fā)的內(nèi)容(這些內(nèi)容往往偏重于細節(jié),使得其篇幅很容易就超出了 1000 頁,例如《JavaScript Bible》)混雜在一起。對于剛剛開始學習 JavaScript 的初學者,這本書毫無疑問是最佳的入門書。

    3、XML 高級編程(Professional XML)

    Didier Martin等著

    Wrox 原版,機械工業(yè)出版社中文版

    這本書是關于 XML 開發(fā)技術非常詳盡的著作。雖然因為作者眾多(第一版 12 個人,第二版好像又多了幾個),無法擺脫 Wrox 紅皮書系列大雜燴的印記,但是這本書可以說是紅皮書系列中少有的精品。

    這本書可以作為 XML 技術參考書,雖然很厚,但是沒有必要從頭到尾全部讀完。其中與 Ajax 相關的內(nèi)容包括 XML DOM、XSLT 等等。

    4、網(wǎng)站重構(gòu)(Designing with Web Standards)

    作者:Jeffrey Zeldman

    New Riders 原版,電子工業(yè)出版社中文版

    這 本書詳細地介紹了如何摒棄遠古時代(按照我的理解,3 年以前吧)不符合標準,專門針對某種瀏覽器(90%以上的情況下是 IE)做開發(fā)的惡習,真正采用符合標準的方式來做開發(fā),最終走上向后兼容(注意:不是與瀏覽器以前不能完整支持 Web 標準的版本相兼容,而是與瀏覽器以后的版本相兼容)的平坦大路上來。這本書雖然不是 CSS 的專著,但是其中充分展示了使用 CSS 的一些高級技巧。尤其是最后一章展示了完全基于 CSS 做布局,摒棄使用 table 做布局的老方法的具體做法。

    非常遺憾的是這本書的中文版翻譯的非常爛,如果不對照原文,很容易誤入歧途。讀這本書有任何疑問的朋友都可以直接和我聯(lián)系。

    上面列出的是與 Ajax 涉及到的技術相關的書籍。我沒有列出 CSS 的書,是因為我并沒有專門讀過一本 CSS 方面的專著。附件是網(wǎng)上流傳很廣的 CSS 2.0 中文手冊,可以作為這方面的參考。

    讀了以上這些書,你已經(jīng)在技術方面打下了極為堅實的基礎,你還需要有一個經(jīng)常的討論場所,JavaEye 毫無疑問是你最值得來的地方。

    下面我再列出幾本與技術沒有直接關系的書籍。

    5、面向使用的軟件設計(Software for Use)

    作者:Larry Contantine, Lucy Lockwood

    ACM Press 原版,機械工業(yè)出版社中文版

    大 部分的軟件都是給人使用的。我在 BEA User Group上的演講中說到,Ajax 為什么會越來越流行,主要的原因就是它能比傳統(tǒng)的基于 HTML FORM 的交互模式帶給用戶更好的交互體驗,也就是 Ajax 可以實現(xiàn)更好的 Web 可用性(Web Usability,這是目前國外的一個專門的研究領域),這才是 Ajax 最大的價值。軟件的可用性永遠都是一個大的話題,《面向使用的軟件設計》正是這方面最權威的專著。我們只要在做最終用戶直接使用(有一個可視的界面)的軟 件開發(fā),提高可用性就是我們需要孜孜不倦追求的目標。

    6、軟件創(chuàng)新之路(Inmates Are Running the Asylum)

    作者:Alan Cooper

    Sams Publishing 原版,電子工業(yè)出版社中文版

    7、About Face 2.0

    作者:Alan Cooper

    John Wiley & Sons 原版,中文版即將出版

    上面兩本書都是交互設計大師 Alan Cooper 的名著,相信很多朋友都知道 Alan Cooper 的大名,這兩本書是交互設計愛好者必讀的著作。


    posted @ 2006-05-26 22:48 Alex 閱讀(157) | 評論 (0)編輯 收藏

    kew words: javamail

    這幾天項目里涉及到javamail,順便看了下.

    現(xiàn)在都習慣在blogjava上搜索一番了? XXX in site:blogjava.net是我常用的搜索方式了,呵呵,大多數(shù)時候發(fā)現(xiàn)blogjava沒讓我失望,也說明這里的高手很多啊 :)

    感覺 Bromon的兩篇文章很實用:
    JavaMail使用指南(一)Javamail使用指南(二)

    還有 morcble的 javamail發(fā)送郵件javamail接受郵件

    在測試的時候有幾個問題值得一提:
    • 第一就是一定要加上activation.jar 庫文件,否則會報下面的異常:

    NoClassDefFoundError:?javax/activation/DataSource

    • 另外,發(fā)現(xiàn)用yahoo的smtp會報535的驗證錯誤,把驗證的方式換為morcble的下面的內(nèi)部類的方式驗證也不行:
    Session?session?=?Session.getDefaultInstance(props,
    ????
    new?Authenticator()?{
    ?????
    public?PasswordAuthentication?getPasswordAuthentication()?{
    ??????
    return?new?PasswordAuthentication(mymail.username,
    ????????mymail.password);?? ??
    ?????}
    ????});

    最后換了個smtp服務器沒問題,不知道各位兄弟有沒有碰到這樣的問題,可以確認的是我的yahoo配置信息應該是正確的,因為我用foxmail收發(fā)信件都是可以的.

    后來到y(tǒng)ahoo中國里面看了一下幫助,里面說
    我們目前正在對雅虎郵箱該項服務進行相關的調(diào)整,因此我們暫時停止了在頁面上POP服務設置的相關介紹。目前雅虎郵箱暫時不提供POP服務,敬請關注雅虎郵箱的近期活動。


    應該就是這個原因了?? :)

    • 另外,還有一些基于javamail封裝的工具類:
    ??? 可以參考這篇 :? 簡化JavaMail:小巧 Jakarta Commons-Email 簡單教程


    posted @ 2006-05-23 00:18 Alex 閱讀(254) | 評論 (0)編輯 收藏

    出處:codeChina

    key words: cos 文件上傳 jsp上傳

    index.html文件:

    <html>
    <head>
    <meta?http-equiv="Content-Type"?content="text/html;charset=gb2312">
    <title>無標題文檔</title>
    </head>

    <body>
    <!--?enctype的值很重要,upload.jsp為處理上傳的jsp-->
    <form?name="form1"??method="post"?enctype="multipart/form-data"?
    action
    ="upload.jsp">
    <p>
    ??
    <input?name="file1"?type="file">
    </p>
    <p>
    ??
    <input?name="file2"?type="file">
    </p>
    <p>??<input?name="file3"?type="file">
    </p>
    <p>
    ??
    <input?type="submit"?name="Submit"?value="上傳">
    </p>
    </form?>

    </body>
    </html>?

    upload.jsp文件 :
    <%@page?import="java.io.*"%>
    <%@page?import="com.oreilly.servlet.MultipartRequest"%>
    <%@page?import="com.oreilly.servlet.multipart.CoverFileRenamePolicy"%>
    <%@page?contentType="text/html;?charset=gb2312"?%>
    <%
    //文件上傳后,保存在c:\\upload
    String?saveDirectory?="c:\\upload";
    //每個文件最大5m,最多3個文件,所以
    int?maxPostSize?=3?*?5?*?1024?*?1024?;
    //response的編碼為"gb2312",同時采用缺省的文件名沖突解決策略,實現(xiàn)上傳
    //就這一句就完成上傳了,真是很爽
    MultipartRequest?multi?
    = new?MultipartRequest(request,?saveDirectory,?maxPostSize,"gb2312");

    //輸出反饋信息
    ?Enumeration?files?
    =?multi.getFileNames();
    ?????
    while?(files.hasMoreElements())?{
    ????????System.err.println(
    "ccc");
    ???????
    String?name?=?(String)files.nextElement();
    ???????File?f?
    =?multi.getFile(name);
    ???????
    if(f!=null){
    ?????????
    String?fileName?=?multi.getFilesystemName(name);
    ?????????
    String?lastFileName=?saveDirectory+"\\"?+?fileName;
    ?????????out.println(
    "上傳的文件:"+lastFileName);
    ?????????out.println(
    "<hr>");

    ???????}
    ?????}

    %>


    相關鏈接:幾種上傳方法介紹和比較
    posted @ 2006-05-22 20:59 Alex 閱讀(2779) | 評論 (3)編輯 收藏

    key words: jsp文件上傳 上傳組件 Rrilly-Cos? jspsmartUpload? Jakarta Apache Struts upload


    幾種上傳方法介紹、比較

    目 錄

    1 引言... 1

    2 O`Rrilly-Cos. 1

    3 jspsmartUpload. 3

    4 Jakarta Apache Struts upload. 5

    5 幾種方法的比較... 6

    1 引言

    一個網(wǎng)站總是不可避免的要和用戶進行信息的交互,倘若是從窗體傳送一般的簡單輸入類型(例如:text、password、radio、 checkbox、select等等)的信息到服務器端時,只要使用application/x-www-form-urlencoded的編碼方式用 session傳遞就可以了。但是當涉及到和用戶之間的文件交換(包括上傳和下載)時,就不是那么簡單了。在上傳文件到服務器時,必須要使用 multipart/form-data的編碼方式,并且不能直接使用request.getParameter()來取得。至于所使用的方法有很多種, 比如:jspsmart公司的jspsmartupload組件,O`Rrilly公司的cos組件,Jakarta Apache公司的commonsFileUpload組件,JavaZoom的uploadbean組件,還有Struts組件中自帶的 org.apache.struts.upload類工具等等。下面就針對其中的三種解決方案(jspsmartupload、O`Reilly- cos、struts.upload)做一個簡單的介紹和對比。

    2 O`Rrilly-Cos

    Cos組件是O`Rrilly公司開發(fā)的,該組件免費,不定期增加新功能,開源。

    圖1 O`Rrilly-Cos

    在Cos組件中,MultipartRequest類主要負責文件上傳的處理。MultipartRequest有8個構(gòu)造函數(shù):

    1.Public MultipartRequest ( HttpServletRequest request, String saveDirectory,) throws IOException

    2.Public MultipartRequest ( HttpServletRequest request, String saveDirectory, int maxPostSize) throws IOException

    3.Public MultipartRequest ( HttpServletRequest request, String saveDirectory, int maxPostSize, FileRenamePolicy policy) throws IOException

    4.Public MultipartRequest ( HttpServletRequest request, String saveDirectory, int maxPostSize, String encoding) throws IOException

    5.Public MultipartRequest ( HttpServletRequest request, String saveDirectory, int maxPostSize, String encoding, FileRenamePolicy policy) throws IOException

    6.Public MultipartRequest ( HttpServletRequest request, String saveDirectory, String encoding) throws IOException

    7.Public MultipartRequest ( HttpServletRequest request, String saveDirectory) throws IOException

    8.Public MultipartRequest ( HttpServletRequest request, String saveDirectory, int maxPostSize) throws IOException

    前6種構(gòu)造函數(shù)都是用來專門處理HTTP協(xié)議的,saveDirectory是上傳文件要存儲在服務器端的目錄名稱;maxPostSize是用來 限制用戶上傳文件大小的,若超過maxPostSzie,會產(chǎn)生IOException,默認上傳文件大小是1MB;encoding可以設定用何種編碼 方式來上傳文件名稱,可以解決中文問題。

    MultipartRequest類工具有8種方法,利用這些方法,我們可以取得請求的相關信息:

    Public Enumeration getParameterNames()

    可以取得請求參數(shù)的名稱

    public String getParameter(String name)

    此方法傳回參數(shù)為name的值

    public String[] getParameterValues(String name)

    此方法主要用在取得當一指定參數(shù)具有多個值時,它會傳回String的數(shù)組

    public Enumeration getFileName()

    傳回所有文件輸入類型的名稱

    public String getFilesystemNames(String name)

    用此方法得到上傳文件的真正的文件名,這里的name指文件輸入類型的名稱

    public String getContentType(String name)

    此方法得到上傳文件的內(nèi)容類型

    public File getFile(String name)

    此方法得到一個文件對象,代表儲存在服務器上的name文件

    public String getOriginalFileName(String name)

    返回文件在修改政策有效之前的文件名

    3 jspsmartUpload

    Jspsmartupload組件是由jspsmart公司開發(fā)的,安裝好它的組件以后,就可以處理文件上傳及下載的問題。該組件簡單好用,免費,但是源碼不公開。

    Jspsmartupload Overview:

    Free 免費的

    upload 1or more files to the server 可上傳1個或多個文件

    upload to a database 上傳文件到數(shù)據(jù)庫

    control the upload file by file 可以一列一列的(一個個)控制上傳

    manage mixed forms files +form fields 可以管理表格文件和表格域

    download a file 可以實現(xiàn)文件下載

    download a database field 可以從數(shù)據(jù)庫中下載

    restrict file size , extension etc 可以限制上傳文件的尺寸和類型

    MacBinary support MckBinary的支持

    Platform: Apache, NT, Unix, Linux, IIS 可以在多種平臺上運行

    Database : MySQL , Oracle…… 支持多種數(shù)據(jù)庫(最支持MySQL)

    整個jspsmartupload壓縮包113K,包括有范例、API說明和編譯好的class文件,調(diào)用這些class文件就可以實習文件的上傳下載功能。

    圖2 jspsmartUpoad

    Jspsmartupload能實現(xiàn)比O`Rrilly-Cos更多的方法,比如有:

    1.public int getSize()方法得到上傳文件大小的總和

    2.public void setDeniedFilesList(String deniedFilesList)方法設定用戶不可上傳的類型

    3.public void setAllowedFilesList(String allowedFilesList)方法設定用戶可上傳的文件類型

    4.public void setTotalMaxFileSize(Long totalMaxFilesList)設定一次上傳文件大小總和

    5.public int getCount()得到Files中的文件個數(shù)

    6.public Boolean isMissing()測試文件是否確實已經(jīng)存在

    7.public String getFieldName()得到此File在前一個HTML文件中的表格名稱

    8.public String getFilePathName()得到此File在上傳端的文件位置

    9.public String getFileExt()得到文件的擴展名

    ………….

    Jspsmartupload的安裝:只需把這些class文件拷貝到classes文件夾中即可。

    4 Jakarta Apache Struts upload

    由于本項目是用Struts結(jié)構(gòu)開發(fā)的,所以利用Struts自帶的類工具實現(xiàn)上傳,這能和工程整體結(jié)合的很好,不需要導入其他的包,并且功能強大,使用簡單,性能穩(wěn)定且開源,所以無疑是最佳的選擇。

    下圖是Struts中upload包的結(jié)構(gòu)。基本上要實現(xiàn)上傳功能,只要用到FormFiles和MultipartRequestHandler接口就可以解決了。

    圖3 Struts-upload包的結(jié)構(gòu)

    基本處理流程是,從頁面中傳遞文件到Form中,然后從Action得到Form中的文件,形成InputStream,然后通過OutputStream寫入磁盤。

    同樣,Struts的upload工具類也可以實現(xiàn)對上傳文件大小和類型的控制,可以同時上傳多個文件等等。

    5 幾種方法的比較

    O`Rrilly-Cos

    jspsmartUpload

    Struts-upload

    是否開源

    是否免費

    是否繼續(xù)開發(fā)

    不明

    功能

    一般

    可靠性

    一般

    特點綜述

    免費,開源,不定期增加新功能,可靠性高,代碼直接寫在jsp文件中

    簡單好用,可上傳、下載,功能強大,免費,但是源碼不公開,代碼直接寫在jsp文件中。上傳時,文件先預讀入內(nèi)存,當接到save指令時才保存到磁盤,所以上傳的性能和文件及內(nèi)存的大小關系密切。

    在Struts中使用極為方便,免費,開源,可靠性高,表示層和業(yè)務層分離,有后臺的Form和Action

    表1 幾種上傳方法的比較

    在研究比較這幾種上傳組件之后,我認為不管用其中的哪一種都能滿足我們的要求,畢竟我們要實現(xiàn)的僅僅是文件上傳的功能。最基本的,只要能將文件取得File格式的,就能實現(xiàn)各種各樣的功能。

    結(jié)論是,就本項目而言,使用Struts-upload組件是最貼切的選擇;如果要做封裝的話,最好選擇jspsmartUpload和O`Rrilly-Cos。

    posted @ 2006-05-16 23:50 Alex 閱讀(1549) | 評論 (0)編輯 收藏

    key words: 動態(tài)樹 eval函數(shù)用法

    近期項目中需要在ilearning中做開發(fā),用到大量純jsp模式的開發(fā),當然javaScript也用了很多,看來近期要好好研究javascript了 :)

    一.樹
    這次要做一個樹,需要支持展開和放置checkbox,開始的時候打算找一個,后來發(fā)現(xiàn)沒有適合的,最后自己寫,其實也就是用到.style.display='none'或者.style.display='block'來支持展開
    顯示效果如下:
    樹
    <!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd"
    >
    <html>
    <head>
    <meta?http-equiv="Content-Type"?content="text/html;?charset=gb2312">
    <title>Tree</title>
    <script?language="javascript">
    function?show(IMG,DV)
    {
    ????
    if(DV.style.display=="none")
    ????{
    ????????DV.style.display
    ="block";
    ????????IMG.src
    ="manager.gif"
    ????}
    ????
    else
    ????{
    ????????DV.style.display
    ="none";
    ????????IMG.src
    ="manager.gif"????????
    ????}
    }
    var?display="none";
    var?i;
    function?showall()
    {
    ????
    var?divTags=document.getElementsByTagName("div");
    ????
    //alert(divTags[10].id.replace("DV",""));
    ????if(?display=="none"?)
    ????{
    ????????
    for(i=0;i<divTags.length;i++)
    ????????{
    ????????????divTags[i].style.display
    ="block";
    ????????????eval(
    "IMG"+divTags[i].id.replace("DV","")).src="images/btnDel.gif";
    ????????????display
    ="block"
    ????????}
    ????}
    ????
    else
    ????{
    ????????
    for(i=0;i<divTags.length;i++)
    ????????{
    ????????????divTags[i].style.display
    ="none";
    ????????????eval(
    "IMG"+divTags[i].id.replace("DV","")).src="images/btnAdd.gif";
    ????????????display
    ="none";
    ????????}
    ????}
    }
    </script>

    <SCRIPT?LANGUAGE="JavaScript">
    function?checkAll(str)
    {
    ??
    var?a?=?document.getElementsByName(str);
    ??
    var?n?=?a.length;
    ??
    for?(var?i=0;?i<n;?i++)
    ??a[i].checked?
    =?window.event.srcElement.checked;
    }
    function?checkItem(str)
    {
    ??
    var?e?=?window.event.srcElement;
    ??
    var?all?=?eval("document.form0."+?str);
    ??
    if?(e.checked)
    ??{
    ????
    var?a?=?document.getElementsByName(e.name);
    ????all.checked?
    =?true;
    ????
    for?(var?i=0;?i<a.length;?i++)
    ????{
    ??????
    if?(!a[i].checked){?all.checked?=?false;?break;}
    ????}
    ??}
    ??
    else?all.checked?=?false;
    }
    </SCRIPT>


    </head>

    <body>
    ??????
    <a?href="#"?ONCLICK="show(IMG001,DV001)">
    ??????????
    <img?id="IMG001"?src="manager.gif"?border="0"></a>
    ??????????
    <input?type="Checkbox"?name="All"?onclick="checkAll('cb')">
    ?第一層

    ????
    <!--Begin?of?2-->
    ????????????
    <DIV?id='DV001'?style='display:none'>
    ????????????
    &nbsp;&nbsp;<img?id="IMG0010"?src="user.gif"?border="0">
    ????????????
    <input?type="checkbox"?name="cb"?value="1"?>
    ??????????????? 101
    ?????????????????
    <br>??????
    ????????????
    &nbsp;&nbsp;<img?id="IMG0010"?src="user.gif"?border="0">
    ????????????
    <input?type="checkbox"?name="cb"?value="1"?>
    ??????????????? 102
    ????????????????
    <!--End?of?2-->
    ????????????
    </div>????
    ?
    <br>???????????????
    ???
    <a?href="#"?ONCLICK="show(IMG002,DV002)">
    ???????
    <img?id="IMG002"?src="manager.gif"?border="0">
    ???????
    </a>
    ???????
    <input?type="Checkbox"?name="fdasfdsafsd"?onclick="checkAll('cbb')"?>
    ?第二層

    ????
    <!--Begin?of?2-->
    ????????????
    <DIV?id='DV002'?style='display:none'>
    ????????????
    &nbsp;&nbsp;<img?id="IMG0011"?src="user.gif"?border="0">
    ????????????
    <input?type="checkbox"?name="cbd"?value="1"?id="cbb">
    ??????????????? 201
    ?????????????????
    <br>??????
    ????????????
    &nbsp;&nbsp;<img?id="IMG0011"?src="user.gif"?border="0">
    ????????????
    <input?type="checkbox"?name="cbd"?value="1"?id="cbb">
    ??????????????? 202
    ????????????????
    <!--End?of?2-->
    ???
    </div>????
    </body>
    </html>




    2.eval函數(shù)用法
    這次碰到一個問題,就是動態(tài)獲取某個id的值,比如document.formX.idX.value,其中idX是動態(tài)的,所以直接寫無法獲得,會提示找不到某變量,這時eval就派上用場了
    比如
    var?myObj?=?"document.formX."+idX;
    myObj.value?
    =?XXValue;

    詳細信息參考這里
    這里再提供幾個例子:
    function?simpleSwap()
    {
    ?
    var?the_image?=?prompt("change?parrot?or?cheese","");
    ?
    var?the_image_name?=?"window.document."?+?the_image;
    ?
    var?the_image_object?=?eval(the_image_name);
    ?the_image_object.src?
    =?"ant.gif";
    }

    function?tophide(id)????//id?indicates?menu
    {
    ????
    if?(top.topframeset.rows?==?"31,*")
    ????{
    ????????top.topframeset.rows?
    =?"86,*";
    ????????eval(id?
    +?"_icon.src="/imgs/collapse_up.gif'");
    ????????eval(id?+?
    "_icon.alt='Collapse?The?Head'");
    ????????head.style.display?=?
    "block"
    ????????}
    ????else
    ????{
    ????????top.topframeset.rows?=?
    "31,*";
    ????????eval(id?+?
    "_icon.src="/imgs/collapse_down.gif'");
    ????????eval(id?
    +?"_icon.alt='Expand?The?Head'");
    ????????head.style.display?
    =?"none"
    ????}
    }


    posted @ 2006-05-16 22:39 Alex 閱讀(461) | 評論 (2)編輯 收藏

    僅列出標題
    共15頁: First 上一頁 7 8 9 10 11 12 13 14 15 下一頁 
    主站蜘蛛池模板: 一二三区免费视频| 添bbb免费观看高清视频| 精品久久亚洲中文无码| 亚洲 日韩经典 中文字幕| 亚洲av成人中文无码专区| 男女男精品网站免费观看| baoyu116.永久免费视频| 67194国产精品免费观看| 97无码免费人妻超级碰碰夜夜| 免费人成视网站在线观看不卡| 国产成人亚洲精品狼色在线| 亚洲精品第一国产综合精品| 亚洲AV日韩AV一区二区三曲| 国产成人精品免费大全| 91人成网站色www免费下载| 在线观看免费污视频| 亚洲综合色在线观看亚洲| 91精品国产亚洲爽啪在线观看| 亚洲色精品VR一区区三区| 一级做a爱片特黄在线观看免费看| 久久一本岛在免费线观看2020| 四色在线精品免费观看| 亚洲免费观看视频| 亚洲一区二区三区高清在线观看 | 国产在线ts人妖免费视频| 亚洲午夜久久久久久久久电影网| 亚洲AV无码久久久久网站蜜桃| 九九99热免费最新版| 成年网站免费视频A在线双飞| 久久精品亚洲男人的天堂| 亚洲卡一卡2卡三卡4麻豆| 免费无码午夜福利片| 91免费播放人人爽人人快乐| 亚洲精品老司机在线观看| 亚洲精品动漫在线| 五月婷婷免费视频| 国产情侣激情在线视频免费看| 中文字幕亚洲综合久久男男 | 久久精品国产99精品国产亚洲性色| 亚洲另类无码一区二区三区| a在线视频免费观看|