萧秋水的博客


带着淡淡的倦意,轻轻的忧惺,宛若远山含笑迷蒙,但又如闪电惊雷般震人心魄……

#

window.showModalDialog()、confirm()方法使用

运行描述:在A页单击按钮弹出对话框B,选择要选择的栏目,弹出确认信息。确定后对话框B自动关闭,其所选择的栏目值传到A页相应的文本框内。代码如下

A.htm

<script>
function openwin(){
var value = window.showModalDialog("b.htm",window,"dialogWidth:370px;help:no;resizable:no;status:no;scroll:no");
document.form1.a.value 
= value;
}
</script>
选择栏目:
<href="#" onClick="javascript:openwin();">click</a>
<form name="form1">
<input name="a" type="txt">
</form>

B.htm

<script>
function returnAll(str){
   
if(confirm("是否选择'"+str+"'")){
      window.returnValue
=""+str+"";
      window.close();
   }
}
</script>
<form name="form1">
<href="#" onClick="javascript:returnAll(this.innerText);" id="a">a</a>
<href="#" onClick="javascript:returnAll(this.innerText);" id="b">b</a>
<href="#" onClick="javascript:returnAll(this.innerText);" id="c">c</a>
</form>

window.opener.location.reload();
当A页面弹出B页面时,在B页面如果调用这句js代码,则会刷新A页面。

posted @ 2006-08-15 16:10 萧秋水 阅读(376) | 评论 (0)编辑 收藏

任意增加或删除一行html元素

代码如下:

<script language="javascript">
var curRow=null;
function selectRow(tr1){
if(curRow)
curRow.bgColor="#FFFFFF";
tr1.bgColor="e7e7e7";
curRow=tr1;
}
function addRow(src){
var newrow = src.insertRow(src.rows.length-1);
newrow.attachEvent("onclick",function(){selectRow(newrow);});
newrow.height=20;
var i=4;
while(i--){
var newcell = newrow.insertCell();
switch(i){
case 0: newcell.innerHTML= '<input type="button" onClick="javascript:delRow(this.parentElement.parentElement)" value="删除此行">';break;
default: newcell.innerHTML=div1.innerHTML;break;
}
}
}
function delRow(src){
src.parentElement.deleteRow(src.rowIndex);
}
</script>

<table id="tb" width="100%"  border="1" >
  <tr>
    <th scope="col" width="25%">一</th>
    <th scope="col" width="25%">二</th>
    <th scope="col" width="25%">三</th>
    <th scope="col" width="25%">四</th>
  </tr>
  <tr id="blankRow" onClick="addRow(this.parentElement)">
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
<div id="div1" style="display:none "><inpute type="text"></div>

posted @ 2006-08-15 16:07 萧秋水 阅读(630) | 评论 (0)编辑 收藏

关于struts里中的集合里的javaBean里有集合和javaBean的显示问题

具体的代码如下:
cargoExport为一个存放在request的ArrayList。
 
  < logic:present name = " cargoExport " >
 
< logic:iterate id = " cargo "  name = " cargoExport "  type = " ywsoftware.ship.businessTable.TCtcargo " >
  
< logic:present name = " cargo " >
  
    
< bean:write name = " cargo "  property = " shipper "   />
  
// 下边为显示javaBean里某个属性也是javaBean的显示格式
    < bean:define id = " tctcg "  name = " cargo "  property = " ctcg "  type = " ywsoftware.ship.businessTable.TCtcg " />
   
< bean:write name = " tctcg "  property = " marks "   />
// 下边为显示javaBean里某个属性是集合的显示格式   
    < logic:iterate id = " loadct "  name = " cargo "  property = " loadCTs "  type = " ywsoftware.ship.businessTable.TLoadct " >
          
< logic:present name = " loadct " >
           
< bean:write name = " loadct "  property = " cntrNo "   />
          
</ logic:present >
      
</ logic:iterate >
     
  
</ logic:present >
 
</ logic:iterate >
</ logic:present >


--------------------------------------------------
//下边为显示集和里存放的是数组 
<logic:iterate id="element" indexId="ind" name="catalog">
  
<bean:write name="ind"/><bean:write name="element" property="key"/><BR>
  
<logic:iterate id="elementValue" name="element" property="value" length="23" offset="0">
      
