??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品午夜无码专区,日本久久久久亚洲中字幕,亚洲一区二区三区播放在线http://www.tkk7.com/feingto/category/10712.html&nbsp;&nbsp;? ?/description>zh-cnThu, 03 Jan 2008 02:25:31 GMTThu, 03 Jan 2008 02:25:31 GMT60怎么避免览器缓存静态文?/title><link>http://www.tkk7.com/feingto/archive/2008/01/03/172357.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Thu, 03 Jan 2008 01:19:00 GMT</pubDate><guid>http://www.tkk7.com/feingto/archive/2008/01/03/172357.html</guid><wfw:comment>http://www.tkk7.com/feingto/comments/172357.html</wfw:comment><comments>http://www.tkk7.com/feingto/archive/2008/01/03/172357.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/feingto/comments/commentRss/172357.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/feingto/services/trackbacks/172357.html</trackback:ping><description><![CDATA[<div id="fxbjzvx" class="postbody"> <p>对于动态文?比如 index.asp?id=...  或?index.aspx?id=... 怿有经验的E序员都知道怎样止览器缓存数据了.<br /> 但是对于静态文?css,jpg,gif{等), 在什么场合下面我们需要禁止浏览器~存他们,怎么?<br /> <br /> 本文讨论的主题是如何防缓? 其是如何防止静态文件被~存..<br /> <br /> <br /> ?nbsp; <a target="_blank">RE:对博客园URL的一些调整徏? 二域名不利于客L览器缓?/a> 一文中,我提C怎么最大化?br /> 利用览器缓存功?来提高客L览速度, 减轻服务器负担的.<br /> <br /> 但是事物L一分ؓ二的,q不是所有的场合都要使用~存? 有时候我们的数据被缓存了反而会l我们带来麻?<br /> <br /> 对于动态数据(从数据库d生成的那些)Q我们可以通过以下Ҏ来禁止浏览器~存?/p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">'</span><span style="color: #008000">asp Z 止~存</span><span style="color: #008000"><br /> </span><span style="color: #000000"><br /> Response.Buffer </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">True</span><span style="color: #000000"> <br /> Response.ExpiresAbsolute </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">Now</span><span style="color: #000000">() </span><span style="color: #000000">-</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000"> <br /> Response.Expires </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000"> <br /> Response.CacheControl </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">no-cache</span><span style="color: #000000">"</span><span style="color: #000000"> <br /> Response.AddHeader </span><span style="color: #000000">"</span><span style="color: #000000">Pragma</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">No-Cache</span><span style="color: #000000">"</span><span style="color: #000000"> </span></div> <p>对于Ajax 的请求(不管是静态数据还是动态数据):</p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">//</span><span style="color: #008000">以下三种Ҏ使用其中M一U方法都可以</span><span style="color: #008000"><br /> </span><span style="color: #000000">xmlhttp.setRequestHeader(</span><span style="color: #000000">"</span><span style="color: #000000">Cache-Control</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">no-cache</span><span style="color: #000000">"</span><span style="color: #000000">);  <br /> </span><span style="color: #008000">//</span><span style="color: #008000">或?/span><span style="color: #008000"><br /> </span><span style="color: #000000">xmlhttp.setRequestHeader(</span><span style="color: #000000">"</span><span style="color: #000000">If-Modified-Since</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> </span><span style="color: #008000">//</span><span style="color: #008000">或?/span><span style="color: #008000"><br /> </span><span style="color: #000000">xmlhttp.Open(url</span><span style="color: #000000">+</span><span style="color: #000000">'</span><span style="color: #000000">?</span><span style="color: #000000">rnd</span><span style="color: #000000">=</span><span style="color: #000000">'</span><span style="color: #000000">+</span><span style="color: #000000">Math.random(),....)<br /> </span></div> <p>如果使用 prototype.js  , 用类DL代码 <br /> new Ajax.Request(url,{method:"get",requestHeaders:[<span style="color: #000000">"</span><span style="color: #000000">Cache-Control</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">no-cache</span><span style="color: #000000">"</span>]})<br /> 或?br /> new Ajax.Request(url,{method:"get",requestHeaders:[<span style="color: #000000"><span style="color: #000000">"</span><span style="color: #000000">If-Modified-Since</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span></span>]})<br />  <br /> <br /> 什么情况下Q要止静态文件缓存:<br /> 1、经常可能要改动?js, css.<br />        比如 一个html 文gQ?test.html ?1.0版本中。可能是q样<br />      <script src="common.js"></script><br />      修改?nbsp; v1.1版本Q?br />  <script src="common.js"></script><br />  <script src="foo.js"></script><br />    新增加了一个foo.js  同时Q也改动了common.js , 在common.js 中定义了新的c,q在foo.js 中用了common.js.  <br /> <br /> 在这U情况下如果以前用户览q?1.0版本?html 文gQ那么他的浏览器自动~存?common.js<br /> 当他览新版本的时候,因ؓ使用的是 v1.1?foo.js ?v1.0?common.js Q这样将D脚本出错?br /> <br /> <br /> 解决Ҏ探讨Q?br />   因ؓcss,js 是通过 <script src=....> q种方式加蝲的,所以,很难使用 asp 的U服务器端禁止缓存的办法。也很难使用ajax的通过讄 httph头的办法止使用~存?br /> <br /> 看来随机数是个好办法?/p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">//</span><span style="color: #008000">Ҏ一Q?/span><span style="color: #008000"><br /> </span><span style="color: #000000">document.write(</span><span style="color: #000000">"</span><span style="color: #000000"><script src='test.js?rnd=</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">Math.random()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">'></s</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">cript></span><span style="color: #000000">"</span><span style="color: #000000">)<br /> <br /> </span><span style="color: #008000">//</span><span style="color: #008000">Ҏ二:</span><span style="color: #008000"><br /> </span><span style="color: #0000ff">var</span><span style="color: #000000"> js</span><span style="color: #000000">=</span><span style="color: #000000">document.createElement(</span><span style="color: #000000">"</span><span style="color: #000000">script</span><span style="color: #000000">"</span><span style="color: #000000">)<br /> js.src</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">test.js</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">Math.random()<br /> document.body.appendChild(js)</span></div> <p><br /> 但是Q如果采用随机数的话Q?js文g永q得不到~存Q每ơ都必须重新从服务器加蝲Q即使没有Q何更攏V?br /> 大家如果l常上国外网站的话,可以看到他们通常采用q样的方式来解决Q?br /> <script src="test.js?ver=113"></script><br /> 其中 ver=113 ?113是版本P一般都是采?CVS 或其他工L成的开发版本号?br /> <br /> q样真正做到了应该缓存的时候缓存静态文Ӟ当版本有更新的时候从获取最新的版本Qƈ更新~存?br /> 对于囑փ <img src="test.jps?ver=在CVS的版本号"> 来有效利用和更新~存.<br /> <br /> <br /> 唉,现在在CSDN的Web版,不知道有多少人在重复问着同一个问题?#8220;怎么通过E序删除清空客户端的览器缓?#8221;.........</p> <p> </p> <p>未完待箋Q?<br /> <br /> 下一:  利用览器缓存来改善用户体验。。。。Ajax模式之预先加?br /> <br /> 敬请xQ等我写完再加上链接<br /> </p> </div> <img src ="http://www.tkk7.com/feingto/aggbug/172357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/feingto/" target="_blank">feingto</a> 2008-01-03 09:19 <a href="http://www.tkk7.com/feingto/archive/2008/01/03/172357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp中的旉操作http://www.tkk7.com/feingto/archive/2006/05/10/45375.htmlfeingtofeingtoWed, 10 May 2006 02:41:00 GMThttp://www.tkk7.com/feingto/archive/2006/05/10/45375.htmlhttp://www.tkk7.com/feingto/comments/45375.htmlhttp://www.tkk7.com/feingto/archive/2006/05/10/45375.html#Feedback1http://www.tkk7.com/feingto/comments/commentRss/45375.htmlhttp://www.tkk7.com/feingto/services/trackbacks/45375.htmljsp中的旉操作

