无名的博客

2005年10月18日 #

如何在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-01-19 10:04 十三郎 阅读(1444) | 评论 (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-01-09 10:46 十三郎 阅读(230) | 评论 (0)编辑 收藏

一些比较好的javascript

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

posted @ 2005-12-23 16:49 十三郎 阅读(412) | 评论 (1)编辑 收藏

异常错误解决办法,不断更新新中......

在用JAVA编写程序时时常会遇到一些异常错误,本人把握以往遇到的异常及其解决办法在此写下来,不断增加,希望其他朋友把自己遇到的一些异常解决方法根贴。

1、 java.sql.SQLException: 操作不允许: Unsupported syntax for refreshRow()
这个异常时在用纯jsp分页时遇到的,在这里会用到absolute(),isAfterLast()等方法,
解决方法:
statement=connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);

posted @ 2005-12-15 14:28 十三郎 阅读(495) | 评论 (0)编辑 收藏

两个渐变效果进度条

请看效果 ,具体程序如下:

<html>
<head>
<title>渐变效果进度条</title>
<script language="javascript">
 var i;
 function go()
 {
  bar_width = document.getElementById("bg").clientWidth;
  i = bar_width;
  setTimeout('start();',300);
 }
 function start()
 {
  if(i-->0)
  {
   ps.style.width = i;
   bn.innerHTML = Math.floor((bar_width-i)/bar_width*100)+"%";
   setTimeout('start();',20);
  }
 }
 
</script>
<style type="text/css">
#bg {
filter:progid:DXImageTransform.Microsoft.Gradient
(GradientType=1, StartColorStr=#FFFF00, EndColorStr=#FF0000);
width:300px;
height:20px;
border:1px solid black;
z-index:0;
position:absolute;
}
#ps {
float:right;
background-color:#FFFF00;
width:100%;
}
#bn {
position:absolute;
text-align:center;
width:100%;
height:100%;
cursor:default;
}
</style>
</head>
<body onload="go();">
<div id="bg"><div id="ps"></div><span id="bn">0%</span></div>
</body>
</html>


请看效果 ,具体程序如下:

<html>
<head>
<title>渐变效果进度条</title>
<script language="javascript">
var _Hex = Array("00","01","02","03","04","05","06","07","08","09",
"0A","0B","0C","0D","0E","0F","10","11","12","13","14","15","16","17","18","19",
"1A","1B","1C","1D","1E","1F","20","21","22","23","24","25","26","27","28","29",
"2A","2B","2C","2D","2E","2F","30","31","32","33","34","35","36","37","38","39",
"3A","3B","3C","3D","3E","3F","40","41","42","43","44","45","46","47","48","49",
"4A","4B","4C","4D","4E","4F","50","51","52","53","54","55","56","57","58","59",
"5A","5B","5C","5D","5E","5F","60","61","62","63","64","65","66","67","68","69",
"6A","6B","6C","6D","6E","6F","70","71","72","73","74","75","76","77","78","79",
"7A","7B","7C","7D","7E","7F","80","81","82","83","84","85","86","87","88","89",
"8A","8B","8C","8D","8E","8F","90","91","92","93","94","95","96","97","98","99",
"9A","9B","9C","9D","9E","9F","A0","A1","A2","A3","A4","A5","A6","A7","A8","A9",
"AA","AB","AC","AD","AE","AF","B0","B1","B2","B3","B4","B5","B6","B7","B8","B9",
"BA","BB","BC","BD","BE","BF","C0","C1","C2","C3","C4","C5","C6","C7","C8","C9",
"CA","CB","CC","CD","CE","CF","D0","D1","D2","D3","D4","D5","D6","D7","D8","D9",
"DA","DB","DC","DD","DE","DF","E0","E1","E2","E3","E4","E5","E6","E7","E8","E9",
"EA","EB","EC","ED","EE","EF","F0","F1","F2","F3","F4","F5","F6","F7","F8","F9",
"FA","FB","FC","FD","FE","FF");
 function go()
 {
  setTimeout('start();',100);
 }
 var i=0;
 function start()
 {
  if(i++<256)
  {
   ps.innerHTML += "<span style='width:1px;background-color:#FF"+_Hex[256-i]+"00;'>";
   bn.innerHTML = Math.floor(i/2.56)+"%";
   setTimeout('start();',10);
  }
 }
 