-----<bean:write name="elementValue"/><BR>
  
</logic:iterate>
</logic:iterate>

posted @ 2006-08-15 16:05 萧秋水 阅读(263) | 评论 (0)编辑 收藏

用xmlhttp和session监听站内人数(session监听、无刷新取server端数据)

  这个题目含有许多需要解释的概念,最容易说明的是“站内消息”,这是很多论坛都 有的功能,可以通过web向其他的在线用户发送消息,很多用户都使用过。站内消息的第一个好处是大家都不需要安装客户端,你不用知道对方的MSN或者 QQ,就能与他联系,称赞他的观点或者是给他一顿臭骂。第二个好处是客户管理方便,利用session来维护在线名单,各种脚本都已经把session操 作封装得很易用了,不用像其他无状态的即时通信工具(比如使用UDP通信的工具)一样,要费一些脑细胞来解决在线名单的问题。缺点嘛,就是实时性不好,一 般是在用户跳转或者刷新页面才能探测消息、更新在线名单。

  Session监听嘛,没什么好解释的,java提供了很灵活的事件机制来 监听session,可以监听session的创建和销毁,监控session所携带数据的创建、变化和销毁,可以监听session的锐化和钝化(了解 对象序列化的兄弟应该知道这个),其他的平台是个什么情况我不太清楚,估计也差不多吧。如果能够对所有客户的session进行监控,就不用再去操作麻烦 而危险的Application了。

  Xmlhttp是MS推的一项技术,功能很复杂,可以做很多事情,比如客户端可以在简单的 HTML中打开HTTP连接,主动向server请求数据并获得返回数据,是DOM技术一个非常重要的应用,利用它来写无刷新的动态页面简直是 so easy,做过web开发的兄弟应该明白它的意义有多么重大。

一、 session监听

  servlet中对 session的监听有很多接口,功能很灵活,最常用的是监听Session和Attribute。这里要澄清一下概念,servlet中的 session监听和Attribute监听含义有差别,session监听指的不是我们一般所理解的放置一个session或者销毁一个 session,这是Attribute监听的功能,因为servlet中放置session的语法是session.setAttribute (“session名”,要放入的对象)。而session监听,监听的是HTTP连接,只要有用户与server连接,就算连接的是一个空白的jsp页 面,也会触发session事件,所以此处的session实际上指的是connection,用来统计当前在线用户数最合适了。不知道我说清楚了没有。 下面分别讲解这两种监听方式。

1、 session监听

  首先编写一个session监听类,实作HttpSessionListener接口,它的作用是计算当前有多少个在线用户:

  1. /**
  2. *@Author bromon
  3. *2004-6-12
  4. */
  5. package  org.bromon.test;

  6. import  javax.servlet.*;
  7. import  javax.servlet.http.*;

  8. public  class SessionCount implements  HttpSessionListener
  9. {
  10.     private static int count=0;

  11.     public void sessionCreated( HttpSessionEvent  se)
  12.     {
  13.         count++;
  14.         System.out.println(“session创建:”+new java.util.Date());
  15.     }

  16.     public void sessionDestroyed( HttpSessionEvent  se)
  17.     {
  18.        count--;
  19.        System.out.println(“session销毁:”+new java.util.Date());
  20.     }

  21.     public static int getCount()
  22.     {
  23.        return(count);
  24.      }
  25. }




  怎么样,是不是一目了然?count被定义为static,是因为要保证整个系统只有这一个count。如果你实在不放心,可以把它写成一个单例类。

  然后在web.xml中声明这个监听器:
<listener>
<listener-class>
org.bromon.test.SessionCount
</listener-class>
</listener>

  编写一个测试页面test.jsp,内容是获得count:
<%
int count=org.bromon.test.SessionCount.getCount();
out.println(count);
%>

  需要注意的是,这里根本不涉及任何session的操作。重启动App server,试着连接test.jsp,可以看到监听器已经开始工作。