l常看见jsp版里有h问时间操作的问题Q这些问题一般包括:取当前时_把一个指定的字符串时间{化成旉cdQ求两个旉之间的天敎ͼ求一D|间以前的旉Q求一D|间以后的旉Q在q里把q些问题汇M下?br /><%@  page  contentType="text/html;charset=gb2312"%>
<%@ page import="java.text.*"%>
<%@ page import="java.util.*"%>
<%
//字符串{化成旉cdQ字W串可以是Q意类型,只要和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>");
//1q前日期
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>");
//两个旉之间的天?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>");
//q月周求日期
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>");
//求是星期?br />mydate= myFormatter.parse("2001-1-1");
SimpleDateFormat formatter4 = new SimpleDateFormat("E");
String mydate3=formatter4.format(mydate);
out.println(mydate3);
out.println("<br>");
%>



feingto 2006-05-10 10:41 发表评论
]]>
hibernate的中文问题的解决Ҏhttp://www.tkk7.com/feingto/archive/2006/05/08/45003.htmlfeingtofeingtoMon, 08 May 2006 06:42:00 GMThttp://www.tkk7.com/feingto/archive/2006/05/08/45003.htmlhttp://www.tkk7.com/feingto/comments/45003.htmlhttp://www.tkk7.com/feingto/archive/2006/05/08/45003.html#Feedback2http://www.tkk7.com/feingto/comments/commentRss/45003.htmlhttp://www.tkk7.com/feingto/services/trackbacks/45003.htmlpȝ配置:win2k3 server,jsdk 1.5.0 rc,mysql 4.0.20a,hibernate 2.1.0 ,elcipse 3.0.1
问题描述:在用hibernate作ؓ数据持久层的ҎӞ照样会遇C文问题,具体情况时插入到数据库中的汉字显CZؓ??Q显C数据时汉字??
探烦: l过试验发现与汉字编码有关的地方有以下两处,一个是数据库连接url Q一个是~程时获取Configuration cȝ实例的语句的方式?br />Ҏ1:
    * ~程时获取Configuration cȝ实例的语句ؓ
    * new Configuration().addClass(xx.class);
    必须在hibernate.properties文g里数据库q接url后加?characterEncoding=gbk&useUnicode=true
