龍行天下

            政 博
          隨筆 - 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 閱讀(1400) | 評論 (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 閱讀(675) | 評論 (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 閱讀(458) | 評論 (2)編輯 收藏

          在Struts框架內實現圖片上傳 (轉載:http://www.aygfsteel.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 閱讀(969) | 評論 (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 閱讀(1905) | 評論 (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 閱讀(414) | 評論 (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 閱讀(632) | 評論 (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 閱讀(318) | 評論 (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 閱讀(1166) | 評論 (1)編輯 收藏

          僅列出標題
          共3頁: 上一頁 1 2 3 下一頁 
          主站蜘蛛池模板: 博罗县| 丹巴县| 当涂县| 伊金霍洛旗| 双辽市| 勐海县| 文化| 资溪县| 大竹县| 灵武市| 庄河市| 繁昌县| 东山县| 六安市| 闸北区| 榆社县| 牙克石市| 寿阳县| 庄浪县| 吉木萨尔县| 朝阳区| 横山县| 德兴市| 屏东市| 乐至县| 无极县| 广宁县| 奈曼旗| 河源市| 阿克陶县| 丹寨县| 元氏县| 嘉善县| 静宁县| 页游| 连云港市| 尉氏县| 丹棱县| 比如县| 自贡市| 平昌县|