2、 Attribute监听
  作为一个站内消息系统,肯定要获得所有登陆者的ID,才有可能互发消息。这就涉及Attribute监听。假设我们写了个用户登陆的模块,用户通过身份验证之后会产生一个session,保存它的相关信息,比如:

  1. //check.jsp
  2. <%
  3.     String name=request.getParameter(“name”);
  4.     Name=new String(name.getBytes(“ISO8859-1”));
  5.     session.setAttribute(“user”,name);
  6. %>



  做过jsp的兄弟应该对这段代码再熟悉不过了,下面写个监听器来监听用户登陆,把所有用户的ID保存到一个List当中,这个监听器实作HttpSessionAttributeListener接口:

  1. /**
  2. *@Author bromon
  3. *2004-6-12
  4. */
  5. package  org.bromon.test;

  6. import  javax.servlet.*;
  7. import  javax.servlet.http.*;
  8. import  java.util.*;

  9. public  class OnlineList implements  HttpSessionAttributeListener
  10. {
  11.     private static List list=new ArrayList();

  12.     public void attributeAdded( HttpSessionBindingEvent  se)
  13.     {
  14.         if(“user”.equals(se.getName()))
  15.         {
  16.             list.add(se.getValue());
  17.          }
  18.     }

  19.     public void attributeRemoved( HttpSessionBindingEvent  se)
  20.     {
  21.          if(“user”.equals(se.getName()))
  22.          {
  23.             list.remove(se.getValue());
  24.          }
  25.     }

  26.     public void attributeReplaced( HttpSessionBindingEvent  se){}

  27.     public static List getList()
  28.     {
  29.          return(list);
  30.      }
  31. }



写个简单的jsp来得到用户列表:
<%
    java.util.List list=org.bromon.test.OnlineList.getList();
    out.println(“共有”+list.size()+”名用户已登陆:”);
    for(int I=0;I<lise.size();i++)
    {
        out.println(list.get(i));
    }
%>

也许你说,这有什么神奇呢,监听session而已,不着急,看看xmlhttp。