Ҏ2:
    * ~程时获取Configuration cȝ实例的语句ؓ
    * new Configuration().configure().
    在hibernate.cfg.xml文g?lt;session-factory/>块中讄
        <property name="connection.useUnicode">true</property>
        <property name="connection.characterEncoding">UTF-8</property>
    或编E时?
      Properties extraProperties = new Properties();
      extraProperties.put("hibernate.connection.useUnicode", "true");
      extraProperties.put("hibernate.connection.characterEncoding", "UTF-8");
      myConfiguration.addProperties(extraProperties);

原来怀疑与xml面的编码有兌了一下,好像不v作用?br />



feingto 2006-05-08 14:42 发表评论
]]>
在Struts框架内实现图片上?(转蝲:http://www.tkk7.com/Todayfreeman/)http://www.tkk7.com/feingto/archive/2006/05/03/44466.htmlfeingtofeingtoWed, 03 May 2006 12:09:00 GMThttp://www.tkk7.com/feingto/archive/2006/05/03/44466.htmlhttp://www.tkk7.com/feingto/comments/44466.htmlhttp://www.tkk7.com/feingto/archive/2006/05/03/44466.html#Feedback0http://www.tkk7.com/feingto/comments/commentRss/44466.htmlhttp://www.tkk7.com/feingto/services/trackbacks/44466.html

q个问题让我郁闷了两三天旉,最后才发现问题是在JSP端?<html:form action="/uploadsAction"  enctype="multipart/form-data"  >
标签如果了"  enctype="multipart/form-data"  服务器就会报?
下面把代码脓出来.

JSP?br /> <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文g夹内 如果文g大于20K或是宽&高超q规定范围的,会重新勾?实现对上传图片的控制.
当然q只是测试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");
    }
}



feingto 2006-05-03 20:09 发表评论
]]>
Struts1.2中配|数据源http://www.tkk7.com/feingto/archive/2006/05/03/44465.htmlfeingtofeingtoWed, 03 May 2006 12:05:00 GMThttp://www.tkk7.com/feingto/archive/2006/05/03/44465.htmlhttp://www.tkk7.com/feingto/comments/44465.htmlhttp://www.tkk7.com/feingto/archive/2006/05/03/44465.html#Feedback1http://www.tkk7.com/feingto/comments/commentRss/44465.htmlhttp://www.tkk7.com/feingto/services/trackbacks/44465.html软g环境QTomcat5.5.15,Eclipse3.1.2,MyEclipse4.1,MySQL5.0.15,Resin3.0.18

配置q程Q?/p>

