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

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

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

    模擬Google首頁(dwr實現ajax)

    上周末聽了在用友工作的兩個學長的一個小講座,雖然時間不長,但還是有些收獲的,其中一個開發部的經理就提到了一些小的技術點,其中就包括dwr,回家后上網查了查相關資料,了解到dwr是一個java開源框架,它的誕生就是為了降低開發ajax的難度,原理類似于在javascript中調用java類,于是就使用dwr技術模擬Google首頁做了個練習。由于正直全國哀悼日,頁面效果與各大網站相同,采用灰色樣式,在這里祝愿遭受災難的親人們早日重建家園。

    運行效果如圖:

    后臺數據庫為Oracle:

    --創建查詢信息表
    create table searchInfo
    (
      id 
    number not null primary key,--編號
      content varchar2(100not null,--查詢內容
      count number not null--查詢次數
    )
    --創建序列
    create sequence seq_searchInfo;
    --創建插入數據的存儲過程
    create or replace procedure proc_add(vContent varchar2,vResult out varchar2)
    as
      vCount 
    number;
    begin
      
    select count(*into vCount from searchInfo where content = vContent;
      
    if vCount = 0 then
        
    insert into searchInfo values(seq_searchInfo.Nextval,vContent,1);
      
    else
        
    update searchInfo set count = count + 1 where content = vContent;
      
    end if;
      vResult :
    = 'success';
      exception 
        
    when others then
          vResult :
    = 'fail';
    end;
    首先需要把dwr.jar導入到WEB-INF\lib目錄下,然后在web.xml文件中配置DWRServlet
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation
    ="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    >

        
    <servlet>
            
    <servlet-name>dwr-invoker</servlet-name>
            
    <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
            
    <init-param>
                
    <param-name>debug</param-name>
                
    <param-value>true</param-value>
            
    </init-param>
        
    </servlet>
        
    <servlet>
            
    <description>
                This is the description of my J2EE component
            
    </description>
            
    <display-name>
                This is the display name of my J2EE component
            
    </display-name>
            
    <servlet-name>ServletX</servlet-name>
            
    <servlet-class>control.ServletX</servlet-class>
        
    </servlet>

        
    <servlet-mapping>
            
    <servlet-name>dwr-invoker</servlet-name>
            
    <url-pattern>/dwr/*</url-pattern>
        
    </servlet-mapping>
        
    <servlet-mapping>
            
    <servlet-name>ServletX</servlet-name>
            
    <url-pattern>/ServletX</url-pattern>
        
    </servlet-mapping>
    </web-app>
    接著需要在WEB-INF\lib目錄下創建dwr.xml文件,并對javascript要調用的類進行聲明并公開方法,當然默認公開全部方法,需要提到的是,若類方法的參數或返回值為Bean,則還需要使用convert標簽
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
    <dwr>
        
    <allow>
            
    <create creator="new" javascript="history">
                
    <param name="class" value="operation.OperSearchInfo" />
                
    <include method="getHistory" />
            
    </create>
            
    <convert converter="bean" match="entity.SearchInfo">
                
    <param name="include" value="content,count" />
            
    </convert>
        
    </allow>
    </dwr>
    兩個xml文件配置好后,可以在地址欄中輸入http://localhost:9527/工程名/dwr進行測試,若測試成功,將顯示可用的類及其方法
    創建控制器ServletX.java,本例中只是判斷用戶的搜索操作是否成功,并以控制臺的形式輸出
    package control;

    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import operation.*;

    public class ServletX extends HttpServlet {

        
    private static final long serialVersionUID = 1L;

        
    public ServletX() {
            
    super();
        }


        
    public void destroy() {
            
    super.destroy(); // Just puts "destroy" string in log
            
    // Put your code here
        }


        
    public void doGet(HttpServletRequest request, HttpServletResponse response)
                
    throws ServletException, IOException {
            String model 
    = request.getParameter("model");
            
    if(model.equals("search")){
                String content 
    = Translation.transCode(request.getParameter("content"));
                OperSearchInfo obj 
    = new OperSearchInfo();
                
    if(obj.search(content)){
                    System.out.println(
    "success");
                }
    else{
                    System.out.println(
    "fail");
                }

            }

        }


        
    public void doPost(HttpServletRequest request, HttpServletResponse response)
                
    throws ServletException, IOException {
            
    this.doGet(request, response);
        }


        
    public void init() throws ServletException {
            
    // Put your code here
        }

    }

    創建與數據庫表對應的實體Bean,SearchInfo.java文件
    package entity;

    /**
     * 搜索信息表實體
     * 
    @author 非凡DZ
     *
     
    */

    public class SearchInfo {
        
    private int id;//編號
        private String content;//查詢內容
        private int count;//查詢次數
        
        
    public String getContent() {
            
    return content;
        }

        
    public void setContent(String content) {
            
    this.content = content;
        }

        
    public int getCount() {
            
    return count;
        }

        
    public void setCount(int count) {
            
    this.count = count;
        }

        
    public int getId() {
            
    return id;
        }

        
    public void setId(int id) {
            
    this.id = id;
        }

    }

    創建對數據庫表searchInfo進行操作的類OperSearchInfo.java及方法
    package operation;

    import java.sql.*;
    import java.util.*;
    import db.DataBase;
    import entity.SearchInfo;
    /**
     * 該類包含對searchInfo表所有操作
     * 
    @author 非凡DZ
     *
     
    */

    public class OperSearchInfo {
        
        
    /**
         * 用戶點擊搜索按鈕后執行
         * 
    @param content
         * 
    @return
         
    */

        
    public boolean search(String content){
            
    boolean flag = false;
            DataBase db 
    = new DataBase();
            Connection con 
    = db.getConnection();
            CallableStatement cs 
    = null;
            
    try{
                cs 
    = con.prepareCall("{call proc_add(?,?)}");
                cs.setString(
    1, content);
                cs.registerOutParameter(
    2, java.sql.Types.CHAR);
                cs.execute();
                
    if(cs.getString(2).equals("success")){
                    flag 
    = true;
                }

            }
    catch(Exception e){
                System.out.println(
    "proc異常"+e.getMessage());
                e.printStackTrace();
            }
    finally{
                
    try{
                    con.close();
                }
    catch(Exception ex){
                    System.out.println(
    "關閉連接異常"+ex.getMessage());
                    ex.printStackTrace();
                }

            }

            
    return flag;
        }

        
        
    /**
         * 獲得與界面文本框中信息相似的前10條信息
         * 
    @param content 界面文本框中的數據
         * 
    @return 相似信息
         
    */

        
    public ArrayList getHistory(String content){
            DataBase db 
    = new DataBase();
            Connection con 
    = db.getConnection();
            ResultSet rs 
    = null;
            ArrayList
    <SearchInfo> aryResult = new ArrayList<SearchInfo>();
            String sql 
    = "select content,count from searchInfo where content"
                
    +" like ? and rownum <= 10 order by count desc";
            
    try{
                
    if(!content.equals("")){
                    PreparedStatement pstn 
    = con.prepareStatement(sql);
                    pstn.setString(
    1, content+"%");
                    rs 
    = pstn.executeQuery();
                    
    while(rs.next()){
                        SearchInfo info 
    = new SearchInfo();
                        info.setContent(rs.getString(
    1));
                        info.setCount(rs.getInt(
    2));
                        aryResult.add(info);
                    }

                }

            }
    catch(Exception e){
                System.out.println(
    "獲得歷史查詢信息異常"+e.getMessage());
                e.printStackTrace();
            }
    finally{
                
    try{
                    con.close();
                }
    catch(Exception ex){
                    System.out.println(
    "關閉連接異常"+ex.getMessage());
                    ex.printStackTrace();
                }

            }

            
    return aryResult;
        }

    }

    Translation類用于處理數據傳輸的編碼問題
    package operation;

    import java.io.*;

    /**
     * 該類用于解決編碼問題
     * 
    @author 非凡DZ
     *
     
    */

    public class Translation {
      
    public Translation() {
      }


      
    public static String transCode(String str){
          String temp 
    = null;
          
    if(str == null){
              temp 
    = "";
          }

          
    try {
              temp 
    = new String(str.getBytes("iso8859-1"), "utf-8");
          }
     catch (UnsupportedEncodingException ex) {
          }

          
    return temp;
      }

    }

    DataBase用于獲得數據庫連接
    package db;

    import java.sql.*;
    /**
     * 該類用于獲取數據庫連接
     * 
    @author 非凡DZ
     *
     
    */

    public class DataBase {
        
    private Connection con;
        
    private String driver = "oracle.jdbc.driver.OracleDriver";
        
    private String url = "jdbc:oracle:thin:@localhost:1521:daizhenghenry";
        
    private String uid = "daizheng";
        
    private String pwd = "daizheng";
        
        
    public Connection getConnection(){
            
    try{
                Class.forName(driver);
                con 
    = DriverManager.getConnection(url, uid, pwd);
            }
    catch(Exception e){
                System.out.println(
    "連接異常"+e.getMessage());
                e.printStackTrace();
            }

            
    return con;
        }

    }

    最后是jsp頁面
    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        
    <head>
            
    <title>模擬搜索引擎</title>
            
    <style type="text/css">
            html 
            
    {
                filter
    :progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);
            
    }
     
        
    </style>
            
    <script type='text/javascript' src='/ajaxTest/dwr/interface/history.js'></script>
            
    <script type='text/javascript' src='/ajaxTest/dwr/engine.js'></script>
            
    <script type='text/javascript' src='/ajaxTest/dwr/util.js'></script>
            
    <script language="javascript">
            
    /*處理用戶相關搜索*/
            
    function change(data){
                
    //得到表格中的行數
                var count = document.getElementById('tab').rows.length;
                
    //如果表中存在行,將所有行刪除
                if(count >0){
                    
    for(var i=count-1;i>=0;i--){
                        document.getElementById('tab').deleteRow(i);
                    }

                }

                
    //如果存在相關搜索記錄        
                if(data.length > 0){
                    document.getElementById('Related').style.display 
    = '';
                    document.getElementById('x').style.display 
    = '';
                    
    for(var i=0;i<data.length;i++){
                        
    var objTr = document.getElementById('tab').insertRow();
                        
    var objTd1 = objTr.insertCell(0);
                        objTd1.innerHTML 
    = "<input readonly type='text' "
                        
    +"size='35' name='txtHistory' style='border:none;background:#FFFFFF'"
                        
    +" value='"+data[i].content+"' onmouseover='overChangeColor(this)'"
                        
    +" onmouseleave='leaveChangeColor(this)' "
                        
    +"onclick='clickHistory(this)'>";
                        
    var objTd2 = objTr.insertCell(1);
                        objTd2.innerHTML 
    = "<input type='text' name='result' readonly"
                        
    +" size='15' style='border:none;background:#FFFFFF;text-align:right'"
                        
    +" value='"+data[i].count+"結果"+"' align='right'/>";
                        objTd2.align 
    = 'right';
                    }

                }
    else{
                    document.getElementById('Related').style.display 
    = 'none';
                }

            }

            
    /*關閉歷史查詢記錄*/
            
    function myClose(){
                document.getElementById('Related').style.display 
    = 'none';
            }

            
    /*鼠標在相關搜索內容上方時執行*/
            
    function overChangeColor(object){
                
    var histories = document.getElementsByName('txtHistory');
                
    for(var i=0;i<histories.length;i++){
                
    //如果當前鼠標停留在某一行上
                    if(histories[i].style.background == '#ccffcc'){
                        histories[i].style.background 
    = '#FFFFFF';
                        
    var tdObj1 = histories[i].parentElement;//td
                        var trObj1 = tdObj1.parentElement;//tr
                        var childObj1 = trObj1.childNodes(1);
                        
    var x1 = childObj1.childNodes(0);
                        x1.style.background 
    = '#FFFFFF';
                        
    break;
                    }

                }

                object.style.background 
    = '#CCFFCC';
                
    var tdObj = object.parentElement;//td
                var trObj = tdObj.parentElement;//tr
                var childObj = trObj.childNodes(1);
                
    var x = childObj.childNodes(0);
                x.style.background 
    = '#CCFFCC';
            }

            
    /*鼠標離開相關搜索內容上方時執行*/
            
    function leaveChangeColor(object){
                object.style.background 
    = '#FFFFFF';
                
    var tdObj = object.parentElement;//td
                var trObj = tdObj.parentElement;//tr
                var childObj = trObj.childNodes(1);//td
                var x = childObj.childNodes(0);//input
                x.style.background = '#FFFFFF';
            }

            
    /*鼠標點擊相關搜索內容時執行*/
            
    function clickHistory(object){
                document.frm.content.value 
    = object.value;
                document.getElementById('Related').style.display 
    = 'none';
                frm.submit();
            }

            
    /*用戶在搜索框中按鍵事件處理*/
            
    function keySelectHistory(){
                
    var nKeyCode = window.event.keyCode;
                
    if(nKeyCode == 38 || nKeyCode == 40){
                    
    var count = document.getElementById('tab').rows.length;
                    
    var tempRowId;//記錄鼠標懸浮所在行
                    var flag = false;//標識是否有已經變色的行
                    if(count > 0 && (nKeyCode == 38 || nKeyCode == 40)){//如果存在相關搜索信息
                        var histories = document.getElementsByName('txtHistory');
                        
    for(var i=0;i<histories.length;i++){
                            
    //如果當前鼠標停留在某一行上
                            if(histories[i].style.background == '#ccffcc'){
                                tempRowId 
    = i;
                                flag 
    = true;
                                
    break;
                            }

                        }

                        
    if(!flag){
                            tempRowId 
    = 0;
                        }

                        
    if(nKeyCode == 38){//向上鍵
                            if(tempRowId > 0){
                                leaveChangeColor(histories[tempRowId]);
                                overChangeColor(histories[tempRowId 
    - 1]);
                                document.frm.content.value 
    = (histories[tempRowId - 1]).value;
                            }
    else{
                                leaveChangeColor(histories[
    0]);
                                overChangeColor(histories[count 
    - 1]);
                                document.frm.content.value 
    = (histories[count - 1]).value;
                            }

                            
                        }
    else if(nKeyCode == 40){//向下鍵
                            if(tempRowId == 0 && histories[0].style.background != '#ccffcc'){
                                overChangeColor(histories[
    0]);
                                document.frm.content.value 
    = histories[0].value;
                            }
    else if(tempRowId < count -1){
                                leaveChangeColor(histories[tempRowId]);
                                overChangeColor(histories[tempRowId 
    + 1]);
                                document.frm.content.value 
    = (histories[tempRowId + 1]).value;
                            }
    else{
                                leaveChangeColor(histories[tempRowId]);
                                overChangeColor(histories[
    0]);
                                document.frm.content.value 
    = histories[0].value;
                            }

                        }

                    }

                }
    else{//搜索框內容發生改變時(手動使其變化,而非通過上下鍵)
                    var str = document.frm.content.value;
                    history.getHistory(str,change);
                }

            }

        
    </script>
        
    </head>
        
    <body>
            
    <b>模擬搜索引擎</b>
            
    <br />
            
    <form action="ServletX" name="frm" method="post">
                
    <img alt="逝者安息,生者堅強" src="images\daonian.gif" />
                
    <br />
                
    <br />
                
    <input type="hidden" name="model" value="search" />
                
    <input type="text" size="55" name="content"
                    onkeyup
    ="keySelectHistory()" />
                
    <input type="submit" value="搜索" />
                
    <div id="Related"
                    style
    ="border:1px solid #f990033;display:'none';width:335;">
                    
    <table id="tab" cellpadding="0" border="0" cellspacing="0">
                    
    </table>
                    
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    
    <id="x" href='javascript:;' onclick='myClose()'
                        
    style="display:none">關閉</a>
                
    </div>
            
    </form>
        
    </body>
    </html>
    盡情享受dwr為我們開發ajax帶來的暢爽吧!

    posted on 2008-05-21 18:37 非凡DZ 閱讀(3846) 評論(15)  編輯  收藏 所屬分類: J2EE

    評論

    # re: 模擬Google首頁(dwr實現ajax) 2008-05-21 18:59 天天基金網

    不錯,學習中~~~~  回復  更多評論   

    # re: 模擬Google首頁(dwr實現ajax)[未登錄] 2008-05-21 21:45 wst302

    學習,dwr倒是經常用,主要看看下拉框的顯示  回復  更多評論   

    # re: 模擬Google首頁(dwr實現ajax) 2008-05-22 18:33 wenlin

    iso8859-1 有這個編碼么?
    好像是 iso-8859-1 吧  回復  更多評論   

    # re: 模擬Google首頁(dwr實現ajax) 2008-05-22 21:08 銀河使者

    study  回復  更多評論   

    # re: 模擬Google首頁(dwr實現ajax) 2008-05-24 17:49 sh

    這么簡單一個需求被你實現的如此復雜,也算是一種學習了。。。  回復  更多評論   

    # re: 模擬Google首頁(dwr實現ajax) 2008-05-24 18:57 非凡DZ

    當初在動態創建<tr>時,是想直接寫<tr>對象的事件來實現鼠標懸浮來著,可就是沒效果,到現在還有點不明白,所以只好采用通過文本框的事件再向上找對象的方式來實現,除了這點確實是復雜了點,其他地方還真沒想到哪里復雜了,還請這位朋友明示阿 呵呵  回復  更多評論   

    # re: 模擬Google首頁(dwr實現ajax) 2008-05-27 09:54 zhouyanhui

    挺好的! 支持!  回復  更多評論   

    # re: 模擬Google首頁(dwr實現ajax) 2008-06-03 09:24 zyhxl66

    初學dwr 你的這幾個js
    /ajaxTest/dwr/interface/history.js
    /ajaxTest/dwr/engine.js
    /ajaxTest/dwr/util.js
    是哪的,從哪里可以得到!  回復  更多評論   

    # re: 模擬Google首頁(dwr實現ajax) 2008-06-03 09:55 非凡DZ

    在你對dwr.xml配置完成后,進入測試頁面,頁面上就有這幾個路徑,你直接復制到你想應用的頁面就行了  回復  更多評論   

    # re: 模擬Google首頁(dwr實現ajax) 2008-06-05 13:33 zyhxl66

    我訪問測試地址后 http://localhost:8001/zyhxl66/dwr/index.html
    頁面上出現這些
    Classes known to DWR:
    Other Links
    Up to top level of web app.
    沒有出現你所說的那幾個js   回復  更多評論   

    # re: 模擬Google首頁(dwr實現ajax) 2008-06-05 13:54 非凡DZ

    測試頁到這層即可 http://localhost:8001/zyhxl66/dwr
    不用再向下了 頁面會出現所有你公開的可供javascript調用的方法
    <script type='text/javascript' src='/ajaxTest/dwr/engine.js'></script>
    <script type='text/javascript' src='/ajaxTest/dwr/util.js'></script>
    除了這兩項 都是你定義的 你想在哪個頁面用什么方法 你就根據實際情況選擇就行了
      回復  更多評論   

    # re: 模擬Google首頁(dwr實現ajax) 2008-06-05 14:30 zyhxl66

    好像是我程序少 jar包 你有qq msn 嗎 我的 106054541 zyhbrave@hotmail.com
      回復  更多評論   

    # re: 模擬Google首頁(dwr實現ajax) 2008-08-30 21:36 桃花島主

    我是一個初學者,感謝樓主,正是我想要的,我也學到了東西啦.  回復  更多評論   

    # re: 模擬Google首頁(dwr實現ajax) 2009-06-24 17:36 123

    1222  回復  更多評論   

    # re: 模擬Google首頁(dwr實現ajax) 2009-09-02 09:14 ss

    好貼 大家頂起來  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2008年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(2)

    隨筆分類(19)

    隨筆檔案(19)

    友情鏈接

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲一级片免费看| 成年女人18级毛片毛片免费| 野花香高清在线观看视频播放免费| 国产精品永久免费视频| 免费在线黄色电影| 96免费精品视频在线观看| 亚洲人成免费电影| 日韩电影免费在线| 国产亚洲午夜高清国产拍精品| 亚洲精品无码av人在线观看 | 学生妹亚洲一区二区| 国产成人亚洲午夜电影| a级毛片免费观看视频| 97国产免费全部免费观看| 日韩一级免费视频| 亚洲中文字幕久久精品无码喷水 | 一区二区免费视频| 好爽…又高潮了毛片免费看| 亚洲精品久久久www | 亚洲视频在线观看免费视频| 亚洲中文字幕久久精品无码A | 亚洲av无码av在线播放| 国产男女爽爽爽免费视频 | 最近免费最新高清中文字幕韩国| 成人午夜18免费看| 在线精品亚洲一区二区小说 | 亚洲国产系列一区二区三区| 免费无码午夜福利片69| 青青草无码免费一二三区| 四虎永久免费地址在线网站| 久久精品视频亚洲| 亚洲av日韩综合一区久热| 老司机69精品成免费视频| 日韩高清在线高清免费| 亚洲精品高清国产一线久久| 亚洲日韩亚洲另类激情文学| 国内精品免费在线观看 | 免费少妇a级毛片| 亚洲电影在线播放| 久久精品无码免费不卡| 日韩中文字幕免费|