二、 XMLHTTP

  XMLHTTP的用处很多,这里只说我们需要的,就是无刷新的与server通信,看这段代码:

  1. <script language="javascript"
  2. xml = new ActiveXObject("Microsoft.XMLHTTP"); 
  3. var post=" ";//构造要携带的数据 
  4. xml.open("POST","http://localhost:7001/TestWL/index.jsp",false);//使用POST方法打开一个到服务器的连接,以异步方式通信 
  5. xml.setrequestheader("content-length",post.length); 
  6. xml.setrequestheader("content-type","application/x-www-form-urlencoded"); 
  7. xml.send(post);//发送数据 
  8. var res = xml.responseText;//接收服务器返回的数据 
  9. document.write(res); 
  10. </script>




  豁然开朗,这段代码就是打开一个HTTP连接,以标准 的HTTP格式传递数据,如果你喜欢,可以用XML的格式来传递。更改一下xml对象的构造方式就可以兼容Mozilla和Netscape。下面来写一 个轮询,每隔一段时间刷新一次用户列表,当然,是不需要刷新页面的:

  1. <html>
  2. <head><title>探测器</title>
  3. <script language="javascript">
  4. function detect()
  5. {
  6. xml = new ActiveXObject("Microsoft.XMLHTTP"); 
  7. var post=" ";//构造要携带的数据 
  8. xml.open("POST","http://localhost:7001/TestWL/index.jsp",false);//使用POST方法打开一个到服务器的连接,以异步方式通信 
  9. xml.setrequestheader("content-length",post.length); 
  10. xml.setrequestheader("content-type","application/x-www-form-urlencoded"); 
  11. xml.send(post);//发送数据 
  12. var res = xml.responseText;//接收服务器返回的数据 
  13. list.innerText=res;
  14. setTimeout(“detect()”,5000);//每隔5秒钟轮询一次
  15. </script>
  16. <body onload=”detect()”>
  17. <a id=”list”></a>
  18. </body>
  19. </html>


  这样的通信方式数据量很小,不用重新传递整个页面,5秒钟轮一次,普通PC也能承受较大的在线数。构造一个探测器来监听在线列表和消息,效果是很好的,即使你的客户坐在电脑前袖手旁观,键鼠都不碰一下,也能保证数据即时传递,页面也不会发生跳转和刷新。

  Session监听加上XMLHTTP通信,开发一个较为完善的站内消息系统实在易如反掌。

posted @ 2006-08-15 16:05 萧秋水 阅读(403) | 评论 (0)编辑 收藏

在TOMCAT下JSP的中文处理解决方案

方法一:new String(request.getParameter("test").getBytes("iso-8859-1"),"GBK")

方法二:
1、
在jsp中加入下面两行
          <%@ page contentType="text/html; charset=GBK" language="java" %>
          <meta http-equiv="Content-Type" content="text/html; charset=GBK">
2、
在TOMCAT中找到SetCharacterEncodingFilter.java,他们位于D:\Tomcat5.0.27\webapps\jsp-examples\WEB-INF\classes\filters,加到你的工程文件里去,并修改包名。
3、
配置WEB.XML,
在web.xml里加入这一段
 <filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>utils.SetCharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>GB2312</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
4、修改server.xml中两个部分
<Connector port="8090"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000"
               disableUploadTimeout="true" URIEncoding='GB2312'/>
<Connector className="org.apache.coyote.tomcat5.CoyoteConnector"
               port="8009" minProcessors="5" maxProcessors="75"
               enableLookups="true" redirectPort="8443"
               acceptCount="10" debug="0" connectionTimeout="0"
               useURIValidationHack="false" protocol="AJP/1.3"
              
protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler" 
               URIEncoding='GB2312'/>

posted @ 2006-08-15 16:03 萧秋水 阅读(224) | 评论 (0)编辑 收藏

如何在TOMCAT配置数据源,调用数据源

1、在TOMCAT里配置数据源,在<host></host>之间加上下面的代码,具体的参数根据自己情况修改
   <Context path="" docBase="E:\WEB_CODE\DEMO\WEB" debug="0">
   
   <Logger className="org.apache.catalina.logger.FileLogger"
                     prefix="localhost_xzm_log." suffix=".txt"
           timestamp="true"/>

          <Environment name="maxExemptions" type="java.lang.Integer"
                      value="15"/>
          <Parameter name="context.param.name" value="context.param.value"
                     override="false"/>         
         
          <Resource name="jdbc/tzwdb" auth="Container"
                    type="oracle.jdbc.pool.OracleDataSource"/>
          <ResourceParams name="jdbc/tzwdb">
            <parameter><name>factory</name><value>oracle.jdbc.pool.OracleDataSourceFactory</value></parameter>           
            <parameter><name>driverClassName</name><value>oracle.jdbc.driver.OracleDriver</value></parameter>
            <parameter><name>url</name><value>jdbc:oracle:thin:@127.0.0.1:1521:ORCL</value></parameter>
            <parameter><name>username</name><value>demo</value></parameter>
            <parameter><name>password</name><value>demo</value></parameter>
            <parameter><name>serverName</name><value>127.0.0.1</value></parameter>           
            <parameter><name>databaseName</name><value>ORCL</value></parameter>           
            <parameter><name>portNumber</name><value>1521</value></parameter>
            <parameter><name>maxActive</name><value>30</value></parameter>
            <parameter><name>maxIdle</name><value>10</value></parameter>
            <parameter><name>maxWait</name><value>500</value></parameter>           
            <parameter><name>description</name><value>oracle</value></parameter>           
          </ResourceParams>
           
          <Resource name="mail/Session" auth="Container"
                    type="javax.mail.Session"/>
          <ResourceParams name="mail/session">
            <parameter>
              <name>mail.smtp.host</name>
              <value>localhost</value>
            </parameter>
          </ResourceParams>
   
   </Context>

2、连接数据库

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import org.apache.log4j.Logger;

/**
 * @author : 萧秋水
 *
 * @contact me :
cnyanhai@hotmail.com
 *
 */
public class DBManager {


    static Logger logger = Logger.getLogger(DBManager.class.getClass());

    private Context initCtx = null;

    private Context ctx = null;

    private DataSource ds = null;

    private long timeout = 5000;

    private Statement theStatement = null;

    private PreparedStatement thePstmt = null;

    private static final String userName = "tzw";

    private static final String password = "ywsoft";

    /***************************************************************************
     *
     * 初试化initCtx
     *
     * 取得数据源对象
     * 
     **************************************************************************/

    public DBManager() {
        try {
            initCtx = new InitialContext();
            //init context,read config web.xml
            if (initCtx == null) {
                throw new Exception("Initial Failed!");
            }
            ctx = (Context) initCtx.lookup("java:comp/env");
            //find "jdbc/tzwdb" object this configruation in the SERVER.XML of
            // Tomcat
            if (ctx != null) {
                ds = (DataSource) ctx.lookup("jdbc/tzwdb");
            }
            if (ds == null) {
                throw new Exception("Look up DataSource Failed!");
            }
        } catch (Exception e) {
            logger.error("Look up DataSource error! -- " + e.getMessage());
        }
    }

    /***************************************************************************
     *
     * get Connection
     *
     * @return Connection
     * 
     **************************************************************************/

    public synchronized Connection getConnection() {
        //get connection and set to delay time
        long startTime = new java.util.Date().getTime();
        Connection con = null;
        while (con == null) {
            con = newConnection();
            if (con != null) {
                logger.info("Create New Connection!");
                break;
            }
            try {
                logger.info("Connection timeout,Please wait " + timeout + "ms");
                wait(timeout);
            } catch (InterruptedException e) {
                logger.warn("Connection timeout! -- " + e.getMessage());
            }
            if ((new java.util.Date().getTime() - startTime) >= timeout) {
                logger.warn("Connection timeout!");
                break;
            }
        }
        return con;
    }

    private Connection newConnection() {
        Connection con = null;
        try {
            con = ds.getConnection(userName, password);
            if (con == null) {
                throw new Exception("Create Connection Failed!");
            }
        } catch (Exception e) {
            logger.warn("Create Connection Failed! -- " + e.getMessage());
        }
        return con;
    }

    /***************************************************************************
     *
     * release the connection
     * 
     **************************************************************************/

    public synchronized void freeConnection(Connection conn, PreparedStatement pstmt) {
        try {
            //close PreparedStatement
            if (pstmt != null) {
                pstmt.close();
                pstmt = null;
            }
        } catch (Exception e) {
            logger.warn("release stmt,pstmt error! -- " + e.getMessage());
        }
        try {
            //close Connection
            if (conn != null) {
                conn.close();
                conn = null;
            }
        } catch (SQLException e) {
            logger.warn("release conn error! -- " + e.getMessage());
        }
    }

}
  

posted @ 2006-08-15 16:03 萧秋水 阅读(379) | 评论 (0)编辑 收藏

Java中一些关于日期、日期格式、日期的解析和日期的计算--转载

     Java 语言的Calendar(日历),Date(日期), 和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分. 日期是商业逻辑计算一个关键的部分. 所有的开发者都应该能够计算未来的日期, 定制日期的显示格式, 并将文本数据解析成日期对象.

    Date 类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数.

一、创建一个日期对象
    使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子. 这个时间通常被称为Java 虚拟机(JVM)主机环境的系统时间.

Date date = new Date();
System.out.println(date.getTime());

    上面的例子在系统输出设备上显示的结果是 1001803809710. 在这个例子中,值得注意的是我们使用了Date 构造函数创建一个日期对象, 这个构造函数没有接受任何参数. 而这个构造函数在内部使用了System.currentTimeMillis() 方法来从系统获取日期.
二、日期数据的定制格式
    定制日期数据的格式, 比方星期六-9月-29日-2001年. 下面的例子展示了如何完成这个工作:

SimpleDateFormat bartDateFormat = new SimpleDateFormat("EEEE-MMMM-dd-yyyy");
Date date = new Date();
System.out.println(bartDateFormat.format(date));

    只要通过向SimpleDateFormat 的构造函数传递格式字符串"EEE-MMMM-dd-yyyy", 我们就能够指明自己想要的格式. 你应该可以看见, 格式字符串中的ASCII 字符告诉格式化函数下面显示日期数据的哪一个部分. EEEE是星期, MMMM是月, dd是日, yyyy是年. 字符的个数决定了日期是如何格式化的.传递"EE-MM-dd-yy"会显示 Sat-09-29-01.
    下面是一些格式:
Date and Time Pattern Result
"yyyy.MM.dd G 'at' HH:mm:ss z"2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"Wed, Jul 4, '01
"h:mm a"12:08 PM
"hh 'o''clock' a, zzzz"12 o'clock PM, Pacific Daylight Time
"K:mm a, z"0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ"010704120856-0700


三、将文本数据解析成日期对象
    假设我们有一个文本字符串包含了一个格式化了的日期对象, 而我们希望解析这个字符串并从文本日期数据创建一个日期对象. 我们将再次以格式化字符串"MM-dd-yyyy" 调用SimpleDateFormat类, 但是这一次, 我们使用格式化解析而不是生成一个文本日期数据. 我们的例子, 显示在下面, 将解析文本字符串"9-29-2001"并创建一个值为001736000000 的日期对象.

SimpleDateFormat bartDateFormat = new SimpleDateFormat("MM-dd-yyyy");
String dateStringToParse = "9-29-2001";
try {
Date date = bartDateFormat.parse(dateStringToParse);
System.out.println(date.getTime());
} catch (Exception ex) {
System.out.println(ex.getMessage());
}

四、使用标准的日期格式化过程

既然我们已经可以生成和解析定制的日期格式了, 让我们来看一看如何使用内建的格式化过程. 方法 DateFormat.getDateTimeInstance() 让我们得以用几种不同的方法获得标准的日期格式化过程. 在下面的例子中, 我们获取了四个内建的日期格式化过程. 它们包括一个短的, 中等的, 长的, 和完整的日期格式.

Date date = new Date();

DateFormat shortDateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
DateFormat mediumDateFormat =DateFormat.getDateTimeInstance( DateFormat.MEDIUM, teFormat.MEDIUM);
DateFormat longDateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG); DateFormat fullDateFormat = DateFormat.getDateTimeInstance( DateFormat.FULL, DateFormat.FULL);