一、下载必要的jar包。有四个包要下蝲Q网上有贴子说只要下面前三个包就可以了,但我在配|的时候如果没有第四个包会报错Q?br />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目录下,q有要把MySQL的驱动程序包也放到这里(也可以把数据库的驱动包放?Tomcat_Home%/common/lib目录下或%Resin_Home%/lib目录下,q样在启动Web服务器的时候就会加载这个包Q服务器和Web应用都可以用驱动程序类Q?/p>

二、在struts-config.xml中添加Data Source。MyEclipse的Design模式下可以可视化地编辑struts-config.xml和添加Data SourceQ但它在struts-config.xml中生成的数据源的代码是错误的Q就是因个耽误了我很多旉Q?br />我们手工~辑代码Q?/p>

  <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 sourceQ可以给每个data source指定不同的keyQ然后在E序中根据key指定要引用的数据源?/p>

三、测试数据源。配|好以后可以在ActionServlet中用了?/p>

  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>

注意Q蓝色字体的部分?.1?.2在配|上不一L地方?br />



feingto 2006-05-03 20:05 发表评论
]]>
一个高效简z的Struts分页Ҏhttp://www.tkk7.com/feingto/archive/2006/05/03/44462.htmlfeingtofeingtoWed, 03 May 2006 12:04:00 GMThttp://www.tkk7.com/feingto/archive/2006/05/03/44462.htmlhttp://www.tkk7.com/feingto/comments/44462.htmlhttp://www.tkk7.com/feingto/archive/2006/05/03/44462.html#Feedback0http://www.tkk7.com/feingto/comments/commentRss/44462.htmlhttp://www.tkk7.com/feingto/services/trackbacks/44462.html  
  一?开发环?br />  
  我的开发环境是QJBuilder x + Weblogic 8.1 + Oracle 9i + Windows 2003 Q如果朋友们的开发环境不一样亦无妨?br />  
  二、开发思\
  
  既然讲的是StrutsQ那自然M了MVCQ分|CZ是如此?br />  
  1?建立数据库和对应的表Q本例的表是TCertificate?br />  
  2?建立适当的模型组Ӟ对应你要查询数据库中的表。这部分由DAO数据讉K层来实现Q如果有的朋友对DAO不熟悉可以查询一下相兌料。本例由CertificateDAO.java来实现?br />  
  3 、徏立分|需要的模型lgQ由javaBean来充当,q与CertificateDAO实现分离。网上介l的很多ҎQ都存在着数据与分늻件藕合的现象Q这也是本方法与其它分页Ҏ的主要不同之处?br />  
  4、徏立控制器lgQ这部分由Struts 中的Action来实现。主要负责将实例化CertificateDAOQ只取要昄的数据记录,存入ArrayList对象然后q回Qƈ攑ֈ request中。而分部分则Ҏ分页条gQ单独进行构造,避免了与DAO混在一L情况发生。网上其它介l的一些分|法中Q基本上都是一ơ性读出所有查询的数据Q然后再由分늛关组件进行构造。这P如果数据量大的话Q很Ҏ形成瓉。在本例中由于不是一ơ性地d查询的所有数据,而只是读Z个页面要昄的数据记录,q就节省了很多不必要的数据传输,提高了效率。本例中为CertificateAction.java?br />  
   5、徏立视囄Ӟq部分由jsp来充当,Z不出现java 代码Q我们用Struts提供的标{ֺQ主要负责从request中取出刚刚放入的对象Q通过反复调用CertificateAction以及 action参数Q而实现分|C。本例中为listcertificate.jsp?br />  
  6?建立q|struts-config.xml?br />  
  三、实例代?br />  
  定好上面的开发思\后,代码的实现就有单可@了?br />  
  1、徏数据库和相应的表?br />  
  2、数据逻辑层的相关代码?br />  
  1Q、通用的DAOc:CommonDAO.java
  
  q是一个很多DAO都要l承到的通用DAOc,是我Ҏ实践ȝ出来的,Z减少幅Q这里只昄和本例相关的代码?br />  
  java代码:
  
  代码Q?br />  --------------------------------------------------------------------------------
  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;
  }
  }
  }
  
  q个cM要是通过子类传进来的先进l果集,取得查询的记录LQƈҎ据库q接q行单的理?br />  
  2Q、对数据库进行访问:CertificateDAO.java
  
  java代码:
  
  代码Q?br />  --------------------------------------------------------------------------------
  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 Ҏ在父cDAO?/
  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)是查得所有要昄的数据,q放入ArrayList中。看q网上有些例子,把数据记录放入ArrayList的动作过E直接在while循环体里完成Q如果字D多的话Q会造成Ҏq于宠大Q又不美观。这里,数据记录攑օArrayList的动作过E由rs2VOҎ完成Q就比较整洁了。另外,if (rs != null && rs.next ()) 配合while ( (countRows++ < limit) && rs.next ()) 是ؓ了程序的健壮性考虑的,E分析一下不隑־出结论?br />  
  3、徏立控制器lgQCertificateAction.java
  
  java代码:
  
  代码Q?br />  --------------------------------------------------------------------------------
  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条记?br />  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;  //页时的起始记录所在游?br />  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中取出,q放入一个ArrayList 中,然后通过配置文g再Y件View的JSPc?br />  
  5、徏立视图listcertificate.jsp文g?br />  
  jsp代码:
  
  代码Q?br />  --------------------------------------------------------------------------------
  
  <%@ 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、对应的配置文gstruts-config.xml?br />  
  java代码:
  
  代码Q?br />  --------------------------------------------------------------------------------
  <?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>
  …?br />  </struts-config>
  
  7、最后当然是最重要的分代码了QPager.java
  
  java代码:
  
  代码Q?br />  --------------------------------------------------------------------------------
  package com.xindeco.common;
  
  import java.util.* ;
  public class Pager {
  private static int MAX_PAGE_INDEX = 10; //脚昄多少?br />  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 "";
  }
  }
  }
  
  q部分代码的实现相当z,但已l够完成所需了?

feingto 2006-05-03 20:04 发表评论
]]>
struts中的分页实例http://www.tkk7.com/feingto/archive/2006/05/03/44463.htmlfeingtofeingtoWed, 03 May 2006 12:04:00 GMThttp://www.tkk7.com/feingto/archive/2006/05/03/44463.htmlhttp://www.tkk7.com/feingto/comments/44463.htmlhttp://www.tkk7.com/feingto/archive/2006/05/03/44463.html#Feedback0http://www.tkk7.com/feingto/comments/commentRss/44463.htmlhttp://www.tkk7.com/feingto/services/trackbacks/44463.htmlstruts中的分页实例 
  
    q仅是一个入门实例,z实用,从网上整理而来Q供参考。这里仅列出部分文gQ其它文件、数据库及目录结构请从本站下载?
一、struts-config.xml配置Q主要是配数据库,q里用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>

二、Actionc?
?page.do?start=1 来显C第一个页面?
参数说明Q?
  listQ信息列表?
  startQ开始位|?
  pageQ每|C的信息数目 
  pages: 总页?
  previousQ上开始位|?
  nextQ下开始位|?

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"));
  } 
}


三、beancBook.java
package bean;
import java.sql.*;
import java.util.ArrayList;
public class Book {
 int id;
 private String bookname; //书名
 private String author;   //作?
 private String price;    //h
 
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}"/>条记??lt;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 
来源Q?java学习?br /> 



