继续关注我的C语言学习博客

林临的地盘

java学习博客
posts - 44, comments - 28, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2006年3月16日

struts2的s:iterator 可以遍历 数据栈里面的任何数组,集合等等 以下几个简单的demo:
s:iterator 标签有3个属性:
    value:被迭代的集合
    id   :指定集合里面的元素的id
    status 迭代元素的索引
1:jsp页面定义元素写法 数组或list

<s:iterator value="{'1','2','3','4','5'}" id='number'>
    <s:property value='number'/>A
</s:iterator>
打印结果为: 1A2A3A4A5A
2:索引的用法
如果指定了status,每次的迭代数据都有IteratorStatus的实例,它有以下几个方法
int getCount()返回当前迭代了几个元素
int getIndex()返回当前元素索引
boolean isEven()当然的索引是否偶数
boolean isFirst()当前是否第一个元素
boolean isLast()
boolean isOdd()当前元素索引是否奇数
<s:iterator value="{'a','b','c'}" id='char' status='st'>
    <s:if test="#st.Even">
        现在的索引是奇数为:<s:property value='#st.index'/>
    </s:if>
    当前元素值:<s:property value='char'/>
</s:iterator>
3:遍历map
value可以直接定义为:
value="#{"1":"a","2":"b"}"
每个元素以都好隔开。元素之间的key和value 冒号隔开
value也可以是数据栈里面的java.util.Map对象
遍历写法如下:
<s:iterator value="map" id="id" status="st">
     key : <s:property value='key'/>
     value:<s:property vlaue='value'/>
</s:iterator>
当然key 和value 都可以使java 的 Object
3:遍历数据栈.简单的List类,
List<Attr>
class Attr{String attrName;String getAttrName(){return "123";}}
<s:iterator value="label" id="id">
    <s:property value="#id.attrName" />
</s:iterator>
当然value 还可以写成 value="%{label}" label可以有.操作
label的属性List 可以写成value="%{label.list}" 相当于:getLabel().getList();
4:遍历2个list;
List<AttrName> attrN {color,size,style}
List<AttrValue> attrV {red,20,gay}
这2个list的元素是一一对应的,一个attrN对应一个attrV
<s:iterator value="%{attrN }" id="id"   status="status">
index    is : <s:property value='status.index'/>
attrName is : <s:property value='id'/> or <s:property value='%{id}'/>
attrName is : <s:property value='%{attrV[#status.index]}'/>
</s:iterator>  
转自:http://www.blogjava.net/Reg/archive/2009/11/20/303085.html

posted @ 2012-06-18 17:11 lubaolin 阅读(819) | 评论 (0)编辑 收藏

点击“开始→运行”,在弹出的“运行”对话框中输入“REGSVR32 /n /i:u shell32”(不含双引号),然后回车,片刻后会弹出“shell32中的DllInstall成功”对话框,“显示桌面”按钮就可以完美归来了

posted @ 2011-04-21 09:11 lubaolin 阅读(349) | 评论 (0)编辑 收藏

     摘要: HTML字符实体(Character Entities),转义字符串(Escape Sequence) 为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用。这些符号是不显示在我们最终看到的网页里的,那如果我们希望在网页中显示这些符号,该怎么办呢? 这就要说到HTML转义字符串(Esca...  阅读全文

posted @ 2010-09-07 18:30 lubaolin 阅读(8814) | 评论 (0)编辑 收藏

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jazzlib.ZipEntry;
import net.sf.jazzlib.ZipOutputStream;

public class BatchDownload extends HttpServlet {

 public BatchDownload() {
  super();
 }

 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  response.setContentType("APPLICATION/OCTET-STREAM");
  response.setHeader("Content-Disposition","attachment; filename="+this.getZipFilename());
  System.out.println("in BatchDownload................");
  ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());  
     File[] files = new File[2];
     files[0]=new File("c:/zip/文件A.doc");
     files[1]=new File("c:/zip/文件B.doc");
     zipFile(files, "", zos);  
     zos.flush();  
     zos.close();  

 }
 private void zipFile(File[] subs, String baseName, ZipOutputStream zos) throws IOException {    
      for (int i=0;i<subs.length;i++) {
       File f=subs[i];
       zos.putNextEntry(new ZipEntry(baseName + f.getName()));  
       FileInputStream fis = new FileInputStream(f);  
       byte[] buffer = new byte[1024];  
       int r = 0;  
       while ((r = fis.read(buffer)) != -1) {  
           zos.write(buffer, 0, r);  
       }  
       fis.close();
      }
 }
 private String getZipFilename(){
  Date date=new Date();
  String s=date.getTime()+".zip";
  return s;
 }

 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  this.doGet(request, response);
 }
}

posted @ 2009-10-22 14:30 lubaolin 阅读(696) | 评论 (0)编辑 收藏

将listener.ora中的(PROGRAM = extproc)这句注释掉就可以了。去网上找过,extproc是一个扩展的程序调用接口协议,  连接和调用外部的操作系统程序或进程用时会用到。

转自:http://blog.csdn.net/chenjuntj2007/archive/2009/07/04/4321640.aspx

posted @ 2009-09-21 17:19 lubaolin 阅读(21184) | 评论 (3)编辑 收藏

//创建临时表空间

create temporary tablespace test_temp
tempfile 'E:\oracle\product\10.2.0\oradata\testserver\test_temp01.dbf'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;

//创建数据表空间
create tablespace test_data
logging
datafile 'E:\oracle\product\10.2.0\oradata\testserver\test_data01.dbf'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;

//创建用户并指定表空间
create user username identified by password
default tablespace test_data
temporary tablespace test_temp;

//给用户授予权限

grant connect,resource to username;

//以后以该用户登录,创建的任何数据库对象都属于test_temp 和test_data表空间,这就不用在每创建一个对象给其指定表空间了。

转载:http://virgos.javaeye.com/blog/337976

posted @ 2009-07-23 10:35 lubaolin 阅读(341) | 评论 (0)编辑 收藏

struts2+spring2.x+hibernate3.x 懒加载异常:org.hibernate.LazyInitializationException: failed to lazily initialize

Hibernate的Lazy初始化1:n关系时,必须保证是在同一个Session内部使用这个关系集合,不然Hiernate将抛出异常:org.hibernate.LazyInitializationException: failed to lazily initialize of....
两种处理方法:
一、设置lazy=false,此方法不再累述。
二、用OpenSessionInViewFilter过滤器,注意hibernateFilter过滤器和struts2过滤器在映射时的先后顺序。同时要配置事物处理,否则会导致session处于只读状态而不能做修改、删除的动作。
即在web.xml文件中如下配置:
     <!-- Spring ApplicationContext配置文件的加载目录。 -->  
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath*:spring/applicationContext.xml</param-value>
 </context-param>

 <!-- 解决延迟加载的问题 -->
 <filter>
  <filter-name>hibernateFilter</filter-name>
  <filter-class>
   org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
  </filter-class>
 </filter>
 
 <!-- 继承Struts2的FilterDispatcher类,具备GBK等编码设定功能与struts2的action过滤功能。 -->
 <filter>
  <filter-name>struts2</filter-name>
  <filter-class>
   com.iman.nrms.opm.web.common.FilterDispatcher
  </filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>GBK</param-value>
  </init-param>
 </filter>
 <filter>
         <filter-name>struts-cleanup</filter-name>
         <filter-class>
             org.apache.struts2.dispatcher.ActionContextCleanUp
         </filter-class>
     </filter>
 
 <filter-mapping>
  <filter-name>hibernateFilter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
 
 <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
 
 <filter-mapping>
  <filter-name>struts-cleanup</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。而Spring为我们提供的OpenSessionInViewFilter过滤器为我们很好的解决了这个问题。OpenSessionInViewFilter的主要功能是使每个请求过程绑定一个 Hibernate Session,即使最初的事务已经完成了,也可以在 Web 层进行延迟加载的操作。OpenSessionInViewFilter 过滤器将 Hibernate Session 绑定到请求线程中,它将自动被 Spring 的事务管理器探测到。所以 OpenSessionInViewFilter 适用于 Service 层使用HibernateTransactionManager 或 JtaTransactionManager 进行事务管理的环境,也可以用于非事务只读的数据操作中。
request-->open session-->打开连接、开始事务-->持久操作-->渲染(关闭连接、session)-->response 其中一些过程省略了,不是很关心。

 

引自:http://blog.csdn.net/fhwbj/archive/2009/03/25/4022805.aspx

posted @ 2009-07-03 16:19 lubaolin 阅读(2637) | 评论 (0)编辑 收藏

1、选择Help -> Software Updates -> Find and Install...-> Search for new features to install ->New remote site...
Name: "Spket", Url: "http://www.spket.com/update/"下载完毕重启 Eclipse

2、Window -> Preferences -> Spket -> JavaScript Profiles -> New ;
输入“ExtJS”点击OK;
选择“ExtJS” 并点击“Add Library”然后在下拉条中选取“ExtJS”;
选择 “ExtJS”并点击“Add File”,然后在你的./ext-2.x/source目录中选取“ext.jsb” 文件;

3、设置新的ExtJS Profile,选中并点击“JavaScript Profiles” 对话框右手边的“Defalut”按钮;

4、JS打开方式为 Window -> Preferences ->General-> Editors-> File...选择JS  为 Spket JavaScript Editor(default)

posted @ 2009-04-06 22:20 lubaolin 阅读(888) | 评论 (0)编辑 收藏

半年前,报考了系统分析师,也没怎么看书,只是抱着试试水有多深的想法去考的,结果既在我意料之中,也在我意料之外,得了个39/33/39,只差6/12/6分就可以通过了,尤其是论文,居然得了39分,看来还是有希望的,所以决定再次冲击,并以此做为平台,练习论文写作,假如写一篇论文就和写一篇日记一样手到擒来...........

posted @ 2008-07-21 14:34 lubaolin 阅读(371) | 评论 (0)编辑 收藏

SQL> select * from t1;

        N1 V1                NID
---------- ---------- ----------
         1 aa                 61
         2 aa                 62
         3 bb                 83
         4 aa                 64

SQL> select exp(sum(ln(nid))) from t1 where v1='aa';

EXP(SUM(LN(NID)))
-----------------
           242048

已用时间:  00: 00: 00.02

验证一下:)
SQL> select 61*62*64 from dual;

  61*62*64
----------
    242048

已用时间:  00: 00: 00.00

先分组然后求积
SQL> select exp(sum(ln(nid))) from t1 group by v1;

EXP(SUM(LN(NID)))
-----------------
           242048
               83


oracle 这东东挺有意思.
转自:http://blog.sina.com.cn/s/blog_54eeb5d901000ae5.html

posted @ 2008-07-21 14:26 lubaolin 阅读(1033) | 评论 (0)编辑 收藏