System.out.println(shortDateFormat.format(date));
System.out.println(mediumDateFormat.format(date));
System.out.println(longDateFormat.format(date));
System.out.println(fullDateFormat.format(date));

注意我们在对 getDateTimeInstance的每次调用中都传递了两个值. 第一个参数是日期风格, 而第二个参数是时间风格. 它们都是基本数据类型int(整型). 考虑到可读性, 我们使用了DateFormat 类提供的常量: SHORT, MEDIUM, LONG, 和 FULL.
运行例子程序的时候, 它将向标准输出设备输出下面的内容:
9/29/01 8:44 PM
Sep 29, 2001 8:44:45 PM
September 29, 2001 8:44:45 PM EDT
Saturday, September 29, 2001 8:44:45 PM EDT

五、Calendar 类

假设你想要设置, 获取, 和操纵一个日期对象的各个部分, 比方一个月的一天或者是一个星期的一天. 为了演示这个过程, 我们将使用具体的子类 java.util.GregorianCalendar. 考虑下面的例子, 它计算得到下面的第十个星期五是13号.


DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);

GregorianCalendar cal = new GregorianCalendar();

cal.setTime(new Date());
System.out.println("System Date: " + dateFormat.format(cal.getTime()));

// Set the day of week to FRIDAY
cal.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY);
System.out.println("After Setting Day of Week to Friday: " +
dateFormat.format(cal.getTime()));