feingto 2006-05-03 20:04 发表评论
]]>
Struts+Hibernate开发实?分页的实?/title><link>http://www.tkk7.com/feingto/archive/2006/05/03/44464.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Wed, 03 May 2006 12:04:00 GMT</pubDate><guid>http://www.tkk7.com/feingto/archive/2006/05/03/44464.html</guid><wfw:comment>http://www.tkk7.com/feingto/comments/44464.html</wfw:comment><comments>http://www.tkk7.com/feingto/archive/2006/05/03/44464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/feingto/comments/commentRss/44464.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/feingto/services/trackbacks/44464.html</trackback:ping><description><![CDATA[ <p>在进行web应用开发的时候经常要q行分页处理Q经常看C些h在问分页处理的问题,现在我把自己的处理方法写在这儿,希望能对需要进行分处理的朋友有所帮助?</p> <p>一、在struts中分|两种l构Q?<br />    1. 在Action中通过DAO查询出所有的记录Q然后加到session或request对象中,传到客户端,由JSPq行分页。这U方法对于在数据量少的时候很方便Q也不媄响速度?<br />    2.在Action中每ơ通过DAO只查询出一늚记录Q再传给JSP面。这U结构对于数据量大的E序很好Q但对于数据量小的情况,会增加对服务器的hQ加大服务器的负载?<br />      <br />二、Hibernate查询 <br />    ׃在Hibernate中直接提供了Ҏ据库定点定量的查询方法,所以我采用的是W?U方法?</p> <p>如: <br />从第1万条开始取?00条记?<br />Query q = session.createQuery("from Cat as c"); <br />q.setFirstResult(10000); <br />q.setMaxResults(100); <br />List l = q.list(); </p> <p>三、具体实?</p> <p> 1.Pagerc?</p> <p>package com.jpcf.db.helper; </p> <p>import java.math.*; </p> <p>public class Pager { <br />  private int totalRows; //总行?<br />  private int pageSize = 10; //每页昄的行?<br />  private int currentPage; //当前号 <br />  private int totalPages; //总页?<br />  private int startRow; //当前在数据库中的v始行 </p> <p>  public Pager() { <br />  } </p> <p>  public Pager(int _totalRows) { <br />    totalRows = _totalRows; <br />    totalPages=totalRows/pageSize; <br />    int mod=totalRows%pageSize; <br />    if(mod>0){ <br />      totalPages++; <br />    } <br />    currentPage = 1; <br />    startRow = 0; <br />  } </p> <p>  public int getStartRow() { <br />    return startRow; <br />  } </p> <p>  public int getTotalPages() { <br />    return totalPages; <br />  } </p> <p>  public int getCurrentPage() { <br />    return currentPage; <br />  } </p> <p>  public int getPageSize() { <br />    return pageSize; <br />  } </p> <p>  public void setTotalRows(int totalRows) { <br />    this.totalRows = totalRows; <br />  } </p> <p>  public void setStartRow(int startRow) { <br />    this.startRow = startRow; <br />  } </p> <p>  public void setTotalPages(int totalPages) { <br />    this.totalPages = totalPages; <br />  } </p> <p>  public void setCurrentPage(int currentPage) { <br />    this.currentPage = currentPage; <br />  } </p> <p>  public void setPageSize(int pageSize) { <br />    this.pageSize = pageSize; <br />  } </p> <p>  public int getTotalRows() { <br />    return totalRows; <br />  } </p> <p>  public void first() { <br />    currentPage = 1; <br />    startRow = 0; <br />  } </p> <p>  public void previous() { <br />    if (currentPage == 1) { <br />      return; <br />    } <br />    currentPage--; <br />    startRow = (currentPage - 1) * pageSize; <br />  } </p> <p>  public void next() { <br />    if (currentPage < totalPages) { <br />      currentPage++; <br />    } <br />    startRow = (currentPage - 1) * pageSize; <br />  } </p> <p>  public void last() { <br />    currentPage = totalPages; <br />    startRow = (currentPage - 1) * pageSize; <br />  } </p> <p>  public void refresh(int _currentPage) { <br />    currentPage = _currentPage; <br />    if (currentPage > totalPages) { <br />      last(); <br />    } <br />  } </p> <p>} </p> <p>Pagercȝ于计首c前一c下一c尾늚在数据库中的起始行,当前的页码?</p> <p>2.PagerHelpc?</p> <p>package com.jpcf.db.helper; </p> <p>import javax.servlet.http.*; </p> <p>public class PagerHelper { </p> <p>  public static Pager getPager(HttpServletRequest httpServletRequest,int totalRows) { </p> <p>    //定义pager对象Q用于传到页?<br />    Pager pager = new Pager(totalRows); </p> <p>    //从Request对象中获取当前页?<br />    String currentPage = httpServletRequest.getParameter("currentPage"); </p> <p>    //如果当前号为空Q表CZؓ首次查询该页 <br />    //如果不ؓI,则刷新pager对象Q输入当前页L信息 <br />    if (currentPage != null) { <br />      pager.refresh(Integer.parseInt(currentPage)); <br />    } </p> <p>    //获取当前执行的方法,首页Q前一,后一,N?<br />    String pagerMethod = httpServletRequest.getParameter("pageMethod"); </p> <p>    if (pagerMethod != null) { <br />      if (pagerMethod.equals("first")) { <br />        pager.first(); <br />      } else if (pagerMethod.equals("previous")) { <br />        pager.previous(); <br />      } else if (pagerMethod.equals("next")) { <br />        pager.next(); <br />      } else if (pagerMethod.equals("last")) { <br />        pager.last(); <br />      } <br />    } <br />    return pager; <br />  } <br />} </p> <p>PageHelperq个c,我不用说应该也知道用来干嘛了 </p> <p>3.DAOc?</p> <p>package com.jpcf.db.dao; </p> <p>import com.jpcf.db.model.*; <br />import com.jpcf.db.helper.HibernateUtil; <br />import net.sf.hibernate.*; <br />import java.util.*; <br />import com.jpcf.db.controller.*; </p> <p>public class VehiclePropertyDAO { </p> <p>  public Collection findWithPage(int pageSize, int startRow) throws HibernateException { <br />    Collection vehicleList = null; <br />    Transaction tx = null; <br />    try { <br />      Session session = HibernateUtil.currentSession(); <br />      tx = session.beginTransaction(); <br />      Query q = session.createQuery("from VehicleProperty vp"); <br />      q.setFirstResult(startRow); <br />      q.setMaxResults(pageSize); <br />      vehicleList = q.list(); <br />      tx.commit(); <br />    } catch (HibernateException he) { <br />      if (tx != null) { <br />        tx.rollback(); <br />      } <br />      throw he; <br />    } finally { <br />      HibernateUtil.closeSession(); <br />    } <br />    return vehicleList; <br />  } </p> <p>  public int getRows(String query) throws HibernateException { <br />    int totalRows = 0; <br />    Transaction tx = null; <br />    try { <br />      Session session = HibernateUtil.currentSession(); <br />      tx = session.beginTransaction(); <br />      totalRows = ((Integer) session.iterate(query).next()).intValue(); <br />      tx.commit(); <br />    } catch (HibernateException he) { <br />      if (tx != null) { <br />        tx.rollback(); <br />      } <br />      throw he; <br />    } finally { <br />      HibernateUtil.closeSession(); <br />    } </p> <p>    return totalRows; <br />  } </p> <p>} <br />DAOcLpq些分页需要的代码了?<br />“from VehicleProperty vp”也可以用一个参Cq来Q有兴趣的自己改一下吧 </p> <p>4.Action </p> <p>下面是在Action中用到的代码Q?<br />  public ActionForward execute(ActionMapping actionMapping, <br />                                     ActionForm actionForm, <br />                                     HttpServletRequest httpServletRequest, <br />                                     HttpServletResponse httpServletresponse) { <br />     Collection clInfos = null;//用于输出到页面的记录集合 <br />     int totalRows;//记录总行?<br />     VehiclePropertyDAO vehicleDAO = new VehiclePropertyDAO(); </p> <p>    //取得当前表中的总行?<br />    try { <br />      totalRows = vehicleDAO.getRows("select count(*) from VehicleProperty"); <br />    } catch (Exception ex) { <br />      servlet.log(ex.toString()); <br />      return actionMapping.findForward(Constants.FAILURE); <br />    } </p> <p>    //通过PagerHelpercL获取用于输出到页面的pager对象 <br />    Pager pager=PagerHelper.getPager(httpServletRequest,totalRows); </p> <p>    //取出从startRow开始的pageSize行记?<br />    try { <br />      clInfos = vehicleDAO.findWithPage(pager.getPageSize(), pager.getStartRow()); <br />    } catch (Exception ex) { <br />      servlet.log(ex.toString()); <br />      return actionMapping.findForward(Constants.FAILURE); <br />    } </p> <p>    //把输出的记录集和pager对象保存到request对象?<br />    httpServletRequest.setAttribute("CLINFOS", clInfos); <br />    httpServletRequest.setAttribute("PAGER", pager); </p> <p>    return actionMapping.findForward(Constants.SUCCESS); <br />  } </p> <p>   查询语句select count(*) from VehicleProperty 也可以换成你需要的L的条Ӟselect count(*)  </p> <p>from VehicleProperty where ..) </p> <p> <br />5.JSP面使用 </p> <p>下面是在JSP中的应用了: </p> <p><td colspan="8" align="right" class="head"> <br />   W?lt;bean:write name="PAGER" property="currentPage"/>?<br />   ?lt;bean:write name="PAGER" property="totalPages"/>?<br />   <html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=first"  <br />paramName="PAGER" paramProperty="currentPage" paramId="currentPage">首页</html:link> <br />   <html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=previous"  <br />paramName="PAGER" paramProperty="currentPage" paramId="currentPage">上一?lt;/html:link> <br />   <html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=next"  <br />paramName="PAGER" paramProperty="currentPage" paramId="currentPage">下一?lt;/html:link> <br />   <html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=last"  <br />paramName="PAGER" paramProperty="currentPage" paramId="currentPage">N</html:link> <br /></td> </p> <p>   解释一下这一?"/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=first <br />method=queryWithPage 是由于我的Actionl承的是DispatchAction,需要一个method参数 <br />pageMethod=first 是用来在PageHelpercM判断执行哪个操作 </p> <p>四、ȝ </p> <p>    我做的这个也只是一个借鉴Q还有很多没有实现的Q比如还可以加一?go 直接到第n늚功能?<br />    其实最关键的是把当前页号和要执行的是功?上一,下一?的参C面传进来,在Action中就可以Ҏq两个参数去取下一个页面上要显C的记录集了?</p> <img src ="http://www.tkk7.com/feingto/aggbug/44464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/feingto/" target="_blank">feingto</a> 2006-05-03 20:04 <a href="http://www.tkk7.com/feingto/archive/2006/05/03/44464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate查询解决Ҏhttp://www.tkk7.com/feingto/archive/2006/05/03/44460.htmlfeingtofeingtoWed, 03 May 2006 12:03:00 GMThttp://www.tkk7.com/feingto/archive/2006/05/03/44460.htmlhttp://www.tkk7.com/feingto/comments/44460.htmlhttp://www.tkk7.com/feingto/archive/2006/05/03/44460.html#Feedback0http://www.tkk7.com/feingto/comments/commentRss/44460.htmlhttp://www.tkk7.com/feingto/services/trackbacks/44460.html阅读全文