Spring的依赖关系
依赖关系分组
JAR文件
说 明
ant
ant.jar, ant-junit.jar, ant-launcher.jar
Spring采用Apache Ant作为其构建工具,还用来完成大量其它任务如文档生成和测试执行等。运行时Ant根本不起作用,因此发布应用时无需包含该JAR文件。
aopalliance
aopalliance.jar
AOP Alliance(http://aopalliance.sourceforge.net/)是个联合的开源协作组织,在多个项目间进行协作以期提供一套标准的AOP Java接口(interface)。 Spring AOP就是基于AOP Alliance标准API实现的。如果你打算使用Spring的AOP或基于AOP的任何特性,只需这个JAR文件。
axis
axis.jar, saaj.jar, wsdl4j.jar
Spring采用Apache Axis项目来支持Spring远程调用里的JAXRPC功能。如果使用JAXRPC Remoting,那么只需要这些文件。
caucho
burlap-2.1.12.jar, hessian-2.1.12.jar
Spring远程调用(remoting)对大量不同种类的协议包括Caucho的Burlap和Hessian提供了支持。要用哪个协议就包含这个分组里相应的JAR文件。
cglib
cglib-full-2.0.2.jar
CGLIB用来生成动态代理类(dynamic proxy classes),供核心DI和AOP实现之用。由于大量Spring功能的实现都要用到CGLIB,因此你的应用几乎总需包含CGLIB。
cos
cos.jar
COS代表com.oreilly.servlet,是个实用类的集合,对Servlets和基于web的应用很有用。Spring在两个地方要用到COS:文件上传处理和e-mail发送。不过在这两种情形中,COS都只是实现选择之一,因此只有选用COS而非其它实现方法时,才需包含cos.jar。
dom4j
dom4j.jar
使用Hibernate时dom4j不可或缺,因此如果你的应用打算采用Hibernate实现ORM,就需要包含这个JAR文件。
easymock
easymock.jar, easymockclassextension.jar
Spring的测试套件用到了EasyMock,因此只有构建和运行测试套件时才用到这个JAR,无需随你的应用一起发布。
freemarker
freemaker.jar
Spring提供了FreeMarker模板引擎的包装类,还为把FreeMarker模板用作web应用的视图提供了支持。只要使用FreeMarker,就需要这个JAR文件。
hibernate
ehcache.jar, hibernate2.jar, odmg.jar
如果采用Spring的Hibernate集成和支持类,这些JAR文件不可或缺。如果使用其它ORM工具如iBATIS,则不需要这些JAR文件。如果使用Hibernate,则你的应用还要包含CGLIB JAR文件。
hsqldb
hsqldb.jar
Spring的示例应用使用了hsqldb.jar文件。
ibatis
ibatis-common.jar , ibatis-sqlmap.jar, ibatis-sqlmap-2.jar
使用Spring的iBATIS集成类时,这些文件不可或缺;如果使用JDBC或其它ORM工具如Hibernate或JDO,则你的应用不需要这些文件。
itext
itext-1.02b.jar
Spring使用iText提供web层的PDF支持。只有你的web应用需要生成PDF输出时才需包含这个JAR文件。
j2ee
activation.jar, connector-api.jar, ejb.jar, jaxrpc.jar, jdbc2_0-stdext.jar, jms.jar, jstl.jar, jta.jar, mail.jar, servlet.jar, xml-apis.jar
如左侧所示,J2EE相关的各种不同JAR文件数量相当可观。如果你想要使用Spring邮件支持的JavaMail实现,则需要activation.jar和mail.jar文件。要让Hibernate使用JCA Connector则需connector-api.jar,使用Spring的EJB支持则需要ejb.jar,jms.jar用于Spring的JMS支持。对于web应用,如果想要使用Spring JSTL支持则需要servlet.jar和jstl.jar。Spring远程调用里的JAXRPC支持需要jaxrpc.jar文件,jta.jar用于JTA事务支持。剩下两个JAR文件jdbc2_0-stdext.jar和xml-apis.jar分别用于JDBC和XML配置支持,不过只有你使用1.3版本的JVM时才需要它们。
jakarta
jakarta-commons commons-attributes-api.jar, commons-attributes-compiler.jar, commons-beanutils.jar, commons-collections.jar, commons-dbcp.jar, commons-digester.jar, commons-discovery.jar, commons-fileupload.jar, commons-lang.jar, commons-logging.jar, commons-pool.jar, commons- validator.jar
Spring使用了来自Jakarta Commons项目的大量组件。如果你想在应用中使用源码级元数据(metadata),就需要commons-attributes-api.jar,此外还需要commons-attributes-compiler.jar,以便将attributes编译到应用里。Struts要用到BeanUtils、Collections、Digester、Discovery,和Validator JAR文件,其中的Collections,Hibernate也会用到。使用DBCP连接池时,Spring JDBC支持要用到DBCP,Pooling则对有些示例应用不可或缺。如果想使用相应的Spring包装类来处理web应用的文件上传,则需要FileUpload。最后,Spring处处用到了Logging,因此需在所有基于Spring的应用里包含这个JAR文件。
jakarta-taglibs
standard.jar
这是Jakarta的JSTL实现,一些Spring示例应用使用了这个实现。
jboss
jboss-common-jdbc-wrapper.jar
运行在JBoss应用服务器上的应用使用Spring的JDBC类时,这个JAR文件不可或缺。
jdo
jdo.jar
提供Spring的JDO支持。
jdom
jdom.jar
在Spring里使用iBATIS 1.3时,JDOM不可或缺。本章介绍的iBATIS版本为2.0。
jotm
jotm.jar, xapool.jar
如果你打算配合Spring事务抽象层一起使用JOTM,jotm.jar文件不可或缺。如果打算在自己的应用里将XAPool用于连接池(connection pooling),则只需xapool.jar。
junit
junit.jar
运行时根本不需要JUnit;它只用来构建和运行测试套件。
log4j
log4j-1.2.8.jar
如果想要使用Spring配置log4j日志记录,这个文件不可或缺。
poi
poi-2.5.jar
这个JAR可令Spring MVC框架支持Microsoft Excel输出。
quartz
quartz.jar
Spring基于Quartz的调度支持需要该JAR。
regexp
Jakarta-oro-2.0.7.jar
使用正则表达式来指定AOP的切入点(pointcut)时需要这个JAR。第六章有更详细的介绍。
struts
struts.jar
欲配合Spring使用Struts构建web应用,Struts JAR必不可少。
velocity
velocity-1.4.jar, velocity-tools-generic-1.1.jar
Spring提供了Velocity的包装类使其支持DI,同时当你在应用中使用Velocity时,还可减少需要编写的代码量。除此之外,Spring还提供了一些类,支持将Velocity用作web层里的视图提供者(view provider)。只要使用了上述任意特性,都需在发布里包含Velocity JAR文件。
xdoclet
xjavadoc-1.0.jar
Commons Attributes用这个JAR解析源代码文件,然后提取属性信息。如果使用了Spring Commons Attributes支持,须包含该JAR文件。

posted @ 2007-08-13 02:39 lubaolin 阅读(5325) | 评论 (0)编辑 收藏

<a target=_self href="javascript:goUrl()">
    <span class="f14b">
    <script type="text/javascript">
     imgUrl1="/images/1.jpg";
     imgtext1="ite"
     imgLink1=escape("http://www.blogjava.net/linlin2005");
     imgUrl2="/images/2.jpg";
     imgtext2="ite"
     imgLink2=escape("http://www.blogjava.net/linlin2005");
     imgUrl3="/images/3.jpg";
     imgtext3="ite"
     imgLink3=escape("http://www.blogjava.net/linlin2005");
     imgUrl4="/images/4.jpg";
     imgtext4="ite"
     imgLink4=escape("http://www.blogjava.net/linlin2005");
     imgUrl5="/images/5.jpg";
     imgtext5="ite"
     imgLink5=escape("http://www.blogjava.net/linlin2005");
     var focus_width=134
     var focus_height=130
     var text_height=30
     var swf_height = focus_height+text_height
     
     var pics=imgUrl1+"|"+imgUrl2+"|"+imgUrl3+"|"+imgUrl4+"|"+imgUrl5
     var links=imgLink1+"|"+imgLink2+"|"+imgLink3+"|"+imgLink4+"|"+imgLink5
     var texts=imgtext1+"|"+imgtext2+"|"+imgtext3+"|"+imgtext4+"|"+imgtext5
     document.write('<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase=http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6?0?0?0 width="'+ focus_width +'" height="'+ swf_height +'">');
     document.write('<param name="allowScriptAccess" value="sameDomain"><param name="movie" value="     document.write('<param name="menu" value="false"><param name=wmode value="opaque">');
     document.write('<param name="FlashVars" value="pics='+pics+'&links='+links+'&texts='+texts+'&borderwidth='+focus_width+'&borderheight=' +focus_height+'&textheight='+text_height+'">');
     document.write('<embed src="pixviewer.swf" wmode="opaque" FlashVars="pics='+pics+'&links='+links+'&texts='+texts+'&borderwidth='+focus_width+'&borderheight= '+focus_height+'&textheight='+text_height+'" menu="false" bgcolor="#F0F0F0" quality="high" width ="'+ focus_width +'" height="'+ focus_height +'" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="
http://www.macromedia.com/go/getflashplayer" />'); document.write('</object>');
    </script>
    </span></a><span id=focustext class=f14b> </span>

posted @ 2007-08-07 17:56 lubaolin 阅读(493) | 评论 (0)编辑 收藏

有同事问到在程序中怎样知道数据库表中那些字段是主键。当时不知道,晚上回来看了看JDK的文档。

       在使用JDBC来查询数据库的时候,通常的步骤是:

1. 注册驱动程序

2. 获取数据库连接

3. 执行查询语句

4. 关闭连接。

       在获得数据库连接后,就可以通过getMetaData()方法来获取DatabaseMetaData;然后通过DatabaseMetaDatagetPrimaryKeys ()方法来获取主键的信息。

       下面是我做的示例程序,该程序在JBuilder2005oracle8i下通过:
import java.sql.*;

import javax.sql.*;

public class TestJDBC {

    public TestJDBC() {

    }

 

    public static void main(String[] args) throws SQLException {

        Connection con = null;

        Statement st = null;

        ResultSet rst = null;

        try{

                     //注册数据库驱动程序

            Class.forName("oracle.jdbc.driver.OracleDriver");

                     //获取数据库连接

            con = DriverManager.getConnection("jdbc:oracle:thin:@10.60.203.80:1521:TestDB","123","123");

                     //获取主键信息

            rst = con.getMetaData().getPrimaryKeys(null,null,"USER");

                     //打印主键信息

            if (!rst.isAfterLast()) {

                rst.next();

                System.out.println(rst.getString("TABLE_NAME") + " " +

                                  rst.getString("COLUMN_NAME"));

            }

        }

        catch (Exception e){

            System.out.println(e.getLocalizedMessage());

        }

        finally{

            try{

                            //关闭连接

                if (rst != null)

                    rst.close();

                if (con != null)

                    con.close();

            }

            catch (SQLException e){

                throw e;

            }

        }

 

    }

}

 

上面的程序中,在获取主键信息的时候,语句

rst = con.getMetaData().getPrimaryKeys(null,null,"USER");

用来获取主键信息。关于该函数的详细信息,请参阅JDK的文档。这里要说的是,在测试中发现第三个参数(数据库表名)是大小写敏感的,如果写成user是查不到结果的。

 引自:http://www.blogjava.net/afrag/

posted @ 2007-08-01 17:19 lubaolin 阅读(4770) | 评论 (0)编辑 收藏

工作中需要在程序中弹出窗口,并且声音报警。查了资料,发现很多都是在网页中用的,在应用程序中应用的很少,解决问题之后,记录下来。
private void play(String path){
  try {
        FileInputStream sound_file=new FileInputStream(path);//获得声音文件
        try {
              AudioStream AudioStream_sound=new AudioStream(sound_file);
              AudioData sound_data = AudioStream_sound.getData();//转化的wav文件这句会报错
              ContinuousAudioDataStream sound_continue= new ContinuousAudioDataStream (sound_data);//循环播放
              AudioPlayer.player.start(sound_continue);// Play audio.
              //System.out.println("Play music success!");
              AudioPlayer.player.stop(sound_continue);// Stop audio.
             } catch (IOException e1) {
               // TODO Auto-generated catch block
               System.out.println("Play music fail!");
               e1.printStackTrace();
             }
           } catch (FileNotFoundException e1) {
               // TODO Auto-generated catch block
               e1.printStackTrace();
           }
       }
 
注:1.这个程序段是应用在应用程序中,网页中的声音调用不适用。
    2.声音片段可以为au格式和wav格式,但是注意的是,如果是别的格式如mp3格式转化过来的,则在AudioData sound_data = AudioStream_sound.getData();系统会报错。
    3.调用的时候,尽量用线程,这样可以避免冲突。

引自:http://blog.sina.com.cn/u/53f7b6e401000a9w

posted @ 2007-07-18 17:19 lubaolin 阅读(1532) | 评论 (0)编辑 收藏

<script language="Javascript"><!--
function document.oncontextmenu(){event.returnValue=false;}//屏蔽鼠标右键
function window.onhelp(){return false} //屏蔽F1帮助
function document.onkeydown()
{
  if ((window.event.altKey)&&
      ((window.event.keyCode==37)||   //屏蔽 Alt+ 方向键 ←
       (window.event.keyCode==39)))   //屏蔽 Alt+ 方向键 →
  {
     alert("不准你使用ALT+方向键前进或后退网页!");
     event.returnValue=false;
  }
     /* 注:这还不是真正地屏蔽 Alt+ 方向键,
     因为 Alt+ 方向键弹出警告框时,按住 Alt 键不放,
     用鼠标点掉警告框,这种屏蔽方法就失效了。以后若
     有哪位高手有真正屏蔽 Alt 键的方法,请告知。*/

  if ((event.keyCode==8)  ||                 //屏蔽退格删除键
      (event.keyCode==116)||                 //屏蔽 F5 刷新键
      (event.ctrlKey && event.keyCode==82)){ //Ctrl + R
     event.keyCode=0;
     event.returnValue=false;
     }
  if (event.keyCode==122){event.keyCode=0;event.returnValue=false;}  //屏蔽F11
  if (event.ctrlKey && event.keyCode==78) event.returnValue=false;   //屏蔽 Ctrl+n
  if (event.shiftKey && event.keyCode==121)event.returnValue=false;  //屏蔽 shift+F10
  if (window.event.srcElement.tagName == "A" && window.event.shiftKey) 
      window.event.returnValue = false;             //屏蔽 shift 加鼠标左键新开一网页
  if ((window.event.altKey)&&(window.event.keyCode==115))             //屏蔽Alt+F4
  {
      window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px");
      return false;
  }
}
</script>

posted @ 2007-07-12 10:42 lubaolin 阅读(8091) | 评论 (4)编辑 收藏

<script>

if (document.layers){

var larg=screen.availWidth-10;

var altez=screen.availHeight-20;}

else{

var larg=screen.availWidth+8;

var altez=screen.availHeight+7;}

self.resizeTo(larg,altez);

self.moveTo(-4,-4);

</script>


<script>

function sss(){

window.moveTo(-4,-4)

window.resizeTo(screen.availWidth+9,screen.availHeight+9)

}

</script>

<a href="#" onclick="sss()">最大化</a>

posted @ 2007-07-12 10:41 lubaolin 阅读(1631) | 评论 (1)编辑 收藏

1:连接池的必知概念
   
首先,我们还是老套的讲讲连接池的基本概念,概念理解清楚了,我们也知道后面是怎么回事了。
以前我们程序连接数据库的时候,每一次连接数据库都要一个连接,用完后再释放。如果频繁的数据库操作,就会导致性能很低。连接池的出现,为开发过程提供了一个很好的管理平台。当程序中需要建立数据库连接时,只须从内存中取一个来用而不用新建。同样,使用完毕后,只需放回内存即可。而连接的建立、断开都有连接池自身来管理。同时,我们还可以通过设置连接池的参数来控制连接池中的连接数、每个连接的最大使用次数等等。通过使用连接池,将大大提高程序效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

Hibernate的出现把连接池的使用引入了一个新的利用方式,让你充分享受配置化给开发带来的便利。


    2
Hibernate连接池的配置
 
    
    
在这里笔者简单介绍一下Hibernate配置连接池的方式:

   
方式1:使用Hibernate自带的连接池。

   
方式2:使用配置文件指定的数据库连接池。

   
方式3:从容器中获取得到连接池(如:Tomcat


    Hibernate
无论采用哪种方式获取连接池的连接,它对Java程序来说是独立的。Hibernate对其采用了配置化处理,也就是当想改变获取数据库连接的方式时,只要修改Hibernate的配置文件就可以了,看看多方便,就是这么简单,这足以让你爱死Hibernate了。哈哈,让我们正式来看看,Hibernate究竟是怎么做的!

   
注意:Hibernate配置文件有两钟格式一个是XML格式,一种是properties格式。本文采用的是主流的XML格式来分析!
 

   
1)使用Hibernate自带的连接池

    Hibernate
自带的连接池性能不高,缺乏响应大批量请求以及容错能力,甚至还有BUG,在项目运用中不值得推荐。虽然缺点一罗筐,可也是Hibernate获取连接池的一种方式,在这里笔者仅给出配置方法,以供参考,如下代码所示:

………..

<hibernate-configuration>

<session-factory >

<!--JDBC驱动程序-->

<property name="connection.driver_class">com.mysql.jdbc.Driver</property>

<!-- 连接数据库的URL-->

<property name="connection.url">

jdbc:mysql://localhost:3306/feifei

</property>

<!--连接的登录名-->

<property name="connection.username">root</property>

<!--登录密码-->

<property name="connection.password"></property>

<!--是否将运行期生成的SQL输出到日志以供调试-->

<property name="show_sql">true</property>

<!--指定连接的语言-->

<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<!--映射资源-->

<mapping resource="/xx/xx.hbm.xml" />

</session-factory>

</hibernate-configuration>

(2)使用配置文件指定的连接池
   
   
笔者在这里推荐当今稳定而且主流的数据源,就是Hibernate支持的第三方连接池产品:C3P0Proxool。随着文章的深入,你会发现他们配置方法也有很大的不同。

   
先来介绍连接池C3P0配置,在写入配置文件之前,用户必须将c3p0-0.8.4.5.jar这个包放入classpath当中,下面给出其核心配置项其他的配置项可参见上面的方式1

…………….

<property name="c3p0.min_size">5</property> <!—在连接池中可用数据库连接的最小数目-->

<property name="c3p0.max_size">30</property> <!--在连接池中所有数据库连接的最大数目-->

<property name="c3p0.time_out">1800</property> <!—设定数据库连接的超时时间-->

<property name="c3p0.max_statement">50</property> <!—可以被缓存的PreparedStatement的最大数目-->

…………….

把上面的配置项添加到hibernate.cfg.xml中就可以了,看看是不是很简单?
   
配置Proxool连接池,就没有那么简单了,稍有不同!笔者原先,也按照配置C3P0连接池的方法去配置Proxool,然后一个大大的错误向我招手了。无助之下,上网看看有没有解决方法,就找到了一个笔者认为不错的方法,推荐给大家。

由于Proxool连接池只管理自己产生的连接,Hibernate又需要管理它,怎么办呢?所以我的做法是单独的建立一个XML文件来管理连接池,又在Hibernate里面设置相关的项,让HibernateProxool关联起来。
 
   
当然首先你要把proxool-0.8.3.jar这个包放入classpath,再建立一个ProxoolConf.xml文件,这个文件便于管理建议和 hibernate.cfg.xml文件放在一起。内容如下:

<?xml version="1.0" encoding="utf-8"?>

<!-- the proxool configuration can be embedded within your own application's.

Anything outside the "proxool" tag is ignored. -->

<something-else-entirely>

<proxool>

<alias>feifeiPool</alias> <!—连接池的别名可以随便写,但注意的是后面在hibernate部分要对应-->

<!--proxool只能管理由自己产生的连接-->

<driver-url>jdbc:mysql://localhost:3306/feifei?useUnicode=true&characterEncoding=GBK</driver-url>

<driver-class> com.mysql.jdbc.Driver </driver-class>

<driver-properties>

<property name="user" value="root"/>

<property name="password" value=""/>

</driver-properties>

<!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁-->

<house-keeping-sleep-time>90000</house-keeping-sleep-time>

<!--指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受-->

<maximum-new-connections>20</maximum-new-connections>

<!-- 最少保持的空闲连接数-->

<prototype-count>5</prototype-count>

<!-- 允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定-->

<maximum-connection-count>100</maximum-connection-count>

<!-- 最小连接数-->

<minimum-connection-count>10</minimum-connection-count>

</proxool>

</something-else-entirely>

 

然后需要在hibernate.cfg.xml中作配置,参考如下:

…………

<property name="proxool.pool_alias">feifeiPool</property> <!—这个名字要和上面XML文件中的别名要对应啊-->

<property name="proxool.xml">ProxoolConf.xml</property> <!—这个你刚才上面建立的XML文件的名字-->

<property name="connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>

<!—定义Hibernate-->

…………

C3P0连接池不同,Proxool连接池配置有两个步骤,请大家注意!至于c3p0,有评论说它的算法不是最优的,proxool不少行家推荐使用,而且暂时来说,是负面评价是最少的一个。性能是上,笔者也推荐使用这个。
      (3)
从容器中获取得到连接池(如:Tomcat

   
笔者以我们大家常用的Tomcat为例子来描述,Hibernate想要从Tomcat中获取数据源,需要对Tomcat容器与Hibernate分别进行配置。

    <1>
在容器中配置数据源

   
配置容器的数据源,这里不多讲,属于服务器的配置范畴。假定已经配好了一个JNDI名为“jdbc/feifei”的数据源。

    <2>
hibernate.cfg.xml中指定使用这个名为“jdbc/feifei”
JNDI
    <property name=”hibernate.connection.datasource”>java:/comp/env/jdbc/feifei </property>
    <!—
指定这个JNDI名字就可以了,而且必须是完整的,一定要注意哦!
-->
    
本文的连接池方案分析就到此为止了。看完了,是不是很有想法?Hibernate配置连接池方面有这么多的方法提供给我们来选,选择的余地多了,发挥的空间也大了。

    3
:编后语

   
连接池为我们开发带来了极大的便利,它为我们开发者承担了数据库连接管理的压力,让我们从烦琐的数据库事务中解脱出来,专心研究业务逻辑实现业务,是我们的一大福音。

本文分析的Hibernate连接池配置方案,为读者提供了多种选择。建议读者也根据自己的实际情况来选取方案。文中肯定还有很多纰漏之处,还望大家斧正。讲的不足的地方,以后有机会定当补全!

 

 

1Hibernate默认连接池
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory >
<!?JDBC
驱动程序-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>

 

<!-- 连接数据库的URL-->
<property name="connection.url"> 
jdbc:mysql://localhost:3306/schoolproject
</property>
<property name="connection.useUnicode">true</property>
<property name="connection.characterEncoding">UTF-8</property>

<!--
连接的登录名
-->
<property name="connection.username">root</property>

<!?
登录密码
-->
<property name="connection.password"></property>

<!--
是否将运行期生成的SQL输出到日志以供调试
-->
<property name="show_sql">true</property>

<!--
指定连接的语言
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<!--
映射Student这个资源
-->
<mapping resource="com/wqbi/model/pojo/student.hbm.xml" />

</session-factory> 
</hibernate-configuration>


2
C3P0连接配置
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory >
<!?JDBC
驱动程序-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>

<!-- 
连接数据库的
URL-->
<property name="connection.url"> 
jdbc:mysql://localhost:3306/schoolproject
</property>

<property name="connection.useUnicode">true</property>
<property name="connection.characterEncoding">UTF-8</property>

<!--
连接的登录名
-->
<property name="connection.username">root</property>

<!--
登录密码
-->
<property name="connection.password"></property>

<!-- C3P0
连接池设定
-->

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">120</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">120</property>
<property name="hibernate.c3p0.acquire_increment">2</property>


<!--
是否将运行期生成的SQL输出到日志以供调试-->
<property name="show_sql">true</property>
<!--
指定连接的语言
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<!--
映射Student这个资源
-->
<mapping resource="com/wqbi/model/pojo/student.hbm.xml" />

</session-factory> 
</hibernate-configuration>

3
proxool连接池


(1) 
先写proxool的配置文件,文件名:proxool.xml(一般放在与hibernate.cfg.xml文件在同一个目录中)本例配置的是MYSQL数据库,数据库的名字为schoolproject
<?xml version="1.0" encoding="UTF-8"?> 
<!-- the proxool configuration can be embedded within your own application's. 
Anything outside the "proxool" tag is ignored. --> 
<something-else-entirely>
<proxool>
<!--
连接池的别名
-->
<alias>DBPool</alias>
<!--proxool
只能管理由自己产生的连接
-->

<driver-url>
jdbc:mysql://localhost:3306/schoolproject?useUnicode=true&characterEncoding=UTF8
</driver-url>

<!?JDBC驱动程序-->
<driver-class>com.mysql.jdbc.Driver</driver-class>
<driver-properties>
<property name="user" value="root"/>
<property name="password" value=""/>
</driver-properties> 

<!-- proxool
自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回

,超时的销毁--> 
<house-keeping-sleep-time>90000</house-keeping-sleep-time>

<!-- 
指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的

用户连接就不会被接受--> 
<maximum-new-connections>20</maximum-new-connections>
<!-- 
最少保持的空闲连接数
--> 
<prototype-count>5</prototype-count>

<!-- 
允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的

等待请求数由maximum-new-connections决定--> 
<maximum-connection-count>100</maximum-connection-count>

<!-- 
最小连接数
-->
<minimum-connection-count>10</minimum-connection-count>

</proxool> 
</something-else-entirely>

(2)
配置hibernate.cfg.xml文件

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory >
<property name="hibernate.connection.provider_class">
org.hibernate.connection.ProxoolConnectionProvider
</property>
<property name="hibernate.proxool.pool_alias">DBPool</property>
<property name="hibernate.proxool.xml">proxoolconf.xml</property>

<!--
是否将运行期生成的SQL输出到日志以供调试-->
<property name="show_sql">true</property>
<!--
指定连接的语言
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<!--
映射Student这个资源
-->
<mapping resource="com/wqbi/model/pojo/student.hbm.xml" />

</session-factory> 
</hibernate-configuration>
(1) hibernate.connection.provider_class
定义Hibernate的连接加载类,这里Proxool连接池是用这个,不同的连接池有不同的加载类,可以查阅Hibernate文档获取相关信息


(2) hibernate.proxool.pool_alias
这里就是用我们上面提到的连接池的别名

(3) hibernate.proxool.xml
是向Hibernate声明连接池的配置文件位置,可以用相对或绝对路径,用相对路径时要注意一定在要Path范围内!不然会抛出异常。

(4) dialect
是声明SQL语句的方言

(5) show_sql
定义是否显示Hibernate生成的SQL语言,一般在调试阶段设为true,完成后再改成false,这样有利于调试。

(6) <mapping >
资源文件映射

4
JNDI连接池,数据源已经由应用服务配置好(Web服务器)Hibernate需要做的只是通过JNDI名查找到此数据源。应用服务器将连接池对外显示为JNDI绑定数据源,它是javax.jdbc.Datasource类的一个实例。只要配置一个Hibernate文件,如:
hibernate.connection.datasource=java:/comp/env/jdbc/schoolproject //JNDI

hibernate.transaction.factory_class = org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.manager_loopup_class =
org.hibernate.transaction.JBossTransactionManagerLookup
hibernate.dialect=org.hibernate.dialect.MySQLDialect

转自:http://www.cublog.cn/u/27479/showart_218912.html

posted @ 2007-05-11 16:33 lubaolin 阅读(7631) | 评论 (6)编辑 收藏

美特斯邦威:不加寻常班               
特步: 加班, 死一般的感觉       
百事:加班无极限   
森马:上什么公司,加什么班  
脑白金:今年过节不加班,加班只加节假日   
汇仁肾宝:他加我也加   
李宁:加班, 一切皆有可能   
旺旺: 你加,我加,大家加,加加  
农夫山泉:加了有点烦   
好迪:大家加,才是真的加
白加黑:白天加白班,不瞌睡;晚上加晚班,睡不着
联想:公司不加班,公司会怎么样
娃哈哈:妈妈~~我也要加班!
清嘴:你知道加班的味道吗?
安踏:我加班,我喜欢!
NIKE:Just 加 it!
钙中钙:现在的加班啊,它含金量高,加一天顶过去五天,实惠!你瞧我, 一口气加了5天,不费劲!

posted @ 2007-04-16 11:19 lubaolin 阅读(535) | 评论 (1)编辑 收藏

bin>mysql -u root
mysql> grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名@用户地址 identified by ‘连接口令’;

权限1,权限2,…权限n代表select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file等14个权限。
当权限1,权限2,…权限n被all privileges或者all代替,表示赋予用户全部权限。
当数据库名称.表名称被*.*代替,表示赋予用户操作服务器上所有数据库所有表的权限。
用户地址可以是localhost,也可以是ip地址、机器名字、域名。也可以用’%'表示从任何地址连接。
‘连接口令’不能为空,否则创建失败。



例如:
mysql>grant select,insert,update,delete,create,drop on vtdc.employee to joe@10.163.225.87 identified by ‘123′;
给来自10.163.225.87的用户joe分配可对数据库vtdc的employee表进行select,insert,update,delete,create,drop等操作的权限,并设定口令为123。

mysql>grant all privileges on vtdc.* to joe@10.163.225.87 identified by ‘123′;
给来自10.163.225.87的用户joe分配可对数据库vtdc所有表进行所有操作的权限,并设定口令为123。

mysql>grant all privileges on *.* to joe@10.163.225.87 identified by ‘123′;
给来自10.163.225.87的用户joe分配可对所有数据库的所有表进行所有操作的权限,并设定口令为123。

mysql>grant all privileges on *.* to joe@localhost identified by ‘123′;
给本机用户joe分配可对所有数据库的所有表进行所有操作的权限,并设定口令为123。

posted @ 2007-04-15 22:29 lubaolin 阅读(1520) | 评论 (0)编辑 收藏

1)swf从jsp读数据
a) 在flash中建一个动态文本框,一个button;文本框名字叫str,button上写


on (release) {
loadVariable("http://localhost:8080/demo/sentVar.jsp", "","get");
}//url相对,绝对路径好像都可以


b) 在sentVar.jsp中写如下代码:
<%@ page contentType="text/html;charset=gb2312"%>
<%
String tmp="wowowo";
out.println("&str="+tmp);//这里一定要写成"&str="的形式,&一定不能少,str的名字要与你a中建的相同,“= ”号也不能少;
%>
c)测试。click button ...yeah~(failed?its none of my business) try again~~