int friday13Counter = 0;

while (friday13Counter <= 10)
{

// Go to the next Friday by adding 7 days.
cal.add(GregorianCalendar.DAY_OF_MONTH, 7);

// If the day of month is 13 we have
// another Friday the 13th.
if (cal.get(GregorianCalendar.DAY_OF_MONTH) == 13)
{
friday13Counter++;
System.out.println(dateFormat.format(cal.getTime()));
}
}

在这个例子中作了有趣的函数调用:
cal.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY);

cal.add(GregorianCalendar.DAY_OF_MONTH, 7);

set 方法能够让我们通过简单的设置星期中的哪一天这个域来将我们的时间调整为星期五. 注意到这里我们使用了常量 DAY_OF_WEEK 和 FRIDAY来增强代码的可读性. add 方法让我们能够在日期上加上数值. 润年的所有复杂的计算都由这个方法自动处理.

我们这个例子的输出结果是:
System Date: Saturday, September 29, 2001
当我们将它设置成星期五以后就成了: Friday, September 28, 2001
Friday, September 13, 2002
Friday, December 13, 2002
Friday, June 13, 2003
Friday, February 13, 2004
Friday, August 13, 2004
Friday, May 13, 2005
Friday, January 13, 2006
Friday, October 13, 2006
Friday, April 13, 2007
Friday, July 13, 2007
Friday, June 13, 2008

