|
2006年7月27日
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.aygfsteel.com/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.aygfsteel.com/linlin2005"); imgUrl2="/images/2.jpg"; imgtext2="ite" imgLink2=escape(" http://www.aygfsteel.com/linlin2005"); imgUrl3="/images/3.jpg"; imgtext3="ite" imgLink3=escape(" http://www.aygfsteel.com/linlin2005"); imgUrl4="/images/4.jpg"; imgtext4="ite" imgLink4=escape(" http://www.aygfsteel.com/linlin2005"); imgUrl5="/images/5.jpg"; imgtext5="ite" imgLink5=escape(" http://www.aygfsteel.com/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="
http://www.webjx.com/js/focus.swf"><param name="quality" value="high"> <param name="bgcolor" value="#F0F0F0">'); 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=" </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.aygfsteel.com/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.aygfsteel.com/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范例,但請 注意,這個范例是不能直接拿來用的。
<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>
<table?? style="TABLE-LAYOUT:?? fixed"?? width="200"?? border="0"?? cellspacing="0"?? cellpadding="7"?? bgcolor="#f7f7f7">?? ? <tr>???? ? <td?? style="LEFT:?? 0px;?? WIDTH:?? 100%;?? WORD-WRAP:?? break-word">?? ? dffadfdaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsfdffadfdasfdffadfdasfdffadfdasfdffadfdasfdffadfdasfdffadfdasfdffadfdasfdffadfdasfdffadfdasf?? ? </font></td>?? ? </tr>?? ? </table>
tomcat---confi--server.xml中的 <Context path="" docBase="ROOT" debug="0"/> 其中path="工程名" docBase="工程路徑"
?
注意:如果所建項目是servlet2.4的,那么在web.xml中寫taglib就要加一個 <jsp-config>標記,如下所示: ? <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee?<display-name> ?TagStudy2 ?</display-name> ? ? <jsp-config> ?????? <taglib> ?????????? <taglib-uri>/hello</taglib-uri> ?????????? <taglib-location>/WEB-INF/HelloTag.tld</taglib-location> ????? </taglib> ?? </jsp-config> ?? ?<welcome-file-list> ??<welcome-file>default.jsp</welcome-file> ?</welcome-file-list> ? </web-app>
?
1 恐龍說:“遇到色狼,不慌不忙;遇到禽獸,慢慢享受……” 2 找不到恐龍,就用蜥蜴頂 3 關羽五綹長髯,風度翩翩,手提青龍偃月刀,江湖人送綽號——刀郎。 4 男人與女人,終究也只是欲望的動物吧!真的可以因為愛而結合嗎?對不起,我也不知道。。 5 路邊的野花不要,踩。 6 吃飯與ml是第一生產力。 7 月經不僅僅是女人的痛苦,也是男人的痛苦。 8 鴛鴛相抱何時了,鴦在一邊看熱鬧。 9 昨天,系花對我笑了一下,樂得我晚上直數羊,一只羊,兩只羊,三只羊…… 10 長大了娶唐僧做老公,能玩就玩一玩,不能玩就把他吃掉。 11 男人有沖動可能是愛你,也可能是不愛,但沒有沖動肯定是不愛! 12 站的更高,尿的更遠。 13 女,喜甜食,甚胖!該女有一癖好:痛恨螞蟻,見必殺之。問其故曰:這小東西,那么愛吃甜食,腰還那么細! 14 打破老婆終身制,實行小姨股份制。引入小姐競爭制,推廣情人合同制。 15 在一輛擁擠的公車上,一位女郎忽然叫了起來:別擠啦!別擠啦!把人家的奶都擠出來啦!(她拿著酸奶呢)。 16 我不在江湖,但江湖中有我的傳說。 17 我身在江湖,江湖里卻沒有我得傳說。 18 要是我灌水,就罵我“三個代表”沒學好吧。 19 如果回帖是一種美德,那我早就成為圣人了! 20 睡眠是一門藝術——誰也無法阻擋我追求藝術的腳步! 21 飯在鍋里,我在床上*^_^* 22 戀愛就是無數個飯局,結婚就是一個飯局。 23 走,MM,咱們化蝶去…… 24 愛護環境,人人有病。 25 愛——不是想出來的,愛——是做出來的!! 26 愛她,就請為她做無痛人流手術! 27 俺從不寫措字,但俺寫通假字! 28 避孕的效果:不成功,便成“人”。 29 勃起不是萬能的,但不能勃起卻是萬萬都不能的! 30 不要在一棵樹上吊死,在附近幾棵樹上多試試死幾次~ 31 不在課堂上沉睡,就在酒桌上埋醉。 32 長得真有創意,活得真有勇氣! 33 自從我變成了狗屎,就再也沒有人踩在我頭上了。 34 丑,但是丑的特別,也就是特別的丑! 35 穿別人的鞋,走自己的路,讓他們找去吧。 36 床上運動也可以減肥的,你們都不知道嗎? 37 此地禁止大小便,違者沒收工具。 38 讀書讀到抽筋處,文思方能如尿崩! 39 佛曰,色即是空,空即是色!今晚,偶想空一下 40 很多女明星不紅的原因是因為沒有張開腿*^_^* 41 花前月下,不如花錢“日”下!*^_^* 42 解釋就是掩飾,掩飾就是編故事! 43 精典之極就是精斑!!! 44 老天,你讓夏天和冬天同房了吧?生出這鬼天氣! 45 漏洞與補丁齊飛,藍屏共死機一色! 46 美女未抱身先走,常使色狼淚滿襟。。。。。。 47 內練一口氣,外練一口屁。 48 男人靠的住,母豬能上樹! 49 男人偷腥時的智商僅次于愛因斯坦! 50 你的丑和你的臉沒有關系。。。。。。 51 .其實我是一個天才,可惜天妒英才! 52 人生不能像做菜、把所有的料都準備好才下鍋! 53 人生重要的不是所站的位置,而是所朝的方向! 54 人生自古誰無死,啊個拉屎不用紙! 55 如果跟導師講不清楚,那么就把他搞胡涂吧! 56 如果有一雙眼睛陪我一同哭泣,就值得我為生命受苦。 57 啥時硬件也可以COPY就好了! 58 生活TMD好玩,因為生活老TMD玩我! 59 所有刻骨銘心的愛都靈魂游離于床上的瞬間! 60 天塌下來你頂著,我墊著! 61 聽君一席話,省我十本書! 62 脫了衣服我是禽獸,穿上衣服我是衣冠禽獸! 63 為中華而努力讀書!一包中華好多錢啊~~~ 64 我的id是假冒的,大家不要相信我是騙子。 65 我媽常說,我們家要是沒有電話就不會這么窮。 66 我喜歡孩子,更喜歡造孩子的過程! 67 我在馬路邊丟了一分錢 ! 68 下雨了,別忘了打傘,濕身是小,淋病就麻煩啦*^_^* 69 修養的藝術,其實就是說謊的藝術。 70 學海無涯,回頭是岸! 71 一時的沖動,子孫的危機! 72 我本非隨便的人,但如果你想隨便,那我就隨你的便好啦! 73 有事秘書干,沒事干秘書! 74 與時俱進,你我共赴高潮! 75 只要不下流,我們就是主流! 76 只有假貨是真的,別的都是假的! 77 E網情深牽手E網。走自己的路,讓別人打車去吧。 78 生,容易。活,容易。生活,不容易。 79 流氓不可怕,就怕流氓有文化。 80 做愛做的事,交配交的人。 81 生我之前誰是我,生我之后我是誰? 82 死亡教會人一切,如同考試之后公布的結果——雖然恍然大悟,但為時晚矣~! 83 不在放蕩中變壞,就在沉默中變態! 84 走過了年少,腳起了水泡 85 商女不知亡國恨、妓女不懂婚外情。 86 禽獸尚且有半點憐憫之心,而我一點也沒有,所以我不是禽獸。 87 所有的男人生來平等,結婚的除外。 88 鍛煉肌肉,防止挨揍! 89 看盡天下A片,心中自然無碼~ 90 如果恐龍是人,那人是什么? 91 比我有才的都沒我帥,比我帥的都沒我有才! 92 沒有激情的親吻,哪來床上的翻滾? 93 勿以坑小而不灌,勿以坑大而灌之。 94 懷揣兩塊,胸懷500萬! 95 解釋就系掩飾,掩飾等于無出色,無出色不如回家休息!!! 96 我真想親口管你爺爺叫聲:爹! 97 微機原理鬧危機,隨機過程隨機過,實變函數學十遍,匯編語言不會編! 98 如果沒有毛片,中國的性教育簡直就是一片空白! 99 男人在結婚前覺得適合自己的女人很少,結婚后覺得適合自己的女人很多。 100 人生本無緣,相見易更難,說句心里話,誰不愛錢啊。
小兔說:"我是兔娘養的!"? 小豬說:"我是豬娘養的!"? 小雞說:"我是雞娘養的!"? 小狗說:"你們聊,我先走了!" > > > > 0號陪練說:"外人叫我零陪,好聽!" > > 1號陪練說:"外人叫我一陪,也好聽!" > > 2號陪練說:"外人叫我二陪,也很好聽!" > > 3號陪練說:"你們聊,我們先走了!" > > > > 貓對我說:"我是你奶奶的貓,好聽!" > > 狗對我說:"我是你奶奶的狗,也好聽!" > > 魚對我說:"我是你奶奶的魚,也很好聽!" > > 熊說:"你們聊,我先走了!" > > > > 浪客說:"人們叫我浪人,好聽!" > > 武士說:"人們叫我武人,也好聽!" > > 高手說:"人們叫我高人,也很好聽!" > > 劍客說:"你們聊,我先走了!" > > > > 張靚穎說:"崇拜我的歌迷都說:偶的偶像叫穎" > > 何潔說:"崇拜我的歌迷都說:偶的偶像叫潔" > > 周筆暢說"崇拜我的歌迷都說:偶的偶像叫暢" > > 李宇春說:"你們聊,我先走了!" > > > > 高等數學老師說:這學期我教高數, > > 大學物理老師說:這學期我教大物, > > 模擬電子老師說:這學期我教模電, > > 社會主義經濟老師說:你們聊,我先走了。 > > > > 北京大學的說:我是北大的。 > > 天津大學的說:我是天大的。 > > 上海大學的說:我是上大的。 > > 廈門大學的說:你們聊,我先走了! > > > > 李宗仁將軍說:我這人,有仁! > > 傅作義將軍說:我這人,有義! > > 左權將軍說:我這人,有權! > > 霍去病將軍說:你們聊,我先走了! > > > > 美能達的用戶說:我們是美人! > > 佳能的用戶說:我們是佳人! > > 華光的用戶說:我們是華人! > > 尼康的用戶說:你們聊,我先走了! > > > > 老張家的門是柳木做的,老張說:我家的門是木門 > > 老李家的門是塑料做的,老李說:我家的門是塑門 > > 老王家的門是磚頭做的,老王說:我家的門是磚門 > > 老劉家的門是鋼做的,老劉說:你們聊,我先走了! > > > > 師范學院的學生說:我是"師院"的 > > 鐵道學院的學生說:我是"鐵院"的 > > 職業學院的學生說:我是"職院"的 > > 技術學院的學生說:你們聊,我先走了!
樓主的帖子實在是寫得太好了。文筆流暢,修辭得體,深得魏晉諸朝遺風,更將唐風宋骨發揚得入木三分,能在有生之年看見樓主的這個帖子。實在是我三生之幸啊。看完樓主的這個帖子之后,我竟產生出一種無以名之的悲痛感--啊,這么好的帖子,如果將來我再也看不到了,那我該怎么辦?那我該怎么辦?直到我毫不猶豫地把樓主的這個帖子收藏了,我內心的那種激動才逐漸平靜下來。可是我立刻想到,這么好的帖子,倘若別人看不到,那么不是浪費樓主的心血嗎?經過痛苦的思想斗爭,我終于下定決心,犧牲小我,奉獻大我。我要拿出這帖子奉獻給世人賞閱,我要把這個帖子一直往上頂,往上頂!頂到所有人都看到為止! 在遇到你之前,我對人世間是否有真正的圣人是懷疑的;而現在,我終于相信了!我曾經忘情于兩漢的歌賦,我曾經驚訝于李杜的詩才,我曾經流連于宋元的詞曲。但現在,我才知道我有多么淺薄! 樓主,你的高尚情操太讓人感動了。在現在這樣一個物欲橫流的金錢社會里,竟然還能見到樓主這樣的性情中人,無疑是我這輩子最大的幸運。讓我深深感受到了人性的偉大。樓主的帖子,就好比黑暗中刺裂夜空的閃電,又好比撕開烏云的陽光,一瞬間就讓我如飲甘露,讓我明白了永恒的真理在這個世界上是真實存在著的。只有樓主這樣具備廣闊胸懷和完整知識體系的人,才能作為這真理的惟一引言者。看了樓主的帖子,我陷入了嚴肅的思考中。我認為,如果不把樓主的帖子頂上去,就是對真理的一種背叛,就是對謬論的極大妥協。因此,我決定義無返顧地頂了! ??? 說得好啊!我在XX社區打滾這么多年,所謂閱人無數,就算沒有見過豬走路,也總明白豬肉是啥味道的。一看到樓主的氣勢,我就覺得樓主同在社區里灌水的那幫小混混有著本質的差別!那憂郁的語調,那熟悉的簽名,還有字里行間高屋建瓴的辭藻。沒用的,樓主,就算你怎么換馬甲都是沒有用的,你的億萬擁戴者早已經把你認出來了,你一定就是傳說中的最強ID。自從社區改版之后,我就已經心灰意冷,對社區也沒抱什么希望了,傳說已經幻滅,神話已經終結,留在社區還有什么意思?沒想到,沒想到,今天可以再睹樓主的風范,我激動得忍不住就在屏幕前流下了眼淚。是啊,只要在樓主的帶領下,社區就有希望了。我的內心再一次沸騰了,我胸腔里的血再一次燃燒了。樓主的幾句話雖然簡單,卻概括扼要,一語道出了我們苦想多年仍不可解的幾個重大問題的根本。樓主就好比社區的明燈,樓主就好比社區的方向,樓主就好比社區的棟梁。有樓主在,社區的明天必將更好! ??? 大師的話真如“大音希聲掃陰翳”,猶如“撥開云霧見青天”,使我等網民看到了希望,看到了未來!晴天霹靂、醍醐灌頂或許不足以形容大師文章的萬一;巫山行云、長江流水更難以比擬大師的文才!黃鐘大呂,振聾發聵!你燭照天下,明見萬里;雨露蒼生,澤被萬方!透過你深邃的文字,我仿佛看到了你鷹視狼顧、龍行虎步的偉岸英姿;仿佛看到了你手執如椽大筆、寫天下文章的智慧神態;仿佛看見了你按劍四顧、指點江山的英武氣概! ??? 逐字逐句地看完這個帖子以后,我的心久久不能平靜,震撼啊!為什么會有如此好的帖子!我縱橫網絡BBS多年,自以為再也不會有任何帖子能打動我,沒想到今天看到了如此精妙絕倫的這樣一篇帖子!樓主,是你讓我深深地理解了“人外有人,天外有天”這句話。謝謝儂!在看完這帖子以后,我沒有立即回復,因為我生怕我庸俗不堪的回復會玷污了這網上少有的帖子。但是我還是回復了,因為覺得如果不能在如此精彩的帖子后面留下自己的網名,那我死也不會瞑目的!能夠在如此精彩的帖子后面留下自己的網名是多么驕傲的一件事啊!樓主,請原諒我的自私!我知道無論用多么華麗的辭藻來形容樓主您帖子的精彩程度都是不夠的,都是虛偽的,所以我只想說一句:您的帖子太好看了!我愿意一輩子看下去!這篇帖子構思新穎,題材獨具匠心,段落清晰,情節詭異,跌宕起伏,主線分明,引人入勝,平淡中顯示出不凡的文學功底,可謂是字字珠璣,句句經典,是我輩應當學習之典范。正所謂:“一馬奔騰,射雕引弓,天地都在我心中!”樓主真不愧為無厘界新一代的開山怪!本來我已經對這個社區失望了,覺得這個社區沒有前途了,心里充滿了悲哀。但是看了你的這個帖子,又讓我對社區產生了希望。是你讓我的心里重新燃起希望之火,是你讓我的心死灰復燃,是你拯救了我一顆拔涼拔涼的心!本來我決定不在社區回任何帖子了,但是看了你的帖子,我告訴自己這個帖子是一定要回的!這是百年難得一見的好貼啊!蒼天有眼啊,讓我在有生之年得以觀得如此精彩絕倫的帖子! 好 好帖
很好帖
確實好帖
少見的好帖
真 *** 好帖
難得一見的好帖
千年等一回的好帖
好得不能再好的好帖
驚天地且泣鬼神的好帖
讓人閱畢擊掌三嘆的好帖
讓人佩服得五體投地的好帖
讓人奔走相告曰須閱讀的好帖
讓斑竹看后決定加精固頂的好帖
讓人看后在各論壇紛紛轉貼的好帖
讓人看后連成人網站都沒興趣的好帖
讓人看完后就要往上頂往死里頂的好帖
讓人不間斷地在各種場合重復引用的好帖
讓人一見面就問你看過某某好帖沒有的好帖
讓人半夜上廁所都要打開電腦再看一遍的好帖
讓個讀過后都下載在硬盤里詳細研究欣賞的好帖
讓人走路吃飯睡覺干什么事連做夢都夢到它的好帖
讓人翻譯成36種不同外語流傳國內外世界各地的好帖
讓人紛紛唱道過年過節不送禮要送就送某某帖子的好帖
讓國家領導人命令將該帖刻在純金版上當國禮送人的好帖
讓網絡上紛紛冒出該帖的真人版卡通版搞笑版成人版的好帖
讓人在公共廁所里不再亂涂亂化而是紛紛對它引經據典的好帖
讓某位想成名的少女向媒體說她與該帖作者發生過性關系的好帖
讓人根據它寫成小說又被不同導演拍成48個不同版本的電影的好帖
讓某名導演跟據此帖改拍的電影在奧斯卡上一連拿了11個獎項的好帖
讓人大代表們看完后聯名要求根據該帖的內容對憲法做適當修改的好帖
讓人為了誰是它的原始作者紛紛地鬧上法院打官司要爭得它的版權的好帖
讓各大學府紛紛邀請該帖作者去就如何發表優秀網絡文學為題目演講的好帖
讓人為了該帖而成立了各種學會來研究并為不同的理解爭得眼紅脖子粗的好帖
讓美國警察于今后逮捕人說你有權保持沉默還有權閱讀某某帖子要不要啊的好帖
讓本拉登躲在山洞里還命令他手下冒著被美軍發現的危險去上網下載來閱讀的好帖
讓薩達姆被捕時被發現他隨身攜帶的除了一把手槍之外還有的就是它的復印件的好帖
讓比爾蓋茨在懂事會上發給與會者人手一份該帖命令仔細閱讀后才討論其他事宜的好帖
讓諾貝兒獎理事會破天荒地因該帖的出現而開會討論一直決定今后設立最佳帖子獎的好帖
讓聯合國安理會決定將它譯成宇宙語由中國神州六號升空后不斷播放看有沒有外星人的好帖
讓人看完后ie鎖死連瑞星諾頓都沒法修復只好格式化硬盤重裝啟動后主頁顯示的還是它的好帖 真是好帖子啊 閣下 字跡工整, 文筆極佳, 才思敏捷, 過目不忘, 十年寒窗, 博學多才, 見多識廣, 才高八斗, 學富五車, 文武雙全, 雄韜偉略, 談吐不凡, 談笑風聲, 高談闊論, 眉飛色舞, 運籌帷幄, 言簡意賅, 完美無缺, 一針見血, 遠見卓識, 義正詞嚴, 一氣呵成, 大顯神通, 出口成章, 出類拔萃, 出神入化, 萬古流芳, 一本正經, 一箭雙雕, 長篇大論, 功德無量, 力排眾議, 力挽狂瀾, 氣貫長虹, 氣勢磅礴, 氣吞山河, 堅韌不拔, 身體力行, 空前絕后, 視死如歸, 英姿煥發, 奉公守法, 艱苦奮斗, 忠貞不渝, 舍己為人, 大公無私, 一塵不染, 一鳴驚人, 路過~~~~那分~~~~~閃人~~~~~~~~謝謝~~~~~~~~~~
這年頭,完美的人生就是住英國的房子,戴瑞士手表,拿美國工資,娶韓國女人,嫖俄羅斯女人,開德國轎車,喝法國紅酒,雇菲律賓女傭。
?
這年頭,苦干實干,做給天看;東混西混,一帆風順;任勞任怨,永難如愿;會捧會獻,杰出貢獻;盡職盡責,必遭指責;推托栽贓,邀功領賞!
?
這年頭,男人的小康就是有一所像樣的小房,有一輛時尚的小車,有一筆吃喝的小鈔,有一位顧家的小太,有一門管用的小“炮”,有一群擦炮的小蜜!
?
這年頭,為官之道就是為領導干一百件好事也不如與領導一起干一件壞事,領導帶你一起干了一件壞事那肯定有一百件好事等著你!
?
這年頭,說河南人詐騙,廣東人笑了;說河南人造假,浙江人笑了;說河南人斤斤計較,上海人笑了;說河南人夸夸其談,北京人笑了;說河南人傻,諸葛亮笑了!
?
這年頭,河南人好生郁悶:好不容易有座山,卻是平頂山;好不容易有家酒店,卻是駐馬店;好不容易想結婚,自己卻洛了“陽”;好不容易找個老婆,卻被人家開了“封”!
?
這年頭,接聽電話聲音漸漸小對方是領導,聲音漸漸大對方是部下,一聽就發燥對方撥錯號,笑得不停歇那是女同學,半天哼一下老婆在訓話,悄悄避開人對方是情人!
?
這年頭,當官也不容易:體質弱的累死,心胸窄的氣死,智商低的悉死,膽量小的嚇死,酒量小的喝死,性欲差的羞死,性欲強的那可真是舒服死!
?
這年頭,教育好子女是生命延續的重要代表,理順好領導安排好部下是權力重要代表,辦好朋友的事是人生價值的重要代表!
?
這年頭,人有錢有時間有個好身體,絕品;人有錢無病無時間,珍品;人無錢無病有時間,上品;人無錢無病無時間,次品;人無錢無時間有脾氣,廢品!
?
這年頭,干部素質要求你:心中有小平,袋中有文憑,對上能擺平,對下能鏟平,道德沒水平,金庫能填平,左手拿酒瓶,右手握藥瓶,家里有醋瓶,外面有花瓶!
?
這年頭,構建和諧社會要注意在自然界不要和天斗,在國際社會不要和美國斗,在路上不要和軍車斗,在單位不要和領導斗,在家里不要和老婆斗!
?
這年頭,聽說要去打臺灣,一老紅軍把計獻:派三萬人馬足矣:派一萬小姐過去把他奶奶的國軍身體搞垮,派一萬河南老鄉過去把他娘的經濟搞亂,派一萬領導干部過去把他媽的國庫折騰干!
?
這年頭,10類人做不了大官:1膽小,2話多,3錢少,4關系差,5酒量小,6才華橫溢,7學歷太高,8疾惡如仇,9性功能差,10有姿色不肯獻身。
?
這年頭,開展批評太難了:批評老婆她就亂跑,批評老公他就亂搞!批評上級就官位難保,批評同級就關系難搞,批評自己就自尋煩惱,批評下級就選票減少!
?
這年頭,老婆是家情人是花,工資給家獎金送花,病了回家好了看花,離不了的是家忘不了的是花,常回家看看別忘了澆花!
?
這年頭,女人對男人的基本配置是:身邊站個魁梧的,懷里摟個有功夫的,家里待個賺錢的,遠方有個思念的,夢里藏個初戀的,偶爾來個溫柔的,老了混個懂保健的。
?
這年頭,男人認為情人是手表越漂亮越好,小蜜是懷表越隱秘越好,小姐是電子表越新鮮越好,老婆是自動表不上弦照樣跑,各種表都想要只是時間要掌握好!
?
這年頭,結婚叫入網,重婚叫一卡雙號,婚外戀叫呼叫轉移,情人多叫移動夢網,離婚叫銷號,分居叫停機留號,女人再婚叫過戶。男人再婚叫補卡,互換叫聯通。
/** ?* <p>Title: 公式解析類</p> ?* <p>Description: 實現對包含“()”的表達式進行簡單的四則運算。</p> ?* <p>Copyright: Copyright (c) 2004</p> ?* <p>Company: </p> ?* @author leasion ?* @version 1.0 ?*/ /** * 原載于:http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=124&threadID=14861&tstart=90 * 修改者:lkz * 修改說明: *???? 1.增加對負數運算支持; *???? 2.增加對公式的檢查; *???? 3.增加對類似公式(A+B)+(C-D)的支持。 *???? 4.其它一些小的改動。 * */
import java.util.Vector;
?
public class FormulaParser { ??? private int leftBracket = 0;//左括號個數 ??? private int rightBracket = 0;//右括號個數 ??? private int startL = 0; ??? private int startR = 0; ??? private double answer = 0; ??? private String strValue=""; ??? private String leftNumber = "0"; ??? private String rightNumber = "0"; ??? public String Msg = ""; ??? private String formula=""; ??? private int[] sym = new int[4]; ??? private Vector list = new Vector();
?
??? public FormulaParser(String calRule){ ????? this.setFormula(calRule); ??? } ??? private int getLeftBracket(String calRule) { ??????? leftBracket = 0; ??????? startL = calRule.indexOf("("); ??????? if (startL != -1) { ??????????? calRule = calRule.substring(startL + 1, calRule.length()); ??????? } ??????? while (startL != -1) { ??????????? leftBracket++; ??????????? startL = calRule.indexOf("("); ??????????? calRule = calRule.substring(startL + 1, calRule.length()); ??????? } ??????? return leftBracket; ??? }
?
??? private void setLeftBracket(int leftBracket) { ??????? this.leftBracket = leftBracket; ??? } ??? public void setFormula(String calRule){ ????? formula=replaceSubtration(calRule.trim()); ????? formula="("+formula+")"; ??? } ??? /* ??? /*為了使公式中支持負數,使用“`”表示減號,使用“-”表示負號 ??? */ ??? private String replaceSubtration(String vstr){ ????? String tmp=""; ????? String result=""; ????? int startS = vstr.indexOf("-"); ????? if (startS !=-1) { ??????? if (startS > 0) { ????????? tmp = vstr.substring(startS - 1, startS); ????????? if (!"+".equals(tmp) && !"-".equals(tmp) && !"*".equals(tmp) &&!"/".equals(tmp) && ???????????? !"(".equals(tmp)){ ??????????? result = result + vstr.substring(0, startS) + "`"; ????????? } ????????? else ??????????? result = result + vstr.substring(0, startS + 1); ??????? } ??????? else ????????? result = result + vstr.substring(0, startS + 1); ?????? vstr = vstr.substring(startS + 1); ????? } ????? while (startS != -1) { ??????? startS = vstr.indexOf("-"); ??????? if (startS > 0) { ????????? tmp = vstr.substring(startS - 1, startS); ????????? if (!"+".equals(tmp) && !"-".equals(tmp) && !"*".equals(tmp) &&!"/".equals(tmp) && ???????????? !"(".equals(tmp)) ??????????? result = result + vstr.substring(0, startS) + "`"; ????????? else ??????????? result = result + vstr.substring(0, startS + 1); ??????? } ??????? else ????????? result = result + vstr.substring(0, startS + 1); ????????? vstr = vstr.substring(startS + 1); ????? } ????? result+=vstr; ????? return result; ??? }
?
??? public String getFormula(){ ????? return formula.replace('`','-').substring(1,formula.length()-1); ??? }
?
??? private int getRightBracket(String calRule) { ??????? rightBracket = 0; ??????? startR = calRule.indexOf(")"); ??????? if (startR != -1) { ??????????? calRule = calRule.substring(startR + 1, calRule.length()); ??????? } ??????? while (startR != -1) { ??????????? rightBracket++; ??????????? startR = calRule.indexOf(")"); ??????????? calRule = calRule.substring(startR + 1, calRule.length()); ??????? } ??????? return rightBracket; ??? }
?
??? private void setRightBracket(int rightBracket) { ??????? this.rightBracket = rightBracket; ??? }
?
??? /* ??? /*對比左右括號個數 ??? */ ??? private boolean compareToLR() { ??????? int lb = getLeftBracket(formula); ??????? int rb = getRightBracket(formula); ??????? boolean CTLR = false; ??????? if (lb == rb) { ??????????? Msg = ""; ??????????? CTLR = true; ??????? } else if (lb > rb) { ??????????? Msg = "左括弧的個數多于右括弧,請檢查!"; ??????????? CTLR = false; ??????? } else { ??????????? Msg = "左括弧的個數少于右括弧,請檢查!"; ??????????? CTLR = false; ??????? } ??????? return CTLR; ??? } ?? /* ?? /*檢查公式中是否存在非法字符如(+、-)等 ?? */ ?? private boolean checkFormula(){ ????? boolean isOk=true; ????? String[] bracket =new String[2]; ????? String[] sign=new String[4]; ????? bracket[0]="("; ????? bracket[1]=")"; ????? sign[0]="+"; ????? sign[1]="`"; ????? sign[2]="*"; ????? sign[3]="/"; ????? String vstr=""; ????? for(int i=0;i<bracket.length;i++){ ??????? for(int j=0;j<sign.length;j++){ ????????? if (i==0) ??????????? vstr=bracket[i]+sign[j]; ????????? else ??????????? vstr=sign[j]+bracket[i]; ????????? if (formula.indexOf(vstr)>0){ ??????????? Msg="公式中存在非法字符"+vstr; ??????????? isOk=false; ??????????? return isOk; ????????? } ??????? } ????? } ????? for(int i=0;i<sign.length;i++){ ??????? for(int j=0;j<sign.length;j++){ ????????? vstr=sign[i]+sign[j]; ????????? if (formula.indexOf(vstr)>0){ ????????????? Msg="公式中存在非法字符"+vstr; ????????????? isOk=false; ????????????? return isOk; ????????? } ??????? } ????? } ????? if (formula.indexOf("()")>0){ ??????? Msg="公式中存在非法字符()"; ??????? isOk=false; ????? } ????? return isOk; ??? } ?? public boolean checkValid(){ ???? if ((formula==null) || (formula.trim().length()<=0) ) { ?????? Msg="請設置屬性calRule!"; ?????? return false; ???? } ???? return (compareToLR()&&checkFormula()); ?? }
?
?? /* ? /*返回公式執行結果 ??? return double ? */ ? public double getResult(){ ??? String formulaStr = "", calRule = ""; ??? double value = 0.0; ??? calRule = this.formula; ??? if (checkValid()) { ????? for (int i = 0; i < leftBracket; i++) { ??????? int iStart=calRule.lastIndexOf("(") + 1; ??????? formulaStr = calRule.substring(iStart, ?????????????????????????????????????? iStart+calRule.substring(iStart).indexOf(")")).trim(); ??????? symbolParse(formulaStr); ??????? value = parseString(); ??????? iStart=calRule.lastIndexOf("("); ??????? int iEnd=calRule.substring(iStart).indexOf(")")+1; ??????? calRule = calRule.substring(0,iStart).trim() + ??????????? value + ??????????? calRule.substring(iStart+iEnd, calRule.length()).trim(); ????? } ??? } ??? System.out.println(Msg); ??? double tmp = Math.pow(10, 10); ??? value = Math.round(value * tmp) / tmp; ??? return value; ?? } ??? public void FormulaStr(String calRule) { ??????? String formulaStr = ""; ??????? if (checkValid()) { ??????????? for (int i = 0; i < leftBracket; i++) { ??????????????? formulaStr = calRule.substring(calRule.lastIndexOf("(") + 1, calRule.indexOf(")")).trim(); ??????????????? symbolParse(formulaStr); ??????????????? double value = parseString(); ??????????????? strValue=String.valueOf(value); ??????????????? System.out.println("formulaStr=" + formulaStr); ??????????????? //formulaVal = Double.parseDouble(formulaStr); ??????????????? System.out.println("formulaVal=" + value); ??????????????? calRule = calRule.substring(0, calRule.lastIndexOf("(")).trim() + value + calRule.substring(calRule.indexOf(")") + 1, calRule.length()).trim(); ??????????????? System.out.println("calRule=" + calRule); ??????????? } ??????? } ??? }
?
??? /* ??? /*抽取最終括號內數據到List ??? */ ??? private void symbolParse(String str) { ??????? list.clear(); ??????? for (int i = 0; i < 4; i++) { ??????????? compareMin(str); ??????????? while (sym[i] != -1) { ??????????????? String insStr = str.substring(0, sym[i]).trim(); ??????????????? list.add(insStr); ??????????????? insStr = str.substring(sym[i], sym[i] + 1).trim(); ??????????????? list.add(insStr); ??????????????? str = str.substring(sym[i] + 1, str.length()).trim(); ??????????????? compareMin(str); ??????????? } ??????? } ??????? if (sym[0] == -1 && sym[1] == -1 && sym[2] == -1 & sym[3] == -1) { ??????????? list.add(str); ??????? } ??? } ???? /* ??? /*循環比較賦SubString起始值 ??? */ ??? private void compareMin(String str) { ??????? int sps = str.indexOf("`");//減法subtration ??????? sym[0] = sps; ??????? int spa = str.indexOf("+");//加法addition ??????? sym[1] = spa; ??????? int spd = str.indexOf("/");//除法division ??????? sym[2] = spd; ??????? int spm = str.indexOf("*");//乘法multiplication ??????? sym[3] = spm; ??????? for (int i = 1; i < sym.length; i++) { ??????????? for (int j = 0; j < sym.length - i; j++) ??????????????? if (sym[j] > sym[j + 1]) { ??????????????????? int temp = sym[j]; ??????????????????? sym[j] = sym[j + 1]; ??????????????????? sym[j + 1] = temp; ??????????????? } ??????? } ??? }
?
??? private double parseString() ??????????? throws NumberFormatException, StringIndexOutOfBoundsException { ??????? try{ ????????? calculate(); ????????? return answer; ??????? }catch(Exception e){ ????????? Msg="錯誤:" + e.getMessage(); ????????? return 0.0; ??????? } ??? }
?
??? private void calculate() { ??????? /* ??????? /*處理除法 ??????? */ ??????? int spd = list.indexOf("/"); ??????? while (spd != -1) { ??????????? leftNumber = list.get(spd - 1).toString(); ??????????? rightNumber = list.get(spd + 1).toString(); ??????????? list.remove(spd - 1); ??????????? list.remove(spd - 1); ??????????? list.remove(spd - 1); ??????????? double ln = Double.valueOf(leftNumber).doubleValue(); ??????????? double rn = Double.valueOf(rightNumber).doubleValue(); ??????????? double answer = ln / rn; ??????????? list.add(spd - 1, String.valueOf(answer)); ??????????? spd = list.indexOf("/"); ??????? } ??????? /* ??????? /*處理乘法 ??????? */ ??????? int spm = list.indexOf("*"); ??????? while (spm != -1) { ??????????? leftNumber = list.get(spm - 1).toString(); ??????????? rightNumber = list.get(spm + 1).toString(); ??????????? list.remove(spm - 1); ??????????? list.remove(spm - 1); ??????????? list.remove(spm - 1); ??????????? double ln = Double.valueOf(leftNumber).doubleValue(); ??????????? double rn = Double.valueOf(rightNumber).doubleValue(); ??????????? double answer = ln * rn; ??????????? list.add(spm - 1, String.valueOf(answer)); ??????????? spm = list.indexOf("*"); ??????? } ??????? /* ??????? /*處理減法 ??????? */ ??????? int sps = list.indexOf("`"); ??????? while (sps != -1) { ??????????? leftNumber = list.get(sps - 1).toString(); ??????????? rightNumber = list.get(sps + 1).toString(); ??????????? list.remove(sps - 1); ??????????? list.remove(sps - 1); ??????????? list.remove(sps - 1); ??????????? double ln = Double.valueOf(leftNumber).doubleValue(); ??????????? double rn = Double.valueOf(rightNumber).doubleValue(); ??????????? double answer = ln - rn; ??????????? list.add(sps - 1, String.valueOf(answer)); ??????????? sps = list.indexOf("`"); ??????? } ??????? /* ??????? /*處理加法 ??????? */ ??????? int spa = list.indexOf("+"); ??????? while (spa != -1) { ??????????? leftNumber = list.get(spa - 1).toString(); ??????????? rightNumber = list.get(spa + 1).toString(); ??????????? list.remove(spa - 1); ??????????? list.remove(spa - 1); ??????????? list.remove(spa - 1); ??????????? double ln = Double.valueOf(leftNumber).doubleValue(); ??????????? double rn = Double.valueOf(rightNumber).doubleValue(); ??????????? double answer = ln + rn; ??????????? list.add(spa - 1, String.valueOf(answer)); ??????????? spa = list.indexOf("+"); ??????? } ??????? if (list.size() != 0) { ??????????? String result = list.get(0).toString(); ??????????? if (result == null || result.length() == 0) result = "0"; ??????????? answer = Double.parseDouble(list.get(0).toString()); ??????? } ??? } }
原文引自:http://blog.csdn.net/lkz912/archive/2004/12/31/236267.aspx
package hibernatedemo;
import hibernatedemo.person; import java.util.*;
import net.sf.hibernate.Query; import net.sf.hibernate.Session; import net.sf.hibernate.SessionFactory; import net.sf.hibernate.cfg.Configuration; import net.sf.hibernate.tool.hbm2ddl.SchemaExport;
publicclass Test { publicstaticvoid main(String[] args)throwsException{ ? ?Configuration cfg = new Configuration().addClass(person.class); ? ?SessionFactory sessions = cfg.buildSessionFactory(); ? ?new SchemaExport(cfg).create(true, true); ? ?Session s = sessions.openSession(); ? ?Query q = s.createQuery("from person"); ? ?for(Iterator it = q.iterate();it.hasNext();){ ? ? ?person b = (person)it.next(); ? ? ?System.out.println("##name:"+b.getName()); ? ?} }
}
引自: http://www.aygfsteel.com/TrampEagle/articles/29972.html
用hibernate建表 把xxx.hbm.xml文件放在class所在位置。偶測試時,執行正常,但未見數據庫中的表,不知道哪里出錯。 import?net.sf.hibernate.SessionFactory; import?net.sf.hibernate.cfg.Configuration; import?net.sf.hibernate.tool.hbm2ddl.SchemaExport; xxx?{ ????Configuration?conf=?new?Configuration().addClass( xxx.class); ????//第一次運行時用來在數據庫中創建表 ????//并且把sql語句輸出到txt文件用的 ????//以后的運行要去掉這一段,否則每次都新建表 ????Properties?prop?=?new?Properties(); ????//沒有設置hibernate.dialect時,執行無法通過,還要找另外一種代替方法,否則這里跟數據庫類型綁定,不是一種好的實現方式 ????prop.setProperty("hibernate.dialect",?"net.sf.hibernate.dialect.MySQLDialect"  ; ????SchemaExport?dbExport=new?SchemaExport(conf,?prop); ????dbExport.setOutputFile("sql_out_lib\\sql.txt"  ; ????dbExport.create(true,?true); } dbExport.create(true,true);
?把這個語句的第二個參數true改成false,就可以生成sql語句了,變成下面的語句: ?dbExport.create(true,?false); ?不過無法直接執行,還需要繼續摸索。 ?另外,發現這個時候不需要數據庫的連接,所以hibernate配置文件的連接池沒有設置也沒有關系。
引自:http://www.blogcn.com/user17/yu_qj/blog/6763871.html
轉貼:Andy.m?? 日期:2003-07-26?? 人氣:35 <script> function addRow(){ ??? ??? // 插入一行 ??? myNewRow = document.all.myTable.insertRow(); ??? var lenRow = document.all.myTable.rows.length; // 計算總行數 ??? ??? if(lenRow > 1){??????? ??????? var point = myNewRow.rowIndex;??? // 計算當前行位置??? ??????? var lenCol = document.all.myTable.rows(0).cells.length; // 計算每行有幾列 ??????? ??????? // 插入lenCol個td ??????????? for (i=0; i < lenCol; i++) { ??????????????? document.all.myTable.rows(point).insertCell(); ??????????????? document.all.myTable.rows(point).cells(i).innerHTML =?????????????????????????????????????????????? parseFloat(document.all.myTable.rows(point-1).cells(i).innerHTML) + lenCol; ??????? } ??? }else if(lenRow == 1){ ??????? // 原來table是0行,初始化一行 ??????? for(i = 0; i < 10; i++){ ??????????? document.all.myTable.rows(0).insertCell(); ??????????? document.all.myTable.rows(0).cells(i).innerHTML = i; ??????? } ??? }??? }
function delRow(){ ??? document.all.myTable.deleteRow(); } </script> <a href="javascript: addRow()">增加一行</a> <a href="javascript: delRow()">減去一行</a> <table name=myTable border=1 id=myTable> </table>
<script? language="javascript">???
function? printsetup(){? //? 打印頁面設置? wb.execwb(8,1);? }? function? printpreview(){? //? 打印頁面預覽? ???????????????? wb.execwb(7,1);? ???????????????? }?
function? printit()? {? if? (confirm('確定打印嗎?')){?
wb.execwb(6,6)? }? }? </script>? <OBJECT? classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"???
height=0? id=wb? name=wb? width=0></OBJECT>? <input? class="ipt"? type=button? name=? button? _print? value="打印"??? onclick? ="? javascript? :printit();">? <input? class="ipt"? type=button??? name=button? _setup? value="打印頁面設置"???????????
onclick? ="? javascript? :? printsetup();">??? <input? class="ipt"? type=button??? name=button_show? value="打印預覽"???????????
onClick="javascript:printpreview();">
|