-------------------------------------------------------------------

2)swf向jsp写数据
这个简单点。

c建一input textfield,起个名字str吧。一个button,上面写:
on (release) {
getURL("showrs.jsp", "","get");
}


b)showrs.jsp中写:

<%@ page contentType="text/html;charset=gb2312"%>
<%
String tem=request.getParameter("str");
out.println("str="+tem);
%>

everything is ok~enjoy...

引自:http://www.flashempire.net/showpost.php?p=892409

posted @ 2007-03-28 09:08 lubaolin 阅读(2850) | 评论 (2)编辑 收藏

进入页面<meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)">
退出页面<meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)">
x为效果持续的时间
y的取值为1-23:

  0 矩形缩小
  1 矩形扩大
  2 圆形缩小
  3 圆形扩大
  4 下到上刷新
  5 上到下刷新
  6 左到右刷新
  7 右到左刷新
  8 竖百叶窗
  9 横百叶窗
  10 错位横百叶窗
  11 错位竖百叶窗
  12 点扩散
  13 左右到中间刷新
  14 中间到左右刷新
  15 中间到上下
  16 上下到中间
  17 右下到左上
  18 右上到左下
  19 左上到右下
  20 左下到右上
  21 横条
  22 竖条
  23 以上22种随机选择一种

posted @ 2007-03-26 16:51 lubaolin 阅读(1510) | 评论 (1)编辑 收藏

我们经常会用到db2 -tvf test.sql 来批量执行test.sql文件中的所有语句,而tvf的具体含义是什么,请看一下介绍
db2命令行参数:以下列出当前的db2命令行参数

db2 => list command options

命令行处理器选项设置

后端进程等待时间(秒) (DB2BQTIME) = 1
连接至后端的重试次数 (DB2BQTRY) = 60
请求队列等待时间(秒) (DB2RQTIME) = 5
输入队列等待时间(秒) (DB2IQTIME) = 5
命令选项 (DB2OPTIONS) =

选项 描述 当前设置
------ ---------------------------------------- ---------------
-a 显示 SQLCA OFF
-c 自动落实 OFF
-e 显示 SQLCODE/SQLSTATE OFF
-f 读取输入文件 OFF
-l 将命令记录到历史文件中 OFF
-n 除去换行字符 OFF
-o 显示输出 ON
-p 显示交互式输入提示 ON
-r 将输出保存到报告文件 OFF
-s 在命令出错时停止执行 OFF
-t 设置语句终止符 OFF
-v 回送当前命令 OFF
-w 显示 FETCH/SELECT 警告消息 ON
-x 不打印列标题 OFF
-z 将所有输出保存到输出文件 OFF

以下用来查看如何修改参数:

db2 => ? options
db2 [option ...] [db2-command | sql-statement |
[? [phrase | message | sqlstate | class-code]]]
选项:-a, -c, -e{c|s}, -finfile, -lhistfile, -n, -o, -p, -rreport, -s, -t,
-td;, -v, -w, -x, -zoutputfile。

选项 描述 缺省设置
------ ---------------------------------------- ---------------
-a 显示 SQLCA OFF
-c 自动落实 ON
-e 显示 SQLCODE/SQLSTATE OFF
-f 读取输入文件 OFF
-l 将命令记录到历史文件中 OFF
-n 除去换行字符 OFF
-o 显示输出 ON
-p 显示 db2 交互式提示 ON
-r 将输出报告保存到文件 OFF
-s 在命令出错时停止执行 OFF
-t 设置语句终止符 OFF
-v 回送当前命令 OFF
-w 显示 FETCH/SELECT 警告消息 ON
-x 不打印列标题 OFF
-z 将所有输出保存到输出文件 OFF

注意:
使用 DB2OPTIONS 环境变量定制选项缺省值。
紧跟选项字母后的减号(-)使该选项关闭。
使用 UPDATE COMMAND OPTIONS 更改选项设置(以交互式或
文件输入方式)。

如何修改,请输入:

db2 => ? update command options

比如修改为不自动提交:

update command options using c off


在db2命令行提示符下,输入?,就可以查看所有的CLP命令

输入: ? command (clp命令名) 比如: ? connect

db2 => ? connect
CONNECT [USER username [{USING password
[NEW new-password CONFIRM confirm-password] |
CHANGE PASSWORD}]]

CONNECT RESET

CONNECT TO database-alias
[IN {SHARE MODE | EXCLUSIVE MODE [ON SINGLE DBPARTITIONNUM]}]
[USER username [{USING password
[NEW new-password CONFIRM confirm-password] |
CHANGE PASSWORD}]]

方括号中的参数是可选参数,尖括号中的内容表示变量。

以下是常用的:

实例

db2start 启动数据库管理器实例。
db2stop 停止数据库管理器实例。
get dbm cfg 返回数据库管理器配置设置。
get dbm cfg show detail 显示数据库管理器参数的当前值和延迟值(从 V8 起)。
1update dbm cfg using  将数据库管理器配置参数 更新为值 。 
get instance 返回 DB2INSTANCE 环境变量的值。
list active databases 列出活动的数据库和连接数。
list application [show detail] 返回关于当前连接的应用程序的信息。
force application (h1 [,h2,..,hn]) 根据句柄号与特定应用程序断开连接。
force application all 断开所有应用程序与数据库的连接。
attach to user using  以用户 通过使用密码 与标识为 的远程实例连接。

 

数据库

create database  创建名为 的数据库。
activate database  显式地激活数据库。
deactivate database  显式地使数据库失效。
connect to [ [user ] using ]  根据需要,显式地以用户 和密码 与数据库 连接。
1update dbm cfg using  将数据库管理器配置参数 更新为值 。 
connect reset 断开与当前数据库的连接。
get db cfg show detail 显示数据库配置参数的当前值和延迟值(仅适用于 V8)。
get db cfg for  返回数据库 的数据库配置设置。
update db cfg for using  将数据库 的数据库配置参数 更新为值 。 
list tables[for {user | all | system | schema }][show detail] 列出数据库中的表。如果没有指定任何参数,则缺省情况是列出当前用户的表。
describe table  显示一个表或视图的列信息。
list tablespaces [show detail] 显示表空间的标识、名称、类型、内容和状态。
list tablespace containers for [show detail] 显示用 指定的表空间的容器信息。
quiesce tablespaces for table reset 将表空间的状态复位成正常(normal)。

 

连接性

catalog [admin] node … 为协议 在节点目录中创建一项。
list [admin] node directory 返回节点目录的内容。
catalog database … 为数据库 在数据库目录中创建一项。
list database directory [on ] 返回数据库目录的内容。

 

性能

get monitor switches 返回会话监控开关的状态。
update monitor switches using  为 设置会话监控开关的状态。
reset monitor all 复位性能监控程序值。
get snapshot for dbm 返回实例级别的性能信息。
get snapshot for all on  为数据库 在数据库级别返回所有性能信息。
get snapshot for dynamic sql on  返回动态 SQL 高速缓存的内容。
runstats on table . 收集表 的统计信息。表名必须是用 全限定的。
reorgchk on table all 确定是否需要对表进行重组。这对于对所有表自动执行 runstats 很有用。
reorg table  通过重构行来消除“碎片”数据并压缩信息,对表进行重组。

 