feingto 2006-05-03 20:03 发表评论
]]>
用struts上传文ghttp://www.tkk7.com/feingto/archive/2006/05/03/44461.htmlfeingtofeingtoWed, 03 May 2006 12:03:00 GMThttp://www.tkk7.com/feingto/archive/2006/05/03/44461.htmlhttp://www.tkk7.com/feingto/comments/44461.htmlhttp://www.tkk7.com/feingto/archive/2006/05/03/44461.html#Feedback1http://www.tkk7.com/feingto/comments/commentRss/44461.htmlhttp://www.tkk7.com/feingto/services/trackbacks/44461.html用到的类import org.apache.struts.upload.FormFile;

Jsp上传面Q?

 

<%@ 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>文g

    <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;//文g框对应的是formFilecd

  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");

    }//可以判断cd

    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()));//文g大小

    request.setAttribute("fileType", file.getContentType());//文gcd

    return actionMapping.findForward("success");

  }

}

 

 

l果面

 

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

<html>

<head>

<title>

strutsUploadResult

</title>

</head>

<body bgcolor="#ffffff">

<h1>

上传l果

</h1>

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

文本Q?lt;%=request.getAttribute("theText")%><br />

文gcdQ?lt;%=request.getAttribute("fileType")%><br />

文g大小Q?lt;%=request.getAttribute("fileSize")%><br />

