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

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

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

    龍行天下

      政 博
    隨筆 - 23, 文章 - 0, 評論 - 12, 引用 - 0
    數據加載中……

    showModalDialog/showModelessDialog實例,父窗口向子窗口傳遞值,子窗口設置父窗口的值,子窗口關閉的時候返回值到父窗口.關閉刷新父窗口

    下面是showModalDialog/showModelessDialog使用例子,父窗口向子窗口傳遞值,子窗口設置父窗口的值,子窗口關閉的時候返回值到父窗口.關閉刷新父窗口,希望對象我這樣的WEB開發的菜鳥有所幫助.

    (一)showModalDialog使用例子,父窗口向子窗口傳遞值,子窗口設置父窗口的值,子窗口關閉的時候返回值到父窗口.


    farther.html
    ---------------------------
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> New Document </TITLE>
    <META NAME="Generator" CONTENT="EditPlus">
    <META NAME="Author" CONTENT="">
    <META NAME="Keywords" CONTENT="">
    <META NAME="Description" CONTENT="">
    <script language="javascript">
    <!--
    function openChild(){

    var k = window.showModalDialog("child.html",window,"dialogWidth:335px;status:no;dialogHeight:300px");
    if(k != null)
    document.getElementById("txt11").value = k;
    }
    //-->
    </script>
    </HEAD>

    <BODY>
    <br>傳遞到父窗口的值:<input id="txt9" type="text" value="3333333333333"><br>
    返回的值:<input id="txt11" type="text"><br>
    子窗口設置的值:<input id="txt10" type="text"><br>


    <input type ="button" value="openChild" onclick="openChild()">
    </BODY>
    </HTML>
    ---------------------------------------------------------------
    child.html
    --------
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> New Document </TITLE>
    <META NAME="Generator" CONTENT="EditPlus">
    <META NAME="Author" CONTENT="">
    <META NAME="Keywords" CONTENT="">
    <META NAME="Description" CONTENT="">
    <meta http-equiv="Expires" CONTENT="0">
    <meta http-equiv="Cache-Control" CONTENT="no-cache">
    <meta http-equiv="Pragma" CONTENT="no-cache">

    </HEAD>

    <BODY>
    <br>父窗口傳遞來的值:<input id="txt0" type="text"><br>
    輸入要設置父窗口的值:<input id="txt1" type="text"><input type ="button" value="設置父窗口的值" onclick="setFather()"><br>
    輸入返回的值:<input id="txt2" type="text"><input type ="button" value="關閉切返回值" onclick="retrunValue()">
    <input type ="button" value="關閉刷新父窗口" onclick="">

    </BODY>
    </HTML>

    <script language=javascript>
    <!--
    var k=window.dialogArguments;
    //獲得父窗口傳遞來的值
    if(k!=null)
     {
     document.getElementById("txt0").value = k.document.getElementById("txt9").value;
     }
     //設置父窗口的值
    function setFather()
    {
     k.document.getElementById("txt10").value = document.getElementById("txt1").value
    }
    //設置返回到父窗口的值
    function retrunValue()
    {
    var s = document.getElementById("txt2").value;
    window.returnValue=s;
    window.close();
    }
    //-->
    </script>

    ----------------------------
    說明:
    由于showModalDialog緩存嚴重,下面是在子窗口取消客戶端緩存的設置.也可以在服務器端取消緩存,參考:
    http://adandelion.cnblogs.com/articles/252137.html
    <meta http-equiv="Expires" CONTENT="0">
    <meta http-equiv="Cache-Control" CONTENT="no-cache">
    <meta http-equiv="Pragma" CONTENT="no-cache">
    ------------------------------------------------------------------------------------------------------------------------
    (二)下面是關閉刷新父窗口的例

    farther.html
    ---------------------------
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> New Document </TITLE>
    <META NAME="Generator" CONTENT="EditPlus">
    <META NAME="Author" CONTENT="">
    <META NAME="Keywords" CONTENT="">
    <META NAME="Description" CONTENT="">
    <script language="javascript">
    <!--
    function openChild()
    {

     var k = window.showModalDialog("child.html",window,"dialogWidth:335px;status:no;dialogHeight:300px");
     if(k == 1)//判斷是否刷新
     {
      alert('刷新');
      window.location.reload();
     }
    }
    //-->
    </script>
    </HEAD>

    <BODY>
    <br>傳遞到父窗口的值:<input id="txt9" type="text" value="3333333333333"><br>
    <input type ="button" value="openChild" onclick="openChild()">
    </BODY>
    </HTML>
    ----------------------------------------------------
    child.html
    --------
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> New Document </TITLE>
    <META NAME="Generator" CONTENT="EditPlus">
    <META NAME="Author" CONTENT="">
    <META NAME="Keywords" CONTENT="">
    <META NAME="Description" CONTENT="">
    <meta http-equiv="Expires" CONTENT="0">
    <meta http-equiv="Cache-Control" CONTENT="no-cache">
    <meta http-equiv="Pragma" CONTENT="no-cache">

    </HEAD>

    <BODY>
    <br>父窗口傳遞來的值:<input id="txt0" type="text"><br>

    <input type ="button" value="關閉刷新父窗口" onclick="winClose(1)">
    <input type ="button" value="關閉不刷新父窗口" onclick="winClose(0)">

    </BODY>
    </HTML>

    <script language=javascript>
    <!--
    var k=window.dialogArguments;
    //獲得父窗口傳遞來的值
    if(k!=null)
     {
     document.getElementById("txt0").value = k.document.getElementById("txt9").value;
     }

    //關閉窗口返回是否刷新的參數.
    function winClose(isRefrash)
    {

    window.returnValue=isRefrash;
    window.close();
    }
    //-->
    </script>

    --------------------------
    說明
    1.下面是取消客戶端緩存的:
    <meta http-equiv="Expires" CONTENT="0">
    <meta http-equiv="Cache-Control" CONTENT="no-cache">
    <meta http-equiv="Pragma" CONTENT="no-cache">
    也可以在服務器端取消緩存,參考:
    http://adandelion.cnblogs.com/articles/252137.html

    2.向父窗口傳遞闡述在ASP.NET中也可以是用aaa.aspx?id=1的方式傳遞.

    3.不刷新父窗口的話在父窗口中直接這樣一來設置可以.
    <script>
    window.showModalDialog("child.html",window,"dialogWidth:335px;status:no;dialogHeight:300px");
    </script>
    4.在子窗口中若要提交頁面的話要加入:,這樣就不會打開新窗口了.
    <head>
    <base target="_self">
    </HEAD>

    本文參考了:http://dev.csdn.net/develop/article/15/15113.shtm ,里面有showModalDialog/showModelessDialog的詳細使用說明

    posted @ 2007-12-29 14:33 feingto 閱讀(1399) | 評論 (0)編輯 收藏

    制作Javascript彈出窗口技巧九則

            經常上網的朋友可能會到過這樣一些網站,一進入首頁立刻會彈出一個窗口,或者按一個連接或按鈕彈出,通常在這個窗口里會顯示一些注意事項、版權信 息、警告、歡迎光顧之類的話或者作者想要特別提示的信息。其實制作這樣的頁面效果非常的容易,只要往該頁面的HTML里加入幾段Javascript代碼 即可實現。下面俺就帶您剖析它的奧秘。

      1、最基本的彈出窗口代碼
      其實代碼非常簡單:
      < SCRIPT LANGUAGE="javascript">
      < !--
      window.open ("page.html")
      -->
      < /SCRIPT>
      因為這是一段Javascript代碼,所以它們應該放在< SCRIPT LANGUAGE="javascript">之間。 < !-- 和 -->是對一些版本低的瀏覽器起作用,在這些老瀏覽器中不會將標簽中的代碼作為文本顯示出來。要養成這個好習慣啊。
      window.open ("page.html") 用于控制彈出新的窗口page.html,如果page.html不與主窗口在同一路徑下,前面應寫明路徑,絕對路徑(http://)和相對路徑(../)均可。
      用單引號和雙引號都可以,只是不要混用。
      這一段代碼可以加入HTML的任意位置,< head>和< /head>之間可以,< body>間< /body>也可以,越前越早執行,尤其是頁面代碼長,又想使頁面早點彈出就盡量往前放。 也可以,越前越早執行,尤其是頁面代碼長,又想使頁面早點彈出就盡量往前放。

      2、經過設置后的彈出窗口
      下面再說一說彈出窗口的設置。只要再往上面的代碼中加一點東西就可以了。我們來定制這個彈出的窗口的外觀,尺寸大小,彈出的位置以適應該頁面的具體情況。
      < SCRIPT LANGUAGE="javascript">
      < !--
      window.open ("page.html", "newwindow", "height=100, width=400, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no")
      //寫成一行
      -->
      < /SCRIPT>
      參數解釋:
      < SCRIPT LANGUAGE="javascript"> js腳本開始;
      window.open 彈出新窗口的命令;
      "page.html" 彈出窗口的文件名;
      "newwindow" 彈出窗口的名字(不是文件名),非必須,可用空"代替;
      height=100 窗口高度;
      width=400 窗口寬度;
      top=0 窗口距離屏幕上方的象素值;
      left=0 窗口距離屏幕左側的象素值;
      toolbar=no 是否顯示工具欄,yes為顯示;
      menubar,scrollbars 表示菜單欄和滾動欄。
      resizable=no 是否允許改變窗口大小,yes為允許;
      location=no 是否顯示地址欄,yes為允許;
      status=no 是否顯示狀態欄內的信息(通常是文件已經打開),yes為允許;
      < /SCRIPT> js腳本結束

      3、用函數控制彈出窗口
      下面是一個完整的代碼:
      < html>
      < head>
      < script LANGUAGE="JavaScript">
      < !--
      function openwin() {
      window.open ("page.html", "newwindow", "height=100, width=400, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")
      //寫成一行
      }
      //-->
      < /script>
      < /head>
      < body onload="openwin()">
      ...任意的頁面內容...
      < /body>
      < /html>
      這里定義了一個函數openwin(),函數內容就是打開一個窗口。在調用它之前沒有任何用途。
      怎么調用呢?
      方法一:< body onload="openwin()"> 瀏覽器讀頁面時彈出窗口;
      方法二:< body onunload="openwin()"> 瀏覽器離開頁面時彈出窗口;
      方法三:用一個連接調用:< a href="#" onclick="openwin()">打開一個窗口< /a>
      注意:使用的"#"是虛連接。
      方法四:用一個按鈕調用:< input type="button" onclick="openwin()" value="打開窗口">

      4、同時彈出2個窗口
      對源代碼稍微改動一下:
      < script LANGUAGE="JavaScript">
      < !--
      function openwin() {
      window.open ("page.html", "newwindow", "height=100, width=100, top=0, left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")
      //寫成一行
      window.open ("page2.html", "newwindow2", "height=100, width=100, top=100, left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")
      //寫成一行
      }
      //-->
      < /script>
      為避免彈出的2個窗口覆蓋,用top和left控制一下彈出的位置不要相互覆蓋即可。最后用上面說過的四種方法調用即可。
      注意:2個窗口的name(newwindows和newwindow2)不要相同,或者干脆全部為空。OK?

      5、主窗口打開文件1.htm,同時彈出小窗口page.html
      如下代碼加入主窗口< head>區:
      < script language="javascript">
      < !--
      function openwin() {
      window.open("page.html","","width=200,height=200")
      }
      //-->
      < /script>
      加入< body>區:
      < a href="1.htm" onclick="openwin()">open< /a>即可

      6、彈出的窗口之定時關閉控制
      下面我們再對彈出的窗口進行一些控制,效果就更好了。如果我們再將一小段代碼加入彈出的頁面(注意是加入到page.html的HTML中,可不是主頁面中,否則...),讓它10秒后自動關閉是不是更酷了?
      首先,將如下代碼加入page.html文件的< head>區:
      < script language="JavaScript">
      function closeit() {
      setTimeout("self.close()",10000) //毫秒
      }
      < /script>
      然后,再用< body onload="closeit()"> 這一句話代替page.html中原有的< BODY>這一句就可以了。(這一句話千萬不要忘記寫啊!這一句的作用是調用關閉窗口的代碼,10秒鐘后就自行關閉該窗口。)

      7、在彈出窗口中加上一個關閉按鈕
      < FORM>
      < INPUT TYPE="BUTTON" VALUE="關閉" onClick="window.close()">
      < /FORM>
      呵呵,現在更加完美了!

      8、內包含的彈出窗口---一個頁面兩個窗口
      上面的例子都包含兩個窗口,一個是主窗口,另一個是彈出的小窗口。通過下面的例子,你可以在一個頁面內完成上面的效果。
      < html>
      < head>
      < SCRIPT LANGUAGE="JavaScript">
      function openwin()
      {
      OpenWindow=window.open("", "newwin", "height=250, width=250,toolbar=no,scrollbars="+scroll+",menubar=no");
      //寫成一行
      OpenWindow.document.write("< TITLE>例子< /TITLE>")
      OpenWindow.document.write("< BODY BGCOLOR=#ffffff>")
      OpenWindow.document.write("< h1>Hello!< /h1>")
      OpenWindow.document.write("New window opened!")
      OpenWindow.document.write("< /BODY>")
      OpenWindow.document.write("< /HTML>")
      OpenWindow.document.close()
      }
      < /SCRIPT>
      < /head>
      < body>
      < a href="#" onclick="openwin()">打開一個窗口< /a>
      < input type="button" onclick="openwin()" value="打開窗口">
      < /body>
      < /html>
      看看OpenWindow.document.write()里面的代碼不就是標準的HTML嗎?只要按照格式寫更多的行即可。千萬注意多一個標簽或少一個標簽就會出現錯誤。記得用OpenWindow.document.close()結束啊。

      9、終極應用--彈出的窗口之Cookie控制
      回想一下,上面的彈出窗口雖然酷,但是有一點小毛病(沉浸在喜悅之中,一定沒有發現吧?)比如你將上面的腳本放在一個需要頻繁經過的頁面里(例如首頁),那么每次刷新這個頁面,窗口都會彈出一次,是不是非常煩人?:-(
      有解決的辦法嗎?當然有!我們使用cookie來控制一下就可以了。首先,將如下代碼加入主頁面HTML的< HEAD>區:
      < script>
      function openwin(){
      window.open("page.html","","width=200,height=200")
      }
      function get_cookie(Name) {
      var search = Name + "=" var returnvalue = "";
      if (document.cookie.length > 0) {
      offset = document.cookie.indexOf(search)
      if (offset != -1) {
      offset += search.length
      end = document.cookie.indexOf(";", offset);
      if (end == -1)
      end = document.cookie.length;
      returnvalue=unescape(document.cookie.substring(offset, end))
      }
      }
      return returnvalue;
      }
      function loadpopup(){
      if (get_cookie("popped")=="){
      openwin()
      document.cookie="popped=yes"
      }
      }
      < /script>
      然后,用< body onload="loadpopup()">(注意不是openwin而是loadpop啊!)替換主頁面中原有的< BODY>這一句即可。你可以試著刷新一下這個頁面或重新進入該頁面,窗口再也不會彈出了。真正的Pop-Only-Once!
      寫到這里彈出窗口的制作和應用技巧基本上算是完成了,俺也累壞了,一口氣說了這么多,希望對正在制作網頁的朋友有所幫助俺就非常欣慰了。
      需要注意的是,JS腳本中的的大小寫最好前后保持一致。 

    posted @ 2007-12-29 14:24 feingto 閱讀(305) | 評論 (0)編輯 收藏

    jsp中的時間操作

    jsp中的時間操作

    經常看見jsp版里有人問時間操作的問題,這些問題一般包括:取當前時間,把一個指定的字符串時間轉化成時間類型,求兩個時間之間的天數,求一段時間以前的時間,求一段時間以后的時間,在這里就把這些問題匯總一下。
    <%@  page  contentType="text/html;charset=gb2312"%>
    <%@ page import="java.text.*"%>
    <%@ page import="java.util.*"%>
    <%
    //字符串轉化成時間類型(字符串可以是任意類型,只要和SimpleDateFormat中的格式一致即可)
    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("M/dd/yyyy hh:mm:ss a",java.util.Locale.US);
    java.util.Date d = sdf.parse("5/13/2003 10:31:37 AM"); 
    out.println(d);
    out.println("<br>");
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String mDateTime1=formatter.format(d);
    out.println(mDateTime1);
    out.println("<br>");
    out.println(d.getTime());
    out.println("<br>");
    //當前時間
    Calendar cal  = Calendar.getInstance();
    //  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss");
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss G E D F w W a E F");
    String mDateTime=formatter.format(cal.getTime());
    out.println(mDateTime);
    out.println("<br>");
    //1年前日期
    java.util.Date myDate=new java.util.Date(); 
    long myTime=(myDate.getTime()/1000)-60*60*24*365;
    myDate.setTime(myTime*1000);
    String mDate=formatter.format(myDate);
    out.println(mDate);
    out.println("<br>");
    //明天日期
    myDate=new java.util.Date();
    myTime=(myDate.getTime()/1000)+60*60*24;
    myDate.setTime(myTime*1000);
    mDate=formatter.format(myDate);
    out.println(mDate);
    out.println("<br>");
    //兩個時間之間的天數
    SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
    java.util.Date date= myFormatter.parse("2003-05-1");
    java.util.Date mydate= myFormatter.parse("1899-12-30");
    long  day=(date.getTime()-mydate.getTime())/(24*60*60*1000);
    out.println(day);
    out.println("<br>");
    //加半小時
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    java.util.Date date1 = format.parse("2002-02-28 23:16:00");
    long Time=(date1.getTime()/1000)+60*30;
    date1.setTime(Time*1000);
    String mydate1=formatter.format(date1);
    out.println(mydate1);
    out.println("<br>");
    //年月周求日期
    SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM F E");
    java.util.Date date2= formatter2.parse("2003-05 5 星期五");
    SimpleDateFormat formatter3 = new SimpleDateFormat("yyyy-MM-dd");
    String mydate2=formatter3.format(date2);
    out.println(mydate2);
    out.println("<br>");
    //求是星期幾
    mydate= myFormatter.parse("2001-1-1");
    SimpleDateFormat formatter4 = new SimpleDateFormat("E");
    String mydate3=formatter4.format(mydate);
    out.println(mydate3);
    out.println("<br>");
    %>

    posted @ 2006-05-10 10:41 feingto 閱讀(673) | 評論 (1)編輯 收藏

    hibernate的中文問題的解決方案

    系統配置:win2k3 server,jsdk 1.5.0 rc,mysql 4.0.20a,hibernate 2.1.0 ,elcipse 3.0.1
    問題描述:在使用hibernate作為數據持久層的方案時,照樣會遇到中文問題,具體情況時插入到數據庫中的漢字顯示為??,顯示數據時漢字為??
    探索: 經過試驗發現與漢字編碼有關的地方有以下兩處,一個是數據庫連接url ,一個是編程時獲取Configuration 類的實例的語句的方式。
    方案1:
    ??? * 編程時獲取Configuration 類的實例的語句為
    ??? * new Configuration().addClass(xx.class);
    ??? 必須在hibernate.properties文件里數據庫連接url后加上?characterEncoding=gbk&useUnicode=true
    方案2:
    ??? * 編程時獲取Configuration 類的實例的語句為
    ??? * new Configuration().configure().
    ??? 在hibernate.cfg.xml文件的<session-factory/>塊中設置
    ??????? <property name="connection.useUnicode">true</property>
    ??????? <property name="connection.characterEncoding">UTF-8</property>
    ??? 或編程時寫:
    ????? Properties extraProperties = new Properties();
    ????? extraProperties.put("hibernate.connection.useUnicode", "true");
    ????? extraProperties.put("hibernate.connection.characterEncoding", "UTF-8");
    ????? myConfiguration.addProperties(extraProperties);

    原來懷疑與xml頁面的編碼有關試了一下,好像不起作用。

    posted @ 2006-05-08 14:42 feingto 閱讀(456) | 評論 (2)編輯 收藏

    在Struts框架內實現圖片上傳 (轉載:http://www.tkk7.com/Todayfreeman/)

    這個問題讓我郁悶了兩三天時間,最后才發現問題是在JSP端? <html:form action="/uploadsAction"? enctype="multipart/form-data"? >
    標簽如果少了"? enctype="multipart/form-data" ?服務器就會報錯,
    下面把代碼貼出來.

    JSP端
    ?<html:errors />
    ????????? <html:form action="/uploadsAction"? enctype="multipart/form-data"? >
    ??????????? <html:file property="theFile" />?
    ???????????? <html:radio property="upType" value="a" />CSVFileReader
    ???????????? <html:radio property="upType" value="b" />FileUp??????
    ??????????? <html:submit value="OK"? />
    ????????? </html:form>
    FormBean中將屬性定義為FormFile,geter seter 方法依舊.
    Action 中的代碼如下:實現將圖片上傳至UPLOAD文件夾內 如果文件大于20K或是寬&高超過規定范圍的,會重新勾畫.實現對上傳圖片的控制.
    當然這只是測試Action沒有跳轉頁面..

    package upload;

    import org.apache.struts.action.ActionMapping;
    import org.apache.struts.action.ActionForm;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.Action;
    import org.apache.struts.upload.*;
    import java.io.IOException;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    import com.sun.image.codec.jpeg.JPEGCodec;

    import java.io.File;
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.FileOutputStream;

    public class UploadAction extends Action {
    ??? public ActionForward execute(ActionMapping actionMapping,
    ???????????????????????????????? ActionForm actionForm,
    ???????????????????????????????? HttpServletRequest servletRequest,
    ???????????????????????????????? HttpServletResponse servletResponse)throws Exception {
    ??????? System.out.println("asdasdasdasdasdasd");
    ??????? UploadForm uploadForm = (UploadForm) actionForm;
    ??????? FormFile pic =? uploadForm.getPic();
    ??????? String picname = pic.getFileName();
    ??????? String uploadFileName = servletRequest.getSession()
    ??????????????????????????????? .getServletContext()
    ??????????????????????????????? .getRealPath("upload")+"\\"+picname;
    ??????? File upliadFile = new File(uploadFileName);
    ??????? BufferedInputStream bis = null;
    ??????? Image image = null;
    ??????? BufferedOutputStream bos = null;
    ??????? try{
    ??????? if(pic.getFileSize()<2*1024*1024){
    ??????? bis = new BufferedInputStream(pic.getInputStream());
    ??????? image = javax.imageio.ImageIO.read(bis);
    ??????? int width = image.getWidth(null);
    ??????? int height = image.getHeight(null);
    ??????? int w = 160;
    ??????? int h = 120;
    ??????? if(width>w||height>h){
    ??????? BufferedImage bi = new BufferedImage(w,h,
    ???????????????????????????????????????????? BufferedImage.TYPE_INT_RGB);
    ??????? bi.getGraphics().drawImage(image,0,0,w,h,null);
    ??????? bos = new BufferedOutputStream(new FileOutputStream(
    ???????upliadFile));
    ??????? JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
    ?????encoder.encode(bi);
    ??????? System.out.println(width * height);
    ??????? }else{
    ??????? bos = new BufferedOutputStream(new FileOutputStream(upliadFile));
    ??????? byte[] date = new byte[5*1024];
    ??????? int len = bis.read(date);
    ??????? while (len!=-1){
    ??????????? bos.write(date);
    ??????????? len = bis.read(date);
    ??????? }
    ??????? }
    ??????? }
    ???????????? return actionMapping.findForward("ok");
    ??????? }catch(Exception e){
    ??????? e.printStackTrace();
    ??? } finally {
    ??????? try {
    ??????????? if (bis != null)
    ??????????????? bis.close();
    ??????? } catch (IOException e1) {

    ??????????? e1.printStackTrace();
    ??????? }
    ??????? try {
    ??????????? if (bos != null)
    ??????????????? bos.close();
    ??????? } catch (IOException e2) {

    ??????????? e2.printStackTrace();
    ??????? }
    ??? }

    ??????? return actionMapping.findForward("ok");
    ??? }
    }

    posted @ 2006-05-03 20:09 feingto 閱讀(967) | 評論 (0)編輯 收藏

    Struts1.2中配置數據源

    軟件環境:Tomcat5.5.15,Eclipse3.1.2,MyEclipse4.1,MySQL5.0.15,Resin3.0.18

    配置過程:

    一、下載必要的jar包。有四個包要下載(網上有貼子說只要下面前三個包就可以了,但我在配置的時候如果沒有第四個包會報錯)。
    http://apache.linuxforum.net/dist/jakarta/commons/dbcp/binaries/commons-dbcp-1.2.zip
    http://apache.linuxforum.net/dist/jakarta/commons/pool/binaries/commons-pool-1.2.zip
    http://apache.linuxforum.net/dist/jakarta/struts/struts-legacy/struts-legacy-1.0.zip
    http://apache.linuxforum.net/dist/jakarta/commons/collections/binaries/commons-collections-3.1.zip
    把這四個jar包放到web應用的WEB-INF/lib目錄下,還有要把MySQL的驅動程序包也放到這里(也可以把數據庫的驅動包放到%Tomcat_Home%/common/lib目錄下或%Resin_Home%/lib目錄下,這樣在啟動Web服務器的時候就會加載這個包,服務器和Web應用都可以使用驅動程序類)

    二、在struts-config.xml中添加Data Source。MyEclipse的Design模式下可以可視化地編輯struts-config.xml和添加Data Source,但它在struts-config.xml中生成的數據源的代碼是錯誤的!就是因為這個耽誤了我很多時間!
    我們手工編輯代碼:

      <data-sources>
        <data-source key="datasource" type="org.apache.commons.dbcp.BasicDataSource">
          <set-property property="password" value="admin" />
          <set-property property="minCount" value="3" />
          <set-property property="maxCount" value="10" />
          <set-property property="username" value="admin" />
          <set-property property="driverClassName" value="com.mysql.jdbc.Driver" />
          <set-property property="description" value="test" />
          <set-property property="url" value="jdbc:mysql://localhost/test" />
          <set-property property="readOnly" value="false" />
          <set-property property="autoCommit" value="true" />
        </data-source>
      </data-sources>

    如果要配置多個data source,可以給每個data source指定不同的key,然后在程序中根據key指定要引用的數據源。

    三、測試數據源。配置好以后就可以在ActionServlet中使用了。

      DataSource ds = getDataSource(request,"datasource");
      Connection conn = ds.getConnection();
      Statement stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery("SQL String");

    附: Struts1.1中struts-config.xml的配置:

      <data-sources >
        <data-source key="datasource" type="org.apache.struts.util.GenericDataSource">
          <set-property property="password" value="admin" />
          <set-property property="minCount" value="2" />
          <set-property property="maxCount" value="10" />
          <set-property property="user" value="admin" />
          <set-property property="driverClass" value="com.mysql.jdbc.Driver" />
          <set-property property="description" value="test" />
          <set-property property="url" value="jdbc:mysql://localhost/test" />
          <set-property property="readOnly" value="false" />
          <set-property property="autoCommit" value="true" />
        </data-source>
      </data-sources>

    注意:藍色字體的部分是1.1和1.2在配置上不一樣的地方。

    posted @ 2006-05-03 20:05 feingto 閱讀(1901) | 評論 (1)編輯 收藏

    Struts+Hibernate開發實踐 分頁的實現

    在進行web應用開發的時候經常要進行分頁處理,經常看到一些人在問分頁處理的問題,現在我把自己的處理方法寫在這兒,希望能對需要進行分頁處理的朋友有所幫助。

    一、在struts中分頁有兩種結構:
    ??? 1. 在Action中通過DAO查詢出所有的記錄,然后加到session或request對象中,傳到客戶端,由JSP進行分頁。這種方法對于在數據量少的時候很方便,也不影響速度。
    ??? 2.在Action中每次通過DAO只查詢出一頁的記錄,再傳給JSP頁面。這種結構對于數據量大的程序很好,但對于數據量小的情況,會增加對服務器的請求,加大服務器的負載。
    ?????
    二、Hibernate查詢
    ??? 由于在Hibernate中直接提供了對數據庫定點定量的查詢方法,所以我采用的是第2種方法。

    如:
    從第1萬條開始取出100條記錄
    Query q = session.createQuery("from Cat as c");
    q.setFirstResult(10000);
    q.setMaxResults(100);
    List l = q.list();

    三、具體實現

    ?1.Pager類

    package com.jpcf.db.helper;

    import java.math.*;

    public class Pager {
    ? private int totalRows; //總行數
    ? private int pageSize = 10; //每頁顯示的行數
    ? private int currentPage; //當前頁號
    ? private int totalPages; //總頁數
    ? private int startRow; //當前頁在數據庫中的起始行

    ? public Pager() {
    ? }

    ? public Pager(int _totalRows) {
    ??? totalRows = _totalRows;
    ??? totalPages=totalRows/pageSize;
    ??? int mod=totalRows%pageSize;
    ??? if(mod>0){
    ????? totalPages++;
    ??? }
    ??? currentPage = 1;
    ??? startRow = 0;
    ? }

    ? public int getStartRow() {
    ??? return startRow;
    ? }

    ? public int getTotalPages() {
    ??? return totalPages;
    ? }

    ? public int getCurrentPage() {
    ??? return currentPage;
    ? }

    ? public int getPageSize() {
    ??? return pageSize;
    ? }

    ? public void setTotalRows(int totalRows) {
    ??? this.totalRows = totalRows;
    ? }

    ? public void setStartRow(int startRow) {
    ??? this.startRow = startRow;
    ? }

    ? public void setTotalPages(int totalPages) {
    ??? this.totalPages = totalPages;
    ? }

    ? public void setCurrentPage(int currentPage) {
    ??? this.currentPage = currentPage;
    ? }

    ? public void setPageSize(int pageSize) {
    ??? this.pageSize = pageSize;
    ? }

    ? public int getTotalRows() {
    ??? return totalRows;
    ? }

    ? public void first() {
    ??? currentPage = 1;
    ??? startRow = 0;
    ? }

    ? public void previous() {
    ??? if (currentPage == 1) {
    ????? return;
    ??? }
    ??? currentPage--;
    ??? startRow = (currentPage - 1) * pageSize;
    ? }

    ? public void next() {
    ??? if (currentPage < totalPages) {
    ????? currentPage++;
    ??? }
    ??? startRow = (currentPage - 1) * pageSize;
    ? }

    ? public void last() {
    ??? currentPage = totalPages;
    ??? startRow = (currentPage - 1) * pageSize;
    ? }

    ? public void refresh(int _currentPage) {
    ??? currentPage = _currentPage;
    ??? if (currentPage > totalPages) {
    ????? last();
    ??? }
    ? }

    }

    Pager類用于計算首頁、前一頁、下一頁、尾頁的在數據庫中的起始行,當前的頁碼。

    2.PagerHelp類

    package com.jpcf.db.helper;

    import javax.servlet.http.*;

    public class PagerHelper {

    ? public static Pager getPager(HttpServletRequest httpServletRequest,int totalRows) {

    ??? //定義pager對象,用于傳到頁面
    ??? Pager pager = new Pager(totalRows);

    ??? //從Request對象中獲取當前頁號
    ??? String currentPage = httpServletRequest.getParameter("currentPage");

    ??? //如果當前頁號為空,表示為首次查詢該頁
    ??? //如果不為空,則刷新pager對象,輸入當前頁號等信息
    ??? if (currentPage != null) {
    ????? pager.refresh(Integer.parseInt(currentPage));
    ??? }

    ??? //獲取當前執行的方法,首頁,前一頁,后一頁,尾頁。
    ??? String pagerMethod = httpServletRequest.getParameter("pageMethod");

    ??? if (pagerMethod != null) {
    ????? if (pagerMethod.equals("first")) {
    ??????? pager.first();
    ????? } else if (pagerMethod.equals("previous")) {
    ??????? pager.previous();
    ????? } else if (pagerMethod.equals("next")) {
    ??????? pager.next();
    ????? } else if (pagerMethod.equals("last")) {
    ??????? pager.last();
    ????? }
    ??? }
    ??? return pager;
    ? }
    }

    PageHelper這個類,我不用說應該也知道用來干嘛了

    3.DAO類

    package com.jpcf.db.dao;

    import com.jpcf.db.model.*;
    import com.jpcf.db.helper.HibernateUtil;
    import net.sf.hibernate.*;
    import java.util.*;
    import com.jpcf.db.controller.*;

    public class VehiclePropertyDAO {

    ? public Collection findWithPage(int pageSize, int startRow) throws HibernateException {
    ??? Collection vehicleList = null;
    ??? Transaction tx = null;
    ??? try {
    ????? Session session = HibernateUtil.currentSession();
    ????? tx = session.beginTransaction();
    ????? Query q = session.createQuery("from VehicleProperty vp");
    ????? q.setFirstResult(startRow);
    ????? q.setMaxResults(pageSize);
    ????? vehicleList = q.list();
    ????? tx.commit();
    ??? } catch (HibernateException he) {
    ????? if (tx != null) {
    ??????? tx.rollback();
    ????? }
    ????? throw he;
    ??? } finally {
    ????? HibernateUtil.closeSession();
    ??? }
    ??? return vehicleList;
    ? }

    ? public int getRows(String query) throws HibernateException {
    ??? int totalRows = 0;
    ??? Transaction tx = null;
    ??? try {
    ????? Session session = HibernateUtil.currentSession();
    ????? tx = session.beginTransaction();
    ????? totalRows = ((Integer) session.iterate(query).next()).intValue();
    ????? tx.commit();
    ??? } catch (HibernateException he) {
    ????? if (tx != null) {
    ??????? tx.rollback();
    ????? }
    ????? throw he;
    ??? } finally {
    ????? HibernateUtil.closeSession();
    ??? }

    ??? return totalRows;
    ? }

    }
    DAO類我就貼這些分頁需要的代碼了。
    “from VehicleProperty vp”也可以用一個參數傳進來,有興趣的自己改一下吧

    4.Action

    下面是在Action中用到的代碼:
    ? public ActionForward execute(ActionMapping actionMapping,
    ???????????????????????????????????? ActionForm actionForm,
    ???????????????????????????????????? HttpServletRequest httpServletRequest,
    ???????????????????????????????????? HttpServletResponse httpServletresponse) {
    ???? Collection clInfos = null;//用于輸出到頁面的記錄集合
    ???? int totalRows;//記錄總行數
    ???? VehiclePropertyDAO vehicleDAO = new VehiclePropertyDAO();

    ??? //取得當前表中的總行數
    ??? try {
    ????? totalRows = vehicleDAO.getRows("select count(*) from VehicleProperty");
    ??? } catch (Exception ex) {
    ????? servlet.log(ex.toString());
    ????? return actionMapping.findForward(Constants.FAILURE);
    ??? }

    ??? //通過PagerHelper類來獲取用于輸出到頁面的pager對象
    ??? Pager pager=PagerHelper.getPager(httpServletRequest,totalRows);

    ??? //取出從startRow開始的pageSize行記錄
    ??? try {
    ????? clInfos = vehicleDAO.findWithPage(pager.getPageSize(), pager.getStartRow());
    ??? } catch (Exception ex) {
    ????? servlet.log(ex.toString());
    ????? return actionMapping.findForward(Constants.FAILURE);
    ??? }

    ??? //把輸出的記錄集和pager對象保存到request對象中
    ??? httpServletRequest.setAttribute("CLINFOS", clInfos);
    ??? httpServletRequest.setAttribute("PAGER", pager);

    ??? return actionMapping.findForward(Constants.SUCCESS);
    ? }

    ?? 查詢語句select count(*) from VehicleProperty 也可以換成你需要的任意的條件(select count(*)?

    from VehicleProperty where ..)


    5.JSP頁面使用

    下面就是在JSP中的應用了:

    <td colspan="8" align="right" class="head">
    ?? 第<bean:write name="PAGER" property="currentPage"/>頁?
    ?? 共<bean:write name="PAGER" property="totalPages"/>頁?
    ?? <html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=first"?
    paramName="PAGER" paramProperty="currentPage" paramId="currentPage">首頁</html:link>
    ?? <html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=previous"?
    paramName="PAGER" paramProperty="currentPage" paramId="currentPage">上一頁</html:link>
    ?? <html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=next"?
    paramName="PAGER" paramProperty="currentPage" paramId="currentPage">下一頁</html:link>
    ?? <html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=last"?
    paramName="PAGER" paramProperty="currentPage" paramId="currentPage">尾頁</html:link>
    </td>

    ?? 解釋一下這一行:"/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=first
    method=queryWithPage 是由于我的Action繼承的是DispatchAction,需要一個method參數
    pageMethod=first 是用來在PageHelper類中判斷執行哪個操作

    四、總結

    ??? 我做的這個也只是一個借鑒,還有很多沒有實現的,比如還可以加一下 go 直接到第n頁的功能。
    ??? 其實最關鍵的是把當前頁號和要執行的是功能(上一頁,下一頁)的參數從頁面傳進來,在Action中就可以根據這兩個參數去取下一個頁面上要顯示的記錄集了。

    posted @ 2006-05-03 20:04 feingto 閱讀(413) | 評論 (0)編輯 收藏

    struts中的分頁實例

    struts中的分頁實例?
    ??
    ??? 這僅是一個入門實例,簡潔實用,從網上整理而來,供參考。這里僅列出部分文件,其它文件、數據庫及目錄結構請從本站下載。
    一、struts-config.xml配置,主要是配數據庫,這里用access。
    <?xml version="1.0" encoding="ISO-8859-1" ?>

    <!DOCTYPE struts-config PUBLIC
    ????????? "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
    ????????? "


    <struts-config>
    <data-sources>
    ?? <data-source key="dataSource" type="org.apache.commons.dbcp.BasicDataSource">
    ??????????? <set-property property="driverClassName" value="sun.jdbc.odbc.JdbcOdbcDriver" />
    ??????????? <set-property property="url" value="jdbc:odbc:page" />
    ??????????? <set-property property="username" value="admin" />
    ??????????? <set-property property="password" value="" />
    ??????????? <set-property property="maxActive" value="20" />
    ??????????? <set-property property="maxWait" value="5000" />
    ??????????? <set-property property="defaultAutoCommit" value="true" />
    ??????????? <set-property property="defaultReadOnly" value="false" />
    ??????????? <set-property property="validationQuery" value="SELECT 1" />
    ??????????? <set-property property="removeAbandoned" value="true" />
    ??????????? <set-property property="removeAbandonedTimeout" value="120" />????????????
    ??????????? <set-property property="encoding" value="false" />????????????
    ??????? </data-source>

    ?</data-sources>
    ? <form-beans>
    ? </form-beans>
    ? <global-forwards>
    ? </global-forwards>

    ? <action-mappings>
    ? <action path="/page" type="page.DataSourceAction" scope="request">
    ? <forward name="success" path="/pagetest.jsp"/>
    ? </action>
    ? </action-mappings>

    ? <controller>
    ? </controller>
    </struts-config>

    二、Action類
    用 page.do?start=1 來顯示第一個頁面?
    參數說明:?
    ? list:信息列表?
    ? start:開始位置?
    ? page:每頁顯示的信息數目?
    ? pages: 總頁數
    ? previous:上頁開始位置?
    ? next:下頁開始位置?

    package page;
    import org.apache.struts.action.*;
    import javax.servlet.http.*;

    import java.util.*;
    import javax.sql.*;
    import java.sql.*;
    import bean.*;

    public class DataSourceAction extends Action {

    ?public DataSourceAction(){}
    ?
    ?public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
    ?HttpServletResponse response) throws Exception {???
    ? try{
    ????? DataSource ds=this.getDataSource(request,"dataSource");???
    ????? Connection con = ds.getConnection();
    ????? Statement stmt = con.createStatement();
    ????? ResultSet resultSet = stmt.executeQuery("select count(*) from book" );?
    ????? resultSet.next();?
    ????? int data_num=resultSet.getInt(1);?
    ????? int start=1;
    ????? int page = 4; //每頁的記錄數。
    ????? int pages=data_num/page;
    ????? if(data_num%page!=0)
    ???????? pages++;
    ????? if(request.getParameter("start")!=null)
    ????????? start = Integer.parseInt(request.getParameter("start"));?
    ????? if(request.getParameter("go")!=null){
    ??????????????? int go = Integer.parseInt(request.getParameter("go"));?
    ??????????????? if(go<=1)
    ????????????????? start=1;
    ??????????????? else if(go>pages)
    ????????????????? start=(pages-1)*page+1;
    ??????????????? else?
    ?????????????????? start=(go-1)*page+1;
    ?????? }?
    ?????
    ????? String sql = "SELECT * FROM book where id>="+start+" and id<"+(start+page);
    ????? resultSet = stmt.executeQuery(sql);??
    ????? ArrayList list = new java.util.ArrayList();?
    ????? while(resultSet.next())
    ????? {??
    ??????? int id=resultSet.getInt("id");
    ??????? String name = resultSet.getString("name");
    ??????? String author = resultSet.getString("author");
    ??????? String price = resultSet.getString("price");
    ??????? System.out.println("開始數據封裝:name="+name+"author="+author+"price="+price);
    ??????? Book book= new Book(id,name,author,price);???????
    ??????? list.add(book);
    ????? }
    ??? con.close();
    ??? request.setAttribute("pages",new Integer(pages));
    ??? request.setAttribute("list",list);
    ??? //request.setAttribute("start", new Integer(start));?
    ??? request.setAttribute("page", new Integer(page));?

    ??????? // if there is a previous page, set the previous variable?
    ??????? int previous = start-page;?
    ??????? if ( previous>=0 ){?
    ??????????? request.setAttribute("previous", new Integer(previous));?
    ??????????? System.out.println ("previous:" + previous);?
    ??????? }?

    ??????? // if there is a next page, set the next variable?
    ??????? int next = start+page;?
    ??????? if ( next<=data_num ){?
    ??????????? request.setAttribute("next", new Integer(next));?
    ??????????? System.out.println ("next:" + next);?
    ??????? }?

    ?? }catch(SQLException e){
    ????????? e.printStackTrace();
    ????????? System.out.println("數據庫連接出現異常");
    ????? }?
    ???
    ???????????? return (mapping.findForward("success"));
    ? }?
    }


    三、bean類Book.java
    package bean;
    import java.sql.*;
    import java.util.ArrayList;
    public class Book {
    ?int id;
    ?private String bookname; //書名
    ?private String author;?? //作者
    ?private String price;??? //價格
    ?
    public Book(int id,String name,String author,String price){
    ?this.id=id;
    ?this.bookname=name;
    ?this.author=author;
    ?this.price=price;
    }

    public int getId(){?
    ??????? return id;?
    ??? }?

    ?public String getAuthor() {
    ? return author;
    ?}

    ?public void setAuthor(String author) {
    ? this.author = author;
    ?}

    ?public String getBookname() {
    ? return bookname;
    ?}

    ?public void setBookname(String bookname) {
    ? this.bookname = bookname;
    ?}
    ?
    ?public String getPrice(){
    ???? return this.price;?
    ?}
    ?
    ?public void setPrice(String price){
    ???? this.price=price;?
    ?}
    ?
    }
    四、分頁的jsp頁面pagetest.jsp,用了jstl中的c標記。
    <%@ page contentType="text/html; charset=gb2312" language="java"%>
    <%@ page import="java.util.*" %>
    <%@ page import="bean.*" %>
    <%@ taglib prefix="c" uri="
    <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
    <%@ taglib uri="/tags/struts-html" prefix="html" %>
    <%@ taglib uri="/tags/struts-logic" prefix="logic" %>

    <logic:iterate id="book" name="list" type="bean.Book">?
    ??????????? <br><html:link??
    ??????????????????? paramId="id" paramName="book" paramProperty="id"?
    ??????????????????? page="/messagedetail.do">?
    ??????????????????? <bean:write name="book" property="bookname" />?
    ??????????????? </html:link>?
    </logic:iterate>?

    <form action="/TestPage/page.do">
    ?? <logic:present name="previous">?
    ??????????? <html:link??
    ??????????????????? paramId="start" paramName="previous"?
    ??????????????????? page="/page.do">?
    ??????????????????? 上一頁?
    ??????????????? </html:link>?
    ?? </logic:present>?

    ?? <logic:present name="next">?
    ????????????? <html:link??
    ??????????????????? paramId="start" paramName="next"?
    ??????????????????? page="/page.do">?
    ??????????????????? 下一頁?
    ??????????????? </html:link>?
    ?? </logic:present>?

    每頁<c:out value="${page}"/>條記錄,共<c:out value="${pages}"/>頁? 跳到<input type="text"? name="go" size="3" maxlength="30" >
    <input type="submit" value="go" >
    </form>
    ?????????

    ?

    OK!!!!
    五、測試,請下載本實例的目錄結構TestPage,放入tomcat的webapps下,在瀏覽器中輸入:
    ???
    http://127.0.0.1:8080/TestPage/page.do?
    來源: java學習室
    ?

    posted @ 2006-05-03 20:04 feingto 閱讀(630) | 評論 (0)編輯 收藏

    一個高效簡潔的Struts分頁方法

    在網上看了幾個Structs分頁,感覺不是很完善,于是根據自己的經驗,寫了一個相對高效簡潔的分頁方法。由于本人水平有限,如果大家有什么更好的想法,歡迎不吝賜教。
      
      一、 開發環境
      
      我的開發環境是:JBuilder x + Weblogic 8.1 + Oracle 9i + Windows 2003 ,如果朋友們的開發環境不一樣亦無妨。
      
      二、開發思路
      
      既然講的是Struts,那自然離不了MVC,分頁顯示也是如此。
      
      1、 建立數據庫和對應的表,本例的表是TCertificate。
      
      2、 建立適當的模型組件,對應你要查詢數據庫中的表。這部分由DAO數據訪問層來實現,如果有的朋友對DAO不熟悉可以查詢一下相關資料。本例由CertificateDAO.java來實現。
      
      3 、建立分頁所需要的模型組件,由javaBean來充當,并與CertificateDAO實現分離。網上介紹的很多方法,都存在著數據與分頁組件藕合的現象,這也是本方法與其它分頁方法的主要不同之處。
      
      4、建立控制器組件,這部分由Struts 中的Action來實現。主要負責將實例化CertificateDAO,只取要顯示的數據記錄,存入ArrayList對象然后返回,并放到 request中。而分頁部分則根據分頁條件,單獨進行構造,避免了與DAO混在一起的情況發生。網上其它介紹的一些分頁方法中,基本上都是一次性讀出所有查詢的數據,然后再由分頁相關組件進行構造。這樣,如果數據量大的話,很容易形成瓶頸。在本例中由于不是一次性地讀出查詢的所有數據,而只是讀出一個頁面要顯示的數據記錄,這就節省了很多不必要的數據傳輸,提高了效率。本例中為CertificateAction.java。
      
       5、建立視圖組件,這部分由jsp來充當,為了不出現java 代碼,我們使用Struts提供的標簽庫,主要負責從request中取出剛剛放入的對象,通過反復調用CertificateAction以及 action參數,而實現分頁顯示。本例中為listcertificate.jsp。
      
      6、 建立并配置struts-config.xml。
      
      三、實例代碼
      
      確定好上面的開發思路后,代碼的實現就有單可循了。
      
      1、建數據庫和相應的表。
      
      2、數據邏輯層的相關代碼。
      
      1)、通用的DAO類:CommonDAO.java
      
      這是一個很多DAO都要繼承到的通用DAO類,是我根據實踐總結出來的,為了減少篇幅,這里只顯示和本例相關的代碼。
      
      java代碼:
      
      代碼:
      --------------------------------------------------------------------------------
      package com.xindeco.business ;
      import java.io.*;
      import java.sql.*;
      import java.util.*;
      import javax.sql.*;
      import java.lang.IllegalAccessException;
      import java.lang.reflect.InvocationTargetException;
      import org.apache.commons.beanutils.BeanUtils;
      public class DAO
      {
      protected DataSource ds;
      /**
      * 說明:取得當前查詢的總記錄數
      */
      public int getRows ()
      {
      return this.count;
      }
      public void rsHandler (ResultSet rs, int offset, int limit)
      {
      try
      {
      count = 0;
      rs.absolute ( -1) ;
      count = rs.getRow () ;
      if (offset <= 0)
      {
      rs.beforeFirst () ;
      }
      else
      {
      rs.absolute (offset) ;
      }
      }
      catch (Exception e)
      {
      e.printStackTrace () ;
      }
      }
      public DAO(DataSource ds) {
      this.ds = ds;
      }
      
      public void setDataSource(DataSource ds) {
      this.ds = ds;
      }
      
      protected void close(ResultSet rs) {
      if (rs != null) {
      try {
      rs.close();
      } catch (SQLException e) {
      }
      rs = null;
      }
      }
      
      protected void close(PreparedStatement pstmt) {
      if (pstmt != null) {
      try {
      pstmt.close();
      } catch (SQLException e) {
      }
      pstmt = null;
      }
      }
      protected void close(Connection conn) {
      if (conn != null) {
      try {
      conn.close();
      } catch (SQLException e) {
      e.printStackTrace();
      }
      conn = null;
      }
      }
      
      protected void rollback(Connection conn) {
      if (conn != null) {
      try {
      conn.rollback();
      } catch (SQLException e) {
      e.printStackTrace();
      }
      conn = null;
      }
      }
      }
      
      這個類主要是通過子類傳進來的先進結果集,取得查詢的記錄總數,并對數據庫連接進行簡單的管理。
      
      2)、對數據庫進行訪問:CertificateDAO.java
      
      java代碼:
      
      代碼:
      --------------------------------------------------------------------------------
      package com.xindeco.business;
      
      import java.io.*;
      import java.sql.*;
      import java.util.*;
      import javax.sql.*;
      
      import com.xindeco.common.dbconn.DbConn;
      
      public class CertificateDAO extends DAO
      {
      
      public NationDAO(DataSource ds) {
      super(ds);
      }
      
      public List findCertificateList(int offset,int limit) throws SQLException
      {
      int countRows = 0 ;
      ArrayList list = null ;
      Connection conn = null;
      PreparedStatement pstmt = null;
      ResultSet rs = null;
      try
      {
      conn = ds.getConnection();
      String sql =
      "SELECT certificateID, certificateCode,certificateName,photoURL,"
      + "description,graduateID FROM TCertificate " ;
      pstmt = conn.prepareStatement(sql);
      rs = pstmt.executeQuery();
      /*對游標進行處理,rsHandler 方法在父類DAO中*/
      this.rsHandler(rs,offset,limit);
      if (rs != null && rs.next ())
      {
      list = new ArrayList () ;
      do
      {
      countRows++ ;
      list.add (rs2VO (rs)) ;
      }
      while ( (countRows++ < limit) && rs.next ()) ;
      }
      close(rs);
      close(pstmt);
      } catch (SQLException e) {
      close(rs);
      close(pstmt);
      rollback(conn);
      e.printStackTrace();
      }
      finally {
      close(conn);
      }
      return list ;
      }
      
      private CertificateVO rs2VO (ResultSet rs)
      {
      try
      {
      CertificateVO certificateVO = new CertificateVO () ;
      certificateVO.setCertificateID (rs.getInt ("certificateID")) ;
      certificateVO.setCertificateCode (rs.getString ("certificateCode")) ;
      certificateVO.setCertificateName (rs.getString ("certificateName")) ;
      certificateVO.setPhotoURL (rs.getString ("photoURL")) ;
      certificateVO.setDescription (rs.getString ("description")) ;
      certificateVO.setGraduateID (rs.getInt ("graduateID")) ;
      return certificateVO ;
      }
      catch (Exception ex)
      {
      ex.printStackTrace () ;
      return null ;
      }
      }
      }
      
      findCertificateList(int offset,int limit)是查得所有要顯示的數據,并放入ArrayList中。看過網上有些例子,把數據記錄放入ArrayList的動作過程直接在while循環體里完成,如果字段多的話,會造成方法過于寵大,又不美觀。這里,數據記錄放入ArrayList的動作過程由rs2VO方法完成,就比較整潔了。另外,if (rs != null && rs.next ()) 配合while ( (countRows++ < limit) && rs.next ()) 是為了程序的健壯性考慮的,稍分析一下不難得出結論。
      
      3、建立控制器組件:CertificateAction.java
      
      java代碼:
      
      代碼:
      --------------------------------------------------------------------------------
      package com.xindeco.presentation;
      
      import javax.sql.* ;
      import java.util.* ;
      
      import javax.servlet.http.* ;
      import javax.servlet.* ;
      
      import org.apache.struts.action.* ;
      import org.apache.struts.util.* ;
      
      import com.xindeco.common.Pager;
      import com.xindeco.business.graduatedata.CertificateDAO ;
      
      public class CertificateAction
      extends Action
      {
      private static final int PAGE_LENGTH = 5 ; //每頁顯示5條記錄
      public ActionForward execute (ActionMapping mapping, Actionform form,
      HttpServletRequest request,
      HttpServletResponse response)
      {
      ActionForward myforward = null ;
      String myaction = mapping.getParameter () ;
      
      if (isCancelled (request))
      {
      return mapping.findForward ("failure") ;
      }
      if ("".equalsIgnoreCase (myaction))
      {
      myforward = mapping.findForward ("failure") ;
      }
      else if    ("LIST".equalsIgnoreCase (myaction))
      {
      myforward = performList (mapping, form, request, response) ;
      }
      else
      {
      myforward = mapping.findForward ("failure") ;
      }
      return myforward ;
      }
      
      private ActionForward performList (ActionMapping mapping,
      Actionform actionform,
      HttpServletRequest request,
      HttpServletResponse response)
      {
      try
      {
      DataSource ds = (DataSource) servlet.getServletContext().getAttribute(Action.DATA_SOURCE_KEY);
      
      CertificateDAO  certificateDAO = new CertificateDAO (ds) ;
      
      int offset = 0;  //翻頁時的起始記錄所在游標
      int length = PAGE_LENGTH;
      String pageOffset = request.getParameter("pager.offset");
      if (pageOffset == null || pageOffset.equals("")) {
      offset = 0;
      } else {
      offset = Integer.parseInt(pageOffset);
      }
      List certificateList = certificateDAO .findCertificateList (offset,length) ;
      int size = certificateDAO.getRows(); // 取得總記錄數
      String url = request.getContextPath()+"/"+mapping.getPath()+".do";
      String pagerHeader = Pager.generate(offset, size, length, url); //分頁處理
      
      request.setAttribute ("pager", pagerHeader) ;
      request.setAttribute ("list", certificateList) ;
      }
      catch (Exception e)
      {
      e.printStackTrace();
      return mapping.findForward ("error") ;
      }
      return mapping.findForward ("success") ;
      }
      }
      
      CertificateAction.java主要是把數據從DAO中取出,并放入一個ArrayList 中,然后通過配置文件再軟件View的JSP頁。
      
      5、建立視圖listcertificate.jsp文件。
      
      jsp代碼:
      
      代碼:
      --------------------------------------------------------------------------------
      
      <%@ page contentType="text/html; charset=GBK" %>
      <%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %>
      <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
      <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
      <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
      
      <table bgcolor="#666666" cellpadding="1" cellspacing="0" border="0" width="500">
      <tr>
      <td>
      <table cellpadding="0" cellspacing="0" border="0" width="500">
      <tr>
      <td bgcolor="#fecc51">&</td>
      </tr>
      </table>
      </td>
      </tr>
      <tr>
      <td>
      <table cellpadding="0" cellspacing="0" border="0" width="500">
      <tr>
      <td bgcolor="#d6e0ed">
      &&<bean:message key="label.list4certificate"/>
      </td>
      </tr>
      <tr bgcolor="#FFFFFF">
      <td width="5%"></td><td width="19%"></td><td width="76%"></td>
      </tr>
      <tr>
      <td>
      <table bgcolor="#f2f2f2" width="500" cellspacing="0" border="0">
      <tr bgcolor="#bacce1">
      <td><b><bean:message key="Certificate.select"/> </b></td>
      <td><b><bean:message key="Certificate.certificateID"/> </b></td>
      <td><b><bean:message key="Certificate.certificateCode"/></b></td>
      <td><b><bean:message key="Certificate.certificateName"/></b></td>
      <td><b><bean:message key="Certificate.view"/></b></td>
      </tr>
      
      <bean:write name="pager" property="description"/>
      <logic:equal name="pager" property="hasPrevious" value="true">
      <a href="/graduatedata/list.do?viewPage=<bean:write name="pager" property="previousPage"/>" class="a02">
      Previous
      </a>
      </logic:equal>
      <logic:equal name="pager" property="hasNext" value="true">
      <a href="/graduatedata/list.do?viewPage=<bean:write name="pager" property="nextPage"/>" class="a02">
      Next
      </a>
      </logic:equal>
      
      <logic:notEmpty name="list" scope="request">
      <logic:iterate id="certificate" name="list" type="com.xindeco.business.graduatedata.CertificateVO"scope="request">
      <tr bgcolor="#FFFFFF">
      <td><html:text property="name" value="<bean:write name="certificate" property="certificateID" scope="page"/>"/>
      </td>
      <td> <bean:write name="certificate" property="certificateID" scope="page"/></td>
      <td> <bean:write name="certificate" property="certificateCode" scope="page"/></td>
      <td> <bean:write name="certificate" property="certificateName" scope="page"/></td>
      <td> <bean:write name="certificate" property="photoURL" scope="page"/></td>
      </tr>
      </logic:iterate>
      </logic:notEmpty>
      </table>
      </td>
      </tr>
      </table>
      </td>
      </tr>
      </table>
      
      6、對應的配置文件struts-config.xml。
      
      java代碼:
      
      代碼:
      --------------------------------------------------------------------------------
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "  <struts-config>
      <form-beans>
      <form-bean name="certificateform" type="com.xindeco.presentation.graduatedata.Certificateform" />
      </form-beans>
      <global-forwards>
      <forward name="error" path="/error/error.jsp" />
      </global-forwards>
      <action-mappings>
      <action name="certificateform" parameter="LIST" path="/graduatedata/list" scope="request" type="com.xindeco.presentation.graduatedata.CertificateAction" validate="true">
      <forward name="success" path="/graduatedata/listcertificate.jsp" />
      </action>
      </action-mappings>
      ……
      </struts-config>
      
      7、最后當然是最重要的分頁代碼了:Pager.java
      
      java代碼:
      
      代碼:
      --------------------------------------------------------------------------------
      package com.xindeco.common;
      
      import java.util.* ;
      public class Pager {
      private static int MAX_PAGE_INDEX = 10; //頁腳顯示多少頁
      private static String HEADER = "Result page";
      
      public static String generate(int offset, int length, int size, String url) {
      if (length > size) {
      String pref;
      if (url.indexOf("?") > -1) {
      pref = "&";
      } else {
      pref = "?";
      }
      String header = "<font face='Helvetica' size='-1'>"+HEADER+": ";
      if (offset > 0) {
      header += "&<a href=\""+url+pref+"pager.offset="+(offset-size)+"\">[<< Prev]</a>\n";
      }
      int start;
      int radius = MAX_PAGE_INDEX/2*size;
      if (offset < radius) {
      start = 0;
      } else if(offset < length-radius) {
      start = offset - radius;
      } else {
      start = (length/size-MAX_PAGE_INDEX)*size;
      }
      for(int i=start;i<length && i < start + MAX_PAGE_INDEX*size;i+=size) {
      if (i == offset) {
      header += "<b>"+(i/size+1)+"</b>\n";
      } else {
      header += "&<a href=\""+url+pref+"pager.offset="+i+"\">"+(i/size+1)+"</a>\n";
      }
      }
      if(offset < length - size) {
      header += "&<a href=\""+url+pref+"pager.offset="+((int)offset+(int)size)+"\">[Next >>]</a>\n";
      }
      header += "</font>";
      return header;
      } else {
      return "";
      }
      }
      }
      
      這部分代碼的實現相當簡潔,但已經足夠完成所需了。

    posted @ 2006-05-03 20:04 feingto 閱讀(317) | 評論 (0)編輯 收藏

    用struts上傳文件

    用到的類import org.apache.struts.upload.FormFile;

    Jsp上傳頁面:

    ?

    <%@ page contentType="text/html; charset=GBK" %>

    <html>

    <head>

    <title>

    strutsUploadForm

    </title>

    </head>

    <body bgcolor="#ffffff">

    <h1>

    上傳測試

    </h1>

    <form action="uploadTestAction.do" method="post" enctype="multipart/form-data" name="form1">

    ? <p>文本

    ??? <input name="theText" type="text" id="theText">

    </p>

    ? <p>文件

    ??? <input name="theFile" type="file" id="theFile">

    </p>

    ? <p>保存到

    ??? <input name="saveTo" type="text" id="saveTo">

    </p>

    ? <p>

    ??? <input type="submit" name="Submit" value="提交">

    </p>

    </form>

    </body>

    </html>

    ?

    ?

    actionForm

    ?

    package hehe;

    ?

    import org.apache.struts.action.*;

    import javax.servlet.http.*;

    import org.apache.struts.upload.FormFile;

    ?

    public class UploadTestForm extends ActionForm {

    ? private String saveTo;

    ? private String theText;

    ? private org.apache.struts.upload.FormFile theFile;//文件框對應的是formFile類型

    ? public String getSaveTo() {

    ??? return saveTo;

    ? }

    ? public void setSaveTo(String saveTo) {

    ??? this.saveTo = saveTo;

    ? }

    ? public org.apache.struts.upload.FormFile getTheFile() {

    ??? return theFile;

    ? }

    ? public void setTheFile(org.apache.struts.upload.FormFile theFile) {

    ??? this.theFile = theFile;

    ? }

    ? public String getTheText() {

    ??? return theText;

    ? }

    ? public void setTheText(String theText) {

    ??? this.theText = theText;

    ? }

    ? public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {

    ??? /**@todo: finish this method, this is just the skeleton.*/

    ??? if(!this.getTheFile().getContentType().equals("image/pjpeg")){

    ????? System.out.println("不是jpg");

    ??? }//可以判斷類型

    ??? if(this.getTheFile().getFileSize()>100){

    ????? System.out.println("長度大于1000");

    ??? }//可以判斷大小

    ??? return null;

    ? }

    ? public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {

    ??? saveTo = null;

    ??? theFile = null;

    ??? theText = null;

    ? }

    }

    ?

    ?

    Action

    ?

    package hehe;

    ?

    import org.apache.struts.action.*;

    import org.apache.struts.upload.FormFile;

    import javax.servlet.http.*;

    import java.io.*;

    ?

    public class UploadTestAction

    ??? extends Action {

    ? public ActionForward execute(ActionMapping actionMapping,

    ?????????????????????????????? ActionForm actionForm,

    ?????????????????????????????? HttpServletRequest request,

    ?????????????????????????????? HttpServletResponse response) {

    ??? UploadTestForm uploadForm = (UploadTestForm) actionForm;

    ??? FormFile file = uploadForm.getTheFile();

    ??? String path = uploadForm.getSaveTo();

    ??? String theText = uploadForm.getTheText();

    ??? try {

    ????? InputStream input = file.getInputStream();//能從FormFile中獲得輸入流

    ????? OutputStream output = new FileOutputStream(path);

    ????? int bytesReader = 0;

    ????? byte[] readbuffer = new byte[8192];

    ????? while ( (bytesReader = input.read(readbuffer, 0, 8192)) != -1) {

    ??????? output.write(readbuffer, 0, bytesReader);

    ????? }

    ????? output.close();

    ??? }

    ??? catch (Exception e) {

    ????? e.printStackTrace();

    ??? }

    ??? request.setAttribute("theText", theText);

    ??? request.setAttribute("fileName", file.getFileName());//上傳的文件名

    ??? request.setAttribute("fileSize", new Integer(file.getFileSize()));//文件大小

    ??? request.setAttribute("fileType", file.getContentType());//文件類型

    ??? return actionMapping.findForward("success");

    ? }

    }

    ?

    ?

    結果頁面

    ?

    <%@ page contentType="text/html; charset=GBK" %>

    <html>

    <head>

    <title>

    strutsUploadResult

    </title>

    </head>

    <body bgcolor="#ffffff">

    <h1>

    上傳結果

    </h1>

    文件名:<%=request.getAttribute("fileName")%><br />

    文本:<%=request.getAttribute("theText")%><br />

    文件類型:<%=request.getAttribute("fileType")%><br />

    文件大小:<%=request.getAttribute("fileSize")%><br />

    </body>

    </html>

    posted @ 2006-05-03 20:03 feingto 閱讀(1165) | 評論 (1)編輯 收藏

    僅列出標題
    共3頁: 上一頁 1 2 3 下一頁 
    主站蜘蛛池模板: 亚洲永久网址在线观看| 亚洲精彩视频在线观看| 亚洲成av人在线观看网站| 亚洲精品动漫免费二区| 亚洲色中文字幕在线播放| 毛片网站免费在线观看| 亚洲精华国产精华精华液好用 | 成人免费a级毛片无码网站入口 | a毛片成人免费全部播放| 亚洲乱码日产精品a级毛片久久| 成人嫩草影院免费观看| 国产亚洲人成A在线V网站| 免费91麻豆精品国产自产在线观看| 国产亚洲高清不卡在线观看| 香蕉成人免费看片视频app下载| 亚洲综合综合在线| 成熟女人特级毛片www免费| 美女扒开屁股让男人桶爽免费| 亚洲国产成人五月综合网| 91精品成人免费国产| 亚洲国产美国国产综合一区二区| 无码精品A∨在线观看免费| 亚洲精品日韩一区二区小说| 亚洲精品国产自在久久| 久久成人免费大片| 2020久久精品亚洲热综合一本| 免费国产精品视频| 日本三级在线观看免费| 亚洲av乱码一区二区三区| 成人免费视频观看无遮挡| 日本中文字幕免费看| 亚洲人成在线影院| 四虎影视大全免费入口| 在线观看免费视频一区| 亚洲日本乱码卡2卡3卡新区| 亚洲AV中文无码乱人伦| 国产91免费视频| 人成免费在线视频| jiz zz在亚洲| 亚洲av无码成人黄网站在线观看 | 又粗又大又黑又长的免费视频|