管理

export 将数据库数据抽取到一个平面文件中。
import 通过使用 IMPORT 实用程序,将数据导入到数据库。
load query table [to local-message-file][nosummary | summaryonly] [showdelta]  返回 LOAD 实用程序的进度。
backup database [to ] 执行数据库备份。
restore database [from ] 执行数据库恢复。
get health snapshot for dbm 返回实例的正常快照信息(仅适用于 V8)。
get health snapshot for all on  返回数据库 的所有正常快照(仅适用于 V8)。

 

管理服务器

get admin cfg 返回管理服务器的配置设置。
update admin cfg using  将管理服务器配置参数 更新为值 。

posted @ 2007-03-16 12:58 lubaolin 阅读(878) | 评论 (0)编辑 收藏

1、查看表空间的名称及大小
select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size
from dba_tablespaces t, dba_data_files d
where t.tablespace_name = d.tablespace_name
group by t.tablespace_name;

2、查看表空间物理文件的名称及大小
select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;

3、查看回滚段名称及大小
select segment_name, tablespace_name, r.status,
(initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,
max_extents, v.curext CurExtent
From dba_rollback_segs r, v$rollstat v
Where r.segment_id = v.usn(+)
order by segment_name ;

4、查看控制文件
select name from v$controlfile;

5、查看日志文件
select member from v$logfile;

6、查看表空间的使用情况
select sum(bytes)/(1024*1024) as free_space,tablespace_name
from dba_free_space
group by tablespace_name;

SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;

7、查看数据库库对象
select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status;

8、查看数据库的版本 
Select version FROM Product_component_version
Where SUBSTR(PRODUCT,1,6)='Oracle';

9、查看数据库的创建日期和归档方式
Select Created, Log_Mode, Log_Mode From V$Database;

10、捕捉运行很久的SQL
column username format a12
column opname format a16
column progress format a8

select username,sid,opname,
round(sofar*100 / totalwork,0) || '%' as progress,
time_remaining,sql_text
from v$session_longops , v$sql
where time_remaining <> 0
and sql_address = address
and sql_hash_value = hash_value
/

11、查看数据表的参数信息
SELECT partition_name, high_value, high_value_length, tablespace_name,
pct_free, pct_used, ini_trans, max_trans, initial_extent,
next_extent, min_extent, max_extent, pct_increase, FREELISTS,
freelist_groups, LOGGING, BUFFER_POOL, num_rows, blocks,
empty_blocks, avg_space, chain_cnt, avg_row_len, sample_size,
last_analyzed
FROM dba_tab_partitions
--WHERE table_name = :tname AND table_owner = :towner
ORDER BY partition_position

12、查看还没提交的事务
select * from v$locked_object;
select * from v$transaction;

13、查找object为哪些进程所用
select
p.spid,
s.sid,
s.serial# serial_num,
s.username user_name,
a.type object_type,
s.osuser os_user_name,
a.owner,
a.object object_name,
decode(sign(48 - command),
1,
to_char(command), 'Action Code #' || to_char(command) ) action,
p.program oracle_process,
s.terminal terminal,
s.program program,
s.status session_status
from v$session s, v$access a, v$process p
where s.paddr = p.addr and
s.type = 'USER' and
a.sid = s.sid and
a.object='SUBSCRIBER_ATTR'
order by s.username, s.osuser

14、回滚段查看
select rownum, sys.dba_rollback_segs.segment_name Name, v$rollstat.extents
Extents, v$rollstat.rssize Size_in_Bytes, v$rollstat.xacts XActs,
v$rollstat.gets Gets, v$rollstat.waits Waits, v$rollstat.writes Writes,
sys.dba_rollback_segs.status status from v$rollstat, sys.dba_rollback_segs,
v$rollname where v$rollname.name(+) = sys.dba_rollback_segs.segment_name and
v$rollstat.usn (+) = v$rollname.usn order by rownum

15、耗资源的进程(top session)
select s.schemaname schema_name, decode(sign(48 - command), 1,
to_char(command), 'Action Code #' || to_char(command) ) action, status
session_status, s.osuser os_user_name, s.sid, p.spid , s.serial# serial_num,
nvl(s.username, '[Oracle process]') user_name, s.terminal terminal,
s.program program, st.value criteria_value from v$sesstat st, v$session s , v$process p
where st.sid = s.sid and st.statistic# = to_number('38') and ('ALL' = 'ALL'
or s.status = 'ALL') and p.addr = s.paddr order by st.value desc, p.spid asc, s.username asc, s.osuser asc

16、查看锁(lock)情况
select /*+ RULE */ ls.osuser os_user_name, ls.username user_name,
decode(ls.type, 'RW', 'Row wait enqueue lock', 'TM', 'DML enqueue lock', 'TX',
'Transaction enqueue lock', 'UL', 'User supplied lock') lock_type,
o.object_name object, decode(ls.lmode, 1, null, 2, 'Row Share', 3,
'Row Exclusive', 4, 'Share', 5, 'Share Row Exclusive', 6, 'Exclusive', null)
lock_mode, o.owner, ls.sid, ls.serial# serial_num, ls.id1, ls.id2
from sys.dba_objects o, ( select s.osuser, s.username, l.type,
l.lmode, s.sid, s.serial#, l.id1, l.id2 from v$session s,
v$lock l where s.sid = l.sid ) ls where o.object_id = ls.id1 and o.owner
<> 'SYS' order by o.owner, o.object_name

17、查看等待(wait)情况
SELECT v$waitstat.class, v$waitstat.count count, SUM(v$sysstat.value) sum_value
FROM v$waitstat, v$sysstat WHERE v$sysstat.name IN ('db block gets',
'consistent gets') group by v$waitstat.class, v$waitstat.count

18、查看sga情况
SELECT NAME, BYTES FROM SYS.V_$SGASTAT ORDER BY NAME ASC

19、查看catched object
SELECT owner, name, db_link, namespace,
type, sharable_mem, loads, executions,
locks, pins, kept FROM v$db_object_cache

20、查看V$SQLAREA
SELECT SQL_TEXT, SHARABLE_MEM, PERSISTENT_MEM, RUNTIME_MEM, SORTS,
VERSION_COUNT, LOADED_VERSIONS, OPEN_VERSIONS, USERS_OPENING, EXECUTIONS,
USERS_EXECUTING, LOADS, FIRST_LOAD_TIME, INVALIDATIONS, PARSE_CALLS, DISK_READS,
BUFFER_GETS, ROWS_PROCESSED FROM V$SQLAREA

21、查看object分类数量
select decode (o.type#,1,'INDEX' , 2,'TABLE' , 3 , 'CLUSTER' , 4, 'VIEW' , 5 ,
'SYNONYM' , 6 , 'SEQUENCE' , 'OTHER' ) object_type , count(*) quantity from
sys.obj$ o where o.type# > 1 group by decode (o.type#,1,'INDEX' , 2,'TABLE' , 3
, 'CLUSTER' , 4, 'VIEW' , 5 , 'SYNONYM' , 6 , 'SEQUENCE' , 'OTHER' ) union select
'COLUMN' , count(*) from sys.col$ union select 'DB LINK' , count(*) from

22、按用户查看object种类
select u.name schema, sum(decode(o.type#, 1, 1, NULL)) indexes,
sum(decode(o.type#, 2, 1, NULL)) tables, sum(decode(o.type#, 3, 1, NULL))
clusters, sum(decode(o.type#, 4, 1, NULL)) views, sum(decode(o.type#, 5, 1,
NULL)) synonyms, sum(decode(o.type#, 6, 1, NULL)) sequences,
sum(decode(o.type#, 1, NULL, 2, NULL, 3, NULL, 4, NULL, 5, NULL, 6, NULL, 1))
others from sys.obj$ o, sys.user$ u where o.type# >= 1 and u.user# =
o.owner# and u.name <> 'PUBLIC' group by u.name order by
sys.link$ union select 'CONSTRAINT' , count(*) from sys.con$

23、有关connection的相关信息
1)查看有哪些用户连接
select s.osuser os_user_name, decode(sign(48 - command), 1, to_char(command),
'Action Code #' || to_char(command) ) action, p.program oracle_process,
status session_status, s.terminal terminal, s.program program,
s.username user_name, s.fixed_table_sequence activity_meter, '' query,
0 memory, 0 max_memory, 0 cpu_usage, s.sid, s.serial# serial_num
from v$session s, v$process p where s.paddr=p.addr and s.type = 'USER'
order by s.username, s.osuser
2)根据v.sid查看对应连接的资源占用等情况
select n.name,
v.value,
n.class,
n.statistic#
from v$statname n,
v$sesstat v
where v.sid = 71 and
v.statistic# = n.statistic#
order by n.class, n.statistic#
3)根据sid查看对应连接正在运行的sql
select /*+ PUSH_SUBQ */
command_type,
sql_text,
sharable_mem,
persistent_mem,
runtime_mem,
sorts,
version_count,
loaded_versions,
open_versions,
users_opening,
executions,
users_executing,
loads,
first_load_time,
invalidations,
parse_calls,
disk_reads,
buffer_gets,
rows_processed,
sysdate start_time,
sysdate finish_time,
'>' || address sql_address,
'N' status
from v$sqlarea
where address = (select sql_address from v$session where sid = 71)

24、查询表空间使用情况select a.tablespace_name "表空间名称",
100-round((nvl(b.bytes_free,0)/a.bytes_alloc)*100,2) "占用率(%)",
round(a.bytes_alloc/1024/1024,2) "容量(M)",
round(nvl(b.bytes_free,0)/1024/1024,2) "空闲(M)",
round((a.bytes_alloc-nvl(b.bytes_free,0))/1024/1024,2) "使用(M)",
Largest "最大扩展段(M)",
to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') "采样时间"
from (select f.tablespace_name,
sum(f.bytes) bytes_alloc,
sum(decode(f.autoextensible,'YES',f.maxbytes,'NO',f.bytes)) maxbytes
from dba_data_files f
group by tablespace_name) a,
(select f.tablespace_name,
sum(f.bytes) bytes_free
from dba_free_space f
group by tablespace_name) b,
(select round(max(ff.length)*16/1024,2) Largest,
ts.name tablespace_name
from sys.fet$ ff, sys.file$ tf,sys.ts$ ts
where ts.ts#=ff.ts# and ff.file#=tf.relfile# and ts.ts#=tf.ts#
group by ts.name, tf.blocks) c
where a.tablespace_name = b.tablespace_name and a.tablespace_name = c.tablespace_name

25、 查询表空间的碎片程度
select tablespace_name,count(tablespace_name) from dba_free_space group by tablespace_name
having count(tablespace_name)>10;

alter tablespace name coalesce;
alter table name deallocate unused;

create or replace view ts_blocks_v as
select tablespace_name,block_id,bytes,blocks,'free space' segment_name from dba_free_space
union all
select tablespace_name,block_id,bytes,blocks,segment_name from dba_extents;

select * from ts_blocks_v;

select tablespace_name,sum(bytes),max(bytes),count(block_id) from dba_free_space
group by tablespace_name;

posted @ 2007-03-09 14:53 lubaolin 阅读(349) | 评论 (0)编辑 收藏

1.字符串函数
长度与分析用
datalength(Char_expr)返回字符串包含字符数,但不包含后面的空格
substring(expression,start,length)不多说了,取子串
right(char_expr,int_expr)返回字符串右边int_expr个字符

字符操作类
upper(char_expr)转为大写
lower(char_expr)转为小写
space(int_expr)生成int_expr个空格
replicate(char_expr,int_expr)复制字符串int_expr次
reverse(char_expr)反转字符串
stuff(char_expr1,start,length,char_expr2)将字符串char_expr1中的从start开始的length个字符用char_expr2代替
ltrim(char_expr)rtrim(char_expr)取掉空格
ascii(char)char(ascii)两函数对应,取ascii码,根据ascii吗取字符

字符串查找
charindex(char_expr,expression)返回char_expr的起始位置
patindex("pattern",expression)返回指定模式的起始位置,否则为0

2.数学函数
abs(numeric_expr)求绝对值
ceiling(numeric_expr)取大于等于指定值的最小整数
exp(float_expr)取指数
floor(numeric_expr)小于等于指定值得最大整数
pi()3.1415926.........
power(numeric_expr,power)返回power次方
rand([int_expr])随机数产生器
round(numeric_expr,int_expr)安int_expr规定的精度四舍五入
sign(int_expr)根据正数,0,负数,,返回 1,0,-1
sqrt(float_expr)平方根

3.日期函数
getdate()返回日期
datename(datepart,date_expr)返回名称如June
datepart(datepart,date_expr)取日期一部份
datediff(datepart,date_expr1.dateexpr2)日期差
dateadd(datepart,number,date_expr)返回日期加上number

上述函数中datepart的
写法取值和意义
yy1753-9999年份
qq1-4刻
mm1-12月
dy1-366日
dd1-31日
wk1-54周
dw1-7周几
hh0-23小时
mi0-59分钟
ss0-59秒
ms0-999毫秒

日期转换
convert()

4.系统函数
suser_name()用户登录名
user_name()用户在数据库中的名字
user用户在数据库中的名字
show_role()对当前用户起作用的规则
db_name()数据库名
object_name(obj_id)数据库对象名
col_name(obj_id,col_id)列名
col_length(objname,colname)列长度
valid_name(char_expr)是否是有效标识符

posted @ 2007-03-09 09:23 lubaolin 阅读(340) | 评论 (0)编辑 收藏

1. JFrame对象一般可以直接向里面添加数据,但是在设置背景颜色时得用:Container f = new JFrame(“test”).getContentPane();

2. pack()是设置窗体大小自适应其内组件,setSize()为设置其显示的大小。

3. 默认关闭窗体JFrame时,是隐藏。要想真退出。请加入setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE是一整形常量,值为3。

4. 加载GIF图片:
MediaTracker tracker = new MediaTracker(this);
Image img = new ImageIcon (getClass().getResource(“test.gif”)).getImage():
Tracker.addImage(img,0):
try{
  tracker.waitForAll();
 }catch(Exception e)
{}
此后就可以对完整的gif进行操作了。

5. 光标移动到组件上给出提示:setToolTipText(”this is tip”);

6. JScrollPane可以通过setVerticalScrollBarPolicy(int policy)
和setHorizontalScrollBarPolicy(int policy)来选择是否显示滚动条。

7.弹出消息框:JOptionPane.showMessageDialog(btn,new String (“test”));
弹出错误提示:JOptionPane.showMessageDialog(null,"错误信息","错误框标题",JOptionPane.ERROR_MESSAGE);

8. 文本输入框右对齐:SetHorizontalAlignment(JTextField.RIGHT);

9.  读取JAR包内资源,应该使用:getClass().getResource();

10. 容器布局为空后——setLayout(null),其内组件应setBounds();

11.内存回收:if(Runtime.getRuntime().freeMemory()<Runtime.getRuntime().totalMemory()/3)
{
 System.gc();
}

12.  JFrame 窗口不可最大化:setResizable(false);

13. 应用程序和applet小程序共存:直接把applet往jframe里面加就成应用程序。

14. 让窗口居中(屏幕)显示:setLocationRelativeTo(null):
或者用:
Toolkit kit = Toolkit.getDefaultToolkit():
Dimension screenSize = kit.getScreenSize();
f.setLocation((screenSize.Width-f.getWidth())/2, (screenSize.Height-f.getHeight())/2);

15. 选择皮肤感官:
try{
UIManager.setLookAndFeel ( "com.sun.java.swing.plaf.motif.MotifLookAndFeel");
            SwingUtilities.updateComponentTreeUI(f);
}

16. 密码框可设setEchoChar(‘#’);或者密码时 pwd = new String(password.getPassword());

17. 用JlayeredPane添加组件时候可以设置深度。

18. 区别单双击事件:
if(e.getClickCount ==1)
{}else if(e.getClickCount ==2){}

19. JAVA2D 中设置虚线:
float [] dash = {2.0f,4.0f};
g2.setStroke(
new BasicStroke(2.0f, BasicStroke.CAP_ROUND,BasicStroke.JOIN_BEVEL,2.0f,dash,2.0f));

20. JAVA2D 中设置字体笔画大小:
Font cf = g.getFont();
Font newf = new Font(cf.getName(),cf.getStyle(),cf.getSize()+20);
g.setFont(newf);

21.让树无图标标签
((DefaultTreeCellRenderer)tree.getCellRenderer()).setOpenIcon(null);
((DefaultTreeCellRenderer)tree.getCellRenderer()).setClosedIcon(null);
((DefaultTreeCellRenderer)tree.getCellRenderer()).setDisabledIcon(null);
((DefaultTreeCellRenderer)tree.getCellRenderer()).setLeafIcon(null);

22.竖着显示滑块
new JSlider(SwingConstants.VERTICAL,min,max,initialValue);

23.通过标尺显示滑块
slider.setMajorTickSpacing(20);
slider.setPaintTicks(true);
slider.setPaintLabels(true);

24.让滑块自动对齐到标尺
slider.setSnapToTicks(true);

25.滑块事件
addChangeListener
ChangeListener -> stateChanged(ChangeEvent event)

26.滑块标尺特殊化
HashtMap map = new HashMap();
map.put(new Integer(0),new JLabel("A"));
slider.setLabel(map);

27.多选单选按钮
JCheckBox 和 JRadioButton 其中单选放入ButtonGroup对象中。
判断是否选中:isSelected()
获取标签用:getText();
事件:ItemListener
方法:itemStateChanged(ItemEvent event)

28.让树一开始就全部展开
expandAll(tree,new TreePath(tree.getModel().getRoot()));
其中有:
public void expandAll (JTree tree,TreePath path)
{
    tree.expandPath(path);
    Obect parent = path.getLastPathComponent();
    TreeModel model = tree.getModel()
    if(model ==null)return;
    if(model.isLeaf(parent)) return;
    int size = model.getChildCount(parent);
    for(int i = 0 ;i<size;i++)
    {
        Object child = model.getChild(parent,i);
        expandAll(tree,path.pathByAddingChild(child));
    }
}

29.树节点匹配:
TreePath path = tree.getNextMatch(str,0,Positon.Bias.Forward);
if(path !=null)
{
    tree.setSelectionPath(path);
}

30.获取树节点

TreeSelectionListener->valueChanged(TreeSelectionEvent e)
TreePath path = e.getPath();
String info = path.getLastPathComponent().toString();
而这里获取到是最后那个选择节点,如成都。
JTree tree = (JTree)e.getSource();
TreePath tp= tree.getPathForLorLocation(e.getPoint().x,e.getPoint().y);
这个PATH是完整的节点名,比如:四川,成都

31.截屏程序核心:
BufferedImage fullScreenImage = robot.createScreenCapture (new Rectangle (
                Toolkit.getDefaultToolkit ().getScreenSize ()));
        ImageIcon icon = new ImageIcon (fullScreenImage);
利用 fullScreenImage.getSubimage(int x,int y,int w,int h)得到子图象(其中的矩形范围是鼠标拖动事件而得到)
ImageIO.write (fullScreenImage.getSubimage(int x,int y,int w,int h),"png","out.png");

界面上:1.继承JLabel 覆盖起paint方法;
    2.JPanel 从(JPanel)Dialog.getContentPane()来,JLabel 添加进JPanel;
    3.Dialog设置为屏幕大小、不显示边框等饰物dialog.setUndecorated (true);(JFrame中其实也有这个方法。)
    4.设置十字光标,dialog.setCursor (Cursor.getPredefinedCursor (Cursor.CROSSHAIR_CURSOR));
        5.设置为模态 dialog.setModal (true);

转自:http://www.blogjava.net/JAVA-HE/archive/2007/02/06/98338.aspx

posted @ 2007-03-07 09:52 lubaolin 阅读(443) | 评论 (0)编辑 收藏

用Acegi为你的Spring应用加把锁!
[简介]
对于一个典型的Web应用,完善的认证和授权机制是必不可少的,在SpringFramework中,Juergen Hoeller提供的范例JPetStore给了一些这方面的介绍,但还远远不够,Acegi是一个专门为SpringFramework提供安全机制的项目,全称为Acegi Security System for Spring,当前版本为0.5.1,就其目前提供的功能,应该可以满足绝大多数应用的需求。

本文的主要目的是希望能够说明如何在基于Spring构架的Web应用中使用Acegi,而不是详细介绍其中的每个接口、每个类。注意,即使对已经存在的Spring应用,通过下面介绍的步骤,也可以马上享受到Acegi提供的认证和授权。

[基础工作]
在你的Web应用的lib中添加Acegi下载包中的acegi-security.jar

[web.xml]
实现认证和授权的最常用的方法是通过filter,Acegi亦是如此,通常Acegi需要在web.xml添加以下5个filter:

<filter>
  <filter-name>Acegi Channel Processing Filter</filter-name>
  <filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class>
  <init-param>
    <param-name>targetClass</param-name>
    <param-value>net.sf.acegisecurity.securechannel.ChannelProcessingFilter</param-value>
  </init-param>
</filter>
<filter>
  <filter-name>Acegi Authentication Processing Filter</filter-name>
  <filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class>
  <init-param>
    <param-name>targetClass</param-name>
    <param-value>net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter</param-value>
  </init-param>
</filter>
<filter>
  <filter-name>Acegi HTTP BASIC Authorization Filter</filter-name>
  <filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class>
  <init-param>
    <param-name>targetClass</param-name>
    <param-value>net.sf.acegisecurity.ui.basicauth.BasicProcessingFilter</param-value>
  </init-param>
</filter>
<filter>
  <filter-name>Acegi Security System for Spring Auto Integration Filter</filter-name>
  <filter-class>net.sf.acegisecurity.ui.AutoIntegrationFilter</filter-class>
</filter>
<filter>
  <filter-name>Acegi HTTP Request Security Filter</filter-name>
  <filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class>
  <init-param>
    <param-name>targetClass</param-name>
    <param-value>net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter</param-value>
  </init-param>
</filter>

最先引起迷惑的是net.sf.acegisecurity.util.FilterToBeanProxy,Acegi自己的文档上解释是: “What  FilterToBeanProxy does is delegate the Filter's methods through to a bean which is obtained from the
Spring application context. This enables the bean to benefit from the Spring application context lifecycle support and configuration flexibility.”,如希望深究的话,去看看源代码应该不难理解。

再下来就是添加filter-mapping了:
<filter-mapping>
  <filter-name>Acegi Channel Processing Filter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
  <filter-name>Acegi Authentication Processing Filter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
  <filter-name>Acegi HTTP BASIC Authorization Filter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
  <filter-name>Acegi Security System for Spring Auto Integration Filter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
  <filter-name>Acegi HTTP Request Security Filter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

这里,需要注意以下两点:
1) 这几个filter的顺序是不能更改的,顺序不对将无法正常工作;
2) 如果你的应用不需要安全传输,如https,则将"Acegi Channel Processing Filter"相关内容注释掉即可;
3) 如果你的应用不需要Spring提供的远程访问机制,如Hessian and Burlap,将"Acegi HTTP BASIC Authorization
Filter"相关内容注释掉即可。

[applicationContext.xml]
接下来就是要添加applicationContext.xml中的内容了,从刚才FilterToBeanFactory的解释可以看出,真正的filter都
在Spring的applicationContext中管理:

1) 首先,你的数据库中必须具有保存用户名和密码的table,Acegi要求table的schema必须如下:

CREATE TABLE users (
    username VARCHAR(50) NOT NULL PRIMARY KEY,
    password VARCHAR(50) NOT NULL,
    enabled BIT NOT NULL
);
CREATE TABLE authorities (
    username VARCHAR(50) NOT NULL,
    authority VARCHAR(50) NOT NULL
);
CREATE UNIQUE INDEX ix_auth_username ON authorities ( username, authority );
ALTER TABLE authorities ADD CONSTRAINT fk_authorities_users foreign key (username) REFERENCES users
(username);

2) 添加访问你的数据库的datasource和Acegi的jdbcDao,如下:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
  <property name="url"><value>${jdbc.url}</value></property>
  <property name="username"><value>${jdbc.username}</value></property>
  <property name="password"><value>${jdbc.password}</value></property>
</bean>
<bean id="jdbcDaoImpl" class="net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl">
  <property name="dataSource"><ref bean="dataSource"/></property>
</bean>

3) 添加DaoAuthenticationProvider:

