??xml version="1.0" encoding="utf-8" standalone="yes"?>
表格部分代码如下Q?/font>
<table id="testTbl" border=1>
<tr id="tr1">
<td width=6%><input type=checkbox id="box1"></td>
<td id="b">W一?lt;/td>
</tr>
<tr id="tr2">
<td width=6%><input type=checkbox id="box2"></td>
<td id="b">W二?lt;/td>
</tr>
<tr>
<td width=6%><input type=checkbox id="box3"></td>
<td>W三?lt;/td>
</tr>
</table>
动态添加表行的javascript函数如下Q?/font>
<script language="javascript">
function addRow(){
//d一?/font>
var newTr = testTbl.insertRow();
//讄行背?/font>
newTr.bgColor = '#008040';
//d两列
var newTd0 = newTr.insertCell();
var newTd1 = newTr.insertCell();
//讄列内容和属?/font>
newTd0.innerHTML = '<input type=checkbox id="box4">';
newTd1.innerText= '新增加的?;
<BR>
1、inserRow()和insertCell()函数 insertRow()函数可以带参敎ͼ形式如下Q?/p>
insertRow(index) q个函数新行添加到index的那一行前Q比如insertRow(0),是将新行d到第一行之前。默认的insertRow()函数相当于insertRow(-1),新行添加到表的最后?/p>
insertCell()和insertRow的用法相同?/p>
2、动态设|属性和事g 上面行数中的innerHTML和innerText都是列的属性?/p>
q个innerQ就是“inner”到<tb></tb>之间QinnerText是添加到<tb></tb>之间的文本,innerHTML是添加到<tb></tb>之间的HTML代码(q个so单,q个解释挺多余的) 讄其他属性也是用同样的方式,比如Q设|行背景?/p>
newTr.bgColor = 'red'; 讄事g也一P需要简单说明一炏V?/p>
比如Q我要让点击新加行的时候执行一个自己定义的函数 newClick,newClick行数如下Q?/p>
function newClick(){ alert("q是新添加的?); ?/p>
对onclick事g讄q个函数的代码如下:(x) newTr.onclick = newClick; q里需要主义的是,Q后面的部分必须是函数名,而且不能带引P newTr.onclick = newClick(); newTr.onclick = 'newClick'; newTr.onclick = "newClick";
上面的写法都是错误的?/p>
Z么,其实知道Z么没有什么意思,知道怎么用就O(jin)K了,如果不想知道Q可以蟩q下面这一Dc(din)?/p>
实际上这?后面的newClick是指向自己定义的newClick函数的指针,javascript里面函数名就是指向函数的指针Q加了引h号什么的览器就找不到那个函C?/p>
下面的写法,也是正确?/p>
newTr.onclick = function newClick(){ alert("q是新添加的?); ?/p>
q个使用函数名实际上是一L(fng) 讄其他的事件用法相同?/p>
posted on 2005-05-27 09:36 L逍遥?/a> 最q在J2EE的项目中需要用LOB字段保存文本信息以及(qing)囄和文?到网上搜拉一?q不?仔细看拉一?但都不是很全有的q有错误,l过几天的实?把问题都解决?Zȝ一?希望寚w要的朋友有点参? posted on 2005-05-27 09:36 L逍遥?/a> 最q在J2EE的项目中需要用LOB字段保存文本信息以及(qing)囄和文?到网上搜拉一?q不?仔细看拉一?但都不是很全有的q有错误,l过几天的实?把问题都解决?Zȝ一?希望寚w要的朋友有点参? Ҏ(gu)二:(x) "^[0-9]*[1-9][0-9]*$" //正整?/p>
"^((-\d+)|(0+))$" //非正整数Q负整数 + 0Q?/p>
"^-[0-9]*[1-9][0-9]*$" //负整?/p>
"^-?\d+$" //整数 "^\d+(\.\d+)?$" //非负点敎ͼ正QҎ(gu) + 0Q?/p>
"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正QҎ(gu) "^((-\d+(\.\d+)?)|(0+(\.0+)?))$" //非正点敎ͼ负QҎ(gu) + 0Q?/p>
"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //负QҎ(gu) "^(-?\d+)(\.\d+)?$" //点?/p>
"^[A-Za-z]+$" //?6个英文字母组成的字符?/p>
"^[A-Z]+$" //?6个英文字母的大写l成的字W串 "^[a-z]+$" //?6个英文字母的写l成的字W串 "^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符?/p>
"^\w+$" //由数字?6个英文字母或者下划线l成的字W串 "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$" //email地址 "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$" ---------------------------------------------------------------------------------------------------------------------- 字符描述Q?\Q将下一个字W标Cؓ(f)Ҏ(gu)字符或字面倹{例?n"与字W?n"匚w?\n"与换行符匚w。序?\\"?\"匚wQ?\("?("匚w?/p>
^ Q匹配输入的开始位|?/p>
$ Q匹配输入的l尾?/p>
* Q匹配前一个字W零ơ或几次。例如,"zo*"可以匚w"z"?zoo"?/p>
+ Q匹配前一个字W一ơ或多次。例如,"zo+"可以匚w"zoo",但不匚w"z"?/p>
? Q匹配前一个字W零ơ或一ơ。例如,"a?ve?"可以匚w"never"中的"ve"?/p>
.Q匹配换行符以外的Q何字W?/p>
(pattern) 与模式匹配ƈC匚w。匹配的子字W串可以从作为结果的 Matches 集合中?Item [0]...[n]取得。如果要匚w括号字符(?)Q可使用"\(" ?"\)"?/p>
x|yQ匹?x ?y。例?"z|food" 可匹?"z" ?"food"?(z|f)ood" 匚w "zoo" ?"food"?/p>
{n}Qn 为非负的整数。匹配恰好nơ。例如,"o{2}" 不能?"Bob 中的 "o" 匚wQ但是可以与"foooood"中的前两个o匚w?/p>
{n,} Qn 为非负的整数。匹配至nơ。例如,"o{2,}"不匹?Bob"中的"o"Q但是匹?foooood"中所有的o?o{1,}"{h(hun)?o+"?o{0,}"{h(hun)?o*"?/p>
{n,m} Qm ?n 为非负的整数。匹配至?n ơ,臛_ m ơ。例如,"o{1,3}" 匚w "fooooood"中前三个o?o{0,1}"{h(hun)?o?"?/p>
[xyz] Q一个字W集。与括号中字W的其中之一匚w。例如,"[abc]" 匚w"plain"中的"a"?/p>
[^xyz] Q一个否定的字符集。匹配不在此括号中的M字符。例如,"[^abc]" 可以匚w"plain"中的"p". [a-z] Q表C某个范围内的字W。与指定区间内的M字符匚w。例如,"[a-z]"匚w"a"?z"之间的Q何一个小写字母字W?/p>
[^m-z] Q否定的字符区间。与不在指定区间内的字符匚w。例如,"[m-z]"与不?m"?z"之间的Q何字W匹配?/p>
\b Q与单词的边界匹配,卛_词与I格之间的位|。例如,"er\b" ?never"中的"er"匚wQ但是不匚w"verb"中的"er"?/p>
\B Q与非单词边界匹配?ea*r\B"?never early"中的"ear"匚w?/p>
\d Q与一个数字字W匹配。等价于[0-9]?/p>
\D Q与非数字的字符匚w。等价于[^0-9]?/p>
\f Q与分页W匹配?/p>
\n Q与换行W字W匹配?/p>
\r Q与回R字符匚w?/p>
\s Q与M白字W匹配,包括I格、制表符、分늬{。等价于"[ \f\n\r\t\v]"?/p>
\S Q与M非空白的字符匚w。等价于"[^ \f\n\r\t\v]"?/p>
\t Q与制表W匹配?/p>
\v Q与垂直制表W匹配?/p>
\w Q与M单词字符匚wQ包括下划线。等价于"[A-Za-z0-9_]"?/p>
\W Q与M非单词字W匹配。等价于"[^A-Za-z0-9_]"?/p>
\num Q匹?num个,其中 num Z个正整数。引用回到记住的匚w。例如,"(.)\1"匚w两个q箋的相同的字符?/p>
\nQ匹?nQ其中n 是一个八q制换码倹{八q制换码值必L 1, 2 ?3 个数字长?/p>
例如Q?\11" ?"\011" 都与一个制表符匚w?\0011"{h(hun)?\001" ?"1"。八q制换码g得超q?256。否则,只有前两个字W被视ؓ(f)表达式的一部分。允许在正则表达式中使用ASCII码?/p>
\xnQ匹配nQ其中n是一个十六进制的换码倹{十六进制换码值必L好ؓ(f)两个数字ѝ例如,"\x41"匚w"A"?\x041"{h(hun)?\x04" ?"1"。允许在正则表达式中使用 ASCII 码?/p>
好了Q常用的Ҏ(gu)和属性就是这些了Q上面的语法介绍的已l很详细了,我们没有必要在|嗦了,接下来我们来看看在具体的例子里面如何使用q些Ҏ(gu)和属性来校验数据的合法性,我们q是举个例子吧,比如Q我们想要对用户输入的电(sh)子邮件进行校验,那么Q什么样的数据才是一个合法的?sh)子邮g呢?我可以这栯入:(x)uestc95@263.netQ当然我也会(x)q样输入Q?a href="mailto:xxx@yyy.com.cn">xxx@yyy.com.cn,但是q样的输入就是非法的Q?a href="mailto:xxx@@com.cn">xxx@@com.cn或者@xxx.com.cnQ等{,所以我们得Z个合法的?sh)子邮g地址臛_应当满以下几个条gQ?/p>
1. 必须包含一个ƈ且只有一个符号“@?/p>
2. 必须包含臛_一个至多三个符号??/p>
3. W一个字W不得是“@”或者??/p>
4. 不允许出现“@.”或?@ 5. l尾不得是字W“@”或者??/p>
所以根据以上的原则和上面表中的语法Q我们很Ҏ(gu)的就可以得到需要的模板如下Q?(\w)+[@]{1}(\w)+[.]{1Q?}(\w)+" 接下来我们仔l分析一下这个模?首先“\w”表C邮件的开始字W只能是包含下划U的单词字符Q这P满了第三个条gQ“[@]{1}”表C在?sh)子邮g中应当匹配ƈ且只能匹配一ơ字W“@?满了条件一Q同L(fng)“[.]{1Q?}”表C在?sh)子邮g中至匹?个至多匹?个字W??Q满了W二个条Ӟ模板最后的?\w)+”表C结字符只能是包含下划线在内的单词字W,满了条件五Q模板中间的?\w)+”满了条g四?/p>
然后Q我们就直接调用刚才的那个函数CheckExp("(\w)+[@]{1}(\w)+[.]{1}(\w)+",待校验的字符?好了,如果q回TruepC数据是合法的,否则是不正的Q怎么P单吧。我们还可以写出来校验n份证L(fng)的模板:(x)"([0-9]){15}"Q校验URL的模板:(x)"^http://{1}((\w)+[.]){1,3}"{等Q我们可以看刎ͼq些模板为我们提供了很好的可重利用的模块Q利用自己或者别人提供的各种模板Q我们就可以方便快捷的进行数据的合法性校验了Q相信你一定会(x)写出非常通用的模板的?/p>
q样Q我们只要定制不同的模板Q就可以实现对不同数据的合法性校验了。所以,正则表达式对象中最重要的属性就是:(x)“Pattern”属?只要真正掌握了这个属性,才可以自qq用正则表达式对象来为我们的数据校验q行服务?/p>
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=560411
}
</script>
<a href="#" onclick="addRow();">增加一?lt;/a>
p么简单,做点详细的说明:(x)
]]>
J2EEE序中用oracle数据库LOB字段的ȝ(elathen)
http://www.souzz.net 2005-10-23 文章出处Q博客园
LOB中我们用的比较多的主要有两种CLOB和BLOB,我们对两U类型分别讨?
1.CLOB是字W型LOB,主要存储文本信息,,最长ؓ(f)4G.,在J2EEE序?比如|页的textarea中的字符信息比较?Varchar2字段cd不能满?我们得用CLOB数据cd,我们q次目中就到q种情况.现在我们先说说如何存取CLOB字段
现在我要把网中的textarea元素的信息保存到数据库的CLOB字段? 我们都知道textarea中的信息当然不能直接保存成CLOB,我们在后台得到的是Stringcd?不多说拉,我们q是以一个实例讲?
先徏一个test?表有2个字D?ID,CONTENTS,其中CONTENTS保存CLOBcd的文本数?
create table TEST
(
ID VARCHAR2(18) not null,
CONTENTS CLOB,
)
接着我们~写一个测试用的jsp文gClobTest.jsp,代码如下
<%@ page language="java" contentType="text/html; charset=gb2312" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Clob对象的存取测?lt;/title>
</head>
<body>
<form name="test" method="post" action="clobTest.action">
<table width="80%" height="88" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="30" align="center">输入ID?lt;input type="text" name="ID">
</tr>
<tr>
<td align="center">
<textarea rows="28" cols="68" name="CONTENTS">
注册用户需遵守:
重?x)员个h隐私、保障会(x)员隐U安全是CSDN的一基本政{,CSDN不会(x)公开、编辑或透露?x)员的注册资料,除非W合以下情况Q?
(1) Ҏ(gu)中华人民共和国国家安全机构、公安部门的要求?qing)根据相应的法律E序要求?
(2) l护CSDN的商标所有权?qing)其它权益?
(3) 在紧急情况下竭力l护?x)员个h、其它社?x)个体和C会(x)大众的安全?
(4) 严重q反CSDN有关规定?
CSDN保留l束?x)员使用|络服务资格的权利,q保证结束会(x)员资格后仍ؓ(f)?x)员保密所有个人隐U?
</textarea>
</td>
</tr>
<tr>
<td align="center">
<input type="submit" name="Submit" value="提交">
</td>
</tr>
</table>
</form>
</body>
</html>
点击”提交”按?我们在后台的到的?个Stringcd的对?
String strID = request.getParameter(“ID?;
String strCONTENTS = request.getParameter(“CONTENTS?;
接着我们要做的Q务就是如何把StringcdCONTENTS存到数据库中的CLOBcd字段?
注意:LOB数据不能象其它类型数据一L(fng)接插入(INSERTQ。插入前必须先插入一个空的LOB对象QCLOBcd的空对象为EMPTY_CLOB()QBLOBcd的空对象为EMPTY_BLOB()。之后通过SELECT命o(h)查询得到先前插入的记录ƈ锁定Q而将I对象修改ؓ(f)所要插入的LOB对象?
//我们先插入一个空的CLOB对象
public int insertEmptyClob() throws Exception {
Statement statement = null;
int intResult = -1;
try {
//创徏数据库操作语?
statement = connection.createStatement();
//定义SQL语句
String strSQL = “INSET INTO TEST (ID,CONTENTS) VALUES(strID, EMPTY_CLOB())?
//执行SQL语句
intResult = statement.executeUpdate(strSQL);
System.out.println(" intResult valus is"+intResult);
return intResult;
} catch(Exception e) {
e.printStackTrace();
return -1;
} finally {
if (statement != null) {
statement.close();
}
}
}
//把strCONTENT插入CLOB字段
public void insertClob() throws Exception {
Statement statement = null;
ResultSet resultset = null;
try {
//讄不自动提?
connection.setAutoCommit(false);
//创徏数据库操作语?
statement = connection.createStatement();
//定义SQL语句
String strSQL = “SELECT CONTENTS FROM TEST WHERE ID=strID"?
resultset = statement.executeQuery(strSQL);
oracle.sql.CLOB contents = null;
while(resultset.next()) {
//取出CLOB对象
contents = (oracle.sql.CLOB)resultset.getClob("CONTENTS");
}
Writer out = contents.getCharacterOutputStream();
out.write(strContents);
out.flush();
out.close();
//数据库提?
connection.commit();
} catch(Exception e) {
e.printStackTrace();
}finally{
if(resultset != null) {
resultset.close();
}
if(statement != null) {
statement.close();
}
}
}
OK,我们已经把这D|本以CLOB字段的Ş式保存到数据库中了,在实际应用中Q如果要保存或修改一条记录,我们要分2步做Q先保存或修攚wLOB字段cd的字D,再保存或修改LOB字段Q接下来我们来把刚才保存到数据库中的CLOB字段djsp面中去?
我们在保存的时候,CLOB字段?x)把上面textarea中的文本按原来的格式一行一行(包括I格Q都保存到CLOB字段中,d的时候我们只要按照原来格式读起出来就行了Q我q里自己用了一个小处理Ҏ(gu)Q但如果你有更好的方法请告诉我)。在q里我们把CLOBdStringBuffer?Z保存不同行我在行之间加了个?amp;”字W来区分。最后{化成String
攑ֈVO中,q样׃证从前台到后収ͼ从后台到前台的数据传递的一致性!代码如下Q?
/**
* 获取CLOB文本对象
* @param sbSQL
* @return
* @throws java.lang.Exception
*/
public String selectIncludeClob(StringBuffer sbSQL) throws Exception {
Statement stmt = null;
ResultSet rs = null;
StringBuffer sbResult = new StringBuffer();
try {
//讑֮数据库不自动提交
//connection.setAutoCommit(false);
//创徏数据库操作语?
stmt = connection.createStatement();
//获取l果?
rs = stmt.executeQuery(sbSQL.toString());
while(rs.next()) {
CLOB clob = (CLOB)rs.getClob("CONTENTS");
Reader isClob = clob.getCharacterStream();
BufferedReader bfClob = new BufferedReader(isClob);
String strClob = bfClob.readLine();
while(strClob != null) {
sbResult.append(strClob);
sbResult.append("&");
strClob = bfClob.readLine();
}
}
//提交事务
// connection.commit();
} catch(Exception e) {
e.printStackTrace();
throw e;
} finally {
if(rs != null) {
rs.close();
}
if(stmt != null) {
stmt.close();
}
}
return sbResult.toString();
}
到jsp面中,我们从VO中获取改文本信息?
<textarea rows="42" cols="68" name="CONTENTS" style="border-style: solid; border-color: #FFFFFF; font-family:仿宋_GB2312; font-size:14pt; line-height:200%; margin-top:8; margin-bottom:6" >
<%
String content = vo.getContent();
String[] contentArray = content.split("&");
for(int i=0;i<contentArray.length;i++) {
String s= contentArray[i];
out.println(s);
}
%>
</textarea>
q样我们׃证什么格式保存就以什么格式显C?
2QBLOB字段,二进制LOBQ主要存储二q制数据Q最长ؓ(f)4GQ在J2EEE序中,一般类g囄和文件的保存。当然也有另一U方法,把囄和文件保存在盘上,数据库中只保存图片的链接地址和文件在服务器上的\径。如果遇到文件和囄比较重要的还是需要保存到数据库中Q例如:(x)我们做国土资源项目的时候,好多囄、文件就很重要,需要保存到数据库中Q?下面我写一个保存文件到数据库的Blob字段和从数据库的Blob字段中获取文件的Ҏ(gu)Q当然完全应用还要做其他工作Q这里就不多说了Q如果你不清楚的可以问我Q:(x)
/**
* 把上传的文g保存到数据库的Blob字段?
* @param strTableName 对应的表名称
* @param strColumnName 表中保存文g的Blob字段名称
* @param inputStream 输入的文件流
* @param sbSQLWhere where条g
* @throws java.lang.Exception
*/
public static void fileUpload(String strTableName,
String strColumnName,
InputStream inputStream,
StringBuffer sbSQLWhere)
throws Exception {
Connection con = null;
ResultSet resultset = null;
Statement stmt = null;
try {
//得到数据库连?
con = DBConnector.getConnection();
//构徏查询语句
StringBuffer sbSQL = new StringBuffer();
sbSQL.append(" UPDATE ");
sbSQL.append(strTableName);
sbSQL.append(" SET ");
sbSQL.append(strColumnName);
sbSQL.append("=EMPTY_BLOB() ");
sbSQL.append(sbSQLWhere);
System.out.println(" update sql value is*******"+sbSQL.toString());
//获取数据库操作语?
stmt=con.createStatement();
//插入I的blob对象
stmt.executeUpdate(sbSQL.toString());
con.setAutoCommit(false);
StringBuffer sbSQLBlob = new StringBuffer();
sbSQLBlob.append(" SELECT ");
sbSQLBlob.append(strColumnName);
sbSQLBlob.append(" FROM ");
sbSQLBlob.append(strTableName);
sbSQLBlob.append(sbSQLWhere);
sbSQLBlob.append(" FOR UPDATE");
System.out.println(" select sql value is*********"+sbSQL.toString());
resultset =stmt.executeQuery(sbSQLBlob.toString());
while (resultset.next()) {
/* 取出此BLOB对象 */
oracle.sql.BLOB blob = (oracle.sql.BLOB)resultset.getBlob("BODY");
/* 向B(ti)LOB对象中写入数?*/
BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());
BufferedInputStream in = new BufferedInputStream(inputStream);
int c;
while ((c=in.read())!=-1) {
out.write(c);
}
in.close();
out.close();
}
con.setAutoCommit(false);
con.commit();
} catch (Exception ex) {
ex.printStackTrace();
throw ex;
} finally {
if (stmt != null) {
stmt.close();
}
if (resultset != null) {
resultset.close();
}
if (con!=null) {
con.close();
}
}
}
下面的方法是从数据库中得C传的文g的输入流Q把输入写到servlet中Q再从页面中获取Qservlet׃写了?
/**
* Ҏ(gu)描述Q得到数据库上传的文件数?
*
* 输入参数Q?1Q表?String)
* 2Q字D名(String)
* 3: Where条g(StringBuffer)
* 5: 输出?ServletOutputStream)
*
* 输出参数Qvoid
* ~写? */
public static void getdownFile(String strTableName,
String strColumnName,
StringBuffer sbSQLWhere,
ServletOutputStream sos) throws Exception {
Connection con = null;
PreparedStatement ps = null;
ResultSet resultset = null;
try {
//得到数据库连?
con = DBConnector.getConnection();
StringBuffer sbSQL = new StringBuffer();
//构徏查询语句
sbSQL.append(" SELECT " + strColumnName + " FROM " + strTableName);
sbSQL.append(sbSQLWhere);
System.out.println(" sql value is:"+sbSQLWhere.toString());
ps = con.prepareStatement(sbSQL.toString());
//执行查询
resultset = ps.executeQuery();
while (resultset.next()) {
//d数据?
InputStream is = resultset.getBinaryStream(strColumnName);
byte[] buf = new byte[2048];
while(is.read(buf)!=-1) {
//把数据流按块写到servlet的输出流?
sos.write(buf);
}
}
} catch (Exception ex) {
ex.printStackTrace();
throw ex;
} finally {
if (ps != null) {
ps.close();
}
if (resultset != null) {
resultset.close();
}
if (con!=null) {
con.close();
}
}
}
囄的保存和文g的保存一P如果不清楚的可以和我联系
后记Q?
qxd着做项目,闲的时候也很懒QL把自己实际中的一些问题和解决Ҏ(gu)结一下,但L完成Q这是第一ơ写Q写的不好或不清楚的地方请包涵,下次改进Q也希望大家多提意见Q大家一赯步!Q!Q!Q!Q!Q!
]]>
J2EEE序中用oracle数据库LOB字段的ȝ(elathen)
http://www.souzz.net 2005-10-23 文章出处Q博客园
LOB中我们用的比较多的主要有两种CLOB和BLOB,我们对两U类型分别讨?
1.CLOB是字W型LOB,主要存储文本信息,,最长ؓ(f)4G.,在J2EEE序?比如|页的textarea中的字符信息比较?Varchar2字段cd不能满?我们得用CLOB数据cd,我们q次目中就到q种情况.现在我们先说说如何存取CLOB字段
现在我要把网中的textarea元素的信息保存到数据库的CLOB字段? 我们都知道textarea中的信息当然不能直接保存成CLOB,我们在后台得到的是Stringcd?不多说拉,我们q是以一个实例讲?
先徏一个test?表有2个字D?ID,CONTENTS,其中CONTENTS保存CLOBcd的文本数?
create table TEST
(
ID VARCHAR2(18) not null,
CONTENTS CLOB,
)
接着我们~写一个测试用的jsp文gClobTest.jsp,代码如下
<%@ page language="java" contentType="text/html; charset=gb2312" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Clob对象的存取测?lt;/title>
</head>
<body>
<form name="test" method="post" action="clobTest.action">
<table width="80%" height="88" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="30" align="center">输入ID?lt;input type="text" name="ID">
</tr>
<tr>
<td align="center">
<textarea rows="28" cols="68" name="CONTENTS">
注册用户需遵守:
重?x)员个h隐私、保障会(x)员隐U安全是CSDN的一基本政{,CSDN不会(x)公开、编辑或透露?x)员的注册资料,除非W合以下情况Q?
(1) Ҏ(gu)中华人民共和国国家安全机构、公安部门的要求?qing)根据相应的法律E序要求?
(2) l护CSDN的商标所有权?qing)其它权益?
(3) 在紧急情况下竭力l护?x)员个h、其它社?x)个体和C会(x)大众的安全?
(4) 严重q反CSDN有关规定?
CSDN保留l束?x)员使用|络服务资格的权利,q保证结束会(x)员资格后仍ؓ(f)?x)员保密所有个人隐U?
</textarea>
</td>
</tr>
<tr>
<td align="center">
<input type="submit" name="Submit" value="提交">
</td>
</tr>
</table>
</form>
</body>
</html>
点击”提交”按?我们在后台的到的?个Stringcd的对?
String strID = request.getParameter(“ID?;
String strCONTENTS = request.getParameter(“CONTENTS?;
接着我们要做的Q务就是如何把StringcdCONTENTS存到数据库中的CLOBcd字段?
注意:LOB数据不能象其它类型数据一L(fng)接插入(INSERTQ。插入前必须先插入一个空的LOB对象QCLOBcd的空对象为EMPTY_CLOB()QBLOBcd的空对象为EMPTY_BLOB()。之后通过SELECT命o(h)查询得到先前插入的记录ƈ锁定Q而将I对象修改ؓ(f)所要插入的LOB对象?
//我们先插入一个空的CLOB对象
public int insertEmptyClob() throws Exception {
Statement statement = null;
int intResult = -1;
try {
//创徏数据库操作语?
statement = connection.createStatement();
//定义SQL语句
String strSQL = “INSET INTO TEST (ID,CONTENTS) VALUES(strID, EMPTY_CLOB())?
//执行SQL语句
intResult = statement.executeUpdate(strSQL);
System.out.println(" intResult valus is"+intResult);
return intResult;
} catch(Exception e) {
e.printStackTrace();
return -1;
} finally {
if (statement != null) {
statement.close();
}
}
}
//把strCONTENT插入CLOB字段
public void insertClob() throws Exception {
Statement statement = null;
ResultSet resultset = null;
try {
//讄不自动提?
connection.setAutoCommit(false);
//创徏数据库操作语?
statement = connection.createStatement();
//定义SQL语句
String strSQL = “SELECT CONTENTS FROM TEST WHERE ID=strID"?
resultset = statement.executeQuery(strSQL);
oracle.sql.CLOB contents = null;
while(resultset.next()) {
//取出CLOB对象
contents = (oracle.sql.CLOB)resultset.getClob("CONTENTS");
}
Writer out = contents.getCharacterOutputStream();
out.write(strContents);
out.flush();
out.close();
//数据库提?
connection.commit();
} catch(Exception e) {
e.printStackTrace();
}finally{
if(resultset != null) {
resultset.close();
}
if(statement != null) {
statement.close();
}
}
}
OK,我们已经把这D|本以CLOB字段的Ş式保存到数据库中了,在实际应用中Q如果要保存或修改一条记录,我们要分2步做Q先保存或修攚wLOB字段cd的字D,再保存或修改LOB字段Q接下来我们来把刚才保存到数据库中的CLOB字段djsp面中去?
我们在保存的时候,CLOB字段?x)把上面textarea中的文本按原来的格式一行一行(包括I格Q都保存到CLOB字段中,d的时候我们只要按照原来格式读起出来就行了Q我q里自己用了一个小处理Ҏ(gu)Q但如果你有更好的方法请告诉我)。在q里我们把CLOBdStringBuffer?Z保存不同行我在行之间加了个?amp;”字W来区分。最后{化成String
攑ֈVO中,q样׃证从前台到后収ͼ从后台到前台的数据传递的一致性!代码如下Q?
/**
* 获取CLOB文本对象
* @param sbSQL
* @return
* @throws java.lang.Exception
*/
public String selectIncludeClob(StringBuffer sbSQL) throws Exception {
Statement stmt = null;
ResultSet rs = null;
StringBuffer sbResult = new StringBuffer();
try {
//讑֮数据库不自动提交
//connection.setAutoCommit(false);
//创徏数据库操作语?
stmt = connection.createStatement();
//获取l果?
rs = stmt.executeQuery(sbSQL.toString());
while(rs.next()) {
CLOB clob = (CLOB)rs.getClob("CONTENTS");
Reader isClob = clob.getCharacterStream();
BufferedReader bfClob = new BufferedReader(isClob);
String strClob = bfClob.readLine();
while(strClob != null) {
sbResult.append(strClob);
sbResult.append("&");
strClob = bfClob.readLine();
}
}
//提交事务
// connection.commit();
} catch(Exception e) {
e.printStackTrace();
throw e;
} finally {
if(rs != null) {
rs.close();
}
if(stmt != null) {
stmt.close();
}
}
return sbResult.toString();
}
到jsp面中,我们从VO中获取改文本信息?
<textarea rows="42" cols="68" name="CONTENTS" style="border-style: solid; border-color: #FFFFFF; font-family:仿宋_GB2312; font-size:14pt; line-height:200%; margin-top:8; margin-bottom:6" >
<%
String content = vo.getContent();
String[] contentArray = content.split("&");
for(int i=0;i<contentArray.length;i++) {
String s= contentArray[i];
out.println(s);
}
%>
</textarea>
q样我们׃证什么格式保存就以什么格式显C?
2QBLOB字段,二进制LOBQ主要存储二q制数据Q最长ؓ(f)4GQ在J2EEE序中,一般类g囄和文件的保存。当然也有另一U方法,把囄和文件保存在盘上,数据库中只保存图片的链接地址和文件在服务器上的\径。如果遇到文件和囄比较重要的还是需要保存到数据库中Q例如:(x)我们做国土资源项目的时候,好多囄、文件就很重要,需要保存到数据库中Q?下面我写一个保存文件到数据库的Blob字段和从数据库的Blob字段中获取文件的Ҏ(gu)Q当然完全应用还要做其他工作Q这里就不多说了Q如果你不清楚的可以问我Q:(x)
/**
* 把上传的文g保存到数据库的Blob字段?
* @param strTableName 对应的表名称
* @param strColumnName 表中保存文g的Blob字段名称
* @param inputStream 输入的文件流
* @param sbSQLWhere where条g
* @throws java.lang.Exception
*/
public static void fileUpload(String strTableName,
String strColumnName,
InputStream inputStream,
StringBuffer sbSQLWhere)
throws Exception {
Connection con = null;
ResultSet resultset = null;
Statement stmt = null;
try {
//得到数据库连?
con = DBConnector.getConnection();
//构徏查询语句
StringBuffer sbSQL = new StringBuffer();
sbSQL.append(" UPDATE ");
sbSQL.append(strTableName);
sbSQL.append(" SET ");
sbSQL.append(strColumnName);
sbSQL.append("=EMPTY_BLOB() ");
sbSQL.append(sbSQLWhere);
System.out.println(" update sql value is*******"+sbSQL.toString());
//获取数据库操作语?
stmt=con.createStatement();
//插入I的blob对象
stmt.executeUpdate(sbSQL.toString());
con.setAutoCommit(false);
StringBuffer sbSQLBlob = new StringBuffer();
sbSQLBlob.append(" SELECT ");
sbSQLBlob.append(strColumnName);
sbSQLBlob.append(" FROM ");
sbSQLBlob.append(strTableName);
sbSQLBlob.append(sbSQLWhere);
sbSQLBlob.append(" FOR UPDATE");
System.out.println(" select sql value is*********"+sbSQL.toString());
resultset =stmt.executeQuery(sbSQLBlob.toString());
while (resultset.next()) {
/* 取出此BLOB对象 */
oracle.sql.BLOB blob = (oracle.sql.BLOB)resultset.getBlob("BODY");
/* 向B(ti)LOB对象中写入数?*/
BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());
BufferedInputStream in = new BufferedInputStream(inputStream);
int c;
while ((c=in.read())!=-1) {
out.write(c);
}
in.close();
out.close();
}
con.setAutoCommit(false);
con.commit();
} catch (Exception ex) {
ex.printStackTrace();
throw ex;
} finally {
if (stmt != null) {
stmt.close();
}
if (resultset != null) {
resultset.close();
}
if (con!=null) {
con.close();
}
}
}
下面的方法是从数据库中得C传的文g的输入流Q把输入写到servlet中Q再从页面中获取Qservlet׃写了?
/**
* Ҏ(gu)描述Q得到数据库上传的文件数?
*
* 输入参数Q?1Q表?String)
* 2Q字D名(String)
* 3: Where条g(StringBuffer)
* 5: 输出?ServletOutputStream)
*
* 输出参数Qvoid
* ~写? */
public static void getdownFile(String strTableName,
String strColumnName,
StringBuffer sbSQLWhere,
ServletOutputStream sos) throws Exception {
Connection con = null;
PreparedStatement ps = null;
ResultSet resultset = null;
try {
//得到数据库连?
con = DBConnector.getConnection();
StringBuffer sbSQL = new StringBuffer();
//构徏查询语句
sbSQL.append(" SELECT " + strColumnName + " FROM " + strTableName);
sbSQL.append(sbSQLWhere);
System.out.println(" sql value is:"+sbSQLWhere.toString());
ps = con.prepareStatement(sbSQL.toString());
//执行查询
resultset = ps.executeQuery();
while (resultset.next()) {
//d数据?
InputStream is = resultset.getBinaryStream(strColumnName);
byte[] buf = new byte[2048];
while(is.read(buf)!=-1) {
//把数据流按块写到servlet的输出流?
sos.write(buf);
}
}
} catch (Exception ex) {
ex.printStackTrace();
throw ex;
} finally {
if (ps != null) {
ps.close();
}
if (resultset != null) {
resultset.close();
}
if (con!=null) {
con.close();
}
}
}
囄的保存和文g的保存一P如果不清楚的可以和我联系
后记Q?
qxd着做项目,闲的时候也很懒QL把自己实际中的一些问题和解决Ҏ(gu)结一下,但L完成Q这是第一ơ写Q写的不好或不清楚的地方请包涵,下次改进Q也希望大家多提意见Q大家一赯步!Q!Q!Q!Q!Q!
]]>
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
]]>
"^\d+$" //非负整数Q正整数 + 0Q?/p>
]]>
==> TCP首部
源端口号、目的端口号、位序号、位认序号、首部长度、标志位、窗口大、检验和、紧急指针和其它选项?
一个IP地址和一个端口号也成Z个插?socket)。插口对可唯一定互联|中每个TCPq接的双斏V?/p>
==> TCPq接的徏立与l止
TCP是一个面向连接的协议Q无论哪方向另一方发送数据之前,都必d在双方之间徏立一条连接?br /> TCPq接的徏立——三ơ握手?br /> TCPq接的终止——四ơ握手。这是由TCP的半关闭造成的。因为TCP是全双工的,因此每个方向必须单独的进行关闭?/p>
==> 最大报文段长度MSS
MSS大Q允许每个报文段传递的数据多Q相对TCP和IP的首部有更高的利用率?/p>
有些情况下,MSS是可以在建立TCPq接时进行协商的选项Q但是有些情况下不行 ?/p>
* 如果是本地网l,TCP可以Ҏ(gu)|络外出接口处的MTU值减d定的IP首部(20)和TCP长度(20)Q对于以太网Q可以达?460?/p>
* 如果IP地址为非本地的,则MSS通常定ؓ(f)默认?36字节Q允?0字节的IP首部?0字节的TCP首部以适合576字节的IP数据报)?/p>
MSS让主机限制另一端发送数据的长度Q同时也能控制它自己发送数据报的长度,避免较小MTU发生分片?/p>
==> TCP的半关闭
TCPq接的一端在l束它的发送后q能接收来自另一端数据(直到它也发送FINQ的能力Q这是所谓的半关闭。应用程序很用到?/p>
==> 复位报文D?/p>
* 不存在的端口Q目的端口没有进E监听)。目的主机将对SYNhq回一个RST报文Dc(din)(UDP则将产生一个端口不可达的信息)
* 异常l止?/p>
* 半打开的连接?/p>
==> TCP服务器的设计
* 大多数TCP服务器的q程是ƈ发的.
* 只有处于监听的进E才能处理客L(fng)的连接请?
* TCP服务器可以对本地IP地址q行限制,但是一般不能对q程IP地址q行限制.
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=561075
2. 栈的优势是,存取速度比堆要快Q仅ơ于直接位于CPU中的寄存器。但~点是,存在栈中的数据大与生存期必L定的,~Z灉|性。另外,栈数据可以共享,详见W?炏V堆的优势是可以动态地分配内存大小Q生存期也不必事先告诉编译器QJava的垃圾收集器?x)自动收走这些不再用的数据。但~点是,׃要在q行时动态分配内存,存取速度较慢?/p>
3. Java中的数据cd有两U?br /> 一U是基本cd(primitive types), 共有8U,即int, short, long, byte, float, double, boolean, char(注意Qƈ没有string的基本类?。这U类型的定义是通过诸如int a = 3; long b = 255L;的Ş式来定义的,UCؓ(f)自动变量。值得注意的是Q自动变量存的是字面|不是cȝ实例Q即不是cȝ引用Q这里ƈ没有cȝ存在。如int a = 3; q里的a是一个指向intcd的引用,指向3q个字面倹{这些字面值的数据Q由于大可知,生存期可?q些字面值固定定义在某个E序块里面,E序块退出后Q字D值就消失?Q出于追求速度的原因,存在于栈中?br /> 另外Q栈有一个很重要的特D性,是存在栈中的数据可以共享。假设我们同时定?/p>
int a = 3;
int b = 3Q?/p>
~译器先处理int a = 3Q首先它?x)在栈中创徏一个变量ؓ(f)a的引用,然后查找有没有字面gؓ(f)3的地址Q没扑ֈQ就开辟一个存?q个字面值的地址Q然后将a指向3的地址。接着处理int b = 3Q在创徏完b的引用变量后Q由于在栈中已经?q个字面|便将b直接指向3的地址。这P出Ca与b同时均指?的情c(din)?/p>
特别注意的是Q这U字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了q个对象的内部状态,那么另一个对象引用变量也卛_反映个变化。相反,通过字面值的引用来修改其|不会(x)D另一个指向此字面值的引用的g跟着改变的情c(din)如上例Q我们定义完a?b的值后Q再令a=4Q那么,b不会(x){于4Q还是等?。在~译器内部,遇到a=4Q时Q它?yu)׃?x)重新搜烦栈中是否?的字面|如果没有Q重新开辟地址存放4的|如果已经有了Q则直接a指向q个地址。因此a值的改变不会(x)影响到b的倹{?/p>
另一U是包装cL据,如Integer, String, Double{将相应的基本数据类型包装v来的cR这些类数据全部存在于堆中,Java用new()语句来显C地告诉~译器,在运行时才根据需要动态创建,因此比较灉|Q但~点是要占用更多的时间?/p>
4. String是一个特D的包装cL据。即可以用String str = new String("abc");的Ş式来创徏Q也可以用String str = "abc"Q的形式来创?作ؓ(f)Ҏ(gu)Q在JDK 5.0之前Q你从未见过Integer i = 3;的表辑ּQ因为类与字面值是不能通用的,除了String。而在JDK 5.0中,q种表达式是可以的!因ؓ(f)~译器在后台q行Integer i = new Integer(3)的{?。前者是规范的类的创E,卛_Java中,一切都是对象,而对象是cȝ实例Q全部通过new()的Ş式来创徏。Java 中的有些c,如DateFormatc,可以通过该类的getInstance()Ҏ(gu)来返回一个新创徏的类Q似乎违反了此原则。其实不然。该c运用了单例模式来返回类的实例,只不q这个实例是在该cd部通过new()来创建的Q而getInstance()向外部隐藏了此细节。那Z么在String str = "abc"Q中Qƈ没有通过new()来创建实例,是不是违反了上述原则Q其实没有?/p>
5. 关于String str = "abc"的内部工作。Java内部此语句转化Z下几个步骤:(x)
(1)先定义一个名为str的对Stringcȝ对象引用变量QString strQ?br /> (2)在栈中查找有没有存放gؓ(f)"abc"的地址Q如果没有,则开辟一个存攑֭面gؓ(f)"abc"的地址Q接着创徏一个新的Stringcȝ对象oQƈo 的字W串值指向这个地址Q而且在栈中这个地址旁边Cq个引用的对象o。如果已l有了gؓ(f)"abc"的地址Q则查找对象oQƈq回o的地址?br /> (3)str指向对象o的地址?br /> 值得注意的是Q一般StringcM字符串值都是直接存值的。但像String str = "abc"Q这U场合下Q其字符串值却是保存了一个指向存在栈中数据的引用Q?br />
Z更好地说明这个问题,我们可以通过以下的几个代码进行验证?/p>
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
注意Q我们这里ƈ不用str1.equals(str2)Q的方式Q因比较两个字W串的值是否相{?=PҎ(gu)JDK的说明,只有在两个引用都指向了同一个对象时才返回真倹{而我们在q里要看的是Qstr1与str2是否都指向了同一个对象?br /> l果说明QJVM创徏了两个引用str1和str2Q但只创Z一个对象,而且两个引用都指向了q个对象?/p>
我们再来更进一步,以上代码改成:(x)
String str1 = "abc";
String str2 = "abc";
str1 = "bcd";
System.out.println(str1 + "," + str2); //bcd, abc
System.out.println(str1==str2); //false
q就是说Q赋值的变化D了类对象引用的变化,str1指向了另外一个新对象Q而str2仍旧指向原来的对象。上例中Q当我们str1的值改?bcd"ӞJVM发现在栈中没有存放该值的地址Q便开辟了q个地址Qƈ创徏了一个新的对象,其字W串的值指向这个地址?br /> 事实上,Stringc被设计成ؓ(f)不可改变(immutable)的类。如果你要改变其|可以Q但JVM在运行时Ҏ(gu)新值?zhn)?zhn)创Z一个新对象Q然后将q个对象的地址q回l原来类的引用。这个创E虽说是完全自动q行的,但它毕竟占用了更多的旉。在Ҏ(gu)间要求比较敏感的环境中,?x)带有一定的不良影响?/p>
再修改原来代码:(x)
String str1 = "abc";
String str2 = "abc";
str1 = "bcd";
String str3 = str1;
System.out.println(str3); //bcd
String str4 = "bcd";
System.out.println(str1 == str4); //true
str3 q个对象的引用直接指向str1所指向的对?注意Qstr3q没有创建新对象)。当str1改完其值后Q再创徏一个String的引用str4Qƈ指向因str1修改D创建的新的对象。可以发玎ͼq回str4也没有创建新的对象,从而再ơ实现栈中数据的׃n?/p>
我们再接着看以下的代码?/p>
String str1 = new String("abc");
String str2 = "abc";
System.out.println(str1==str2); //false
创徏了两个引用。创Z两个对象。两个引用分别指向不同的两个对象?/p>
String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1==str2); //false
创徏了两个引用。创Z两个对象。两个引用分别指向不同的两个对象?/p>
以上两段代码说明Q只要是用new()来新建对象的Q都?x)在堆中创徏Q而且其字W串是单独存值的Q即使与栈中的数据相同,也不?x)与栈中的数据共享?/p>
6. 数据cd包装cȝg可修攏V不仅仅是Stringcȝg可修改,所有的数据cd包装c都不能更改其内部的倹{?/p>
7. l论与徏议:(x)
(1)我们在用诸如String str = "abc"Q的格式定义cLQL惛_然地认ؓ(f)Q我们创ZStringcȝ对象str。担心陷阱!对象可能q没有被创徏Q唯一可以肯定的是Q指?Stringcȝ引用被创Z。至于这个引用到底是否指向了一个新的对象,必须Ҏ(gu)上下文来考虑Q除非你通过new()Ҏ(gu)来显要地创徏一个新的对象。因此,更ؓ(f)准确的说法是Q我们创Z一个指向Stringcȝ对象的引用变量strQ这个对象引用变量指向了某个gؓ(f)"abc"的StringcR清醒地认识到这一点对排除E序中难以发现的bug是很有帮助的?/p>
(2)使用String str = "abc"Q的方式Q可以在一定程度上提高E序的运行速度Q因为JVM?x)自动根据栈中数据的实际情况来决定是否有必要创徏新对象。而对于String str = new String("abc")Q的代码Q则一概在堆中创徏新对象,而不其字符串值是否相{,是否有必要创建新对象Q从而加重了E序的负担。这个思想应该是n元模式的思想Q但JDK的内部在q里实现是否应用了这个模式,不得而知?/p>
(3)当比较包装类里面的数值是否相{时Q用equals()Ҏ(gu)Q当试两个包装cȝ引用是否指向同一个对象时Q用==?/p>
(4)׃Stringcȝimmutable性质Q当String变量需要经常变换其值时Q应该考虑使用StringBufferc,以提高程序效率?br />
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=561129
|
|
|
|
|
|
在读我自q认识之前
,
我们先来看一?/span>
servet
的结构图
:
以下是我自己的一Ҏ(gu)见:(x)
① Servlet 在初始化的时?/span> , 是通过 init(ServletConfig config) ?/span> init() 来执行的?/span>
ServletConfig 是一个接口,它怎样传递给他一格对象来q行初始化呢Q其实,是这个对象是?/span> servlet 容器来实例化的,由容器生一?/span> ServletConfig 的实现类的对象,然后传递给 Servlet
l论Q?/span> ServletConfig 由容器实例化
② 我们有些时候可能在 Servlet 初始化时l它一些固定的配置参数Q那么这些参数是怎样传递到 Servlet 呢?
其实Q我们在 web.xml 中给 servlet 配置启动参数Q在容器?/span> servlet q行初始化的时候,?x)收集你所配置的参敎ͼ记录?/span> ServletConfig 的实现类中,所以你才可以通过 ServletConfig 对象?/span>
public String getInitParameter(String name); ?/span>
public Enumeration getInitParameterNames();
Ҏ(gu)来取得你已经配置好的参数Q也是_(d)你对 servlet 的配|都已经记录?/span> ServletConfig 对象中了?/span>
l论Q你?/span> Servlet 的配|,?/span> Servlet 的初始化旉由容器来攉q且记录?/span> ServletConfig 的实现类中?/span>
③ 我们来看一?/span> Servlet 的配|?/span>
<servlet>
<servlet-name>index</servlet-name>
<servlet-class>org.zy.pro.sw.servlet.IndexServlet</servlet-class>
<init-param>
<param-name>dbconfig</param-name>
<param-value>/WEB-INF/dbconfig.xml</param-value>
</init-param>
</servlet>
在此Q我们实现对数据库的配置文g的加载?/span>
?/span> Servlet 初始化完成后Q我们可以通过
String dbconf=this.getServletConfig().getInitParameter("dbconfig")
来取得我们的配置的参数的倹{?/span>
但是Q我们仅能得C个配|的字符丌Ӏ之后我们可以通过配置文g取得我们的数据库的配|参敎ͼ然后Ҏ(gu)据库q行初始化?/span>
其实我们也可以通过传递一个类的名字串Q然后再实例化?/span>
<init-param>
<param-name>dbconfig</param-name>
<param-value>org.zy.util.db.DBUtil</param-value>
</init-param>
我们先取得配|参敎ͼ(x)
String dbconf=this.getServletConfig().getInitParameter("dbconfig") Q?/span>
然后通过
Class.forName(dbconf).getInstance();
来实例化对象Q就可以实现Ҏ(gu)据库的调用了?/span>
l论Q在 web.xml 中对 Servlet 的初始化Q只能传递字W串cd的数?/span>
④ ServletContext
ServletContext 是负责和 Servlet 的上文和下文交互Q上面和 Servlet 容器交互Q下面和 Servlet 中的h和相应进行交互?/span>
?/span> ServletConfig 中,
public ServletContext getServletContext(); Ҏ(gu)实现取得当前 ServletContext 的对象?/span>
你可能要问, ServletContext 是一个接口,那么你如何取得他的对象呢Q?/span>
其实q个问题?/span> ServletConfig 相同Q都是在 Servlet q行初始化的时候生的对象Q是由容器来初始化的?/span>
<html>
<head>
<title>看看</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<!--media=print q个属性可以在打印时有?->
<style media=print>
.Noprint{display:none;}
.PageNext{page-break-after: always;}
</style>
<style>
.tdp
{
border-bottom: 1 solid #000000;
border-left: 1 solid #000000;
border-right: 0 solid #ffffff;
border-top: 0 solid #ffffff;
}
.tabp
{
border-color: #000000 #000000 #000000 #000000;
border-style: solid;
border-top-width: 2px;
border-right-width: 2px;
border-bottom-width: 1px;
border-left-width: 1px;
}
.NOPRINT {
font-family: "宋体";
font-size: 9pt;
}
</style>
</head>
<body >
<center class="Noprint" >
<p>
<OBJECT id=WebBrowser classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 width=0>
</OBJECT>
<input type=button value=打印 onclick=document.all.WebBrowser.ExecWB(6,1)>
<input type=button value=直接打印 onclick=document.all.WebBrowser.ExecWB(6,6)>
<input type=button value=面讄 onclick=document.all.WebBrowser.ExecWB(8,1)>
</p>
<p> <input type=button value=打印预览 onclick=document.all.WebBrowser.ExecWB(7,1)>
<br/>
</p>
<hr align="center" width="90%" size="1" noshade>
</center>
<table width="90%" border="0" align="center" cellpadding="2" cellspacing="0" class="tabp">
<tr>
<td colspan="3" class="tdp">W??lt;/td>
</tr>
<tr>
<td width="29%" class="tdp"> </td>
<td width="28%" class="tdp"> </td>
<td width="43%" class="tdp"> </td>
</tr>
<tr>
<td colspan="3" class="tdp"> </td>
</tr>
<tr>
<td colspan="3" class="tdp"><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="50%" class="tdp"><p>q样的报?lt;/p>
<p>对一般的要求够了?lt;/p></td>
<td> </td>
</tr>
</table></td>
</tr>
</table>
<hr align="center" width="90%" size="1" noshade class="NOPRINT" >
<!--分页-->
<div class="PageNext"></div>
<table width="90%" border="0" align="center" cellpadding="2" cellspacing="0" class="tabp">
<tr>
<td class="tdp">W??lt;/td>
</tr>
<tr>
<td class="tdp">看到分页了吧</td>
</tr>
<tr>
<td class="tdp"> </td>
</tr>
<tr>
<td class="tdp"> </td>
</tr>
<tr>
<td class="tdp"><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="50%" class="tdp"><p>q样的报?lt;/p>
<p>对一般的要求够了?lt;/p></td>
<td> </td>
</tr>
</table></td>
</tr>
</table>
</body>
</html>