</script>
<style type="text/css">
#ps {
background-color:#FFFF00;
width:256px;
margin: 1px;
float:left;
}
#bn {
width:39px;
margin: 1px;
float:right;
text-align:center;
color:#FFFFFF;
font-family:Arial;
font-size:13px;
}
</style>
</head>
<body onload="go();">

<div style="background-color:black;width:300px;height:20px;"><div id="ps"></div><div id="bn"></div></div>
</body>
</html>

posted @ 2005-11-29 10:24 十三郎 阅读(531) | 评论 (0)编辑 收藏

常用正则表达式

非负整数(正整数 + 0)
[^\\d+$] 

正整数                 
[^[0-9]*[1-9][0-9]*$]   

非正整数(负整数 + 0)
[^((-\\d+)|(0+))$]        

负整数
[^-[0-9]*[1-9][0-9]*$]  

整数
[^-?\\d+$]       

非负浮点数(正浮点数 + 0)
[^\\d+(
\\.\\d+)?$]  

正浮点数
[^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$]  

非正浮点数(负浮点数 + 0)
[^((-\\d+(
\\.\\d+)?)|(0+(\\.0+)?))$]  

负浮点数
[^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$]  

浮点数
[^(-?\\d+)(
\\.\\d+)?$]  

由26个英文字母组成的字符串
[^[A-Za-z]+$]  

由26个英文字母的大写组成的字符串
[^[A-Z]+$]  

由26个英文字母的小写组成的字符串
[^[a-z]+$]  

由数字和26个英文字母组成的字符串
[^[A-Za-z0-9]+$]  

由数字、26个英文字母或者下划线组成的字符串
[^\\w+$]  

email地址
[^[\\w-]+(
\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$]    

url
[^[a-zA-z]+://(
\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$]  


匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]


中国电话号码验证
匹配形式如:0511-4405222 或者021-87888822 或者 021-44055520-555 或者 (0511)4405222
正则表达式 "((d{3,4})|d{3,4}-)?d{7,8}(-d{3})*"

中国邮政编码验证
匹配形式如:215421
正则表达式 "d{6}"

电子邮件验证
匹配形式如:justali@justdn.com
正则表达式 "w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*"

身份证验证
匹配形式如:15位或者18位身份证
正则表达式 "d{18}|d{15}"

常用数字验证
正则表达式 
"d{n}" n为规定长度
"d{n,m}" n到m的长度范围