<bean id="daoAuthenticationProvider" class="net.sf.acegisecurity.providers.dao.DaoAuthenticationProvider">
  <property name="authenticationDao"><ref bean="authenticationDao"/></property>
  <property name="userCache"><ref bean="userCache"/></property>
</bean>

<bean id="userCache" class="net.sf.acegisecurity.providers.dao.cache.EhCacheBasedUserCache">
  <property name="minutesToIdle"><value>5</value></property>
</bean>

如果你需要对密码加密,则在daoAuthenticationProvider中加入:<property name="passwordEncoder"><ref
bean="passwordEncoder"/></property>,Acegi提供了几种加密方法,详细情况可看包
net.sf.acegisecurity.providers.encoding

4) 添加authenticationManager:

<bean id="authenticationManager" class="net.sf.acegisecurity.providers.ProviderManager">
  <property name="providers">
    <list>
      <ref bean="daoAuthenticationProvider"/>
    </list>
   </property>
</bean>

5) 添加accessDecisionManager:

<bean id="accessDecisionManager" class="net.sf.acegisecurity.vote.AffirmativeBased">
  <property name="allowIfAllAbstainDecisions">
    <value>false</value>
  </property>
  <property name="decisionVoters">
    <list><ref bean="roleVoter"/></list>
  </property>
</bean>
<bean id="roleVoter" class="net.sf.acegisecurity.vote.RoleVoter"/>

6) 添加authenticationProcessingFilterEntryPoint:

<bean id="authenticationProcessingFilterEntryPoint"
class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
  <property name="loginFormUrl"><value>/acegilogin.jsp</value></property>
  <property name="forceHttps"><value>false</value></property>
</bean>

其中acegilogin.jsp是登陆页面,一个最简单的登录页面如下:

<%@ taglib prefix='c' uri='http://java.sun.com/jstl/core' %>
<%@ page import="net.sf.acegisecurity.ui.AbstractProcessingFilter" %>
<%@ page import="net.sf.acegisecurity.AuthenticationException" %>
<html>
  <head>
    <title>Login</title>
  </head>

  <body>
    <h1>Login</h1>
    <form action="<c:url value='j_acegi_security_check'/>" method="POST">
      <table>
        <tr><td>User:</td><td><input type='text' name='j_username'></td></tr>
        <tr><td>Password:</td><td><input type='password' name='j_password'></td></tr>
        <tr><td colspan='2'><input name="submit" type="submit"></td></tr>
        <tr><td colspan='2'><input name="reset" type="reset"></td></tr>
      </table>
    </form>
  </body>
</html>

7) 添加filterInvocationInterceptor:

<bean id="filterInvocationInterceptor"
class="net.sf.acegisecurity.intercept.web.FilterSecurityInterceptor">
  <property name="authenticationManager">
    <ref bean="authenticationManager"/>
  </property>
  <property name="accessDecisionManager">
    <ref bean="accessDecisionManager"/>
  </property>
  <property name="objectDefinitionSource">
    <value>
      CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
      \A/sec/administrator.*\Z=ROLE_SUPERVISOR
      \A/sec/user.*\Z=ROLE_TELLER
    </value>
  </property>
</bean>

这里请注意,要objectDefinitionSource中定义哪些页面需要权限访问,需要根据自己的应用需求进行修改,我上面给出
的定义的意思是这样的:
 a. CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON意思是在比较请求路径时全部转换为小写
 b. \A/sec/administrator.*\Z=ROLE_SUPERVISOR意思是只有权限为ROLE_SUPERVISOR才能访问/sec/administrator*的页面
 c. \A/sec/user.*\Z=ROLE_TELLER意思是只有权限为ROLE_TELLER的用户才能访问/sec/user*的页面

8) 添加securityEnforcementFilter:

<bean id="securityEnforcementFilter" class="net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter">
  <property name="filterSecurityInterceptor">
    <ref bean="filterInvocationInterceptor"/>
  </property>
  <property name="authenticationEntryPoint">
    <ref bean="authenticationProcessingFilterEntryPoint"/>
  </property>
</bean>

9) 添加authenticationProcessingFilter:

<bean id="authenticationProcessingFilter"
class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
  <property name="authenticationManager">
    <ref bean="authenticationManager"/>
  </property>
  <property name="authenticationFailureUrl">
    <value>/loginerror.jsp</value>
  </property>
  <property name="defaultTargetUrl">
    <value>/</value>
  </property>
  <property name="filterProcessesUrl">
    <value>/j_acegi_security_check</value>
  </property>
</bean>
其中authenticationFailureUrl是认证失败的页面。

10) 如果需要一些页面通过安全通道的话,添加下面的配置:

<bean id="channelProcessingFilter" class="net.sf.acegisecurity.securechannel.ChannelProcessingFilter">
  <property name="channelDecisionManager">
    <ref bean="channelDecisionManager"/>
  </property>
  <property name="filterInvocationDefinitionSource">
    <value>
      CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
      \A/sec/administrator.*\Z=REQUIRES_SECURE_CHANNEL
      \A/acegilogin.jsp.*\Z=REQUIRES_SECURE_CHANNEL
      \A/j_acegi_security_check.*\Z=REQUIRES_SECURE_CHANNEL
      \A.*\Z=REQUIRES_INSECURE_CHANNEL
    </value>
  </property>
</bean>

<bean id="channelDecisionManager" class="net.sf.acegisecurity.securechannel.ChannelDecisionManagerImpl">
  <property name="channelProcessors">
    <list>
      <ref bean="secureChannelProcessor"/>
      <ref bean="insecureChannelProcessor"/>
    </list>
  </property>
</bean>
<bean id="secureChannelProcessor" class="net.sf.acegisecurity.securechannel.SecureChannelProcessor"/>
<bean id="insecureChannelProcessor" class="net.sf.acegisecurity.securechannel.InsecureChannelProcessor"/>

[缺少了什么?]
Acegi目前提供了两种"secure object",分别对页面和方法进行安全认证管理,我这里介绍的只是利用
FilterSecurityInterceptor对访问页面的权限控制,除此之外,Acegi还提供了另外一个Interceptor——
MethodSecurityInterceptor,它结合runAsManager可实现对对象中的方法的权限控制,使用方法可参看Acegi自带的文档
和contact范例。

[最后要说的]
本来以为只是说明如何使用Acegi而已,应该非常简单,但真正写起来才发现想要条理清楚的理顺所有需要的bean还是很
困难的,但愿我没有遗漏太多东西,如果我的文章有什么遗漏或错误的话,还请参看Acegi自带的quick-start范例,但请
注意,这个范例是不能直接拿来用的。

posted @ 2007-03-06 09:28 lubaolin 阅读(247) | 评论 (0)编辑 收藏

<SCRIPT>
var imagepath="10cfeba177b.jpg"
var imagewidth=200 //这两行写图片的大小
var imageheight=300
var speed=2;
var imageclick="index0.htm" //这里写点击图片连接到的地址
var hideafter=0
var isie=0;
if(window.navigator.appName=="Microsoft Internet Explorer"&&window.navigator.appVersion.substring(window.navigator.appVersion.indexOf("MSIE")+5,window.navigator.appVersion.indexOf("MSIE")+8)>=5.5) {
isie=1;
}
else {
isie=0;
}
if(isie){
var preloadit=new Image()
preloadit.src=imagepath
}
function pop() {
if(isie) {
x=x+dx;y=y+dy;
oPopup.show(x, y, imagewidth, imageheight);
if(x+imagewidth+5>screen.width) dx=-dx;
if(y+imageheight+5>screen.height) dy=-dy;
if(x<0) dx=-dx;
if(y<0) dy=-dy;
startani=setTimeout("pop();",50);
}
}
function dismisspopup(){
clearTimeout(startani)
oPopup.hide()
}
function dowhat(){
if (imageclick=="dismiss")
dismisspopup()
else
window.open(imageclick);
}
if(isie) {
var x=0,y=0,dx=speed,dy=speed;
var oPopup = window.createPopup();
var oPopupBody = oPopup.document.body;
oPopupBody.style.cursor="hand"
oPopupBody.innerHTML = '<IMG SRC="'+preloadit.src+'">';
oPopup.document.body.onmouseover=new Function("clearTimeout(startani)")
oPopup.document.body.onmouseout=pop
oPopup.document.body.onclick=dowhat
pop();
if (hideafter>0)
setTimeout("dismisspopup()",hideafter*1000)
}
</SCRIPT>

