??xml version="1.0" encoding="utf-8" standalone="yes"?> 1?/span>首先下蝲apache2.2 下蝲地址Q?/font>http://mirrors.sohu.com/apache/httpd-2.2.16.tar.gz 2?/span>然后下蝲SVN a) 包:subversion-deps-1.6.12.tar.gz i. 地址Q?font face="Times New Roman">http://subversion.tigris.org/downloads/subversion-deps-1.6.12.tar.gz b) susubversion-1.6.12.tar.gz 地址Q?/font> i. http://subversion.tigris.org/downloads/subversion-1.6.12.tar.gz 3?/span>然后解析Apache2Q安?/font> 4?/span>tar -zxvf httpd-2.2.16.tar.gz 5?/span>安装Apache a) ./configure -prefix=/opt/web/apache2 --enable-mods-shared=all --enable-so b) Make c) Make install 6?/span>?font face="Times New Roman">APACHE是否安装成功Q?/font> 启动apache:/opt/web/apache2/bin/apachectl start 7?/span>安装Svn 8?/span>首先解压Q?nbsp;tar -zxvf subversion-deps-1.6.12.tar.gz 9?/span>然后解压Q?font face="Times New Roman">tar -zxvf susubversion-1.6.12.tar.gz 10?/span>安装命oQ?/span> a) ./configure --prefix=/opt/web/subversion --with-apxs=/opt/web/apache2/bin/apxs --with-apr=/opt/web/httpd-2.2.16/srclib/apr --with-apr-util=/opt/web/httpd-2.2.16/srclib/apr-util 11?/font>make make install 1、首先检查一下linux下是有存在一下YӞ如果不存在,必须这些Y件安?br />
rpm -q compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel glibc glibc-common glibc-devel gcc- gcc-c++ libaio-devel libaio libgcc libstdc++ libstdc++-devel make sysstat unixODBC unixODBC-devel 然后创徏数据库的所有者: if [$USER = "Oracle"] ; then
]]>
]]>
]]>
]]>
]]>
C:\> net start ResinA
net stop ResinA
一个机器安装多个ResinҎ
apache+resin Ҏ
LoadModule caucho_module \
<installdir>/resin-3.1.x/win32/apache-2.0/mod_caucho.dll
ResinConfigServer localhost 6802
<Location /caucho-status>
SetHandler caucho-status
</Location>
]]>
2、以root方式登陆Q修?etc/sysctl.confQ在文g中增加一下参?br />
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range =1024 65000
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default =262144
net.core.wmem_max =262144
groupadd oinstall
groupadd dba
useradd -g oinstall -G dba Oracle 创徏用户Oracle
passwd OracleQ修改Oracle的密码)
修改Oracle用户的限?br />
cd /etc/security
vi limits.conf
在该文g增加一下内?br />
Oracle soft nproc 2047
Oracle hard nproc 16384
Oracle soft nofile 1024
Oracle hard nofile 65536
在文?etc/pam.d/login文g增加一下内?br />
session required /lib/security/pam_limits.so
session required pam_limits.so
在文?etc/profile增加一下内?/p>
if [ $SHELL = " /bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65535
else
ulimit -u 16384 -n 65536
fi
fi
创徏安装目录Q?br />
mkdir -p /opt/app/oracle
chown -P Oracle:oinstall /opt/app
chmod -R 755 /opt/app
执行命oQ解压安装文?Qunzip linux_11gR1_database.zip
然后q入解压后的目录Q执?br />
$ ./runInstaller
]]>
首先我们看看Directory 的类
public abstract class Directory {
volatile boolean isOpen = true;
/*** 持有一个LockFactory的实例(实现锁定q个目录实例Q?/
protected LockFactory lockFactory;
/**q回该目录下的所有文件数l?如果q个目录下没有文件存在,或者存在权限问题不能访问,该方法可能返回Null*/
public abstract String[] list() throws IOException;
/** * q回指定名称的文件是不是存在 */
public abstract boolean fileExists(String name)
throws IOException;
/**q回指定名称的文件最后修改的旉
public abstract long fileModified(String name) throws IOException;
/**讄指定文g名的文g最后的修改旉为当前时?/
public abstract void touchFile(String name) throws IOException;
/**删除指定文g?*/
public abstract void deleteFile(String name)throws IOException;
/**q回指定文g的长度?*/
public abstract long fileLength(String name) throws IOException;
/** 在当前目录下使用l定的名U创Z个空的文件。ƈ且返回一个流来写该文件?/
public abstract IndexOutput createOutput(String name) throws IOException;
/** * Lucene使用该方法确保所有的针对该文件的写操作都会存储到Index。ƈ且阻止machine/OS发生故障 破坏该index?/
public void sync(String name) throws IOException {}
/**获取已经存在的一个文件的IndexInput操作该文g?*/
public abstract IndexInput openInput(String name) throws IOException;
/** q回已经存在的一个文件、ƈ且用指定大的~冲的IndexInputQ但是当前目录也可能忽略该缓冲池的大,
* 当前主要是考虑CompoundFileReader和FSDirectory对于ơ参数的需求?/
public IndexInput openInput(String name, int bufferSize) throws IOException {
return openInput(name);
}
/** 创徏一个指定名U的?
public Lock makeLock(String name) {
return lockFactory.makeLock(name);
}
/**
* 清除指定的锁定(解锁和删除)q不仅要求在q个时候当前的锁一定不在用?*/
public void clearLock(String name) throws IOException {
if (lockFactory != null) {
lockFactory.clearLock(name);
}
}
/** l束q个store. */
public abstract void close() throws IOException;
/**讄LockFactoryQ此目录实例应光定执行。每个LockFactory实例只用于一个目录(卻I不要q一个实例在多个目录Q?*/
public void setLockFactory(LockFactory lockFactory) {
this.lockFactory = lockFactory;
lockFactory.setLockPrefix(this.getLockID());
}
/** 获得LockFactoryQ此目录例实例用其锁定执行。请注意Q这可能是无效的目录执行Q提供自己锁执行*/
public LockFactory getLockFactory() {
return this.lockFactory;
}
/**q去锁实例的唯一表示ID的字W串描述*/
public String getLockID() {
return this.toString();
}
/**// 拯源目录src下的文gQ复制到目的目录dest下面Q拷贝完成后关闭源目录src*/
public static void copy(Directory src, Directory dest, boolean closeDirSrc) throws IOException {
final String[] files = src.list();
if (files == null)
throw new IOException("cannot read directory " + src + ": list() returned null");
byte[] buf = new byte[BufferedIndexOutput.BUFFER_SIZE];
for (int i = 0; i < files.length; i++) {
IndexOutput os = null;
IndexInput is = null;
try {
// create file in dest directory
os = dest.createOutput(files[i]);
// read current file
is = src.openInput(files[i]);
// and copy to dest directory
long len = is.length();
long readCount = 0;
while (readCount < len) {
int toRead = readCount + BufferedIndexOutput.BUFFER_SIZE > len ? (int)(len - readCount) : BufferedIndexOutput.BUFFER_SIZE;
is.readBytes(buf, 0, toRead);
os.writeBytes(buf, toRead);
readCount += toRead;
}
} finally {
// graceful cleanup
try {
if (os != null)
os.close();
} finally {
if (is != null)
is.close();
}
}
}
if(closeDirSrc)
src.close();
}
从Directory抽象cȝ定义Q我们可以得到如下几点:
1、管理锁工厂及其锁实例;
2、管理Directory目录实例的基本属性,主要是通过文g名称q行理Q?br />
3、管理与操作该目录相关的一些流对象Q?br />
4、管理烦引文件的拯?br />
2?/span>我们首先看看IndexWriter的构造函?/font>
public IndexWriter(String path, Analyzer a, boolean create, MaxFieldLength mfl)
public IndexWriter(String path, Analyzer a, boolean create)(废弃Q不提倡?
public IndexWriter(File path, Analyzer a, boolean create, MaxFieldLength mfl)
public IndexWriter(File path, Analyzer a, boolean create)(废弃Q不提倡?
public IndexWriter(Directory d, Analyzer a, boolean create, MaxFieldLength mfl)
public IndexWriter(Directory d, Analyzer a, boolean create)(废弃Q不提倡?
public IndexWriter(String path, Analyzer a, MaxFieldLength mfl)
public IndexWriter(String path, Analyzer a)(废弃Q不提倡?
public IndexWriter(File path, Analyzer a, MaxFieldLength mfl)
public IndexWriter(File path, Analyzer a)(废弃Q不提倡?
public IndexWriter(Directory d, Analyzer a, MaxFieldLength mfl)
public IndexWriter(Directory d, Analyzer a)(废弃Q不提倡?
public IndexWriter(Directory d, boolean autoCommit, Analyzer a)(废弃Q不提倡?
public IndexWriter(Directory d, boolean autoCommit, Analyzer a, boolean create)Q废弃,不提倡?
public IndexWriter(Directory d, Analyzer a, IndexDeletionPolicy deletionPolicy, MaxFieldLength mfl)
public IndexWriter(Directory d, boolean autoCommit, Analyzer a, IndexDeletionPolicy deletionPolicy)Q废弃,不提倡?
public IndexWriter(Directory d, Analyzer a, boolean create, IndexDeletionPolicy deletionPolicy, MaxFieldLength mfl)
public IndexWriter(Directory d, boolean autoCommit, Analyzer a, boolean create, IndexDeletionPolicy deletionPolicy)Q废弃,不提倡?
l心的读者肯定会发现Q废弃的构造函C提倡用的构造函敎ͼ多了一个MaxFieldLength参数。带有该参数的构造函数都是允许正怋用的?/font>Q注释:废弃的构造函数将在Lucene3.0中移除)
仔细查看其构造函数的实现呢,最l都转化成一个私有的构造函敎ͼ如图Q?/font>
/**
* 该构造函C要是创徏一个IndexWrite对象
* d Q指定的存放建立索引文g的烦引目?/font>
* a QAnalyzer 分词分析?/font>
* create Q是否要重新写入索引文gQ如果ؓtrueQ则重写索引文gQ如果ؓfalseQ则q加写入索引文g
* closeDir Q一个boolean型变量,表示是否关闭索引目录Directory dQ与IndexWriter的一个成员变量相?/font>
* deletionPolicy Q指定删除烦引文件用的{略
* autoCommit Q徏立烦引文件后Q自动提交?/font>
* maxFieldLength Q?nbsp;表示索引中Field的最大长度?/font>
*/
private void init(Directory d, Analyzer a, final boolean create, boolean closeDir, IndexDeletionPolicy deletionPolicy, boolean autoCommit, int maxFieldLength)
throws CorruptIndexException, LockObtainFailedException, IOException {
this.closeDir = closeDir;
directory = d;
analyzer = a;
setMessageID(defaultInfoStream);//q里主要是指定infoStreamQ是一个PrintStream输出对?/font>
this.maxFieldLength = maxFieldLength; //指定Field数据的最大长?/font>
if (create) {
// 如果是重新创建烦引文?/font>Q?/font>清除写锁文gwrite.lock
directory.clearLock(WRITE_LOCK_NAME);
}
Lock writeLock = directory.makeLock(WRITE_LOCK_NAME);
if (!writeLock.obtain(writeLockTimeout)) // 获取写锁文g
throw new LockObtainFailedException("Index locked for write: " + writeLock);
this.writeLock = writeLock; //保存新的写锁文g
try {
if (create) {
// 如果create为trueQ表C重写烦引文件。重写烦引文件之前,要先d已经存在的烦引文Ӟq且要清除掉历史写入的segment信息
try {
segmentInfos.read(directory);
segmentInfos.clear();
} catch (IOException e) {
}
segmentInfos.commit(directory); // 向指定的索引存放目录中写入segment信息
} else {
segmentInfos.read(directory); //dsegment信息
// We assume that this segments_N was previously
// properly sync'd:
for(int i=0;i<segmentInfos.size();i++) {
final SegmentInfo info = segmentInfos.info(i);
List files = info.files();
for(int j=0;j<files.size();j++)
synced.add(files.get(j));
}
}
this.autoCommit = autoCommit; //执行提交写入索引的标?nbsp;
setRollbackSegmentInfos(segmentInfos); //克隆原来?/font>segment状态信息,q且信息保存到HashSet?/font>
docWriter = new DocumentsWriter(directory, this); //创徏一个DocumentsWriter对象
docWriter.setInfoStream(infoStream); //讄DocumentsWriter对象?/font>infoStream信息
docWriter.setMaxFieldLength(maxFieldLength); //讄DocumentsWriter对象?/font>maxFieldLength信息
//默认的删除策略实现类为KeepOnlyLastCommitDeletionPolicyQ它只是保证最q提交删除的索引文gQ提交删除动?nbsp;
// IndexFileDeleter deleter是IndexWritercȝ一个私有的成员变量Q它在org.apache.lucene.index包里面,主要对删除烦引文件进行实现和理
deleter = new IndexFileDeleter(directory,
deletionPolicy == null ? new KeepOnlyLastCommitDeletionPolicy() : deletionPolicy,
segmentInfos, infoStream, docWriter);
pushMaxBufferedDocs(); //hDocsBuffer?/font>
if (infoStream != null) { //如果infoStream是null
message("init: create=" + create);
messageState();
}
} catch (IOException e) {
this.writeLock.release();
this.writeLock = null;
throw e;
}
}
通过IndexWrite的构造函敎ͼ以及最l的实现Ҏ的init分发Q其主要是实CҎ指定的徏立烦引的方式(重写、追加写?Q通过create标志位来判断Q从而指定一U在操作索引文g的过E中删除索引文g的策略?/font>
在理解lucene的时_必须熟悉其初始化IndexWrite的原理,才能深入了解该框架在创徏索引的核心实现机制?/font>
FiledcL代码解析
首先Filed内部定义了三个静态类Store、Index、TermVector?br />
//定一个静态类Store Q主要ؓ了设|Field的存储属?br />
public static final class Store extends Parameter implements Serializable {
private Store(String name) {
super(name);
}
//使用压羃的方式来存储Field的?br />
public static final Store COMPRESS = new Store("COMPRESS");
//在烦引中存储Field的?br />
public static final Store YES = new Store("YES");
//在烦引中不存贮Field的?br />
public static final Store NO = new Store("NO");
}
//定一个静态类Index Q主要ؓ了设|Field的烦引属?br />
public static final class Index extends Parameter implements Serializable {
private Index(String name) {
super(name);
}
//不对Fieldq行索引Q所以这个Field׃能被索到(一般来_建立索引而它不被检索,q是没有意义?
//如果对该Fieldq设|了Field.Store为Field.Store.YES或Field.Store.COMPRESSQ则可以?br />
public static final Index NO = new Index("NO");
//对Fieldq行索引Q同时还要对其进行分?由Analyzer来管理如何分?
public static final Index ANALYZED = new Index("ANALYZED");
//废弃的属性,使用ANALYZED 来替?br />
public static final Index TOKENIZED = ANALYZED;
//对Fieldq行索引Q但是不对该Field使用分词
public static final Index NOT_ANALYZED = new Index("NOT_ANALYZED");
//废弃的属性,使用NOT_ANALYZED来替?br />
public static final Index UN_TOKENIZED = NOT_ANALYZED;
//即不对Field索引Q也不对其用Analyzer来分?br />
public static final Index NOT_ANALYZED_NO_NORMS = new Index("NOT_ANALYZED_NO_NORMS");
//废弃的属性,有NOT_ANALYZED_NO_NORMS来替?br />
public static final Index NO_NORMS = NOT_ANALYZED_NO_NORMS;
//对Field属性,使用分词Q但是不是用Analyzer来分?br />
public static final Index ANALYZED_NO_NORMS = new Index("ANALYZED_NO_NORMS");
}
q是一个与词条有关的类。因为在索的时候需要指定检索关键字Q通过Z个Fieldd一个TermVectorQ就可以在检索中把该Field索到?br />
public static final class TermVector extends Parameter implements Serializable {
private TermVector(String name) {
super(name);
}
//不存?br />
public static final TermVector NO = new TermVector("NO");
//为每个Document都存储一个TermVector
public static final TermVector YES = new TermVector("YES");
//存储Qƈ且存在位|信?br />
public static final TermVector WITH_POSITIONS = new TermVector("WITH_POSITIONS");
//存储Qƈ且存贮偏U量信息
public static final TermVector WITH_OFFSETS = new TermVector("WITH_OFFSETS");
//存储位置、偏U量{所有信?br />
public static final TermVector WITH_POSITIONS_OFFSETS = new TermVector("WITH_POSITIONS_OFFSETS");
}
构造函?br />
public Field(String name, String value, Store store, Index index)
public Field(String name, String value, Store store, Index index, TermVector termVector)
public Field(String name, Reader reader)
public Field(String name, Reader reader, TermVector termVector)
public Field(String name, TokenStream tokenStream)
public Field(String name, TokenStream tokenStream, TermVector termVector)
public Field(String name, byte[] value, Store store)
public Field(String name, byte[] value, int offset, int length, Store store)
程Q?br />
首先查name以及values不能为空以及Nnull?br />
然后查是否是存储以及是否分词如果两者都是NoQ则抛出异常?br />
然后查是否存储以及是否向量分词,如果两者都是No'Q则抛出异常?br />
然后该Filed的名U命令传递过来的名称源代码(this.name = name.internQ?br />
表示获取JVM String帔R池的地址
此时ҎStore的|来设|是否存储以及压~的?br />
然后ҎIndex的|来设|是否烦引、是否分词、omitNorms 的g及置是否是二q制
然后开始根据TermVector 的|来设|是否存储向量、是否存储偏U量、是否存储位|等信息?br />
以上信息可能存在分析不正,请大家给指证Q本语有不怎么好,
Document是lucene自己定义的一U文件格式,lucene使用docement来代替对应的物理文g或者保存在数据库中的数据。因此Document只能作ؓ数据源在Lucene中的数据存贮的一U文件Ş式?/font>
Document只是负责攉数据源,因ؓ不同的文件可以构建同一个Document。只要用户将不同的文件创建成Documentcd的文ӞLucenep快速找到查扑ƈ且用他们?/font>
对于一个Document文gQ可以同时增加多个Field。Lucene中对于每个数据源是用FieldcL表示的。多个Fieldl成一个DocumentQ多个Documentl成一个烦引文件。Document与Field关系如果一所C?/font>
此时Q我们去看看Documentq个cȝ源代码。Document采用默认不带参数的构造函敎ͼ但是我们他在创徏的时_
产生两个变量Q?/font>fields?nbsp;boost
其中fields是创Z一个arrayList,其主要是保存Fieldc?/font>
Boost主要是设|该doc的优先
其方法:addQFieldable fieldQ增加一个field对象
removeField(String name) ҎnameU除一个ield对象Q找C个就q回Q?/font>
removeFields(String name) ҎnameU除所有的field对象
Field getField(String name) Ҏ名字扑ֈ该Field对象?/font>
Fieldable getFieldable(String name) Ҏ名字扑ֈFieldable子类QFieldable?/font> 接口Q具体有Filed来实玎ͼ
String get(String name) Ҏ名字Q找到给Filed对象中包含的内容
public final byte[] getBinaryValue(String name) 主要查找Doc中包含有二进制field 数据Q如果不存在Q则q回nullQ?/font>
public final List getFields() 直接q回该Doc中包含的Field?br />
q个是需要替换的内容<a href=../../08/19/10483.html>下一: PHP+MySQL应用中用XORq算加密法</a>
不知道是什么原因,replassall竟然不能替换Q是找不到源里的数据Q还是其他有问题呢?其他面都能替换掉,是?-2个页面不能替换,郁闷。是不是字符~码的问题?有谁知道吗?误?br />
֮现限制输入大、小写英文,数字QQ点小敎ͼ日期Q中文,部分英文Q部分中文等众多功能。直接加入到html代码中即可用?/p>
<script>
function regInput(obj, reg, inputStr)
{
var docSel = documentQselection.createRange()
if (docSel.parentElement().tagName != "INPUT") return false
oSel = docSel.duplicate()
oSel.text = ""
var srcRange = obj.createTextRange()
oSel.setEndPoint("StartToStart", srcRange)
var str = oSel.text + inputStr + srcRange.text.substr(oSel.text.length)
return reg.test(str)
}
</script>
写英文Q?lt;xmp style= "display:inline"> </xmp>
<input onkeypress = "return regInput(this, /^[a-z]*$/, String.fromCharCode(event.keyCode))"
onpaste = "return regInput(this, /^[a-z]*$/, window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^[a-z]*$/, event.dataTransfer.getData('Text'))"
style="ime-mode:Disabled"><br>
大写英文Q?lt;xmp style= "display:inline"> </xmp>
<input onkeypress = "return regInput(this, /^[A-Z]*$/, String.fromCharCode(event.keyCode))"
onpaste = "return regInput(this, /^[A-Z]*$/, window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^[A-Z]*$/, event.dataTransfer.getData('Text'))"
style="ime-mode:Disabled">
<br>
L数字Q?lt;xmp style="display:inline"> </xmp>
<input onkeypress = "return regInput(this, /^[0-9]*$/, String.fromCharCode(event.keyCode))"
onpaste = "return regInput(this, /^[0-9]*$/, window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^[0-9]*$/, event.dataTransfer.getData('Text'))"
style="ime-mode:Disabled"><br>
?位小敎ͼ<xmp style="display:inline"> </xmp>
<input onkeypress = "return regInput(this, /^\d*\.?\d{0,2}$/,
String.fromCharCode(event.keyCode))"
onpaste = "return regInput(this, /^\d*\.?\d{0,2}$/,
window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^\d*\.?\d{0,2}$/,
event.dataTransfer.getData('Text'))"
style="ime-mode:Disabled">
? 123.12<br>
日 期:<xmp style="display:inline"> </xmp>
<input onkeypress = "return regInput(this, /^\d{1,4}
([-\/](\d{1,2}([-\/](\d{1,2})?)?)?)?$/,
String.fromCharCode(event.keyCode))"
onpaste = "return regInput(this, /^\d{1,4}([-\/](\d{1,2}
([-\/](\d{1,2})?)?)?)?$/,
window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^\d{1,4}([-\/](\d{1,2}
([-\/](\d{1,2})?)?)?)?$/,
event.dataTransfer.getData('Text'))"
style="ime-mode:Disabled">
? 2002-9-29<br>
L中文Q?lt;xmp style="display:inline"> </xmp>
<input onkeypress = "return regInput(this, /^$/,
String.fromCharCode(event.keyCode))"
onpaste = "return regInput(this, /^[\u4E00-\u9FA5]*$/,
window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^[\u4E00-\u9FA5]*$/,
event.dataTransfer.getData('Text'))"><br>
部分英文Q?lt;xmp style="display:inline"> </xmp>
<input onkeypress = "return regInput(this, /^[a-e]*$/,
String.fromCharCode(event.keyCode))"
onpaste = "return regInput(this, /^[a-e]*$/,
window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^[a-e]*$/,
event.dataTransfer.getData('Text'))"
style="ime-mode:Disabled">
范围: a,b,c,d,e<br>
部分中文Q?lt;xmp style="display:inline"> </xmp>
<script language=javascript>
function checkChinese(oldLength, obj)
{
var oTR = window.documentQselection.createRange()
var reg = /[^一二三四五六七八九十]/g
oTR.moveStart("character", -1*(obj.value.length-oldLength))
oTR.text = oTR.text.replace(reg, "")
}
</script>
<input onkeypress="return false" onkeydown=
"setTimeout('checkChinese('+this.value.length+','+this.uniqueID+')',
1)"
onpaste = "return regInput(this, /^[一二三四五六七八九十]*$/,
window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^[一二三四五六七八九十]*$/,
event.dataTransfer.getData('Text'))">
范围: 一二三四五六七八九?lt;br>
2.不能展开右键Q不能全选,不能复制的实?
<body oncontextmenu="window.event.returnvalue=false"
onkeypress="window.event.returnvalue=false"
onkeydown="window.event.returnvalue=false"
onkeyup="window.event.returnvalue=false"
ondragstart="window.event.returnvalue=false"
onselectstart="event.returnvalue=false">
...
</body>
3.止面正文内容被选取
<body oncontextmenu="return false" ondragstart="return false"
onselectstart ="return false" onselect="documentQselection.empty()"
oncopy="documentQselection.empty()" onbeforecopy="return false"onmouseup="documentQselection.empty()">
4.避免别h把网|在框架中
<script language=“javascript”><!--if (self!=top){top.location=self.location;}-->< /script>
5.示查看源代?
<frameset>
<frame src="你要保密的文件的URL">
</frameset>
6.关闭输入?
<input style="ime-mode:disabled">
7.止囄下蝲
在这里的最后加入:
oncontextmenu="return false" ondragstart="return false" onselectstart="return
false" scroll="auto"
8.止~存
在HEAD里加入:
<meta http-equiv="Expires" CONTENT="0">
<meta http-equiv="Cache-Control" CONTENT="no-cache">
<meta http-equiv="Pragma" CONTENT="no-cache">
webService主要是可以解决站炚w的数据共享问题,把复杂的业务ҎQ封装在被调用的站点上面Q这样不是WEB站点和其他的应用E序Q当然要能保证上|)都可以访问到暴露的方法?/p>
myeclipse5.1支持xfire支持的非常棒。这里讲解一个简单的例子Q?
此文章ؓ引用文章Q仅做保留,供学习参考?
点击finish之后Qmyeclipse自动帮你生成services.xml以及web应用目录l构Q其中的services.xml是你导出服务的配|文Ӟ注意在WEB-INF/web.xml文g中配|了xfire自己?/p>
servlet.
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
2.接下来,现在~写要导出的pojoc,首先是接口:
q程QFile>New>Other>MyEclipse>Web Service
选择QCreate web service from Java beanQ把Create new javabean也勾?br />
3。在D面中,输入
web service name: HelloWorldTest
java package : services
services Interface : IHelloWorldTest
services impl.class :HelloWorldTestImpl
其他的默认,点finish
最后可以看到Web Services 下面的services.xml的内容如?br />
<beans xmlns="
<service>
<name>HelloWorldTest</name>
<serviceClass>services.IHelloWorldTest</serviceClass>
<implementationClass>
services.HelloWorldTestImpl
</implementationClass>
<style>wrapped</style>
<use>literal</use>
<scope>application</scope>
</service>
</beans>
4。services包中的文Ӟ
IHelloWorldTest.java
-----------------------------------------------
package services;
//Generated by MyEclipse
public interface IHelloWorldTest {
public String sayHello(String message);
}
----------------------------------------------------------
HelloWorldTestImpl.java
----------------------------------------------------
package services;
//Generated by MyEclipse
public class HelloWorldTestImpl implements IHelloWorldTest {
public String sayHello(String message) {
return "Hello,"+message;
}
}
------------------------------------------------------------
到此为止webServices~码工作完成Q现在开始部|到tomcatq里省略?/p>
部v好后可以试下:
http://localhost:8080/HelloWorld/services/HelloWorldTest?WSDL
新徏工程useWebServiceQƈ且徏立client和services?br /> bulid path中导入,XFire 1.1 core libraries 和XFire 1.1 HTTP client libraries.
SayHello.java
----------------------------------------
package client;
import java.net.MalformedURLException;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import services.IHelloWorldTest;
public class SayHello {
public String say(String name)
{
String result="";
Service srvcModel = new ObjectServiceFactory().create(IHelloWorldTest.class);
XFireProxyFactory factory =
new XFireProxyFactory(XFireFactory.newInstance().getXFire());
String helloWorldURL = "http://localhost:8080/HelloWorld/services/HelloWorldTest";
try {
IHelloWorldTest srvc = (IHelloWorldTest)factory.create(srvcModel, helloWorldURL);
result = srvc.sayHello(name);
} catch (MalformedURLException e) {
e.printStackTrace();
}finally{
return result;}
}
}
--------------------------------------------------------------
IHelloWorldTest .java
---------------------------------------------------------------
package services;
public interface IHelloWorldTest {
public String sayHello(String message);
}
-----------------------------------------------------------------
创徏index.jspQbody部分
-----------------------
<form name="form1" action="say.jsp" method="POST">
您的大名Q?lt;input name="userName" type="text"/> <input value="提交" type="submit"/>
</form>
-------------------------------
创徏say.jsp,body部分
----------------------------------------------------------------
<%String name=(String)request.getParameter("userName");
String result=new SayHello().say(name);
%>
webServiceq程调用l果Q?<%=result %>
------------------------------------------------------------------------
q行下测试!OK
字符 | 转义后的字符 | ||
---|---|---|---|
HTML字符 | 字符~码 | ||
and(? | & | & | & |
单引?/td> | ' | ' | ' |
双引?/td> | " | " | " |
大于?/td> | > | > | > |
于?/td> | < | < | < |
import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDriver;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.apache.log4j.Logger;
/**
* @author Administrator
*
*/
public class DBConnectionFactory {
/**
* Logger for this class
*/
private static final Logger logger = Logger
.getLogger(DBConnectionFactory.class);
private static ObjectPool connectionPool=null;
private static String sqlJdbc = "";
private static String sqlUser = "";
private static String sqlPwd = "";
@SuppressWarnings("unchecked")
private static Class driverClass=null;
public static void proDBConnectionFactory(){
if(sqlJdbc.equals("")){
sqlJdbc = "jdbc:jtds:sqlserver://27.0.0.1:1433/finance;tds=8.0;lastupdatecount=true";
}
if(sqlUser.equals("")){
sqlUser = "sa";
}
if(sqlPwd.equals("")){
sqlPwd = "11111";
}
initDataSource();
}
public synchronized static void initDataSource(){
if(driverClass == null){
try {
driverClass = Class.forName("net.sourceforge.jtds.jdbc.Driver");
} catch (ClassNotFoundException e) {
logger.error("在注册驱动名U的旉发生错误Q?+e.getMessage(),e);
}
}
if(connectionPool == null){
setupDriver(sqlJdbc);
//printDriverStats();
}else{
System.out.print("q接池已l存?);
}
try {
// printDriverStats();
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConn(){
proDBConnectionFactory();
Connection conn = null;
try {
conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:FinanceDBPool");
} catch(SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void printDriverStats() throws Exception {
PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");
ObjectPool connectionPool = driver.getConnectionPool("FinanceDBPool");
System.out.println("zd的连? " + connectionPool.getNumActive());
System.out.println("I闲的连? " + connectionPool.getNumIdle());
}
public static void setupDriver(String connectURI){
try {
connectionPool = new GenericObjectPool(null);
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI,sqlUser,sqlPwd);
@SuppressWarnings("unused")
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true);
Class.forName("org.apache.commons.dbcp.PoolingDriver");
PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");
//driver.registerPool("FinanceDBPool",connectionPool);
driver.registerPool("FinanceDBPool",connectionPool);
} catch (ClassNotFoundException e) {
logger.error("注册q接池的旉发生错误:"+e.getMessage(),e);
} catch (SQLException e) {
logger.error("注册q接池的旉发生错误:"+e.getMessage(),e);
}
}
web.xml <xwork> import com.opensymphony.xwork.ActionSupport; /**
<?xml version="1.0" encoding="GB18030"?>
<web-app version="2.4"
xmlns=" xmlns:xsi=" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
<filter>
<filter-name>webwork</filter-name>
<filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>webwork</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
xwork.xml
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
"
<include file="webwork-default.xml"></include>
<package name="default" extends="webwork-default">
<action name="helloWorld" class="cn.javaworker.yeming.action.HelloWorld">
<result name="success">index.jsp</result>
<result name="input">hello.jsp</result>
</action>
</package>
</xwork>
hello.jsp
<%@ taglib prefix="ww" uri="/webwork"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Enter you name</title>
</head>
<body>
<ww:form action="helloWorld">
<ww:textfield label="please enter user name" name="name"></ww:textfield>
<input type="submit"/>
</ww:form>
<form action="helloWorld.action">
please enter you name:<input type="text" name="name" value="<ww:property value="name"/>"/>
<input type="submit">
</form>
</body>
</html>
index.jsp
<%@ taglib prefix="ww" uri="/webwork"%>
<html>
<head>
<title>hello page</title>
</head>
<body>
The message generated by my first action is :<ww:property value="message"/>
</body>
</html>
HelloWorld.java
package cn.javaworker.yeming.action;
* @author $author
*/
@SuppressWarnings("serial")
public class HelloWorld extends ActionSupport{
private String message;
private String name;
/**
* @see com.opensymphony.xwork.Action#execute()
*/
public String execute() throws Exception
{
if(name==null||name.equals("")||name.equals("world")){
addFieldError("name","blank names or names of 'world' are not allowed!");
return INPUT;
}
message ="hello "+name+"!\n";
message+="this is the time is: "+System.currentTimeMillis();
return SUCCESS;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the message
*/
public String getMessage() {
return message;
}
}
]]>
出现q个问题Q是因ؓ你没有正配|?Hibernate internal session context management .
String s = new String("The Java platform is the ideal platform for network computing");
StringTokenizer st = new StringTokenizer(s);
System.out.println( "Token Total: " + st.countTokens() );
while( st.hasMoreElements() ){
System.out.println( st.nextToken() );
}
l果为:
Token Total: 10
The
Java
platform
is
the
ideal
platform
for
network
computing
String s = new String("The=Java=platform=is=the=ideal=platform=for=network=computing");
StringTokenizer st = new StringTokenizer(s,"=",true);
System.out.println( "Token Total: " + st.countTokens() );
while( st.hasMoreElements() ){
System.out.println( st.nextToken() );
}
l果为:
Token Total: 19
The
=
Java
=
platform
=
is
=
the
=
ideal
=
platform
=
for
=
network
=
computing
String question = new String("1+1=");
int answer = 3;
boolean result = (1+1==3);
StringBuffer sb = new StringBuffer();
sb.append(question);
sb.append(answer);
sb.append('\t');
sb.append(result);
System.out.println(sb);
l果为:
1+1=3 false
StringBuffer sb1 = new StringBuffer(5);
StringBuffer sb2 = new StringBuffer(5);
sb1.ensureCapacity(6);
sb2.ensureCapacity(100);
System.out.println( "sb1.Capacity: " + sb1.capacity() );
System.out.println( "sb2.Capacity: " + sb2.capacity() );
l果为:
sb1.Capacity: 12
sb2.Capacity: 100
StringBuffer sb = new StringBuffer("I love her!");
char[] i = {'I',' ','l','o','v','e',' ','y','o','u'};
sb.getChars(7,10,i,7);
System.out.println( "sb: " + sb );
l果为:sb: I love her!
StringBuffer sb = new StringBuffer("0123456789");
System.out.println( "sb.reverse(): " + sb.reverse() );
l果为:sb.reverse(): 9876543210
StringBuffer sb = new StringBuffer("0123456789");
sb.setLength(5);
System.out.println( "sb: " + sb );
l果为:sb: 01234
log4j.rootLogger=INFO, A1,A4
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.Threshold=ERROR
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%p [%t] %c{2} (%M:%L) - %m%n
log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A4.file=D:\\Java\\logs\\yeming.log
log4j.appender.A4.Encoding=GBK
log4j.appender.A4.DatePattern='.'yyyy-MM-dd
log4j.appender.A4.layout=org.apache.log4j.PatternLayout
log4j.appender.A4.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
使用代码Q?br />package com.javawoker.yeming.jiemie.database;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import org.apache.log4j.Logger;
/**
*@author 叶明 ---guming123416@gmail.com
*@version $Id: v 1.01 2006/06/38 16:09:14 teodord Exp $
*/
public class Pubconn {
/*
* 创徏U有变量conn为数据库q接对象中Connection
* 创徏U有变量dsye为数据库q接池的DataSource
*/
private Connection conn;
private DataSource dsye;
private static Logger log=Logger.getLogger(Pubconn.class);
/*
* 创徏构造函数PubconnQ在建立class中加载数据源的InitialContext
*/
public Pubconn()
{
try{
Context initCtx=new InitialContext();
if(initCtx==null)
{
throw new Exception("不能加蝲文gContext");
}
dsye=(javax.sql.DataSource)initCtx.lookup("jdbc/yeming");
}catch(Exception ex)
{
ex.printStackTrace();
log.error("在加栽数据库q接池时间发生错?+ex.getMessage());
}
}
/*
* 从连接池中取Z条连接变?br /> *
*/
public Connection getConn()
{
try{
conn=dsye.getConnection();
}catch(SQLException ex)
{
ex.printStackTrace();
log.error("获得q接对象CONN旉发生错误"+ex.getMessage());
}
return conn;
}
/*
* 关闭数据库连接,释放资源
*/
public void closeConn(Connection conn)
{
try{
if(conn!=null)
{
conn.close();
conn=null;
}
}catch(SQLException ex)
{
ex.printStackTrace();
log.error("关闭CONN旉发生错误"+ex.getMessage());
}
}
}
}
然后建立调用面
代码如下Q?br />
<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="GBK" contentType="text/html charset=gbk"%>
<jsp:useBean id="yeconn" scope="page" class="com.javawoker.yeming.jiemie.database.Pubconn"></jsp:useBean>
<%
Connection conn=yeconn.getConn();
Statement stmt=conn.createStatement();
String sql="select * from combasicinfo";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next())
{
out.println(rs.getInt(1));
out.println(rs.getString(2));
}
rs.close();
stmt.close();
yeconn.closeConn(conn);
%>