GregorianCalendar类提供处理日期的方法。一个有用的方法是add().使用add()方法,你能够增加象年,月数,天数到日期对象中。要使用add()方法,你必须提供要增加的字段,要增加的数量。一些有用的字段是DATE, MONTH, YEAR, 和 WEEK_OF_YEAR。下面的程序使用add()方法计算未来80天的一个日期。在Jules的<环球80天>是一个重要的数字,使用这个程序可以计算Phileas Fogg从出发的那一天1872年10月2日后80天的日期:

GregorianCalendar worldTour = new GregorianCalendar(1872, Calendar.OCTOBER, 2);
worldTour.add(GregorianCalendar.DATE, 80);
Date d = worldTour.getTime();
DateFormat df = DateFormat.getDateInstance();
String s = df.format(d);
System.out.println("80 day trip will end " + s);

五、实现日期以天数的加减:
/* 将当前日期加减n天数。
* 如传入字符型"-5" 意为将当前日期减去5天的日期
* 如传入字符型"5" 意为将当前日期加上5天后的日期
* 返回字串 例(1999-02-03)
*/

public String dateAdd(String to)
{
//日期处理模块 (将日期加上某些天或减去天数)返回字符串
int strTo;
try {
   strTo = Integer.parseInt(to);}
catch (Exception e) {
   System.out.println("日期标识转换出错! : \n:::" + to + "不能转为数字型");
   e.printStackTrace();
   strTo = 0;
}
Calendar strDate = Calendar.getInstance(); //java.util包,设置当前时间
strDate.add(strDate.DATE, strTo); //日期减 如果不够减会将月变动 //生成 (年-月-日)
String meStrDate = strDate.get(strDate.YEAR) + "-" +String.valueOf(strDate.get(strDate.MONTH)+1) + "-" + strDate.get(strDate.DATE);
return meStrDate;
}

posted @ 2006-08-15 16:01 萧秋水 阅读(880) | 评论 (0)编辑 收藏

在JSP中执行dos命令

     在JSP中我们经常要调用服务器端的一些dos命令,已达到一些特殊的效果,但同时调用服务器端的dos命令也存在着一些安全隐患,因此需要慎重使用。

     以下以一个例子来说明用jsp执行dos的过程,比如在服务器端每天都会自动生成一个目录(目录名称为当天的日期),再此目录下会生成一些当天的新闻文 件,管理员会把这些文件几个月作一次备份,备份完后在把这些文件删除。

     如果在服务器上,我们可以在dos下直接执行c:\j2sdk\jar cf d:\bak\200502.jar d:\news\20050101 命令, 然后再把20050101目录删除即可。

     在JSP中我们应当这么来写

<%
//执行dos命令
String commandstr = "c:/j2sdk/jar cf d:/bak/200502.jar d:/news/20050101";
Process p ;
try {
   p = Runtime.getRuntime().exec(commandstr);
//等待刚刚执行的命令的结束  
while (true){  
           if(p.waitFor() == 0)   break;
   }    
   
} catch (Exception e) {
    out.println(e.toString());
   }

//删除已经打包的文件及其目录
File f = new File("d:/news/20020101");
String[] allFiles = f.list();
for (int i = 0; i < allFiles.length; i++) {
   File delF = new File("d:/news/20050101/"+allFiles[i]);
   delF.delete();
}
File delD = new File("d:/news/20050101");
delD.delete();
%>

     在jsp中以下代码必须执行,如果没有该代码,则由于删除文件的速度快于打包的速度,因此当压缩包还没有打包完成,一些文件已经被删除,加入下面的代码, 会在此一直做循环,一直p.waitFor()(这个方法的说明是:等待子进程的结束,如果已经结束,一般返回0)返回0为止才会接着执行后面的代码
while (true){  
           if(p.waitFor() == 0)   break;
   }

posted @ 2006-08-15 16:00 萧秋水 阅读(508) | 评论 (1)编辑 收藏

关于hibernate配置使用weblogic7.0里的连接池

    在经过了几天的郁闷的日子后,终于把hibernate跟weblogic的连接池结合使用给搞定了,煞是开心啊。当配置成功后才感觉如此简单,其实就是 DataSource跟JNDi命名问题。以下为正确的配置。与大家分享(weblogic7.0+sql server2000)

