|
2007年3月6日
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
点击“开始→运行”,在弹出的“运行”对话框中输入“REGSVR32 /n /i:u shell32”(不含双引号),然后回车,片刻后会弹出“shell32中的DllInstall成功”对话框,“显示桌面”按钮就可以完美归来了
摘要: HTML字符实体(Character Entities),转义字符串(Escape Sequence)
为什么要用转义字符串?
HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用。这些符号是不显示在我们最终看到的网页里的,那如果我们希望在网页中显示这些符号,该怎么办呢?
这就要说到HTML转义字符串(Esca... 阅读全文
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);
}
}
将listener.ora中的(PROGRAM = extproc)这句注释掉就可以了。去网上找过,extproc是一个扩展的程序调用接口协议, 连接和调用外部的操作系统程序或进程用时会用到。
转自:http://blog.csdn.net/chenjuntj2007/archive/2009/07/04/4321640.aspx
//创建临时表空间
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
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
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)
半年前,报考了系统分析师,也没怎么看书,只是抱着试试水有多深的想法去考的,结果既在我意料之中,也在我意料之外,得了个39/33/39,只差6/12/6分就可以通过了,尤其是论文,居然得了39分,看来还是有希望的,所以决定再次冲击,并以此做为平台,练习论文写作,假如写一篇论文就和写一篇日记一样手到擒来...........
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
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文件。
|
<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>
有同事问到在程序中怎样知道数据库表中那些字段是主键。当时不知道,晚上回来看了看JDK的文档。
在使用JDBC来查询数据库的时候,通常的步骤是:
1. 注册驱动程序
2. 获取数据库连接
3. 执行查询语句
4. 关闭连接。
在获得数据库连接后,就可以通过getMetaData()方法来获取DatabaseMetaData;然后通过DatabaseMetaData的getPrimaryKeys ()方法来获取主键的信息。
下面是我做的示例程序,该程序在JBuilder2005+oracle8i下通过: 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/
工作中需要在程序中弹出窗口,并且声音报警。查了资料,发现很多都是在网页中用的,在应用程序中应用的很少,解决问题之后,记录下来。 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
<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>
<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>
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支持的第三方连接池产品:C3P0,Proxool。随着文章的深入,你会发现他们配置方法也有很大的不同。 先来介绍连接池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里面设置相关的项,让Hibernate与Proxool关联起来。 当然首先你要把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连接池配置方案,为读者提供了多种选择。建议读者也根据自己的实际情况来选取方案。文中肯定还有很多纰漏之处,还望大家斧正。讲的不足的地方,以后有机会定当补全!
1.Hibernate默认连接池 <?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
美特斯邦威:不加寻常班
特步: 加班, 死一般的感觉
百事:加班无极限
森马:上什么公司,加什么班
脑白金:今年过节不加班,加班只加节假日
汇仁肾宝:他加我也加
李宁:加班, 一切皆有可能
旺旺: 你加,我加,大家加,加加
农夫山泉:加了有点烦
好迪:大家加,才是真的加
白加黑:白天加白班,不瞌睡;晚上加晚班,睡不着
联想:公司不加班,公司会怎么样
娃哈哈:妈妈~~我也要加班!
清嘴:你知道加班的味道吗?
安踏:我加班,我喜欢!
NIKE:Just 加 it!
钙中钙:现在的加班啊,它含金量高,加一天顶过去五天,实惠!你瞧我, 一口气加了5天,不费劲!
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。
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
进入页面<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种随机选择一种
我们经常会用到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 将管理服务器配置参数 更新为值 。
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;
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)是否是有效标识符
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
用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范例,但请 注意,这个范例是不能直接拿来用的。
|