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

林临的地盘

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

2007年2月8日

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 阅读(827) | 评论 (0)编辑 收藏

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

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

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

posted @ 2010-09-07 18:30 lubaolin 阅读(8822) | 评论 (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 阅读(704) | 评论 (0)编辑 收藏

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

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

posted @ 2009-09-21 17:19 lubaolin 阅读(21213) | 评论 (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 阅读(351) | 评论 (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 阅读(2644) | 评论 (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 阅读(900) | 评论 (0)编辑 收藏

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

posted @ 2008-07-21 14:34 lubaolin 阅读(382) | 评论 (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 阅读(1046) | 评论 (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 阅读(5333) | 评论 (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 阅读(505) | 评论 (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 阅读(4791) | 评论 (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 阅读(1544) | 评论 (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 阅读(8105) | 评论 (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 阅读(1643) | 评论 (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 阅读(7648) | 评论 (6)编辑 收藏

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

posted @ 2007-04-16 11:19 lubaolin 阅读(544) | 评论 (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 阅读(1530) | 评论 (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 阅读(2864) | 评论 (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 阅读(1514) | 评论 (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 阅读(901) | 评论 (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 阅读(360) | 评论 (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 阅读(353) | 评论 (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 阅读(448) | 评论 (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 阅读(253) | 评论 (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 阅读(4994) | 评论 (2)编辑 收藏

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