posted @ 2007-02-08 18:01 lubaolin 阅读(4986) | 评论 (2)编辑 收藏

<table   style="TABLE-LAYOUT:   fixed"   width="200"   border="0"   cellspacing="0"   cellpadding="7"   bgcolor="#f7f7f7">  
  <tr>    
  <td   style="LEFT:   0px;   WIDTH:   100%;   WORD-WRAP:   break-word">  
  dffadfdaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsfdffadfdasfdffadfdasfdffadfdasfdffadfdasfdffadfdasfdffadfdasfdffadfdasfdffadfdasfdffadfdasf  
  </font></td>  
  </tr>  
  </table>

posted @ 2007-02-07 15:01 lubaolin 阅读(463) | 评论 (0)编辑 收藏

tomcat---confi--server.xml中的 <Context path="" docBase="ROOT" debug="0"/> 其中path="工程名" docBase="工程路径"

posted @ 2007-02-06 16:21 lubaolin 阅读(222) | 评论 (0)编辑 收藏

 

注意:如果所建项目是servlet2.4的,那么在web.xml中写taglib就要加一个

<jsp-config>标记,如下所示:

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 <display-name>
 TagStudy2
 </display-name>
 
  <jsp-config>
       <taglib>
           <taglib-uri>/hello</taglib-uri>
           <taglib-location>/WEB-INF/HelloTag.tld</taglib-location>
      </taglib>
   </jsp-config>
  

 <welcome-file-list>
  <welcome-file>default.jsp</welcome-file>
 </welcome-file-list>
 

</web-app>

posted @ 2007-01-22 10:41 lubaolin 阅读(1049) | 评论 (1)编辑 收藏

 
1 恐龙说:“遇到色狼,不慌不忙;遇到禽兽,慢慢享受……”
2 找不到恐龙,就用蜥蜴顶
3 关羽五绺长髯,风度翩翩,手提青龙偃月刀,江湖人送绰号——刀郎。
4 男人与女人,终究也只是欲望的动物吧!真的可以因为爱而结合吗?对不起,我也不知道。。
5 路边的野花不要,踩。
6 吃饭与ml是第一生产力。
7 月经不仅仅是女人的痛苦,也是男人的痛苦。
8 鸳鸳相抱何时了,鸯在一边看热闹。
9 昨天,系花对我笑了一下,乐得我晚上直数羊,一只羊,两只羊,三只羊……
10 长大了娶唐僧做老公,能玩就玩一玩,不能玩就把他吃掉。
11 男人有冲动可能是爱你,也可能是不爱,但没有冲动肯定是不爱!
12 站的更高,尿的更远。
13 女,喜甜食,甚胖!该女有一癖好:痛恨蚂蚁,见必杀之。问其故曰:这小东西,那么爱吃甜食,腰还那么细!
14 打破老婆终身制,实行小姨股份制。引入小姐竞争制,推广情人合同制。
15 在一辆拥挤的公车上,一位女郎忽然叫了起来:别挤啦!别挤啦!把人家的奶都挤出来啦!(她拿着酸奶呢)。
16 我不在江湖,但江湖中有我的传说。
17 我身在江湖,江湖里却没有我得传说。
18 要是我灌水,就骂我“三个代表”没学好吧。
19 如果回帖是一种美德,那我早就成为圣人了!
20 睡眠是一门艺术——谁也无法阻挡我追求艺术的脚步!
21 饭在锅里,我在床上*^_^*
22 恋爱就是无数个饭局,结婚就是一个饭局。
23 走,MM,咱们化蝶去……
24 爱护环境,人人有病。
25 爱——不是想出来的,爱——是做出来的!!
26 爱她,就请为她做无痛人流手术!
27 俺从不写措字,但俺写通假字!
28 避孕的效果:不成功,便成“人”。
29 勃起不是万能的,但不能勃起却是万万都不能的!
30 不要在一棵树上吊死,在附近几棵树上多试试死几次~
31 不在课堂上沉睡,就在酒桌上埋醉。
32 长得真有创意,活得真有勇气!
33 自从我变成了狗屎,就再也没有人踩在我头上了。
34 丑,但是丑的特别,也就是特别的丑!
35 穿别人的鞋,走自己的路,让他们找去吧。
36 床上运动也可以减肥的,你们都不知道吗?
37 此地禁止大小便,违者没收工具。
38 读书读到抽筋处,文思方能如尿崩!
39 佛曰,色即是空,空即是色!今晚,偶想空一下
40 很多女明星不红的原因是因为没有张开腿*^_^*
41 花前月下,不如花钱“日”下!*^_^*
42 解释就是掩饰,掩饰就是编故事!
43 精典之极就是精斑!!!
44 老天,你让夏天和冬天同房了吧?生出这鬼天气!
45 漏洞与补丁齐飞,蓝屏共死机一色!
46 美女未抱身先走,常使色狼泪满襟。。。。。。
47 内练一口气,外练一口屁。
48 男人靠的住,母猪能上树!
49 男人偷腥时的智商仅次于爱因斯坦!
50 你的丑和你的脸没有关系。。。。。。
51 .其实我是一个天才,可惜天妒英才!
52 人生不能像做菜、把所有的料都准备好才下锅!
53 人生重要的不是所站的位置,而是所朝的方向!
54 人生自古谁无死,啊个拉屎不用纸!
55 如果跟导师讲不清楚,那么就把他搞胡涂吧!
56 如果有一双眼睛陪我一同哭泣,就值得我为生命受苦。
57 啥时硬件也可以COPY就好了!
58 生活TMD好玩,因为生活老TMD玩我!
59 所有刻骨铭心的爱都灵魂游离于床上的瞬间!
60 天塌下来你顶着,我垫着!
61 听君一席话,省我十本书!
62 脱了衣服我是禽兽,穿上衣服我是衣冠禽兽!
63 为中华而努力读书!一包中华好多钱啊~~~
64 我的id是假冒的,大家不要相信我是骗子。
65 我妈常说,我们家要是没有电话就不会这么穷。
66 我喜欢孩子,更喜欢造孩子的过程!
67 我在马路边丢了一分钱 !
68 下雨了,别忘了打伞,湿身是小,淋病就麻烦啦*^_^*
69 修养的艺术,其实就是说谎的艺术。
70 学海无涯,回头是岸!
71 一时的冲动,子孙的危机!
72 我本非随便的人,但如果你想随便,那我就随你的便好啦!
73 有事秘书干,没事干秘书!
74 与时俱进,你我共赴高潮!
75 只要不下流,我们就是主流!
76 只有假货是真的,别的都是假的!
77 E网情深牵手E网。走自己的路,让别人打车去吧。
78 生,容易。活,容易。生活,不容易。
79 流氓不可怕,就怕流氓有文化。
80 做爱做的事,交配交的人。
81 生我之前谁是我,生我之后我是谁?
82 死亡教会人一切,如同考试之后公布的结果——虽然恍然大悟,但为时晚矣~!
83 不在放荡中变坏,就在沉默中变态!
84 走过了年少,脚起了水泡
85 商女不知亡国恨、妓女不懂婚外情。
86 禽兽尚且有半点怜悯之心,而我一点也没有,所以我不是禽兽。
87 所有的男人生来平等,结婚的除外。
88 锻炼肌肉,防止挨揍!
89 看尽天下A片,心中自然无码~
90 如果恐龙是人,那人是什么?
91 比我有才的都没我帅,比我帅的都没我有才!
92 沒有激情的亲吻,哪來床上的翻滾?
93 勿以坑小而不灌,勿以坑大而灌之。
94 怀揣两块,胸怀500万!
95 解释就系掩饰,掩饰等于无出色,无出色不如回家休息!!!
96 我真想亲口管你爷爷叫声:爹!
97 微机原理闹危机,随机过程随机过,实变函数学十遍,汇编语言不会编!
98 如果没有毛片,中国的性教育简直就是一片空白!
99 男人在结婚前觉得适合自己的女人很少,结婚后觉得适合自己的女人很多。
100 人生本无缘,相见易更难,说句心里话,谁不爱钱啊。

posted @ 2007-01-19 21:29 lubaolin 阅读(318) | 评论 (1)编辑 收藏

小兔说:"我是兔娘养的!" 
小猪说:"我是猪娘养的!" 
小鸡说:"我是鸡娘养的!" 
小狗说:"你们聊,我先走了!"
> >
> > 0号陪练说:"外人叫我零陪,好听!"
> > 1号陪练说:"外人叫我一陪,也好听!"
> > 2号陪练说:"外人叫我二陪,也很好听!"
> > 3号陪练说:"你们聊,我们先走了!"
> >
> > 猫对我说:"我是你奶奶的猫,好听!"
> > 狗对我说:"我是你奶奶的狗,也好听!"
> > 鱼对我说:"我是你奶奶的鱼,也很好听!"
> > 熊说:"你们聊,我先走了!"
> >
> > 浪客说:"人们叫我浪人,好听!"
> > 武士说:"人们叫我武人,也好听!"
> > 高手说:"人们叫我高人,也很好听!"
> > 剑客说:"你们聊,我先走了!"
> >
> > 张靓颖说:"崇拜我的歌迷都说:偶的偶像叫颖"
> > 何洁说:"崇拜我的歌迷都说:偶的偶像叫洁"
> > 周笔畅说"崇拜我的歌迷都说:偶的偶像叫畅"
> > 李宇春说:"你们聊,我先走了!"
> >
> > 高等数学老师说:这学期我教高数,
> > 大学物理老师说:这学期我教大物,
> > 模拟电子老师说:这学期我教模电,
> > 社会主义经济老师说:你们聊,我先走了。
> >
> > 北京大学的说:我是北大的。
> > 天津大学的说:我是天大的。
> > 上海大学的说:我是上大的。
> > 厦门大学的说:你们聊,我先走了!
> >
> > 李宗仁将军说:我这人,有仁!
> > 傅作义将军说:我这人,有义!
> > 左权将军说:我这人,有权!
> > 霍去病将军说:你们聊,我先走了!
> >
> > 美能达的用户说:我们是美人!
> > 佳能的用户说:我们是佳人!
> > 华光的用户说:我们是华人!
> > 尼康的用户说:你们聊,我先走了!
> >
> > 老张家的门是柳木做的,老张说:我家的门是木门
> > 老李家的门是塑料做的,老李说:我家的门是塑门
> > 老王家的门是砖头做的,老王说:我家的门是砖门
> > 老刘家的门是钢做的,老刘说:你们聊,我先走了!
> >
> > 师范学院的学生说:我是"师院"的
> > 铁道学院的学生说:我是"铁院"的
> > 职业学院的学生说:我是"职院"的
> > 技术学院的学生说:你们聊,我先走了!

posted @ 2007-01-19 21:18 lubaolin 阅读(169) | 评论 (0)编辑 收藏

楼主的帖子实在是写得太好了。文笔流畅,修辞得体,深得魏晋诸朝遗风,更将唐风宋骨发扬得入木三分,能在有生之年看见楼主的这个帖子。实在是我三生之幸啊。看完楼主的这个帖子之后,我竟产生出一种无以名之的悲痛感--啊,这么好的帖子,如果将来我再也看不到了,那我该怎么办?那我该怎么办?直到我毫不犹豫地把楼主的这个帖子收藏了,我内心的那种激动才逐渐平静下来。可是我立刻想到,这么好的帖子,倘若别人看不到,那么不是浪费楼主的心血吗?经过痛苦的思想斗争,我终于下定决心,牺牲小我,奉献大我。我要拿出这帖子奉献给世人赏阅,我要把这个帖子一直往上顶,往上顶!顶到所有人都看到为止!
在遇到你之前,我对人世间是否有真正的圣人是怀疑的;而现在,我终于相信了!我曾经忘情于两汉的歌赋,我曾经惊讶于李杜的诗才,我曾经流连于宋元的词曲。但现在,我才知道我有多么浅薄!
楼主,你的高尚情操太让人感动了。在现在这样一个物欲横流的金钱社会里,竟然还能见到楼主这样的性情中人,无疑是我这辈子最大的幸运。让我深深感受到了人性的伟大。楼主的帖子,就好比黑暗中刺裂夜空的闪电,又好比撕开乌云的阳光,一瞬间就让我如饮甘露,让我明白了永恒的真理在这个世界上是真实存在着的。只有楼主这样具备广阔胸怀和完整知识体系的人,才能作为这真理的惟一引言者。看了楼主的帖子,我陷入了严肃的思考中。我认为,如果不把楼主的帖子顶上去,就是对真理的一种背叛,就是对谬论的极大妥协。因此,我决定义无返顾地顶了!
    说得好啊!我在XX社区打滚这么多年,所谓阅人无数,就算没有见过猪走路,也总明白猪肉是啥味道的。一看到楼主的气势,我就觉得楼主同在社区里灌水的那帮小混混有着本质的差别!那忧郁的语调,那熟悉的签名,还有字里行间高屋建瓴的辞藻。没用的,楼主,就算你怎么换马甲都是没有用的,你的亿万拥戴者早已经把你认出来了,你一定就是传说中的最强ID。自从社区改版之后,我就已经心灰意冷,对社区也没抱什么希望了,传说已经幻灭,神话已经终结,留在社区还有什么意思?没想到,没想到,今天可以再睹楼主的风范,我激动得忍不住就在屏幕前流下了眼泪。是啊,只要在楼主的带领下,社区就有希望了。我的内心再一次沸腾了,我胸腔里的血再一次燃烧了。楼主的几句话虽然简单,却概括扼要,一语道出了我们苦想多年仍不可解的几个重大问题的根本。楼主就好比社区的明灯,楼主就好比社区的方向,楼主就好比社区的栋梁。有楼主在,社区的明天必将更好!
    大师的话真如“大音希声扫阴翳”,犹如“拨开云雾见青天”,使我等网民看到了希望,看到了未来!晴天霹雳、醍醐灌顶或许不足以形容大师文章的万一;巫山行云、长江流水更难以比拟大师的文才!黄钟大吕,振聋发聩!你烛照天下,明见万里;雨露苍生,泽被万方!透过你深邃的文字,我仿佛看到了你鹰视狼顾、龙行虎步的伟岸英姿;仿佛看到了你手执如椽大笔、写天下文章的智慧神态;仿佛看见了你按剑四顾、指点江山的英武气概!
    逐字逐句地看完这个帖子以后,我的心久久不能平静,震撼啊!为什么会有如此好的帖子!我纵横网络BBS多年,自以为再也不会有任何帖子能打动我,没想到今天看到了如此精妙绝伦的这样一篇帖子!楼主,是你让我深深地理解了“人外有人,天外有天”这句话。谢谢侬!在看完这帖子以后,我没有立即回复,因为我生怕我庸俗不堪的回复会玷污了这网上少有的帖子。但是我还是回复了,因为觉得如果不能在如此精彩的帖子后面留下自己的网名,那我死也不会瞑目的!能够在如此精彩的帖子后面留下自己的网名是多么骄傲的一件事啊!楼主,请原谅我的自私!我知道无论用多么华丽的辞藻来形容楼主您帖子的精彩程度都是不够的,都是虚伪的,所以我只想说一句:您的帖子太好看了!我愿意一辈子看下去!这篇帖子构思新颖,题材独具匠心,段落清晰,情节诡异,跌宕起伏,主线分明,引人入胜,平淡中显示出不凡的文学功底,可谓是字字珠玑,句句经典,是我辈应当学习之典范。正所谓:“一马奔腾,射雕引弓,天地都在我心中!”楼主真不愧为无厘界新一代的开山怪!本来我已经对这个社区失望了,觉得这个社区没有前途了,心里充满了悲哀。但是看了你的这个帖子,又让我对社区产生了希望。是你让我的心里重新燃起希望之火,是你让我的心死灰复燃,是你拯救了我一颗拔凉拔凉的心!本来我决定不在社区回任何帖子了,但是看了你的帖子,我告诉自己这个帖子是一定要回的!这是百年难得一见的好贴啊!苍天有眼啊,让我在有生之年得以观得如此精彩绝伦的帖子!