</body>

</html>



feingto 2006-05-03 20:03 发表评论
]]>
struts错误和信息的处理http://www.tkk7.com/feingto/archive/2006/05/03/44458.htmlfeingtofeingtoWed, 03 May 2006 12:02:00 GMThttp://www.tkk7.com/feingto/archive/2006/05/03/44458.htmlhttp://www.tkk7.com/feingto/comments/44458.htmlhttp://www.tkk7.com/feingto/archive/2006/05/03/44458.html#Feedback0http://www.tkk7.com/feingto/comments/commentRss/44458.htmlhttp://www.tkk7.com/feingto/services/trackbacks/44458.html 1. 错误和信息的处理 .

首先在资源文件中定义错误信息和普通信?/span> . ?/span> :MessageResources.properties 中定义如?/span> :

java 代码



#
# Resources
for testing <html:errors> tag.
#

errors.header=<table>
errors.footer=</table>
errors.prefix=<tr><td>
errors.suffix=</td></tr>

property1error1=Property 1,
Error 1
property2error1=Property 2,
Error 1
property2error2=Property 2,
Error 2
property2error3=Property 2,
Error 3
property3error1=Property 3,
Error 1
property3error2=Property 3,
Error 2
globalError=Global
Error

#
# Resources
for testing <html:messages> tag.
#

messages.header=<table>
messages.footer=</table>

property1message1=Property 1, Message 1
property2message1=Property 2, Message 1
property2message2=Property 2, Message 2
property2message3=Property 2, Message 3
property3message1=Property 3, Message 1
property3message2=Property 3, Message 2
globalMessage=Global Message

 



在程序中定义错误和信息类 , q个例子写在 JSP ?/span>

java 代码



<%
      ActionErrors errors =
new ActionErrors();
      errors.add("property1",
new ActionError("property1error1"));
      errors.add("property2",
new ActionError("property2error1"));
      errors.add("property2",
new ActionError("property2error2"));
      errors.add("property2",
new ActionError("property2error3"));
      errors.add("property3",
new ActionError("property3error1"));
      errors.add("property3",
new ActionError("property3error2"));
      errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError("globalError"));
      request.setAttribute(Globals.ERROR_KEY, errors);

      ActionMessages messages =
new ActionMessages();
      messages.add("property1",
new ActionMessage("property1message1"));
      messages.add("property2",
new ActionMessage("property2message1"));
      messages.add("property2",
new ActionMessage("property2message2"));
      messages.add("property2",
new ActionMessage("property2message3"));
      messages.add("property3",
new ActionMessage("property3message1"));
      messages.add("property3",
new ActionMessage("property3message2"));
      messages.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("globalMessage"));
      request.setAttribute(Globals.MESSAGE_KEY, messages);
    %>

 





昄错误 :

java 代码



<html:errors property="property1" />
<html:errors property="property2" />

 


昄信息 :

java 代码



<html:messages property="property1" message="
true " id="msg" header="messages.header" footer="messages.footer">
            <tr>
              <td>
                     <%= pageContext.getAttribute("msg") %>
              </td>
            </tr>
          </html:messages>

