posts - 14,  comments - 8,  trackbacks - 0
            2008年4月21日
           

          1、test.html  測試頁
           <html>
           <head>
             <title>測試頁面</title>
             <style>
               .list {
                 border-top:1 solid #8A2BE2;
                 border-left:1 solid #8A2BE2;
                 border-right:1 solid #8A2BE2;
               }
               .list td {
                 border-bottom: 1 solid #8A2BE2;
               }
             </style>
             <script>
                function $(el) {
                  return document.getElementById(el);
                }
                function showWin(param) {
                  window.showModalDialog("dailog.htm", param, "dialogWidth:" +param.width +"px;dialogHeight:"+param.height+"px;center:yes;help:no;scroll:no;status:no;resizable:no");
                }
               
                function TB(tbid) {
                  this.tb = typeof(tbid) == "string"? $(tbid): tbid;
                  this.getValue = function(rowIndex, cellIndex){
                    var trs = this.tb.rows[rowIndex];
                    var _td = trs.cells[cellIndex];
                    return _td.innerText;
                  }
                  this.setValue = function(rowIndex, cellIndex, value) {
                    var _tr = this.tb.rows[rowIndex];
                    var _td = _tr.cells[cellIndex];
                    _td.innerText = value;
                  }
                 
                  /********獲取行索引********/
                  this.findRowIndex = function(eventSrc) {
                    var _tr = eventSrc; //eventSrc事件源,必須在TD里獲事件源是TD或TR本身
                    while(_tr.tagName != "TR") {
                      _tr =  _tr.parentNode;
                    }
                    var trs = this.tb.rows;
                    for(var i = 0; i < trs.length; i++){
                      if(_tr == trs[i]) return i;
                    }
                  }
                }
                    
                function edit() {
                  var tb = new TB("data");
                  rIndex = tb.findRowIndex(event.srcElement);
                  $("updateRowIndex").value = rIndex;
                  $("userName").value = tb.getValue(rIndex, 1); //獲得姓名
                  $("sex").value = tb.getValue(rIndex, 2); //獲得性別
                  $("age").value = tb.getValue(rIndex, 3); //獲得年齡
                   showWin({title:"修改用戶信息", width:390, height:230, _div:"openWin",parent:window});
                }
               
                function saveAndUpdateView(){
                  var updateRowIndex = $("updateRowIndex").value;
                  var tb = new TB($f("data")); //$f()在dailog.html定義,獲到的table是父窗口中的table
                  tb.setValue(updateRowIndex, 1, $("userName").value);
                  tb.setValue(updateRowIndex, 2, $("sex").value);
                  tb.setValue(updateRowIndex, 3, $("age").value);
                  close();
                }
             </script>
            
           </head>
           <body>
            <p style="margin-top:60px">
             <center>
               <table id="data" class="list" width="460px">
                 <tr>
                   <td>編號</td>
                   <td>用戶名</td>
                   <td>性別</td>
                   <td>年齡</td>
                   <td>操作</td>
                 </tr>
                 <tr>
                   <td>1</td>
                   <td>李永勝</td>
                   <td>男</td>
                   <td>27</td>
                   <td><span style="background:#FAEBD7;cursor:hand" onclick="edit();">&nbsp;修改&nbsp;</span></td>
                 </tr>
                  <tr>
                   <td>2</td>
                   <td>林兄</td>
                   <td>男</td>
                   <td>27</td>
                   <td><span style="background:#FAEBD7;cursor:hand" onclick="edit();">&nbsp;修改&nbsp;</span></td>
                 </tr>
                  <tr>
                   <td>3</td>
                   <td>葉兄</td>
                   <td>男</td>
                   <td>23</td>
                   <td><span style="background:#FAEBD7;cursor:hand" onclick="edit();">&nbsp;修改&nbsp;</span></td>
                 </tr>
               </table>
             </center>
            </p>
           
            <!---彈出窗口顯示的內容---->
            <div id="openWin" style="display:none;">
              <form>
                <fieldSet>
                  <legend>修改用戶</legend>
                  <table>
                    <tr>
                      <td>用戶名</td><td><input type="text" id="userName"/></td>
                    </tr>
                    <tr>
                      <td>性別</td><td><input type="text" id="sex"/></td>
                    </tr>
                    <tr>
                      <td>年齡</td><td><input type="text" id="age"/></td>
                    </tr>
                  </table>
                </fieldSet>
                <input type="hidden" id="updateRowIndex"/>
              </form>
              <span style="background:#FAEBD7;cursor:hand" onclick="saveAndUpdateView();">&nbsp;修改&nbsp;</span>
            </div>
           </body>
          </html>

          2、dailog.html 窗口原型

          <html>
           <head>
             <script>
               var param = window.dialogArguments; //傳過來的模式對話框窗口參數
               document.title = param.title; //窗口標題,必須在窗口創建前實現s
              
             /********將父窗口的js加載進來********/
               var scripts = param.parent.document.scripts;
               var _head = document.getElementsByTagName("head")[0];
               for(var n = 0; n < scripts.length; n++) {
                 if(scripts[n].src) {
                   var _script = newEl("script");
                   _script.src = scripts[n].src;
                   bind(_head, _script);
                 }else{//加載直接在html文檔中寫的script
                   var _script = newEl("script");
                   _script.text = scripts[n].text;
                    bind(_head, _script);
                 }
               }
              
               /*******根據ID獲得父窗口的元素*********/
               function $f(el) {
                 return param.parent.document.getElementById(el);
               }
             
              /***********創建一個HTML元素*******/
               function newEl(tagName) {
                 return document.createElement(tagName);
               }
               /***********追加元素***************/
               function bind(ower, child) {
                 ower.appendChild(child);
               }
               /*******在瀏覽器完成對象的裝載后立即觸發*********/
               window.onload = function() {
                 var winDiv;
                 if(typeof(param._div) == "string") {
                   winDiv = param.parent.document.getElementById(param._div); //父窗口window對象,因為param._div對象在父窗口
                 }else{//直接傳對象過來
                   winDiv = param._div;
                 }
                 $("mainDiv").innerHTML = winDiv.innerHTML; //將DIV內容在彈出窗口中渲染
              }
             </script>
           </head>
           <body>
           <center>
            <div id="mainDiv" style="margin-top:20px;width:90%"></div>
           </center>
           </body>
          </html>
          posted @ 2008-05-05 10:43 虎嘯龍吟 閱讀(1914) | 評論 (0)編輯 收藏
          轉自http://www.aygfsteel.com/flyffa/archive/2006/12/14/87722.html

          基本方法:

          基本的方法,網上到處都是,在 java 中就是在 web.xml 注冊一個 Listener ,如下:

          <listener>

              <listener-class>xp.web.SessionCounter</listener-class>

          </listener>

          SessionCounter.java 實現 javax.servlet.http.HttpSessionListener 接口,分別在 sessionCreated 方法和 sessionDestroyed 方法中處理 session 數目。

           

          這樣的方法有一定的問題:

          1 、對于真正從網頁訪問的和搜索引擎的 spider 無法區分。

          2 、當 Tomcat 重啟時,加載了上次持久化的 session 時,無法準確計算在線數。

           

          第二個問題我們可以不予考慮,這是 tomcat 容器實現不標準的問題,我們要解決的是的第一個問題,如何知道你的訪問的是真實的。

           

          js 繞過搜索引擎

          做過 pv 統計的都知道,可以用 script 的方式得到你真實的 pageView 數目,我們現在要做的就是這樣的一件事情,我們在所有的頁面都加入一段話:

          <script type="text/javascript">

          document.write ("<iframe src='/sessionCountServlet' width=0 height=0 frameborder=no border=0 MARGINWIDTH=0 MARGINHEIGHT=0 SCROLLING=no></iframe>");

          </script>

          然后我們寫上一個 servlet 來記錄這些真正的訪問者。

          import java.io.*;

           

          import javax.servlet.*;

          import javax.servlet.http.*;

          public class SessionCounterServlet extends HttpServlet {

              public SessionCounterServlet() {

                  super();

              }

           

              public void doGet(HttpServletRequest request,

                                HttpServletResponse response) throws IOException,

                      ServletException {

           

                  process(request, response);

           

              }

           

              public void doPost(HttpServletRequest request,

                                 HttpServletResponse response) throws IOException,

                      ServletException {

           

                  process(request, response);

           

              }

           

              public void process(HttpServletRequest request,

                                  HttpServletResponse response) throws IOException,

                      ServletException {

                  SessionCounter.put(request.getSession().getId());

          }

          }

           

          我們可以看到這個 servlet 只是做了一件事情,在 process 里面做了 SessionCounter.put(request.getSession().getId()); 這個動作。

          我們來看看我們的 SessionCounter 做了些什么:

          import javax.servlet.http.*;

          import java.util.Hashtable;

           

          public class SessionCounter implements HttpSessionListener {

              public SessionCounter() {

              }

           

              public static Hashtable m_real = new Hashtable();

           

              private static long count = 0;

           

              public void sessionCreated(HttpSessionEvent e) {

                  count++;

              }

           

              public void sessionDestroyed(HttpSessionEvent e) {

                  if (count > 0) {

                      count--;

                  }

                  m_real.remove(e.getSession().getId());

              }

           

              public static long getSessionCount() {

                  return count;

              }

           

              public static void put(String sessionId){

                  m_real.put(sessionId,"1");

              }

           

              public static int getRealCount(){

                  return m_real.size();

              }

          }

          我們記錄了一個靜態的 hash 表來記錄激活狀態的 sessionid ,并在 session 銷毀的時候將這個 sessionid 置為空。

          怎么把 servlet 配置到 web 應用中我就不羅唆了。

          posted @ 2008-04-21 11:37 虎嘯龍吟 閱讀(305) | 評論 (0)編輯 收藏

          這部分的內容基本與Hibernate一致.JPA同樣支持3種類型的繼承形式:

          1.Single Table Strategy ,單表策略,一張表包含基類與子類的所有數據,很多情況下都是采用這樣的冗余設計,通過一個discriminator來區分

          2.Table Per Class Strategy ,每個子類對應一張表,每張表都擁有基類的屬性

          3.Join Strategy ,仍然是每個子類對應一張表,但此表中不包含基類的屬性,僅僅是此子類的擴展屬性,共享基類的屬性

          以一個例子來說明3種情況:

          一.單表策略

          比如Pet作為基類,Cat和Dog繼承此類并擁有自己的擴展屬性,如:

          package com.denny_blue.ejb3.inheritance;

          import java.io.Serializable;

          import javax.persistence.DiscriminatorColumn;
          import javax.persistence.DiscriminatorType;
          import javax.persistence.Entity;
          import javax.persistence.GeneratedValue;
          import javax.persistence.GenerationType;
          import javax.persistence.Id;
          import javax.persistence.Inheritance;
          import javax.persistence.InheritanceType;

          @Entity
          @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
          @DiscriminatorColumn(name = "animal_type", discriminatorType = DiscriminatorType.STRING)
          public class Pet implements Serializable {
           private int id;

           private String name;

           private double weight;

           public Pet() {
           }

           @Id
           @GeneratedValue(strategy = GenerationType.AUTO)
           public int getId() {
            return id;
           }

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

           public String getName() {
            return name;
           }

           public void setName(String name) {
            this.name = name;
           }

           public double getWeight() {
            return weight;
           }

           public void setWeight(double weight) {
            this.weight = weight;
           }

          }

          Pet類值的注意的就是通過@Inheritance(strategy = InheritanceType.SINGLE_TABLE)確定采用單表策略,通過@DiscriminatorColumn確定了標志值的字段和類型,我想熟悉hibernate的朋友對這些都應該很熟悉.然后是兩個子類:

          //Cat.java

          package com.denny_blue.ejb3.inheritance;

          import javax.persistence.DiscriminatorColumn;
          import javax.persistence.DiscriminatorType;
          import javax.persistence.DiscriminatorValue;
          import javax.persistence.Entity;
          import javax.persistence.Inheritance;
          import javax.persistence.InheritanceType;

          @Entity
          @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
          @DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING)
          @DiscriminatorValue("cat")
          public class Cat extends Pet {
           private String HairBall;

           public String getHairBall() {
            return HairBall;
           }

           public void setHairBall(String hairBall) {
            HairBall = hairBall;
           }

          }

          //Dog.java

          package com.denny_blue.ejb3.inheritance;

          import javax.persistence.DiscriminatorColumn;
          import javax.persistence.DiscriminatorType;
          import javax.persistence.DiscriminatorValue;
          import javax.persistence.Entity;
          import javax.persistence.Inheritance;
          import javax.persistence.InheritanceType;

          @Entity
          @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
          @DiscriminatorColumn(discriminatorType=DiscriminatorType.STRING)
          @DiscriminatorValue("dog")
          public class Dog extends Pet {
           private String trick;

           public String getTrick() {
            return trick;
           }

           public void setTrick(String trick) {
            this.trick = trick;
           }

          }

          兩個子類最值的關注的就是@DiscriminatorValue注釋,比如Cat的此值為cat,意味著當Cat類型的Entity存入數據庫時,JPA將自動把cat的值賦給animal_type字段,Dog的值則為dog,由此就可以在同一張表中區分開兩個不同的子類.

          二.Table per Class

          采用Table Per Class策略的話,每個子類都將單獨建表,并且都獨立擁有基類中的所有屬性,互相之間不共享,在我們的例子中所要進行的修改很小,像這樣:

          //基類

          @Entity
          @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
          public class Pet implements Serializable {
           private int id;

           private String name;

           private double weight;

          ........

          //子類:不需要任何設置

          @Entity
          public class Dog extends Pet {
           private String trick;

            .......

            .......

          三.Join策略

          每個子類同樣獨立建表,基類也獨立建表,只不過所有的子類的表中只有擴展屬性,他們共享基類的表,在我們的例子中修改下即可:

          //基類

          @Entity
          @Inheritance(strategy = InheritanceType.JOINED)
          public class Pet implements Serializable {
           private int id;

           private String name;

           private double weight;

            ........

          //子類

          @Entity

          @Inheritance(strategy = InheritanceType.JOINED)
          public class Dog extends Pet {
           private String trick;

            .......

            .......

          這部分的內容實在沒什么新意,與hibernate完全一致.JAVA EE5向spring和hibernate借鑒了太多東西.
          {}

          posted @ 2008-04-21 11:20 虎嘯龍吟 閱讀(320) | 評論 (0)編輯 收藏
          <2008年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章檔案

          相冊

          友情鏈接

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 桦川县| 阿鲁科尔沁旗| 绿春县| 天柱县| 三亚市| 安庆市| 丰台区| 晋中市| 红桥区| 宝丰县| 饶平县| 永善县| 山东| 通江县| 永宁县| 新闻| 邹平县| 汕尾市| 北安市| 藁城市| 巴林左旗| 靖宇县| 朝阳县| 色达县| 濉溪县| 澄城县| 佛冈县| 临颍县| 台山市| 洪湖市| 二连浩特市| 正安县| 石楼县| 株洲县| 盘锦市| 浮梁县| 定安县| 门头沟区| 奎屯市| 南郑县| 开远市|