好帖

很好帖

确实好帖

少见的好帖

真 *** 好帖

难得一见的好帖

千年等一回的好帖

好得不能再好的好帖

惊天地且泣鬼神的好帖

让人阅毕击掌三叹的好帖

让人佩服得五体投地的好帖

让人奔走相告曰须阅读的好帖

让斑竹看后决定加精固顶的好帖

让人看后在各论坛纷纷转贴的好帖

让人看后连成人网站都没兴趣的好帖

让人看完后就要往上顶往死里顶的好帖

让人不间断地在各种场合重复引用的好帖

让人一见面就问你看过某某好帖没有的好帖

让人半夜上厕所都要打开电脑再看一遍的好帖

让个读过后都下载在硬盘里详细研究欣赏的好帖

让人走路吃饭睡觉干什么事连做梦都梦到它的好帖

让人翻译成36种不同外语流传国内外世界各地的好帖

让人纷纷唱道过年过节不送礼要送就送某某帖子的好帖

让国家领导人命令将该帖刻在纯金版上当国礼送人的好帖

让网络上纷纷冒出该帖的真人版卡通版搞笑版成人版的好帖

让人在公共厕所里不再乱涂乱化而是纷纷对它引经据典的好帖

让某位想成名的少女向媒体说她与该帖作者发生过性关系的好帖

让人根据它写成小说又被不同导演拍成48个不同版本的电影的好帖

让某名导演跟据此帖改拍的电影在奥斯卡上一连拿了11个奖项的好帖

让人大代表们看完后联名要求根据该帖的内容对宪法做适当修改的好帖

让人为了谁是它的原始作者纷纷地闹上法院打官司要争得它的版权的好帖

让各大学府纷纷邀请该帖作者去就如何发表优秀网络文学为题目演讲的好帖

让人为了该帖而成立了各种学会来研究并为不同的理解争得眼红脖子粗的好帖

让美国警察于今后逮捕人说你有权保持沉默还有权阅读某某帖子要不要啊的好帖

让本拉登躲在山洞里还命令他手下冒着被美军发现的危险去上网下载来阅读的好帖

让萨达姆被捕时被发现他随身携带的除了一把手枪之外还有的就是它的复印件的好帖

让比尔盖茨在懂事会上发给与会者人手一份该帖命令仔细阅读后才讨论其他事宜的好帖

让诺贝儿奖理事会破天荒地因该帖的出现而开会讨论一直决定今后设立最佳帖子奖的好帖

让联合国安理会决定将它译成宇宙语由中国神州六号升空后不断播放看有没有外星人的好帖

让人看完后ie锁死连瑞星诺顿都没法修复只好格式化硬盘重装启动后主页显示的还是它的好帖
真是好帖子啊
阁下  字迹工整,
    文笔极佳,
    才思敏捷,
    过目不忘,
    十年寒窗,
    博学多才,
    见多识广,
    才高八斗,
    学富五车,
    文武双全,
    雄韬伟略,
    谈吐不凡,
    谈笑风声,
    高谈阔论,
    眉飞色舞,
    运筹帷幄,
    言简意赅,
    完美无缺,
    一针见血,
    远见卓识,
    义正词严,
    一气呵成,
    大显神通,
    出口成章,
    出类拔萃,
    出神入化,
    万古流芳,
    一本正经,
    一箭双雕,
    长篇大论,
    功德无量,
    力排众议,
    力挽狂澜,
    气贯长虹,
    气势磅礴,
    气吞山河,
    坚韧不拔,
    身体力行,
    空前绝后,
    视死如归,
    英姿焕发,
    奉公守法,
    艰苦奋斗,
    忠贞不渝,
    舍己为人,
    大公无私,
    一尘不染,
    一鸣惊人, 路過~~~~那分~~~~~閃人~~~~~~~~謝謝~~~~~~~~~~

posted @ 2007-01-19 21:07 lubaolin 阅读(178) | 评论 (0)编辑 收藏

这年头,完美的人生就是住英国的房子,戴瑞士手表,拿美国工资,娶韩国女人,嫖俄罗斯女人,开德国轿车,喝法国红酒,雇菲律宾女佣。

 

这年头,苦干实干,做给天看;东混西混,一帆风顺;任劳任怨,永难如愿;会捧会献,杰出贡献;尽职尽责,必遭指责;推托栽赃,邀功领赏!

 

这年头,男人的小康就是有一所像样的小房,有一辆时尚的小车,有一笔吃喝的小钞,有一位顾家的小太,有一门管用的小“炮”,有一群擦炮的小蜜!

 

这年头,为官之道就是为领导干一百件好事也不如与领导一起干一件坏事,领导带你一起干了一件坏事那肯定有一百件好事等着你!

 

这年头,说河南人诈骗,广东人笑了;说河南人造假,浙江人笑了;说河南人斤斤计较,上海人笑了;说河南人夸夸其谈,北京人笑了;说河南人傻,诸葛亮笑了!

 

这年头,河南人好生郁闷:好不容易有座山,却是平顶山;好不容易有家酒店,却是驻馬店;好不容易想结婚,自己却洛了“阳”;好不容易找个老婆,却被人家开了“封”!

 

这年头,接听电话声音渐渐小对方是领导,声音渐渐大对方是部下,一听就发燥对方拨错号,笑得不停歇那是女同学,半天哼一下老婆在训话,悄悄避开人对方是情人!

 

这年头,当官也不容易:体质弱的累死,心胸窄的气死,智商低的悉死,胆量小的吓死,酒量小的喝死,性欲差的羞死,性欲强的那可真是舒服死!

 

这年头,教育好子女是生命延续的重要代表,理顺好领导安排好部下是权力重要代表,办好朋友的事是人生价值的重要代表!

 

这年头,人有钱有时间有个好身体,绝品;人有钱无病无时间,珍品;人无钱无病有时间,上品;人无钱无病无时间,次品;人无钱无时间有脾气,废品!

 

这年头,干部素质要求你:心中有小平,袋中有文凭,对上能摆平,对下能铲平,道德没水平,金库能填平,左手拿酒瓶,右手握药瓶,家里有醋瓶,外面有花瓶!

 

这年头,构建和谐社会要注意在自然界不要和天斗,在国际社会不要和美国斗,在路上不要和军车斗,在单位不要和领导斗,在家里不要和老婆斗!

 

这年头,听说要去打台湾,一老红军把计献:派三万人马足矣:派一小姐过去把他奶奶的国军身体搞垮,派一万河南老乡过去把他娘的经济搞乱,派一万领导干部过去把他妈的国库折腾干!

 

这年头,10类人做不了大官:1胆小,2话多,3钱少,4关系差,5酒量小,6才华横溢,7学历太高,8疾恶如仇,9性功能差,10有姿色不肯献身。

 

这年头,开展批评太难了:批评老婆她就乱跑,批评老公他就乱搞!批评上级就官位难保,批评同级就关系难搞,批评自己就自寻烦恼,批评下级就选票减少!

 

这年头,老婆是家情人是花,工资给家奖金送花,病了回家好了看花,离不了的是家忘不了的是花,常回家看看别忘了浇花!

 

这年头,女人对男人的基本配置是:身边站个魁梧的,怀里搂个有功夫的,家里待个赚钱的,远方有个思念的,梦里藏个初恋的,偶尔来个温柔的,老了混个懂保健的。

 

这年头,男人认为情人是手表越漂亮越好,小蜜是怀表越隐秘越好,小姐是电子表越新鲜越好,老婆是自动表不上弦照样跑,各种表都想要只是时间要掌握好!

 

这年头,结婚叫入网,重婚叫一卡双号,婚外恋叫呼叫转移,情人多叫移动梦网,离婚叫销号,分居叫停机留号,女人再婚叫过户。男人再婚叫补卡,互换叫联通。

posted @ 2006-12-22 11:12 lubaolin 阅读(296) | 评论 (0)编辑 收藏

/**
 * <p>Title: 公式解析类</p>
 * <p>Description: 实现对包含“()”的表达式进行简单的四则运算。</p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Company: </p>
 * @author leasion
 * @version 1.0
 */
/**
* 原载于:http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=124&threadID=14861&tstart=90
* 修改者:lkz
* 修改说明:
*     1.增加对负数运算支持;
*     2.增加对公式的检查;
*     3.增加对类似公式(A+B)+(C-D)的支持。
*     4.其它一些小的改动。
*
*/

import java.util.Vector;

 

public class FormulaParser {
    private int leftBracket = 0;//左括号个数
    private int rightBracket = 0;//右括号个数
    private int startL = 0;
    private int startR = 0;
    private double answer = 0;
    private String strValue="";
    private String leftNumber = "0";
    private String rightNumber = "0";
    public String Msg = "";
    private String formula="";
    private int[] sym = new int[4];
    private Vector list = new Vector();

 

    public FormulaParser(String calRule){
      this.setFormula(calRule);
    }
    private int getLeftBracket(String calRule) {
        leftBracket = 0;
        startL = calRule.indexOf("(");
        if (startL != -1) {
            calRule = calRule.substring(startL + 1, calRule.length());
        }
        while (startL != -1) {
            leftBracket++;
            startL = calRule.indexOf("(");
            calRule = calRule.substring(startL + 1, calRule.length());
        }
        return leftBracket;
    }

 

    private void setLeftBracket(int leftBracket) {
        this.leftBracket = leftBracket;
    }
    public void setFormula(String calRule){
      formula=replaceSubtration(calRule.trim());
      formula="("+formula+")";
    }
    /*
    /*为了使公式中支持负数,使用“`”表示减号,使用“-”表示负号
    */
    private String replaceSubtration(String vstr){
      String tmp="";
      String result="";
      int startS = vstr.indexOf("-");
      if (startS !=-1) {
        if (startS > 0) {
          tmp = vstr.substring(startS - 1, startS);
          if (!"+".equals(tmp) && !"-".equals(tmp) && !"*".equals(tmp) &&!"/".equals(tmp) &&
             !"(".equals(tmp)){
            result = result + vstr.substring(0, startS) + "`";
          }
          else
            result = result + vstr.substring(0, startS + 1);
        }
        else
          result = result + vstr.substring(0, startS + 1);
       vstr = vstr.substring(startS + 1);
      }
      while (startS != -1) {
        startS = vstr.indexOf("-");
        if (startS > 0) {
          tmp = vstr.substring(startS - 1, startS);
          if (!"+".equals(tmp) && !"-".equals(tmp) && !"*".equals(tmp) &&!"/".equals(tmp) &&
             !"(".equals(tmp))
            result = result + vstr.substring(0, startS) + "`";
          else
            result = result + vstr.substring(0, startS + 1);
        }
        else
          result = result + vstr.substring(0, startS + 1);
          vstr = vstr.substring(startS + 1);
      }
      result+=vstr;
      return result;
    }

 

    public String getFormula(){
      return formula.replace('`','-').substring(1,formula.length()-1);
    }

 

    private int getRightBracket(String calRule) {
        rightBracket = 0;
        startR = calRule.indexOf(")");
        if (startR != -1) {
            calRule = calRule.substring(startR + 1, calRule.length());
        }
        while (startR != -1) {
            rightBracket++;
            startR = calRule.indexOf(")");
            calRule = calRule.substring(startR + 1, calRule.length());
        }
        return rightBracket;
    }

 

    private void setRightBracket(int rightBracket) {
        this.rightBracket = rightBracket;
    }

 

    /*
    /*对比左右括号个数
    */
    private boolean compareToLR() {
        int lb = getLeftBracket(formula);
        int rb = getRightBracket(formula);
        boolean CTLR = false;
        if (lb == rb) {
            Msg = "";
            CTLR = true;
        } else if (lb > rb) {
            Msg = "左括弧的个数多于右括弧,请检查!";
            CTLR = false;
        } else {
            Msg = "左括弧的个数少于右括弧,请检查!";
            CTLR = false;
        }
        return CTLR;
    }
   /*
   /*检查公式中是否存在非法字符如(+、-)等
   */
   private boolean checkFormula(){
      boolean isOk=true;
      String[] bracket =new String[2];
      String[] sign=new String[4];
      bracket[0]="(";
      bracket[1]=")";
      sign[0]="+";
      sign[1]="`";
      sign[2]="*";
      sign[3]="/";
      String vstr="";
      for(int i=0;i<bracket.length;i++){
        for(int j=0;j<sign.length;j++){
          if (i==0)
            vstr=bracket[i]+sign[j];
          else
            vstr=sign[j]+bracket[i];
          if (formula.indexOf(vstr)>0){
            Msg="公式中存在非法字符"+vstr;
            isOk=false;
            return isOk;
          }
        }
      }
      for(int i=0;i<sign.length;i++){
        for(int j=0;j<sign.length;j++){
          vstr=sign[i]+sign[j];
          if (formula.indexOf(vstr)>0){
              Msg="公式中存在非法字符"+vstr;
              isOk=false;
              return isOk;
          }
        }
      }
      if (formula.indexOf("()")>0){
        Msg="公式中存在非法字符()";
        isOk=false;
      }
      return isOk;
    }
   public boolean checkValid(){
     if ((formula==null) || (formula.trim().length()<=0) ) {
       Msg="请设置属性calRule!";
       return false;
     }
     return (compareToLR()&&checkFormula());
   }

 

   /*
  /*返回公式执行结果
    return double
  */
  public double getResult(){
    String formulaStr = "", calRule = "";
    double value = 0.0;
    calRule = this.formula;
    if (checkValid()) {
      for (int i = 0; i < leftBracket; i++) {
        int iStart=calRule.lastIndexOf("(") + 1;
        formulaStr = calRule.substring(iStart,
                                       iStart+calRule.substring(iStart).indexOf(")")).trim();
        symbolParse(formulaStr);
        value = parseString();
        iStart=calRule.lastIndexOf("(");
        int iEnd=calRule.substring(iStart).indexOf(")")+1;
        calRule = calRule.substring(0,iStart).trim() +
            value +
            calRule.substring(iStart+iEnd, calRule.length()).trim();
      }
    }
    System.out.println(Msg);
    double tmp = Math.pow(10, 10);
    value = Math.round(value * tmp) / tmp;
    return value;
   }
    public void FormulaStr(String calRule) {
        String formulaStr = "";
        if (checkValid()) {
            for (int i = 0; i < leftBracket; i++) {
                formulaStr = calRule.substring(calRule.lastIndexOf("(") + 1, calRule.indexOf(")")).trim();
                symbolParse(formulaStr);
                double value = parseString();
                strValue=String.valueOf(value);
                System.out.println("formulaStr=" + formulaStr);
                //formulaVal = Double.parseDouble(formulaStr);
                System.out.println("formulaVal=" + value);
                calRule = calRule.substring(0, calRule.lastIndexOf("(")).trim() + value + calRule.substring(calRule.indexOf(")") + 1, calRule.length()).trim();
                System.out.println("calRule=" + calRule);
            }
        }
    }

 

    /*
    /*抽取最终括号内数据到List
    */
    private void symbolParse(String str) {
        list.clear();
        for (int i = 0; i < 4; i++) {
            compareMin(str);
            while (sym[i] != -1) {
                String insStr = str.substring(0, sym[i]).trim();
                list.add(insStr);
                insStr = str.substring(sym[i], sym[i] + 1).trim();
                list.add(insStr);
                str = str.substring(sym[i] + 1, str.length()).trim();
                compareMin(str);
            }
        }
        if (sym[0] == -1 && sym[1] == -1 && sym[2] == -1 & sym[3] == -1) {
            list.add(str);
        }
    }
     /*
    /*循环比较赋SubString起始值
    */
    private void compareMin(String str) {
        int sps = str.indexOf("`");//减法subtration
        sym[0] = sps;
        int spa = str.indexOf("+");//加法addition
        sym[1] = spa;
        int spd = str.indexOf("/");//除法division
        sym[2] = spd;
        int spm = str.indexOf("*");//乘法multiplication
        sym[3] = spm;
        for (int i = 1; i < sym.length; i++) {
            for (int j = 0; j < sym.length - i; j++)
                if (sym[j] > sym[j + 1]) {
                    int temp = sym[j];
                    sym[j] = sym[j + 1];
                    sym[j + 1] = temp;
                }
        }
    }

 