非法字符验证
匹配非法字符如:< > & / ' | 
正则表达式 [^<>&/|'\]+

日期验证
匹配形式如:20030718,030718
范围:1900--2099
正则表达式((((19){1}|(20){1})d{2})|d{2})[01]{1}d{1}[0-3]{1}d{1}

posted @ 2005-11-29 09:54 十三郎 阅读(434) | 评论 (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 @ 2005-10-28 11:00 十三郎 阅读(1053) | 评论 (0)编辑 收藏

在HIBERNATE里投影查询数据

    在数据库中我们经常会用到类似这样的sql语句:SELECT A,B,C FROM TABLE_A,在HIBERNATE里实现起来相比较而然,稍微复杂了一点。
    在HIBERNATE里语句应当这么来写:SELECT tableA.a,tableA.b,tableA.c FROM tableA

    tableA-----------表TABLE_A对应的HIBERNATE的类名
    a,b,c-------------表TABLE_A里的三个列名对应的HIBERNATE的类的几个属性

    最后便是取出查询的数据,整个返回值为Iterator,一行数据就是一个Object[]数组,数组里的每个变量对应tableA.a,tableA.b,tableA.c 的顺序取出此行该列的数据值,然后根据tableA.a,tableA.b,tableA.c 在类里的类型在对其进行相应的强制类型转换。
    但是在我测试时如果在语句中FROM之前用到一些类似TO_CHAR,DECODE的函数则就会报错,提示没有该列,也不能像tableA.a AS TP这样来写。如果有解决这种情况出现的问题的,请告知。

posted @ 2005-10-25 14:57 十三郎 阅读(1555) | 评论 (1)编辑 收藏

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>
选择栏目:<a 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">
<a href="#" onClick="javascript:returnAll(this.innerText);" id="a">a</a>
<a href="#" onClick="javascript:returnAll(this.innerText);" id="b">b</a>
<a href="#" onClick="javascript:returnAll(this.innerText);" id="c">c</a>
</form>

posted @ 2005-10-18 10:49 十三郎 阅读(1744) | 评论 (2)编辑 收藏

任意增加或删除一行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 @ 2005-10-18 10:47 十三郎 阅读(743) | 评论 (1)编辑 收藏

用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 @ 2005-10-18 10:45 十三郎 阅读(547) | 评论 (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 @ 2005-10-18 10:40 十三郎 阅读(462) | 评论 (0)编辑 收藏

关于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 @ 2005-10-18 10:33 十三郎 阅读(812) | 评论 (1)编辑 收藏

在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 @ 2005-10-18 10:27 十三郎 阅读(3699) | 评论 (0)编辑 收藏

配置eclipse3.0.1的VE插件

第一步、下载所需要的软件和插件(本人测试的版本如下版本号相同)

  1. Eclipse3.0.1 (软件) 
  2. emf-sdo-runtime-2.0.1  (插件) 
  3. GEF-runtime-3.0.1 (插件)
  4. VE-runtime-1.0.1.1 (插件)

第二步、配置插件

  1. 把Eclipse3.0.1解压到d:\,其目录为d:\eclipse。
  2. 在d:\eclipse目录下新建一个plugins-2的文件夹,然后把emf-sdo-runtime-2.0.1、GEF- runtime-3.0.1、VE-runtime-1.0.1.1三个压缩包解压到该目录,在解压时点击右键选择“解压到<文件名>”。
  3. 在d:\eclipse目录下新建一个links的文件夹,在目录下新建三个文件,扩展名都为.link,文件名为下载的三个插件的文件名,这三个文件里的内容分别填上相对应的内容,以下的path后的内容皆为三个插件的路径,如下:
  • path=D:\\eclipse\\plugins-2\\VE-runtime-1.0.1.1
  • path=D:\\eclipse\\plugins-2\\GEF-runtime-3.0.1
  • path=D:\\eclipse\\plugins-2\\emf-sdo-runtime-2.0.1

第三步、使用eclipse进行可视化编程

  1. 在eclipse目录下找到eclipse.exe,点击右键新建一个“桌面快捷方式”,在桌面上找到刚刚新建的快捷方式,点击右键,选择“属性”,在弹出窗口的目标后面的文本框里 D:\eclipse\eclipse.exe 的后面加上 -clean,然后双击这个图标启动eclipse。
  2. 启动eclipse后,点击“文件---新建--项目”,按照新建一个项目。
  3. 点击“文件---新建--其它”,再弹出的窗口里点击java,在展开的列表里选择AWT或SWING,接着按照接下来的提示新建一个文件。
  4. 在首次运行时可能看不到可供拖放的一些组件,需要在“窗口--显示视图--其它”,在弹出的对话框里里单击“基本”,在列出的列表中选中“Plalette”,点击确定。

posted @ 2005-10-18 10:11 十三郎 阅读(1215) | 评论 (7)编辑 收藏

使用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 @ 2005-10-18 10:05 十三郎 阅读(375) | 评论 (0)编辑 收藏

配置Eclipse 3.0的JSP开发环境

    首先讲一下环境配置,注意我配置的环境是在win 2000 server下的,不是linux下的,配置的大致流程和操作系统无关,仅仅是在具体的安装上有差别。而配置成功与否,与操作系统无关。
  软件安装分为一下几个部分:

  1. java环境安装:
    这里使用的是jdk1.4.1(jdk1.4.2也可以),这个可以到sun公司的网站去下载;
  2. tomcat环境安装:
    tomcat的版本是4.1的,安装版或是解压版都是可以的;
  3. eclipse 3 安装:
    可以去下列地址下载
    http://www.eclipse.org/downloads/index.php
    我下载的是 3.1M4 版本,这个版本应该是比较新的。
  4. tomcat插件安装:
    tomcat插件是要到下面地址下载
    http://www.sysdeo.com/eclipse/tomcatPlugin.html,下载之前需要查看插件是否适合eclipse的版本,我下载的是tomcatPluginV3.zip;
  5. lomboz插件安装:
    lomboz插件需要下载两个部分,一个是emf环境,另一个是lomboz插件,分别到下列地方去找
    http://forge.objectweb.org/project/showfiles.php?group_id=97
    http://download.eclipse.org/tools/emf/scripts/downloads.php#goto2.1.0I
    我下载的是emf-sdo-runtime-I200412160800.zip和org.objectweb.lomboz_3.1.0.N20050106.zip ;

  这里主要是根据eclipse选择适当的lomboz插件,然后查看一下lomboz插件的 介绍,那里会介绍需要的emf插件的版本,然后再去下面的地址找emf插件。

  好了,该下载的都有了,下面我介绍一下如何安装和配置。

  一、 java环境安装

  这个只要直接安装就可以了,不过最好能安装在系统盘以外的地方,这样可以更好理解jvm的配置;安装好了以后,需要配置环境变量,新建JAVA_HOME,并且配置path,把jdk的bin目录添加进去,这样就可以在命令行的任何路径使用jdk的命令了。

  [测试] :编写一个hello world程序,然后在dos下使用javac hello.java和java hello命令,如果可以正常执行,就证明jdk安装成功了。

  二、 tomcat安装

  解压版的直接解压就可以了,然后配置TOMCAT_HOME,安装版的要注意的两点,一个是安装完之后tomcat的服务就能够启动的了,但是还是要配置TOMCAT_HOME;第二个就是需要查看一下安装程序是不是把tomcat服务注册成为windows的启动服务,需要到“服务”里查看,如果有这个选项就把它设置为手动启动,并且先停止这个服务。

  [测试]:使用startup.bat命令,服务正常启动之后,ie浏览器里输入

  http://localhost:8080/ 如果出现正常的小猫页面,那就应该没有问题了。

  三、 eclipse 3安装

  eclipse的安装倒是很简单,只要解压,然后把eclipse目录复制到盘符下就可以了,启动的时候,系统会自动寻找jvm,当然可以再以后配置,但是好像是必须先安装jdk。

  四、 tomcat插件安装,emf插件安装,lomboz插件安装,

  这几部分的步骤都是一样的,解压软件包,然后根据里面的目录结构,把目录文件分别复制到feature或plugins目录里,这样就行了,也可以按照用link方式配置插件的方法来安装这些插件,下面将详细讲述一下eclipse的配置。

  五、 配置eclipse

  1. 首先,打开配置界面 window->preferences。如果这几个插件安装成功,左边的列表里应该有lomboz和tomcat的选项。如果没有,检查上面的步骤是不是正确。
      点击java->Installed JREs,然后显示如上,如果是初始安装的,只有显示第一个jre(不要问我什么是jre,自己查资料去),那是系统默认的安装在c盘的jre,如果系统当中安装了多个jdk,那么最好还是新建一个,点击add,然后选择你需要使用的jdk的位置,然后它会自动寻找其他的参数,点击ok。返回界面之后,不要忘记点选刚刚添加的jdk,要不然是没有用的。然后点击ok关闭这个窗口。
  2. 再次打开配置界面,点击tomcat选项,这里是配置tomcat的参数,根据你安装的tomcat的版本,选择tomcat version,然户找到该tomcat的主目录,输入在tomcat home,下面的参数会自动配置,点击apply。 然后在左边选择advanced,同样把tomcat的主目录复制在tomcat base,点击apply。
      最后在左边选择jvm setting,选择刚刚加入的jre,点击apply,点击ok。这样就可以了。回到界面,点击工具栏上的黄色小猫的图标,如果配置正确,在console里应该有启动tomcat的信息。如果有,就代表tomcat配置成功了。

  lomboz基本上不用什么配置,如果左边有那个lomboz选项,基本上就是成功了。点击lomboz,然后选择刚才配置的jdk里的tools.jar,这样配置就完成了。测试的方法是新建一个jsp文件,看看打开的时候是不是对script代码有特殊显示,并且建个测试类,看看jsp是不是能够自动引用类里的函数。

posted @ 2005-10-18 09:57 十三郎 阅读(369) | 评论 (0)编辑 收藏