<html:messages message="
true " id="msg" header="messages.header" footer="messages.footer">
            <tr>
              <td>
               <%= pageContext.getAttribute("msg") %>
              </td>
            </tr>
</html:messages>

 

 



feingto 2006-05-03 20:02 发表评论
]]>
struts在URI后面传参数的问题http://www.tkk7.com/feingto/archive/2006/05/03/44459.htmlfeingtofeingtoWed, 03 May 2006 12:02:00 GMThttp://www.tkk7.com/feingto/archive/2006/05/03/44459.htmlhttp://www.tkk7.com/feingto/comments/44459.htmlhttp://www.tkk7.com/feingto/archive/2006/05/03/44459.html#Feedback0http://www.tkk7.com/feingto/comments/commentRss/44459.htmlhttp://www.tkk7.com/feingto/services/trackbacks/44459.html在struts标签<html:link>的page属性指定的URI后面传递参数可以有几种方式Q?
1.若明参数名和参数值则直接在URI后输出,
如:<html:link page="/test.do?action=add">add</html:link>

2.对于参数g定的,paramName和paramProperty来输出,用paramId属性指定参数名?br />对于paramName指定的对象应该存在于page、request、session、application其中之一。一般来_是从ActioncMq来的,作ؓrequest的属性之一Qrequst.setAttribute("name",object)Q?br />如果paramName指定的对象是action的ActionFormQ则无需使用request.setAttributeҎ?br />例:<html:link page="/test.do" paramId="userid" paramName="uid">uname</html:link>
若参数值是一个bean对象的属性|比如ActionForm,或者集合中存放的对象)则:
<html:link page="/test.do" paramId="userid" paramName="user" paramProperty="uid">uname</html:link>

3.若两个参敎ͼ一个确定一个不定Q则是以上两U方法的l合Q即Q?br /><html:link page="/test.do?action=modify" paramId="userid" paramName="uid">modify</html:link>

4.对于多个参数的问题,可以使用一个HashMap集合对象来存放所有的参数名及对应的参数值的方式QparamName属性值指定ؓ该HashMap集合对象卛_?br />举例Q?br /><%
//代码理想的位|应该是在action?br />//可以在jsp面试
  java.util.HashMap pms = new java.util.HashMap();
  pms.put("code", "001002");
  pms.put("name", "tester");
  pms.put("alias", new String[]{"matin","jack"});
  request.setAttribute("params", pms);
%>
<html:link action="/test.do" name="params" >test</html:link>
~译后的l果Q?lt;a href="/test.do?code=001002&name=tester&alias=matin&alias=jack">test</a>
q种方式虽然可以解决传多参数的问题,但是实现h也比较麻烦,特别是对记录集中的数据逐条列出的时?/p>

5.针对有的|友?lt;html:link>标签中嵌入用jsp脚本(scriptlet)的问题,
例如:
<html:link page="/test.do?code=<%=varible%>">add</html:link>Q这U写法是错误的,是无法编译的?br />有的|友认ؓ在struts标签内是不允怋用jsp脚本的,q种说法也不准确。如果前面的写法Ҏ:
<html:link page="<%="/test.do?code="+varible%>">add</html:link>Q就可以被执行,但是要注意URL相对路径的问题?/p>

虽然在struts标签中嵌入jsp脚本不是真正意义上的struts应用Q但是有时在委曲求全的情况下也只能如此了Q除非用自定义标签。比如在form表单中可能需要根据具体数据让某个字段是只ȝQ就可以用嵌入jsp脚本来实玎ͼ
<%
boolean rdonly=false;
if(2==2) rdonly=true;
%>
<html:text property="userid" readonly="<%=rdonly%>" />


6.另外一U比较变态的ҎQ既不是真正意义上的strutsQ也不符合xml规范。那是?lt;a>标签中用<bean:write>标签输出参数倹{?br />如:<a href="test.do?uid=<bean:write name="user" property="userid"/>&name=<bean:write name="user" property="username"/>">test</a>



feingto 2006-05-03 20:02 发表评论
]]>
վ֩ģ壺 ˾ѹۿ| һۿƵ߲ | ŷղһëƬ| 91ƵƷȫѹۿ| ޾ƷŮ| Ƭ91Ʒѿ3| ľƷ| ޻ɫ߹ۿ| պשר2020| aƵѹۿ| ޾Ʒsuvһ88| ҹþþþüŮӰԺ| 91ɫۺϾþ| պƷһ߹ۿ| ޸Դ߹ۿ| ӰԺ| ѾþþƷ99reѾy| һŮȫƬѿ| ޼ɫС˵| 91鶹ƷԲ߹ۿ| ëƬڵ߳| һaȫƵëƬ| ޹˾ƷӰ| ĻƷһ | Ƭѹۿ92ƵƵ| ߹ۿ˳վ| ޹Ʒ| ŮվѸƵ| AV߲| ѹۿ˳վ| ޹˾ƷӰ| þþƷƵ| ձ޹һ| Ʒþþþþþ| 91㽶߹ۿѸ| ػɫĴƬۿƵ| պ | AVۺɫ͵| ޾Ʒ | ձһ| þþƷAVվ|