    private double parseString()
            throws NumberFormatException, StringIndexOutOfBoundsException {
        try{
          calculate();
          return answer;
        }catch(Exception e){
          Msg="错误:" + e.getMessage();
          return 0.0;
        }
    }

 

    private void calculate() {
        /*
        /*处理除法
        */
        int spd = list.indexOf("/");
        while (spd != -1) {
            leftNumber = list.get(spd - 1).toString();
            rightNumber = list.get(spd + 1).toString();
            list.remove(spd - 1);
            list.remove(spd - 1);
            list.remove(spd - 1);
            double ln = Double.valueOf(leftNumber).doubleValue();
            double rn = Double.valueOf(rightNumber).doubleValue();
            double answer = ln / rn;
            list.add(spd - 1, String.valueOf(answer));
            spd = list.indexOf("/");
        }
        /*
        /*处理乘法
        */
        int spm = list.indexOf("*");
        while (spm != -1) {
            leftNumber = list.get(spm - 1).toString();
            rightNumber = list.get(spm + 1).toString();
            list.remove(spm - 1);
            list.remove(spm - 1);
            list.remove(spm - 1);
            double ln = Double.valueOf(leftNumber).doubleValue();
            double rn = Double.valueOf(rightNumber).doubleValue();
            double answer = ln * rn;
            list.add(spm - 1, String.valueOf(answer));
            spm = list.indexOf("*");
        }
        /*
        /*处理减法
        */
        int sps = list.indexOf("`");
        while (sps != -1) {
            leftNumber = list.get(sps - 1).toString();
            rightNumber = list.get(sps + 1).toString();
            list.remove(sps - 1);
            list.remove(sps - 1);
            list.remove(sps - 1);
            double ln = Double.valueOf(leftNumber).doubleValue();
            double rn = Double.valueOf(rightNumber).doubleValue();
            double answer = ln - rn;
            list.add(sps - 1, String.valueOf(answer));
            sps = list.indexOf("`");
        }
        /*
        /*处理加法
        */
        int spa = list.indexOf("+");
        while (spa != -1) {
            leftNumber = list.get(spa - 1).toString();
            rightNumber = list.get(spa + 1).toString();
            list.remove(spa - 1);
            list.remove(spa - 1);
            list.remove(spa - 1);
            double ln = Double.valueOf(leftNumber).doubleValue();
            double rn = Double.valueOf(rightNumber).doubleValue();
            double answer = ln + rn;
            list.add(spa - 1, String.valueOf(answer));
            spa = list.indexOf("+");
        }
        if (list.size() != 0) {
            String result = list.get(0).toString();
            if (result == null || result.length() == 0) result = "0";
            answer = Double.parseDouble(list.get(0).toString());
        }
    }
}

原文引自:http://blog.csdn.net/lkz912/archive/2004/12/31/236267.aspx

posted @ 2006-08-02 11:18 lubaolin 阅读(5066) | 评论 (3)编辑 收藏

package hibernatedemo;

import hibernatedemo.person;
import java.util.*;

import net.sf.hibernate.Query;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.tool.hbm2ddl.SchemaExport;

publicclass Test {
publicstaticvoid main(String[] args)throwsException{
   Configuration cfg = new Configuration().addClass(person.class);
   SessionFactory sessions = cfg.buildSessionFactory();
   new SchemaExport(cfg).create(true, true);
   Session s = sessions.openSession();
   Query q = s.createQuery("from person");
   for(Iterator it = q.iterate();it.hasNext();){
     person b = (person)it.next();
     System.out.println("##name:"+b.getName());
   }
}
}

引自:http://www.blogjava.net/TrampEagle/articles/29972.html

posted @ 2006-07-28 17:02 lubaolin 阅读(374) | 评论 (0)编辑 收藏

用hibernate建表

把xxx.hbm.xml文件放在class所在位置。偶测试时,执行正常,但未见数据库中的表,不知道哪里出错。

import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.tool.hbm2ddl.SchemaExport;

xxx {
    Configuration conf= new Configuration().addClass(xxx.class);
    //第一次运行时用来在数据库中创建表
    //并且把sql语句输出到txt文件用的
    //以后的运行要去掉这一段,否则每次都新建表
    Properties prop = new Properties();
    //没有设置hibernate.dialect时,执行无法通过,还要找另外一种代替方法,否则这里跟数据库类型绑定,不是一种好的实现方式
    prop.setProperty("hibernate.dialect", "net.sf.hibernate.dialect.MySQLDialect";
    SchemaExport dbExport=new SchemaExport(conf, prop);
    dbExport.setOutputFile("sql_out_lib\\sql.txt";
    dbExport.create(true, true);
}


dbExport.create(true,true);

 把这个语句的第二个参数true改成false,就可以生成sql语句了,变成下面的语句:

 dbExport.create(true, false);

 不过无法直接执行,还需要继续摸索。
 另外,发现这个时候不需要数据库的连接,所以hibernate配置文件的连接池没有设置也没有关系。

引自:http://www.blogcn.com/user17/yu_qj/blog/6763871.html

posted @ 2006-07-28 16:55 lubaolin 阅读(3312) | 评论 (0)编辑 收藏

转贴:Andy.m   日期:2003-07-26   人气:35
<script>
function addRow(){
   
    // 插入一行
    myNewRow = document.all.myTable.insertRow();
    var lenRow = document.all.myTable.rows.length; // 计算总行数
   
    if(lenRow > 1){       
        var point = myNewRow.rowIndex;    // 计算当前行位置   
        var lenCol = document.all.myTable.rows(0).cells.length; // 计算每行有几列
       
        // 插入lenCol个td
            for (i=0; i < lenCol; i++) {
                document.all.myTable.rows(point).insertCell();
                document.all.myTable.rows(point).cells(i).innerHTML =                                               parseFloat(document.all.myTable.rows(point-1).cells(i).innerHTML) + lenCol;
        }
    }else if(lenRow == 1){
        // 原来table是0行,初始化一行
        for(i = 0; i < 10; i++){
            document.all.myTable.rows(0).insertCell();
            document.all.myTable.rows(0).cells(i).innerHTML = i;
        }
    }   
}

function delRow(){
    document.all.myTable.deleteRow();
}
</script>
<a href="javascript: addRow()">增加一行</a>
<a href="javascript: delRow()">减去一行</a>
<table name=myTable border=1 id=myTable>
</table>

posted @ 2006-07-27 14:31 lubaolin 阅读(329) | 评论 (0)编辑 收藏

<script  language="javascript">   

function  printsetup(){ 
//  打印页面设置 
wb.execwb(8,1); 

function  printpreview(){ 
//  打印页面预览 
                
wb.execwb(7,1); 
                

function  printit() 

if  (confirm('确定打印吗?')){ 

wb.execwb(6,6) 


</script> 
<OBJECT  classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"   

height=0  id=wb  name=wb  width=0></OBJECT> 
<input  class="ipt"  type=button  name=  button  _print  value="打印"   
onclick  ="  javascript  :printit();"> 
<input  class="ipt"  type=button    name=button  _setup  value="打印页面设置"           

onclick  ="  javascript  :  printsetup();">   
<input  class="ipt"  type=button    name=button_show  value="打印预览"           

onClick="javascript:printpreview();">

posted @ 2006-07-27 14:28 lubaolin 阅读(540) | 评论 (0)编辑 收藏

这年头,大棚把季节搞乱,小姐把辈份搞乱,关系把程序搞乱,级别把能力搞乱,公安把秩序搞乱,金钱把官场搞乱,手机把家庭搞乱!这年头,女人漂亮的不下厨房,下厨房的不温柔,温柔的没主见,有主见的没女人味,有女人味的乱花钱,不乱花钱的不时尚,时尚的不放心,放心的没法看!这年头,老婆像小灵通经济实惠但限本地使用,二奶像中国电信安全固定但带不出门,小蜜像中国移动使用方便但话费太贵。情人像中国联通优雅新潮但常不在服务区!这年头,一哥们说北京地铁拥挤不堪他怀孕的老婆竟被挤流产了;昨天他问上海的地铁是不是好些,上海的哥们说更糟:上个月他老婆乘地铁竟然被挤怀孕了!这年头,教授摇唇鼓舌,四处赚钱,越来越像商人;商人现身讲坛,著书立说,越来越像教授。医生见死不救,草菅人命,越来越像杀手;杀手出手麻利,不留后患,越来越像医生。明星卖弄风骚,给钱就上,越来越像妓女;妓女楚楚动人,明码标价,越来越像明星。警察横行霸道,欺软怕硬,越来越像地痞;地痞各霸一方,敢做敢当,越来越像警察。这年头,军委领导说解放军的工资如果翻四倍可以打美国,翻三倍可以打日本,翻两倍可以打台湾,翻一倍可以回家打老婆,目前的工资回家只能被老婆打!

posted @ 2006-07-20 09:18 lubaolin 阅读(262) | 评论 (0)编辑 收藏

 

Struts的Token(令牌)机制能够很好的解决表单重复提交的问题,基本原理是:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。

这时其实也就是两点,第一:你需要在请求中有这个令牌值,请求中的令牌值如何保存,其实就和我们平时在页面中保存一些信息是一样的,通过隐藏字段来保存,保存的形式如: 〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉,这个value是TokenProcessor类中的generateToken()获得的,是根据当前用户的session id和当前时间的long值来计算的。第二:在客户端提交后,我们要根据判断在请求中包含的值是否和服务器的令牌一致,因为服务器每次提交都会生成新的Token,所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致。下面就以在数据库中插入一条数据来说明如何防止重复提交。

在Action中的add方法中,我们需要将Token值明确的要求保存在页面中,只需增加一条语句:saveToken(request);,如下所示:
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
//前面的处理省略
saveToken(request);
return mapping.findForward("add");
}
在Action的insert方法中,我们根据表单中的Token值与服务器端的Token值比较,如下所示:
public ActionForward insert(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
if (isTokenValid(request, true)) {
// 表单不是重复提交
//这里是保存数据的代码
} else {
//表单重复提交
saveToken(request);
//其它的处理代码
}
}

其实使用起来很简单,举个最简单、最需要使用这个的例子:
一般控制重复提交主要是用在对数据库操作的控制上,比如插入、更新、删除等,由于更新、删除一般都是通过id来操作(例如:updateXXXById, removeXXXById),所以这类操作控制的意义不是很大(不排除个别现象),重复提交的控制也就主要是在插入时的控制了。

先说一下,我们目前所做项目的情况:
目前的项目是用Struts+Spring+Ibatis,页面用jstl,Struts复杂View层,Spring在Service层提供事务控制,Ibatis是用来代替JDBC,所有页面的访问都不是直接访问jsp,而是访问Structs的Action,再由Action来Forward到一个Jsp,所有针对数据库的操作,比如取数据或修改数据,都是在Action里面完成,所有的Action一般都继承BaseDispatchAction,这个是自己建立的类,目的是为所有的Action做一些统一的控制,在Struts层,对于一个功能,我们一般分为两个Action,一个Action里的功能是不需要调用Struts的验证功能的(常见的方法名称有add,edit,remove,view,list),另一个是需要调用Struts的验证功能的(常见的方法名称有insert,update)。

就拿论坛发贴来说吧,论坛发贴首先需要跳转到一个页面,你可以填写帖子的主题和内容,填写完后,单击“提交”,贴子就发表了,所以这里经过两个步骤:
1、转到一个新增的页面,在Action里我们一般称为add,例如:
public ActionForward add(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        //这一句是输出调试信息,表示代码执行到这一段了
        log.debug(":: action - subject add");    
    
        //your code here

       //这里保存Token值
        saveToken(request);
        
       //跳转到add页面,在Structs-config.xml里面定义,例如,跳转到subjectAdd.jsp
        return mapping.findForward("add");
    }

2、在填写标题和内容后,选择 提交 ,会提交到insert方法,在insert方法里判断,是否重复提交了。
public ActionForward insert(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response){
if (isTokenValid(request, true)) {
// 表单不是重复提交
//这里是保存数据的代码
} else {
//表单重复提交
saveToken(request);
//其它的处理代码
}
}

下面更详细一点(注意,下面所有的代码使用全角括号):
1、你想发贴时,点击“我要发贴”链接的代码可以里这样的:
〈html:link action="subject.do?method=add"〉我要发贴〈/html:link〉
subject.do 和 method 这些在struct-config.xml如何定义我就不说了,点击链接后,会执行subject.do的add方法,代码如上面说的,跳转到subjectAdd.jsp页面。页面的代码大概如下:
〈html:form action="subjectForm.do?method=insert"〉
  〈html:text property="title" /〉
  〈html:textarea property="content" /〉
  〈html:submit property="发表" /〉
  〈html:reset property="重填" /〉
〈html:form〉
如果你在add方法里加了“saveToken(request);”这一句,那在subjectAdd.jsp生成的页面上,会多一个隐藏字段,类似于这样〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉,

2、点击发表后,表单提交到subjectForm.do里的insert方法后,你在insert方法里要将表单的数据插入到数据库中,如果没有进行重复提交的控制,那么每点击一次浏览器的刷新按钮,都会在数据库中插入一条相同的记录,增加下面的代码,你就可以控制用户的重复提交了。
if (isTokenValid(request, true)) {
// 表单不是重复提交
//这里是保存数据的代码
} else {
//表单重复提交
saveToken(request);
//其它的处理代码
}
注意,你必须在add方法里使用了saveToken(request),你才能在insert里判断,否则,你每次保存操作都是重复提交。
记住一点,Struts在你每次访问Action的时候,都会产生一个令牌,保存在你的Session里面,如果你在Action里的函数里面,使用了saveToken(request);,那么这个令牌也会保存在这个Action所Forward到的jsp所生成的静态页面里。
如果你在你Action的方法里使用了isTokenValid,那么Struts会将你从你的request里面去获取这个令牌值,然后和Session里的令牌值做比较,如果两者相等,就不是重复提交,如果不相等,就是重复提交了。

由于我们项目的所有Action都是继承自BaseDispatchAction这个类,所以我们基本上都是在这个类里面做了表单重复提交的控制,默认是控制add方法和insert方法,如果需要控制其它的方法,就自己手动写上面这些代码,否则是不需要手写的,控制的代码如下:
public abstract class BaseDispatchAction extends BaseAction {
protected ActionForward perform(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {
        String parameter = mapping.getParameter();
        String name = request.getParameter(parameter);
if (null == name) { //如果没有指定 method ,则默认为 list
            name = "list";
        }

        if ("add".equals(name)) {
            if ("add".equals(name)) {
                saveToken(request);
            }
        } else if ("insert".equals(name)) {
            if (!isTokenValid(request, true)) {
                resetToken(request);
                saveError(request, new ActionMessage("error.repeatSubmit"));
                log.error("重复提交!");
                return mapping.findForward("error");
            }
        }
        return dispatchMethod2(mapping, form, request, response, name);
    }
}

posted @ 2006-04-30 14:48 lubaolin 阅读(1107) | 评论 (2)编辑 收藏

常见的MIME类型

超文本标记语言文本

.html,.html

text/html

普通文本

.txt

text/plain

RTF文本

.rtf

application/rtf

GIF图形

.gif

image/gif

JPEG图形

.ipeg,.jpg

image/jpeg

au声音文件

.au

audio/basic

MIDI音乐文件

mid,.midi

audio/midi,audio/x-midi

RealAudio音乐文件

.ra, .ram

audio/x-pn-realaudio

MPEG文件

.mpg,.mpeg

video/mpeg

AVI文件

.avi

video/x-msvideo

GZIP文件

.gz

application/x-gzip

TAR文件

.tar

application/x-tar

Word文件

.doc

Application/msword

Excel文件

.xls

application/vnd.ms-excel

Powerpiont文件

.ppt

application/vnd.ms-powerpoint

Xml文件

.xml

Text/xml

Mp4文件

.mp4

vedio/mp4

posted @ 2006-03-16 13:52 lubaolin 阅读(1882) | 评论 (0)编辑 收藏

继续关注我的C语言学习博客