龙行天下

  政 博
随笔 - 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 阅读(1389) | 评论 (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 阅读(297) | 评论 (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 阅读(665) | 评论 (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 阅读(448) | 评论 (2)编辑 收藏

在Struts框架内实现图片上传 (转载:http://www.blogjava.net/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 阅读(957) | 评论 (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 阅读(1892) | 评论 (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 阅读(405) | 评论 (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"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">


<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="http://java.sun.com/jstl/core" %>
<%@ 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 阅读(621) | 评论 (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" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
  <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 阅读(307) | 评论 (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 阅读(1155) | 评论 (1)编辑 收藏

仅列出标题
共3页: 上一页 1 2 3 下一页