第一步、加载JDBC驱动,我用的是JTDS,在startWebLogic.cmd里加上set CLASSPATH=E:\jtds-1.0.3.jar;在weblogic启动时,在DOS窗口里可以看到。

第二步、启动weblogic,设置连接池,如下图所示:

第三步、配置DataSource,如下图所示:(注意:DataSource Name跟JNDI Name可以不相同。但是如果其中一个前面加了“jdbc/",则另一个也要加,要不就全不要加)

第四步、配置hibernate.cfg.xml文件,如下所示:
<!-- properties start-->
  
<property name="connection.datasource">jdbc/DB</property>
 <property name="hibernate.dialect">
  net.sf.hibernate.dialect.SQLServerDialect
 </property>
<!-- properties end-->

好了,这就是配置的过程,程序不需要改动。以下附直接连接数据库的配置
 <!-- properties start-->
 <property name="hibernate.connection.driver_class">
  net.sourceforge.jtds.jdbc.Driver
 </property>
 <property name="hibernate.connection.url">
  jdbc:jtds:sqlserver://localhost/tax_web
 </property>
 <property name="hibernate.connection.username">sa</property>
 <property name="hibernate.connection.password"></property>
 <property name="hibernate.connection.pool.size">8</property>
 <property name="hibernate.dialect">
  net.sf.hibernate.dialect.SQLServerDialect
 </property>
 <property name="hibernate.show_sql">false</property>
 <!-- properties end-->

posted @ 2006-08-15 15:57 萧秋水 阅读(452) | 评论 (0)编辑 收藏

使用links方式安装Eclipse插件

   eclispe想必大家都很熟悉了,一般来说,eclipse插件都是安装在plugins目录下。不过这样一来,当安装了许多插件之后,eclipse 变的很大,最主要的是不便于更新和管理众多插件。用links方式安装eclipse插件,可以解决这个问题。

当前配置XP SP1,eclipse3.0.1

      现在假设我的eclipse安装目录是D:\eclipse,待安装插件目录是D:\plug-in ,我将要安装LanguagePackFeature(语言包)、emf-sdo-xsd-SDK、GEF-SDK、Lomboz这四个插件。

      先把这四个插件程序全部放在D:\plug-in目录里,分别解压。如Lomboz3.0.1.zip解压成Lomboz3.0.1目录,这个目录包含一 个plugins目录,要先在Lomboz3.0.1目录中新建一个子目录eclipse,然后把plugins目录移动到刚建立的eclipse目录 中,即目录结构要是这样的:D:\plug-in\Lomboz3.0.1\eclipse\plugins

      Eclipse 将会到指定的目录下去查找 eclipse\features 目录和eclipse\plugins 目录,看是否有合法的功能部件和(或)插件。也就是说,目标目录必须包含一个 \eclipse 目录。如果找到,附加的功能部件和插件在运行期配置是将是可用的,如果链接文件是在工作区创建之后添加的,附加的功能部件和插件会作为新的配置变更来处 理。

    其它压缩文件解压后若已经包含eclipse\plugins目录,则不需要建立eclipse目录。

    然后在 eclipse安装目录D:\eclipse目录中建立一个子目录links,在links目录中建立一个link文件,比如 LanguagePackFeature.link,改文件内容为  path=D:/plug-in/LanguagePackFeature  即这个link文件要对应一个刚解压后的插件目录。

说明:

  1.  插件可以分别安装在多个自定义的目录中。
  2.  一个自定义目录可以安装多个插件。
  3. link文件的文件名及扩展名可以取任意名称,比如ddd.txt,myplugin都可以。
  4. link文件中path=插件目录的path路径分隔要用\\或是/
  5. 在links目录也可以有多个link文件,每个link文件中的path参数都将生效。
  6. 插件目录可以使用相对路径。
  7. 可以在links目录中建立一个子目录,转移暂时不用的插件到此子目录中,加快eclipse启动。
  8. 如果安装后看不到插件,把eclipse 目录下的configuration目录删除,重启即可。

posted @ 2006-08-15 15:55 萧秋水 阅读(249) | 评论 (0)编辑 收藏

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