??xml version="1.0" encoding="utf-8" standalone="yes"?>
U呼
Functions
标签库ؓ(f)标签库,倒不如称呼其为函数库来得更容易理解些。因?/span>
Functions
标签库ƈ没有提供传统的标{来?/span>
JSP
面?nobr>工作服务Q而是被用?/span>
EL
表达式语句中。在
JSP2.0
规范下出现的
Functions
标签库ؓ(f)
EL
表达式语句提供了(jin)许多更ؓ(f)有用的功能?/span>
Functions
标签库分Z大类Q共
16
个函数?/span>
q (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
长度函数Q?/span>
fn:length
q (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
字符串处理函敎ͼ(x)
fn:contains
?/span>
fn:containsIgnoreCase
?/span>
fn:endsWith
?/span>
fn:escapeXml
?/span>
fn:indexOf
?/span>
fn:join
?/span>
fn:replace
?/span>
fn:split
?/span>
fn:startsWith
?/span>
fn:substring
?/span>
fn:substringAfter
?/span>
fn:substringBefore
?/span>
fn:toLowerCase
?/span>
fn:toUpperCase
?/span>
fn:trim
以下是各个函数的用途和属性以?qing)简单示例?/span>
长度函数
fn:length
的出现有重要的意义。在
JSTL1.0
中,有一个功能被忽略?jin),那就是对集合的长度取倹{虽?/span>
java.util.Collection
接口定义?/span>
size
Ҏ(gu)Q但是该Ҏ(gu)不是一个标准的
JavaBean
属性方法(没有
get,set
Ҏ(gu)Q,因此Q无法通过
EL
表达式?/span>
${collection.size}
”来L取得?/span>
fn:length
函数正是Z(jin)解决q个问题而被
<%ArrayList arrayList1 = new ArrayList();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) arrayList1.add("aa");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) arrayList1.add("bb");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) arrayList1.add("cc");
%>
<%request.getSession().setAttribute("arrayList1", arrayList1);%>
${fn:length(sessionScope.arrayList1)}
假设一?/span>
ArrayList
cd的实例?/span>
arrayList1
”,qؓ(f)其添加三个字W串对象Q?/span>
fn:length
函数后就可以取得q回l果为?/span>
3
”?/span>
fn:contains
函数用来判断源字W串是否包含子字W串。它包括
string
?/span>
substring
两个参数Q它们都?/span>
String
cdQ分布表C源字符串和子字W串。其q回l果Z?/span>
boolean
cd的倹{下面看一个示例?/span>
${fn:contains("ABC", "a")}<br>
${fn:contains("ABC", "A")}<br>
前者返回?/span>
false
”,后者返回?/span>
true
”?/span>
fn:containsIgnoreCase
函数?/span>
fn:contains
函数的功能差不多Q唯一的区别是
fn:containsIgnoreCase
函数对于子字W串的包含比较将忽略大小写。它?/span>
fn:contains
函数相同Q包?/span>
string
?/span>
substring
两个参数Qƈq回一?/span>
boolean
cd的倹{下面看一个示例?/span>
${fn:containsIgnoreCase("ABC", "a")}<br>
${fn:containsIgnoreCase("ABC", "A")}<br>
前者和后者都?x)返回?/span>
true
”?/span>
fn:startsWith
函数用来判断源字W串是否W合一q串的特定词头。它除了(jin)包含一?/span>
string
参数外,q包含一?/span>
subffx
参数Q表C头字W串Q同h
String
cd。该函数q回一?/span>
boolean
cd的倹{下面看一个示例?/span>
${fn:startsWith ("ABC", "ab")}<br>
${fn:startsWith ("ABC", "AB")}<br>
前者返回?/span>
false
”,后者返回?/span>
true
”?/span>
fn:endsWith
函数用来判断源字W串是否W合一q串的特定词。它?/span>
fn:startsWith
函数相同Q包?/span>
string
?/span>
subffx
两个参数Qƈq回一?/span>
boolean
cd的倹{下面看一个示例?/span>
${fn:endsWith("ABC", "bc")}<br>
${fn:endsWith("ABC", "BC")}<br>
前者返回?/span>
false
”,后者返回?/span>
true
”?/span>
fn:escapeXml
函数用于所有特D字W{化ؓ(f)字符实体码。它只包含一?/span>
string
参数Q返回一?/span>
String
cd的倹{?/span>
fn:indexOf
函数用于取得子字W串与源字符串匹配的开始位|,若子字符串与源字W串中的内容没有匚w成功返回?/span>
-1
”。它包括
string
?/span>
substring
两个参数Q返回结果ؓ(f)
int
cd。下面看一个示例?/span>
${fn:indexOf("ABCD","aBC")}<br>
${fn:indexOf("ABCD","BC")}<br>
前者由于没有匹配成功,所以返?/span>
-1
Q后者匹配成功将q回位置的下标,?/span>
1
?/span>
fn:join
函数允许Z个字W串数组中的每一个字W串加上分隔W,q连接v来。它的参数、返回结果和描述如表
9.25
所C:(x)
?/span>
9.25
fn:join
函数
参数
描述
array
字符串数l。其cd必须?/span>
String[]
cd
separator
分隔W。其cd必须?/span>
String
cd
q回l果
q回一?/span>
String
cd的?/span>
下面看一个示例?/span>
<% String[] stringArray = {"a","b","c"}; %>
<%request.getSession().setAttribute("stringArray", stringArray);%>
${fn:join(sessionScope.stringArray,";")}<br>
定义数组q放|到
Session
中,然后通过
Session
得到该字W串数组Q?/span>
fn:join
函数q传入分隔符?/span>
;
”,得到的结果ؓ(f)?/span>
a;b;c
”?/span>
fn:replace
函数允许为源字符串做替换的工作。它的参数、返回结果和描述如表
9.26
所C:(x)
?/span>
9.26
fn:replace
函数
参数
描述
inputString
源字W串。其cd必须?/span>
String
cd
beforeSubstring
指定被替换字W串。其cd必须?/span>
String
cd
afterSubstring
指定替换字符丌Ӏ其cd必须?/span>
String
cd
q回l果
q回一?/span>
String
cd的?/span>
下面看一个示例?/span>
${fn:replace("ABC","A","B")}<br>
?/span>
ABC
”字W串替换为?/span>
BBC
”,在?/span>
ABC
”字W串中用?/span>
B
”替换了(jin)?/span>
A
”?/span>
fn:split
函数用于一l由分隔W分隔的字符串{换成字符串数l。它的参数、返回结果和描述如表
9.27
所C:(x)
?/span>
9.27
fn:split
函数
参数
描述
string
源字W串。其cd必须?/span>
String
cd
delimiters
指定分隔W。其cd必须?/span>
String
cd
q回l果
q回一?/span>
String[]
cd的?/span>
下面看一个示例?/span>
${fn:split("A,B,C",",")}<br>
?/span>
A,B,C
”字W串转换为数l?/span>
{A,B,C}
?/span>
fn:substring
函数用于截取字符丌Ӏ它的参数、返回结果和描述如表
9.28
所C:(x)
?/span>
9.28
fn:substring
函数
参数
描述
string
源字W串。其cd必须?/span>
String
cd
beginIndex
指定起始下标Qg
0
开始)(j)。其cd必须?/span>
int
cd
endIndex
指定l束下标Qg
0
开始)(j)。其cd必须?/span>
int
cd
q回l果
q回一?/span>
String
cd的?/span>
下面看一个示例?/span>
${fn:substring("ABC","1","2")}<br>
fn:substringBefore
函数允许截取源字W从开始到某个字符丌Ӏ它的参数和
fn:substringAfter
函数相同Q不同的?/span>
substring
表示的是l束字符丌Ӏ下面看一个示例?/span>
${fn:substringBefore("ABCD","BC")}<br>
截取的结果ؓ(f)?/span>
A
”?/span>
fn:toLowerCase
函数允许源字符串中的字W全部{换成写字符。它只有一个表C源字符串的参数
string
Q函数返回一?/span>
String
cd的倹{下面看一个示例?/span>
${fn:toLowerCase("ABCD")}<br>
转换的结果ؓ(f)?/span>
abcd
”?/span>
fn:toUpperCase
函数允许源字符串中的字W全部{换成大写字符。它?/span>
fn:toLowerCase
函数相同Q也只有一?/span>
String
参数Qƈq回一?/span>
String
cd的倹{下面看一个示例?/span>
${fn:toUpperCase("abcd")}<br>
转换的结果ؓ(f)?/span>
ABCD
”?/span>
fn:trim
函数删除源字符串中l尾部分的“空格”以产生一个新的字W串。它?/span>
fn:toLowerCase
函数相同Q只有一?/span>
String
参数Qƈq回一?/span>
String
cd的倹{下面看一个示例?/span>
${fn:trim("AB C (tng)")}D<br>
转换的结果ؓ(f)?/span>
AB CD
”,注意Q它?yu)只删除词尾的空D不是全部,因此?/span>
B
”和?/span>
C
”之间仍然留有一个空根{?/span>
看到
I18N
应该想到知识“国际化”,
I18N formatting
标签库就是用于在
JSP
面中做国际化的动作。在该标{ֺ中的标签一共有
12
个,被分Z(jin)两类Q分别是Q?/span>
q (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
国际化核?j)标{:(x)
<fmt:setLocale>
?/span>
<fmt:bundle>
?/span>
<fmt:setBundle>
?/span>
<fmt:message>
?/span>
<fmt:param>
?/span>
<fmt:requestEncoding>
?/span>
q (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
格式化标{:(x)
<fmt:timeZone>
?/span>
<fmt:setTimeZone>
?/span>
<fmt:formatNumber>
?/span>
<fmt:parseNumber>
?/span>
<fmt:formatDate>
?/span>
<fmt:parseDate>
?/span>
下面只选择其中常见的一些标{֒属性进行介l?/span>
<fmt:setLocale>
标签用于讄
Locale
环境。它的属性和描述如表
9.17
所C:(x)
?/span>
9.17
<fmt:setLocale>
标签属性和说明
属?/span>
描述
value
Locale
环境的指定,可以?/span>
java.util.Locale
?/span>
String
cd的实?/span>
scope
Locale
环境变量的作用范_(d)可选)(j)
下面看一个示例:(x)
<fmt:setLocale value="zh_TW"/>
表示讄本地环境为繁体中文?/span>
q两l标{于资源配|文件的l定Q唯一不同的是
<fmt:bundle>
标签资源配|文件绑定于它标{体中的昄Q?/span>
<fmt:setBundle>
标签则允许将资源配置文g保存?sh)Z个变量,在之后的
Ҏ(gu)
Locale
环境的不同将查找不同后缀的资源配|文Ӟq点在国际化的Q何技术上都是一致的Q通常来说Q这两种标签单独使用是没有意义的Q它们都?x)?/span>
I18N formatting
标签库中的其他标{N合用。它们的属性和描述如表
9.18
所C:(x)
?/span>
9.18
<fmt:bundle>
?/span>
<fmt:setBundle>
标签属性和说明
属?/span>
描述
basename
资源配置文g的指定,只需要指定文件名而无L展名Q二l标{օ有的属?/span>
var
<fmt:setBundle>
独有的属性,用于保存资源配置文gZ个变?/span>
scope
变量的作用范?/span>
下面看一个示?/span>
<fmt:setLocale value="zh_CN"/>
<fmt:setBundle basename="applicationMessage" var="applicationBundle"/>
该示例将?x)查找一个名?/span>
applicationMessage_zh_CN.properties
的资源配|文Ӟ来作为显C的
Resource
l定?/span>
用于信息昄的标{,显C源配|文件中定义的信息。它的属性和描述如表
9.19
所C:(x)
?/span>
9.19
<fmt:message>
标签属性和说明
属?/span>
描述
key
资源配置文g的“键”指?/span>
bundle
若?/span>
<fmt:setBundle>
保存?sh)(jin)资源配|文Ӟ该属性就可以从保存的资源配置文g中进行查?/span>
var
显CZ息保存(sh)ؓ(f)一个变?/span>
scope
变量的作用范?/span>
下面看一个示例:(x)
<fmt:setBundle basename="applicationMessage" var="applicationBundle"/>
<fmt:bundle basename="applicationAllMessage">
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <fmt:message key="userName" />
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <p>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <fmt:message key="passWord" bundle="${applicationBundle}" />
</fmt:bundle>
该示例用了(jin)两种资源配置文g的绑定的做法Q?/span>
applicationMessage
”资源配|文件利?/span>
<fmt:setBundle>
标签被赋于了(jin)变量?/span>
applicationBundle
”,而作?/span>
<fmt:bundle>
标签定义的?/span>
applicationAllMessage
”资源配|文件作用于其标{体内的昄?/span>
q (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
W一?/span>
<fmt:message>
标签用?/span>
applicationAllMessage
”资源配|文件中“键”ؓ(f)?/span>
userName
”的信息昄?/span>
q (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
W二?/span>
<fmt:message>
标签虽然被定义在
<fmt:bundle>
标签体内Q但是它使用?/span>
bundle
属性,因此指定之前由
<fmt:setBundle>
标签保存的?/span>
applicationMessage
”资源配|文Ӟ该“键”ؓ(f)?/span>
passWord
”的信息昄?/span>
<fmt:param>
标签应该位于
<fmt:message>
标签内,ؓ(f)该消息标{提供参数倹{它只有一个属?/span>
value
?/span>
<fmt:param>
标签有两U用版本,一U是直接参数值写?/span>
value
属性中Q另一U是参数值写在标{体内?/span>
<fmt:requestEncoding>
标签用于求设|字W编码。它只有一个属?/span>
value
Q在该属性中可以定义字符~码?/span>
q两l标{N用于讑֮一个时区。唯一不同的是
<fmt:timeZone>
标签得在其标{体内的工作可以使用该时|,
<fmt:setBundle>
标签则允许将时区讄保存?sh)Z个变量,在之后的工作可以Ҏ(gu)该变量来q行。它们的属性和描述如表
9.20
所C:(x)
?/span>
9.20
<fmt:timeZone>
?/span>
<fmt:setTimeZone>
标签
属性和说明
属?/span>
描述
value
时区的设|?/span>
var
<fmt:setTimeZone>
独有的属性,用于保存时区Z个变?/span>
scope
变量的作用范?/span>
<fmt:
formatNumber
>
?/span>
{于格式化数字。它的属性和描述如表
9.21
所C:(x)
?/span>
9.21
<fmt:formatNumber>
标签属性和说明
属?/span>
描述
value
格式化的数字Q该数值可以是
String
cd?/span>
java.lang.Number
cd的实?/span>
type
格式化的cd
pattern
格式化模?/span>
var
l果保存变量
scope
变量的作用范?/span>
maxIntegerDigits
指定格式化结果的最大?/span>
minIntegerDigits
指定格式化结果的最?/span>
maxFractionDigits
指定格式化结果的最大|带小?/span>
minFractionDigits
指定格式化结果的最|带小?/span>
<fmt:formatNumber>
标签实际是对?/span>
java.util.NumberFormat
c,
type
属性的可能值包?/span>
currency
Q货币)(j)?/span>
number
Q数字)(j)?/span>
percent
Q百分比Q?/span>
下面看一个示例?/span>
<fmt:formatNumber value="1000.888" type="currency" var="money"/>
<fmt:parseNumber>
标签用于解析一个数字,q将l果作ؓ(f)
java.lang.Number
cȝ实例q回?/span>
<fmt:parseNumber>
标签看v来和
<fmt:formatNumber>
标签的作用正好相反。它的属性和描述如表
9.22
所C:(x)
?/span>
9.22
<fmt:parseNumber>
标签属性和说明
属?/span>
描述
value
被解析的字W串
type
解析格式化的cd
pattern
解析格式化模?/span>
var
l果保存变量Q类型ؓ(f)
java.lang.Number
scope
变量的作用范?/span>
parseLocale
以本地化的Ş式来解析字符Ԍ该属性的内容应ؓ(f)
String
?/span>
java.util.Locale
cd的实?/span>
下面看一个示例?/span>
<fmt:parseNumber value="15%" type="percent" var="num"/>
解析之后的结果ؓ(f)?/span>
0.15
”?/span>
<fmt:formatDate>
标签用于格式化日期。它的属性和描述如表
9.23
所C:(x)
?/span>
9.23
<fmt:formatDate>
标签属性和说明
属?/span>
描述
value
格式化的日期Q该属性的内容应该?/span>
java.util.Date
cd的实?/span>
type
格式化的cd
pattern
格式化模?/span>
var
l果保存变量
scope
变量的作用范?/span>
timeZone
指定格式化日期的时区
<fmt:formatDate>
标签?/span>
<fmt:timeZone>
?/span>
<fmt:setTimeZone>
两组标签的关pd切。若没有指定
timeZone属性,
也可以通过
<fmt:timeZone>
?/span>
<fmt:setTimeZone>
两组标签讑֮的时区来格式化最后的l果?/span>
<fmt:parseDate>
标签用于解析一个日期,q将l果作ؓ(f)
java.lang.Date
cd的实例返回?/span>
<fmt:parseDate>
标签看v来和
<fmt:formatDate>
标签的作用正好相反。它的属性和描述如表
9.24
所C:(x)
?/span>
9.24
<fmt:parseDate>
标签属性和说明
属?/span>
描述
value
被解析的字W串
type
解析格式化的cd
pattern
解析格式化模?/span>
var
l果保存变量Q类型ؓ(f)
java.lang.Date
scope
变量的作用范?/span>
parseLocale
以本地化的Ş式来解析字符Ԍ该属性的内容?/span>
String
?/span>
java.util.Locale
cd的实?/span>
timeZone
指定解析格式化日期的时区
<fmt:parseNumber>
?/span>
<fmt:parseDate>
两组标签都实现解析字W串Z个具体对象实例的工作Q因此,q两l解析标{֯
var
属性的字符串参数要求非怸根{就
JSP
面的表C层前段来说Q处理这U解析本不属于䆾内之事,因此
<fmt:parseNumber>
?/span>
<fmt:parseDate>
两组标签应该量用Q替代工作的地方应该在服务器端表C层的后D,比如?/span>
Servlet
中?/span>
]]>
]]>
9.7.1 (tng)
长度函数
fn:length
函数
9.7.2 (tng)
判断函数
fn:contains
函数
9.7.3 (tng)fn:containsIgnoreCase
函数
9.7.4 (tng)
词头判断函数
fn:startsWith
函数
9.7.5 (tng)
词尾判断函数
fn:endsWith
函数
9.7.6 (tng)
字符实体转换函数
fn:escapeXml
函数
9.7.8 (tng)
字符匚w函数
fn:indexOf
函数
9.7.9 (tng)
分隔W函?/span>
fn:join
函数
9.7.10 (tng)
替换函数
fn:replace
函数
9.7.11 (tng)
分隔W{换数l函?/span>
fn:split
函数
9.7.12 (tng)
字符串截取函?/span>
fn:substring
函数
9.7.14 (tng)
起始到定位截取字W串函数
fn:substringBefore
函数
9.7.15 (tng)
写转换函数
fn:toLowerCase
函数
9.7.16
大写转换函数
fn:toUpperCase
函数
9.7.17
I格删除函数
fn:trim
函数
]]>
9.5.1 (tng)
用于讄本地化环境的
<fmt:setLocale>
标签
9.5.2 (tng)
用于资源文gl定?/span>
<fmt:bundle>
?/span>
<fmt:setBundle>
标签
9.5.3 (tng)
用于昄资源配置文g信息?/span>
<fmt:message>
标签
9.5.4 (tng)
用于参数传递的
<fmt:param>
标签
9.5.6 (tng)
用于求设|字W编码的
<fmt:requestEncoding>
标签
9.5.7 (tng)
用于讑֮时区?/span>
<fmt:timeZone>
?/span>
<fmt:setTimeZone>
标签
9.5.8 (tng)
用于格式化数字的
<fmt:formatNumber>
标签
9.5.9 (tng)
用于解析数字?/span>
<fmt:parseNumber>
标签
9.5.10 (tng)
用于格式化日期的
<fmt:formatDate>
标签
9.5.11 (tng)
用于解析日期?/span>
<fmt:parseDate>
标签
]]>
]]>
]]>
]]>
]]>
个根据表单数据在client端用js生成excle的demoQo(h)我我Ȁ动了(jin)半天------js太强?jin)?br />
下面分n一下这DjsQ?
(tng)
var (tng)excel (tng) (tng)= (tng)new (tng)ActiveXObject("Excel.Application"); (tng)//创徏AX对象excel
(tng)2excel.visible (tng)=true; (tng)//讄excel可见属?/span>
(tng)3var (tng)workbook (tng)= (tng)excel.Workbooks.Add; (tng)//获取workbook对象
(tng)4var (tng)sheet1 (tng)= (tng)xlBook.Worksheets(2); (tng) (tng)//创徏sheet1
(tng)5var (tng)sheet2 (tng)= (tng)xlBook.Worksheets(1); (tng) (tng)//创徏sheet2
(tng)6sheet1.Range(sheet1.Cells(1,1),sheet1.Cells(1,14)).mergecells=true; (tng)//合ƈ单元?/span>
(tng)7sheet1.Range(sheet1.Cells(1,1),sheet1.Cells(1,14)).value="员工月考核成W"; (tng)//讄单元格内?/span>
(tng)8sheet1.Range(sheet1.Cells(1,1),sheet1.Cells(1,14)).Interior.ColorIndex=6;//讄底色 (tng)
(tng)9sheet1.Range(sheet1.Cells(1,1),sheet1.Cells(1,14)).Font.ColorIndex=5;//讄字体色?/span>
10sheet1.Rows(1).RowHeight (tng)= (tng)20; (tng)//讄列高
11sheet1.Rows(1).Font.Size=16; (tng) (tng)//讄文字大小
12sheet1.Rows(1).Font.Name="宋体"; (tng)//讄字体
13//讄每一列的标题
14sheet1.Cells(2,1).Value="工程师考核?/span>";
15sheet1.Cells(2,2).Value="d";
16sheet1.Cells(2,3).Value="研发q度";
17sheet1.Cells(2,4).Value="出勤?/span>";
18sheet1.Cells(2,5).Value="执行?/span>";
19sheet1.Cells(2,6).Value="责Q?/span>";
20sheet1.Cells(2,7).Value="工作规范";
21sheet1.Cells(2,8).Value="协作_";
22sheet1.Cells(2,9).Value="q取?/span>";
23sheet1.Cells(2,10).Value="工作合理?/span>";
24sheet1.Cells(2,11).Value="解决问题能力";
25sheet1.Cells(2,12).Value="应变能力";
26sheet1.Cells(2,13).Value="人际技?/span>";
27sheet1.Cells(2,14).Value="理解能力";
28//从表单@环控件中取出数据逐行插入对应列的数据
29var (tng)count (tng)= (tng)sfform.GetAttributeValue('Repeat','Count');
30for(var (tng)line=1;line<=count;line++)
{ (tng)//begin (tng)for
31 (tng) (tng)var (tng)name (tng) (tng)= (tng)sfform.GetValue('Repeat['+line+'].name');
32 (tng) (tng)var (tng)total= (tng)sfform.GetValue('Repeat['+line+'].total');
33 (tng) (tng)var (tng)yfjd (tng)= (tng)sfform.GetValue('Repeat['+line+'].yfjd');
34 (tng) (tng)var (tng)jh (tng)= (tng)sfform.GetValue('Repeat['+line+'].jh');
35 (tng) (tng)var (tng)gcgj (tng)= (tng)sfform.GetValue('Repeat['+line+'].gcgj');
36 (tng) (tng)var (tng)cql (tng)= (tng)sfform.GetValue('Repeat['+line+'].cql');
37 (tng) (tng)var (tng)zxl (tng)= (tng)sfform.GetValue('Repeat['+line+'].zxl');
38 (tng) (tng)var (tng)gzgf (tng)= (tng)sfform.GetValue('Repeat['+line+'].gzgf');
39 (tng) (tng)var (tng)zrx (tng)= (tng)sfform.GetValue('Repeat['+line+'].zrx');
40 (tng) (tng)var (tng)xzjs (tng)= (tng)sfform.GetValue('Repeat['+line+'].xzjs');
41 (tng) (tng)var (tng)jqx (tng)= (tng)sfform.GetValue('Repeat['+line+'].jqx');
42 (tng) (tng)var (tng)gzhl (tng)= (tng)sfform.GetValue('Repeat['+line+'].gzh');
43 (tng) (tng)var (tng)jjwt (tng)= (tng)sfform.GetValue('Repeat['+line+'].jjwt');
44 (tng) (tng)var (tng)ybnl (tng)= (tng)sfform.GetValue('Repeat['+line+'].ybnl');
45 (tng) (tng)var (tng)rjjn (tng)= (tng)sfform.GetValue('Repeat['+line+'].rjjn');
46 (tng) (tng)var (tng)ljnl (tng)= (tng)sfform.GetValue('Repeat['+line+'].ljnl');
47 (tng) (tng)sheet1.Cells(2+line,1).Value=name;
48 (tng) (tng)sheet1.Cells(2+line,2).Value=total;
49 (tng) (tng)sheet1.Cells(2+line,3).Value=yfjd;
50 (tng) (tng)sheet1.Cells(2+line,4).Value=cql;
51 (tng) (tng)sheet1.Cells(2+line,5).Value=zxl;
52 (tng) (tng)sheet1.Cells(2+line,6).Value=gzgf;
53 (tng) (tng)sheet1.Cells(2+line,7).Value=zrx;
54 (tng) (tng)sheet1.Cells(2+line,8).Value=xzjs;
55 (tng) (tng)sheet1.Cells(2+line,9).Value=jqx;
56 (tng) (tng)sheet1.Cells(2+line,10).Value=gzhl;
57 (tng) (tng)sheet1.Cells(2+line,11).Value=jjwt;
58 (tng) (tng)sheet1.Cells(2+line,12).Value=ybnl;
59 (tng) (tng)sheet1.Cells(2+line,13).Value=rjjn;
60 (tng) (tng)sheet1.Cells(2+line,14).Value=ljnl;
61
62}//end (tng)for
63
64
基本的代码已l实C(jin)Q生成excel的格式和一些统计计,用js写应该是很方便的Q以后有例子再作补充?br />
从代码角度来看这U写法不是很灉|Q但在能满用户的需求前提下Q这U生成方式还是很受欢q的Q给用户的感觉就是轻
ѝ个为简单就是美Q?
]]>
package SessionCount;e?
import javax.servlet.*; L9k0
import javax.servlet.http.*; plT
import java.io.*; w;
import java.util.*; JC;@
©辑ֆU技论坛 -- 辑ֆU技论坛 @b!Q5
public class SessionCounter extends HttpServlet (tng)implements HttpSessionListener { 2#
private static final String CONTENT_TYPE = "text/html; charset=GBK"; bd35
private static int activeSessions = 1; xZi"Yx
//Initialize global variables +iRX;1
public void init() throws ServletException { n3
©辑ֆU技论坛 -- 辑ֆU技论坛 {Ytdk
} ©辑ֆU技论坛 -- 辑ֆU技论坛 ri04&
©辑ֆU技论坛 -- 辑ֆU技论坛 C
//Process the HTTP Get request @8Ob%
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { zH
(tng) response.setContentType(CONTENT_TYPE); EPjJ
(tng) HttpSession session=request.getSession(); ]g
} ©辑ֆU技论坛 -- 辑ֆU技论坛 )9lR?P
©辑ֆU技论坛 -- 辑ֆU技论坛 !S
//Clean up resources UxUNe
public void destroy() { :=e2NM
} ©辑ֆU技论坛 -- 辑ֆU技论坛 W'F
©辑ֆU技论坛 -- 辑ֆU技论坛 aHW&x9
public void sessionCreated(HttpSessionEvent httpSessionEvent) { HH
(tng) activeSessions++; DyZpv
} ©辑ֆU技论坛 -- 辑ֆU技论坛 4WJ
©辑ֆU技论坛 -- 辑ֆU技论坛 8)#.
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { \s,_t
(tng) activeSessions--; *z
(tng) System.out.println("test test");$s0T@W
// (tng)System.out.println("---111"); ZF+
} ©辑ֆU技论坛 -- 辑ֆU技论坛 MX
public static int getActiveSessions() { tQ
(tng)return activeSessions; )a4
} ©辑ֆU技论坛 -- 辑ֆU技论坛 y%s
} ©辑ֆU技论坛 -- 辑ֆU技论坛 n-=u*
Q/Q/$E
Q/Q/1^[
//count.jsp?
<%@ page import="SessionCount.SessionCounter"%> r-cXS
<%@ page language="java" (tng)contentType="text/html; charset=gb2312"{Z
(tng) (tng)pageEncoding="gb2312"%>~|Q"eP
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">, l
<html>z>
<head>&5)~
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">%G*M?
<title>Insert title here</title>ij7z
</head>$i:
<script language="javascript" type="text/javascript">?.k
<!--#*>}
function MM_callJS(jsStr) { //v2.0mnu)IK
(tng)return eval(jsStr)-A
}©辑ֆU技论坛 -- 辑ֆU技论坛 ]M\-
//-->#}q
</script>rs(
<script language="javascript">Ax%Qs3
function removeline(){Q \@
if(event.clientX<0&&event.clientY<0).45
{©辑ֆU技论坛 -- 辑ֆU技论坛 y!Rw%u
document.write('<iframe width="100" height="100" src="remove.jsp"></iframe><OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 (tng)id=WebBrowser width=0></OBJECT>');Dgo!x
document.all.WebBrowser.ExecWB(45,1);[
}©辑ֆU技论坛 -- 辑ֆU技论坛 ad6+
}©辑ֆU技论坛 -- 辑ֆU技论坛 1`maF
</script>0.
©辑ֆU技论坛 -- 辑ֆU技论坛 9
<body onUnload="MM_callJS('removeline()')">I=QwN
在线Q?lt;%= SessionCounter.getActiveSessions() %> Abd\
</body>.
</html>YZmy
////////////////////////////////6K6(k
///////////////////////////////HoW?y
remove.jspZ{>=
/////©辑ֆU技论坛 -- 辑ֆU技论坛 ]|65(
<%@ page language="java" contentType="text/html; charset=gb2312"!
(tng) (tng)pageEncoding="gb2312"%>4"cD
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">|r<G
<html>8
<head>m.
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">$#9
<title>Insert title here</title>H/hoe0
</head>z_g_
<body>?=9
<%session.invalidate();%>i
</body>-r
</html>Lw;7{.
///////////////////////////}PiE
/////////////////////////////[
web.htmlP&
Q^Q^Q^Q^Q^Q^加上Bz2J
<listener> y+
(tng) <listener-class>SessionCount.SessionCounter</listener-class> q1d{
</listener> h1
if(event.clientX<0&&event.clientY<0)判断览器是关闭q是h Q因为刷C?x)调用onunload&&
©辑ֆU技论坛 -- 辑ֆU技论坛 c07F
document.all.WebBrowser.ExecWB(45,1);是无提示的关闭浏览器!Q!*pf
classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 |0gLI
q个是调用不弹出对话框的Ҏ(gu)Q实际是调用pȝ的方法如?]9M
document.all.WebBrowser.ExecWB(45,1); f:
因ؓ(f)在javascript当中不能调用javaҎ(gu)Q所以选择另外写一个jsp文g用于调用Q?font color="#f3f6fa">;?(5yi
invalidate()Ҏ(gu)Q?font color="#f3f6fa">(?A|`K
©辑ֆU技论坛 -- 辑ֆU技论坛 xv
现在q个l果是正的Q因为我把private static int activeSessions = 1; Q/q里Ҏ(gu)?,本来照理应该设ؓ(f)0的,可以我运行第一ơhttp://localhost:8080/servlet/count.jsp的时候得到的?Q所以我才把它改?的,dKOp0
那们老师或同学知道的话,ȝ(ch)告诉怎么ZQؓ(f)什么在W一ơ创建session时不能触发事件sessionCreated()Rw
现在q个l果是正的Q因为我把private static int activeSessions = 1; Q/q里Ҏ(gu)?,本来照理应该设ؓ(f)0的,可以我运行第一ơhttp://localhost:8080/servlet/count.jsp的时候得到的?Q所以我才把它改?的, h(
Qؓ(f)什么在W一ơ创建session时不能触发事件sessionCreated()g?
session是个双向机制Q第一ơ访问的时候,是从客户端发L(fng)Q浏览器不知道这个网|否需要session,所以浏览器不会(x)创徏sessionId,当这个请求到达服务器的时候,没有sessionId,d}--5
©辑ֆU技论坛 -- 辑ֆU技论坛 r0_/S
SessionCounter 是被嵌在jsp里的Q所以第一ơ显C的时候,得到jsp面的session创徏是在jsp面滞后Q也是说SessionCounter是滞后于jsp面?xKTZrv
©辑ֆU技论坛 -- 辑ֆU技论坛 V@)
Z说一句,extends HttpServlet 是多余的?font color="#f3f6fa">]&
在页面里设|一个退出按钮.调用quit.jsp=
它的内容是:(x)h>
我们用一个quit.jsp来处理用户退出系l的操作Qquit.jsp负责注销sessionQ及(qing)旉放资源?font color="#ffffff">>D6T
©辑ֆU技论坛 -- 辑ֆU技论坛 uj&B
·注销session?font color="#ffffff">Z5K&
©辑ֆU技论坛 -- 辑ֆU技论坛 ##
·关闭览器窗口?font color="#ffffff">@Q(
©辑ֆU技论坛 -- 辑ֆU技论坛 TP^wA
其代码如下所C:(x)"
©辑ֆU技论坛 -- 辑ֆU技论坛 IWeVHc
1. Q?@ page contentType="text/html; charset=GBK" %Q?font color="#ffffff">z
2. Q?E
3. session.invalidate();F"[}H
4. %Q?font color="#ffffff">A
5. Qscript language="javascript" Q?font color="#ffffff">4_
6. window.opener = null;`ngL
7. window.close();M|j%
8. Q?scriptQ?OnZH?
©辑ֆU技论坛 -- 辑ֆU技论坛 3-L-
其中W?行负责注销sessionQ原先放入session的对象将解绑定,{待垃圾回收以释放资源。对于本例而言Qsession中有一个名为ses_userBean的userBean对象Q它是在switch.jsp中放入session的)(j)Q调用session.invalidate()后,userBean从session中解l定Q它的valueUnbound()Ҏ(gu)?x)被触发调用Q然后再{待垃圾回收?font color="#ffffff">A/cr
©辑ֆU技论坛 -- 辑ֆU技论坛 +Nb
W?~8行是一Djavascript脚本E序Q负责关闭窗口,如果|页不是通过脚本E序打开的(window.open()Q,调用window.close()脚本关闭H口前,必须先将window.opener对象|ؓ(f)nullQ如W?行所C,否则览器会(x)弹出一个确定关闭的对话框,W者发现这个问题困C(jin)不少的WebE序员,故特别指出?font color="#ffffff">s `|*)
]]>
<table border oncontextmenu=return(false)><td>no</table> 可用于Table
2. <body onselectstart="return false"> 取消选取、防止复?
3. onpaste="return false" 不准_脓(chung)
4. oncopy="return false;" oncut="return false;" 防止复制
5. <link rel="Shortcut Icon" href="favicon.ico"> IE地址栏前换成自己的图?
6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夹中显C出你的图标
7. <input style="ime-mode:disabled"> 关闭输入?
8. 永远都会(x)带着框架
<script language="JavaScript"><!--
if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网?
// --></script>
9. 防止被hframe
<SCRIPT LANGUAGE=JAVASCRIPT><!-- (tng)
if (top.location != self.location)top.location=self.location;
// --></SCRIPT>
10. |页不能被另存?sh)?
<noscript><iframe src=*.html></iframe></noscript> (tng)
11. <input type=button value=查看|页源代码? 12.删除时确? 13. 取得控g的绝对位|? //VBScript 14. 光标是停在文本框文字的最? 15. 判断上一늚来源 16. 最化、最大化、关闭窗? 17.屏蔽功能键Shift,Alt,Ctrl 18. |页不会(x)被缓? 19.怎样让表单没有凹凸感Q? 1 solid #000000"></textarea> 20.<div><span>&<layer>的区别? (tng) 21.让弹出窗口L在最上面: 22.不要滚动? (tng) 23.怎样L囄链接点击后,囄周围的虚U? 24.?sh)子邮g处理提交表单 25.在打开的子H口h父窗口的代码里如何写Q? 26.如何讑֮打开面的大? 27.在页面中如何加入不是满铺的背景图?拉动面时背景图不动 (tng) 28. (g)查一D字W串是否全由数字l成 29. 获得一个窗口的大小 30. 怎么判断是否是字W? 31.TEXTAREA自适应文字行数的多? 33. 选择?jin)哪一个Radio 34.脚本怸出错 35.ENTER键可以让光标Ud下一个输入框 36. (g)某个网站的链接速度Q? onclick=window.open(this.form.url"+i+".value)><br>") onerror=auto("http://"+autourl+"")>")} 37. 各种样式的光? 38.面q入和退出的Ҏ(gu) 39.在规定时间内跌{ 40.|页是否被检? 41.JAVASCRIPT判断IE是否开启COOKIE
<
script (tng)type
=
"
text/javascript
"
>
(tng) 匚w中文字符的正则表辑ּQ?[\u4e00-\u9fa5]
onclick="window.location = "view-source:"+ "
<a href="javascript:if(confirm("实要删除吗?"))location="boos.asp?&areyou=删除&page=1"">删除</a> (tng)
//Javascript
<script language="Javascript">
function getIE(e){
var t=e.offsetTop;
var l=e.offsetLeft;
while(e=e.offsetParent){
t+=e.offsetTop;
l+=e.offsetLeft;
}
alert("top="+t+"/nleft="+l);
}
</script>
<script language="VBScript"><!--
function getIE()
dim t,l,a,b
set a=document.all.img1
t=document.all.img1.offsetTop
l=document.all.img1.offsetLeft
while a.tagName<>"BODY"
set a = a.offsetParent
t=t+a.offsetTop
l=l+a.offsetLeft
wend
msgbox "top="&t&chr(13)&"left="&l,64,"得到控g的位|?
end function
--></script>
<script language="javascript">
function cc()
{
var e = event.srcElement;
var r =e.createTextRange();
r.moveStart("character",e.value.length);
r.collapse(true);
r.select();
}
</script>
<input type=text name=text1 value="123" onfocus="cc()">
javascript:
document.referrer
<object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"> (tng)
<param name="Command" value="Minimize"></object>
<object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"> (tng)
<param name="Command" value="Maximize"></object>
<OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<PARAM NAME="Command" VALUE="Close"></OBJECT>
<input type=button value=最化 onclick=hh1.Click()>
<input type=button value=最大化 onclick=hh2.Click()>
<input type=button value=关闭 onclick=hh3.Click()>
本例适用于IE
<script>
function look(){ (tng)
if(event.shiftKey) (tng)
alert("止按Shift?"); //可以换成ALT CTRL
} (tng)
document.onkeydown=look; (tng)
</script>
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
或?lt;META HTTP-EQUIV="expires" CONTENT="0">
<input type=text style="border:1 solid #000000"> (tng)
?
<input type=text style="border-left:none; border-right:none; border-top:none; border-bottom: (tng)
<div>(division)用来定义大段的页面元素,?x)生{行?
<span>用来定义同一行内的元素,?lt;div>的唯一区别是不产生转行 (tng)
<layer>是ns的标讎ͼie不支持,相当?lt;div>
<body onblur="this.focus();">
让竖条没? (tng)
<body style="overflow:scroll;overflow-y:hidden"> (tng)
</body> (tng)
让横条没? (tng)
<body style="overflow:scroll;overflow-x:hidden"> (tng)
</body> (tng)
两个都去掉?更简单了(jin) (tng)
<body scroll="no"> (tng)
</body> (tng)
<a href="#" onFocus="this.blur()"><img src="logo.jpg" border=0></a>
<form name="form1" method="post" action="mailto:****@***.com" enctype="text/plain"> (tng)
<input type=submit>
</form>
window.opener.location.reload()
<body onload="top.resizeTo(300,200);">
打开面的位|?lt;body onload="top.moveBy(300,200);">
<STYLE> (tng)
body (tng)
{background-image:url(logo.gif); background-repeat:no-repeat; (tng)
background-position:center;background-attachment: fixed} (tng)
</STYLE> (tng)
<script language="Javascript"><!--
function checkNum(str){return str.match(//D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// --></script>
document.body.clientWidth; document.body.clientHeight
if (/[^/x00-/xff]/g.test(s)) alert("含有汉字");
else alert("全是字符");
<textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight">
</textarea>
32. 日期减去天数{于W二个日?
<script language=Javascript>
function cc(dd,dadd)
{
//可以加上错误处理
var a = new Date(dd)
a = a.valueOf()
a = a - dadd * 24 * 60 * 60 * 1000
a = new Date(a)
alert(a.getFullYear() + "q? + (a.getMonth() + 1) + "? + a.getDate() + "?)
}
cc("12/23/2002",2)
</script>
<HTML><script language="vbscript">
function checkme()
for each ob in radio1
if ob.checked then window.alert ob.value
next
end function
</script><BODY>
<INPUT name="radio1" type="radio" value="style" checked>Style
<INPUT name="radio1" type="radio" value="barcode">Barcode
<INPUT type="button" value="check" onclick="checkme()">
</BODY></HTML>
<SCRIPT LANGUAGE="JavaScript"> (tng)
<!-- Hide (tng)
function killErrors() { (tng)
return true; (tng)
} (tng)
window.onerror = killErrors; (tng)
// --> (tng)
</SCRIPT>
<input onkeydown="if(event.keyCode==13)event.keyCode=9">
把如下代码加?lt;body>区域?
<script language=Javascript>
tim=1
setInterval("tim++",100)
b=1
var autourl=new Array()
autourl[1]="autourl[2]="javacool.3322.net"
autourl[3]="autourl[4]="autourl[5]="function butt(){
document.write("<form name=autof>")
for(var i=1;i<autourl.length;i++)
document.write("<input type=text name=txt"+i+" size=10 value=试中…?gt; =?lt;input type=text (tng)
name=url"+i+" size=40> =?lt;input type=button value=GO (tng)
document.write("<input type=submit value=h></form>")
}
butt()
function auto(url){
document.forms[0]["url"+b].value=url
if(tim>200)
{document.forms[0]["txt"+b].value="链接时"}
else
{document.forms[0]["txt"+b].value="旉"+tim/10+"U?}
b++
}
function run(){for(var i=1;i<autourl.length;i++)document.write("<img src=http://"+autourl+"/"+Math.random()+" width=1 height=1 (tng)
run()</script>
auto Q标准光?
default Q标准箭?
hand Q手形光?
wait Q等待光?
text QI形光?
vertical-text Q水qI形光?
no-drop Q不可拖动光?
not-allowed Q无效光?
help Q?帮助光标
all-scroll Q三角方向标
move Q移动标
crosshair Q十字标
e-resize
n-resize
nw-resize
w-resize
s-resize
se-resize
sw-resize
q入面<meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)">
推出面<meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)"> (tng)
q个是页面被载入和调出时的一些特效。duration表示Ҏ(gu)的持l时_(d)以秒为单位。transition表示使用哪种Ҏ(gu)Q取gؓ(f)1-23:
0 矩Ş~小 (tng)
1 矩Ş扩大 (tng)
2 圆Ş~小
3 圆Ş扩大 (tng)
4 下到上刷斊W?
5 上到下刷?
6 左到叛_斊W?
7 叛_左刷斊W?
8 竖百叶窗
9 横百叶窗 (tng)
10 错位横百叶窗 (tng)
11 错位竖百叶窗
12 Ҏ(gu)散?
13 左右C间刷斊W?
14 中间到左叛_?
15 中间C?
16 上下C闾b?
17 右下到左?
18 右上到左下?
19 左上到右下?
20 左下到右?
21 横条 (tng)
22 竖条 (tng)
23 以上22U随机选择一U?
<META http-equiv=V="REFRESH" content="5;URL=http://www.51js.com"> (tng)
<meta name="ROBOTS" content="属性?>
其中属性值有以下一?
属性gؓ(f)"all": 文g被(g)索,且页上链接可被查询;
属性gؓ(f)"none": 文g不被(g)索,而且不查询页上的链接Q?
属性gؓ(f)"index": 文g被(g)索;
属性gؓ(f)"follow": 查询上的链接;
属性gؓ(f)"noindex": 文g不检索,但可被查询链接;
属性gؓ(f)"nofollow": 文g不被(g)索,但可查询上的链接?
(tng) (tng) (tng) (tng) (tng) (tng)
function
(tng)CookieEnable()
(tng) (tng) (tng) (tng) (tng) (tng){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
var
(tng)result
=
false
;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
if
(navigator.cookiesEnabled)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
return
(tng)
true
;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)document.cookie (tng)
=
(tng)
"
testcookie=yes;
"
;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
var
(tng)cookieSet (tng)
=
(tng)document.cookie;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
if
(tng)(cookieSet.indexOf(
"
testcookie=yes
"
) (tng)
>
(tng)
-
1
)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)result
=
true
;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)document.cookie (tng)
=
(tng)
""
;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
return
(tng)result;
(tng) (tng) (tng) (tng) (tng) (tng)}
(tng) (tng) (tng) (tng) (tng) (tng)
if
(
!
CookieEnable())
(tng) (tng) (tng) (tng) (tng) (tng){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)alert(
"
对不P(zhn)的览器的Cookie功能被禁用,请开?/span>
"
);
(tng) (tng) (tng) (tng) (tng) (tng)}
</
script
>
匚w双字节字W?包括汉字在内)Q[^\x00-\xff]
应用Q计字W串的长度(一个双字节字符长度?QASCII字符?Q?br />
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
匚wI的正则表辑ּQ\n[\s| ]*\r
匚wHTML标记的正则表辑ּQ?<(.*)>.*<\/\1>|<(.*) \/>/
匚w首尾I格的正则表辑ּQ?^\s*)|(\s*$)
应用Qjavascript中没有像vbscript那样的trim函数Q我们就可以利用q个表达式来实现Q如下:(x)
String.prototype.trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}
利用正则表达式分解和转换IP地址Q?br />
下面是利用正则表辑ּ匚wIP地址QƈIP地址转换成对应数值的JavascriptE序Q?br />
function IP2V(ip)
{
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匚wIP地址的正则表辑ּ
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("Not a valid IP address!")
}
}
不过上面的程序如果不用正则表辑ּQ而直接用split函数来分解可能更单,E序如下Q?br />
var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是Q?+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
匚wEmail地址的正则表辑ּQ\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匚w|址URL的正则表辑ּQhttp://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
利用正则表达式去除字串中重复的字W的法E序Q?br />[注:(x)此程序不正确Q原因见本脓(chung)回复]
var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2) //l果为:(x)abcefgi
我原来在CSDN上发贴寻求一个表辑ּ来实现去除重复字W的Ҏ(gu)Q最l没有找刎ͼ
q是我能惛_的最单的实现Ҏ(gu)。思\是用后向引用取出包括重复的字符Q?br />再以重复的字W徏立第二个表达式,取到不重复的字符Q两者串q?br />q个Ҏ(gu)对于字符序有要求的字符串可能不适用?br />
得用正则表达式从URL地址中提取文件名的javascriptE序Q如下结果ؓ(f)page1
s="http://www.9499.net/page1.htm"
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)
利用正则表达式限制网表单里的文本框输入内容Q?br />
用正则表辑ּ限制只能输入中文Qonkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"
用正则表辑ּ限制只能输入全角字符Q?onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"
用正则表辑ּ限制只能输入数字Qonkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
用正则表辑ּ限制只能输入数字和英文:(x)onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
]]>
2. 问:(x)java中用什么表C双引号
{:(x)"""
3. 问:(x)如何在JSPE序里另起一个线E?
{:(x)
JSP本n是独立U程q行而不象CGI都是独立q程.
一?
Thread t = new Thread("你的对象");
t.start();可以了(jin).
要求你这个对象要实现runnable接口或承thread.
4. 问:(x)jsp如何获得客户端的IP地址Q?br />{:(x)
request.getRemoteAddr()
看看各个webserver的API文档说明Q一般都有自带的Qresin和tomcat都有
5. 问:(x)E序l止与输出终?br />{:(x)
E序中止:return;
输出中止out.close();q一句相当于ASP的response.end
6. 问:(x)jsp中如何得C늚URLQ?br />{:(x)request.getHeader("referer");
7. 问:(x)提交|页的网过期功能是怎么做的Q?br />{:(x)response.setHader("Expires","0");
8. 问:(x)在JSP|页中如何知道自已打开的页面的名称
{:(x)
request.getRequestURI() ;//文g?br />request.getRequestURL() ;//全部QRQ?br />
9. 问:(x)提交表单后验证没有通过Q返回提交页面,如何使原提交面中的数据保留Q?br />{:(x)javascript的go(-1)可以把上늚表单内容重新昄出来,但password域没?br />
10. 问:(x)如何取得http的头信息Q?br />{:(x)request.getHader(headerName);
11. 问:(x)&&?amp;的区别?
{:(x)
&&是短路的与操作,也就是当C个条件是false的时候,W二个条件不用执?br />&相反Q两个条件L执行?br />
12. 问:(x)?以正弦曲U的一个周期显C出?br />{:(x)
public void paint(Graphics g)
{
for(int i=0;i<200;i++)
g.drawString("*",i,(int)(Math.sin(i)*20)+50);
}
}
13. 问:(x)点数相乘后l果不精如100.0 * 0.6 l果{于 60.0004
{:(x)
q不叫错?float和double是这样实现的.如果要精计,java提供?jin)一个strictfp,它的计算遵@IEEE 754标准.而普通的float和double?br />
由地q_点格式或硬件提供的额外_ֺ或表C围?br />
14. 问:(x)如何获得当前用的cursors的位|?
{:(x)
int row = rs.getRow()是当前指针行数,q有isFrist();isBeforeFist();isLast();isAfterLast();可以试是不是在Ҏ(gu)名所说的位置
15. 问:(x)表单成功提交?jin),点后退昄|页q期
{:(x)
?lt;head></head>里面加以下代?br /><META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
或者在表单中加上
<%
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
%>
16. 问:(x)接口的简单理?br />{:(x)接口Z(jin)规范,比如我在接口中定义了(jin)一个方?
getData()
q是用来从不同的数据库中取数据的,是JDBC的实现对于用?我不要知道每U数据库是如何做?但我知道如何它们要实现这个接口就一定有
q个Ҏ(gu)可以供我调用.q样SUN把q个接口l各个数据库开发商,让他们自己实? 但ؓ(f)什么不用承而用接口?因ؓ(f)l承只能从一个你c?br />
l承,而接口可以实现多?是说我实现的子cL多个规定好的接口中的功能. q只是简单的理解,{你深入理解抽象的时候就知道抽象到抽?br />
cLZ么还要再抽象到接?
17. 问:(x)怎样~写一个取消按钮(怎样q回上一个页面,象工h的后退按钮Q?
{:(x)
javascript把每ơ浏览过的location都压C(jin)一个栈?q个栈就是history,然后你如果要回到W几个页面它?yu)做几次POP操作,把最后POP出来
的那个LOCATIONl你. q就是JAVASCRIPT在实现history.go(-x)的原?
18. 问:(x)什么是回调Q?br />{:(x)
单说,回调用不是让你去监听谁做完了(jin)什么事,而是谁做完了(jin)什么事报告给? q就是回调用的思想.例子太多?AWT的事?SWING事g模型
都是q样? q有多线E中,如果要控制线E数,不能L查询每个U程是否l束,要在每个U程l束时让U程自己告诉ȝE我l束?你可?br />
开新的U程?
19. 问:(x)要介l一下compareToҎ(gu)
{:(x)
compareToҎ(gu)是Comparable 接口必需实现的方?只要实现Comparable
可以用Arrays.srot()排序p实现Runnable接口的runpThread()一?
20. 问:(x)如何可以从别的Web服务器检索页, 然后把检索到的网늚HTML代码储存在一个变量中q回q来
{:(x)q是一个简单的WEB ROBOT实现,用URLcdC|页中抓内容,然后自己写一个分析程序从中找出新的URL,不断递归下去p?
21. 问:(x)applet中如何获得键盘的输入
{:(x)application的System.in是当前系l的标准输入,applet因ؓ(f)安全的原因不可能d当前pȝ(客户?的标准输?只能从它的ROOTlg?br />
事g?比如键盘?sh)g中取得键?
22. 问:(x)怎样计算代码执行所p的时_(d)
{:(x)
代码开始取旉Q结束后取时_(d)相减
long t1 = System.currentTimeMillis();
///////////////// your code
long t2 = System.currentTimeMillis() ;
long time = t2-t1;
23. 问:(x)如何获在E序中获得一个文件的ContentTypeQ?br />{:(x)
URL u = new URL("file:///aaa.txt");
URLConnection uc = u.openConnection();
String s = uc.getContentType();
24. 问:(x)q接池的使用是徏立很多连接池Q还是一个连接池里用多个q接Q?br />{:(x)
只有在对象源不同的情况下才会(x)发生多个池化,如果你只q一l一个数据源,永远不要用多个连l池. 所以连l池的初始化一定要做成?rn)态的,?br />
且应该在构造对象之?也就是只有在cLOAD的时?别的时候不应该有Q何生成新的连l池的时候?br />
25. 问:(x)JavaMail要怎么安装Q?br />{:(x)下蝲两个包,一个是javamail包,另一个是jaf包。下载完直接把这两个包不解压加到CLASSPATH?br />
26. 问:(x)怎样把地址栏里的地址锁定Q?br />{:(x)把你的服务器的可讉K目录索引选项关闭p?M服务器都有一个conf文g,里面都有q个选项?br />
27. 问:(x)在JAVA中怎么取得环境变量啊。比如:(x) TEMP = CQTEMP Q?br />{:(x)String sss = System.getProperty(key)
28. 问:(x)怎样实现四舍五入Q保留小数点后两位小敎ͼ
{:(x)
import java.text.*;
...
NumberFormat nf=NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
nf.format(numb);
29. 问:(x)Applet和form如何通信Q?br />{:(x)
取得的参C到param里面
<%
String xxx = request.getParameter("xxx");
%>
<applet>
<param value="<%=xxx%>">
</applet>
30. 问:(x)java-plug-in是什么?
{:(x)Java Runtime Environment的插件。用来运行javaE序。不需要什么特别的讄。等于你的机器里面有?jin)jvm?br />
31. 问:(x)WEB上面怎么栯接上一个EXCEL表格Q?br />{:(x)
定义面得contentType="application/vnd.ms-excel"Q让面以excel得Ş式打开。同样也可以以word得Ş式打开Qapplication/msword?br />
32. 问:(x)怎样才能避免textarea字数限制Q?br />{:(x)是用了(jin)FORM的默认方法的~故,如果什么也不写默认是GET改用Post卛_Q在Form中定义mothod="post"?br />
33. 问:(x)Z么加?lt;%@page contentType="text/html;charset=gb2312" %>插入数据库的中文Q依然是qQ?br />{:(x)
q要从环境看,能显C明你的JSP引擎没有问题,但写入数据库时你的JDBC能不能处理中?同一公司不同版本的JDBC都有支持中文和不支持?br />
文的情况,RESIN自带的MYSQL JDBC׃支持,MM的就支持,q有你的数据库类型是否支持中?CHAR的一般支?但是否用binary存储双字节码
34. 问:(x)对于JFrameQhide()Qshow()与setVisibel()有什么区别吗Q?br />{:(x)
setVisible()从Componentl承q来Q而hide(),show()从Window里面l承q来?br />Makes the Window visible. If the Window and/or its owner are not yet displa yable, both are made displayable. The Window will
be validated prior to being made visible. If t he Window is already visible, this will bring the Window to the front. 区别?br />
q?br />36. 问:(x)sendRedirectZ么不可以转到mms协议的地址的?response.sendRedirect("mms://missiah.adsldns.org:9394");
{:(x)javaq_目前实现的protocol中ƈ没有mms,你可以取pȝ属性java.protocol.handler.pkgs看看它的g有没有mms,所以如果要想重定向
到mms://hostq样和URL,只有生成客户端的JAVASCRIPT让它来重定向
37. 问:(x)JTable中怎样定义各个Columns和W(xu)idth和怎样讄表格的内定w做靠x居中Q?br />{:(x)
TableColumn tc = table.getColumn("Name");//取得列名?Name"的列Handle
int currentWidth = tc.getPreferredWidth(); //取得该列当前的宽?br />tc.setPreferredWidth(200); //讄当前列宽
tc.setMaxWidth(200); //讄该列最大宽?br />tc.setMinWidth(50); //讄该列最宽?br />
38. 问:(x)Ҏ(gu)作是否可用于select语句Q?br />{:(x)Ҏ(gu)作其实是指成批理更新的操?l对不可能用于select操作?br />
39. 问:(x)Z么jsp路径太深文g名太长就无法d文gQ?br />{:(x)path不能过255长度,不然找不到?q是作业pȝ的事?br />
40. 问:(x)如何让页面不保留~存Q?br />{:(x)
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
%>
41. 问:(x)我的applet code 中用到jbutton 时就出错是否׃ie不支持swing package 请问应怎么办?
{:(x)JBUTTON是SWING基本包啊,只要把jdk/jre/lib/rt.jar攑֜classpathp?不要加蝲M别的库?br />
42. 问:(x)不知道java是否支持midi格式Q如果支持,应该怎么把wave格式转换成midi格式Q?br />{:(x)目前q(sh)?可以看一下JMF三个版中对MIDI的格式支持是read only,而W(xu)AVE是read/write,MIDI只能播放,不能生成?br />
43. 问:(x)在jsp里面防止用户直接输入urlq去面Q应该怎么做呢Q?br />{:(x)
一是从web服务器控?Ҏ(gu)一目录的所有访问要通过验证.
二是在要讉K的页面中加入控制.q个一般用session,也可以用h状态码实现
44. 问:(x)
例如后台有一计算应用E序Q此E序q算h很慢Q可持箋几分钟到几小Ӟq不,主要是能ȀzdQ,客户d提交后,服务器对?br />
务进行检无误后向服务器后台程序发送信息,q将其激zR要求如下:(x)
1Q首先将后台E序Ȁz,让它执行此Q务(比如Q前台将计算的C代码提交上后Q后台程序程序能马上调用Qƈ其q行Q?br />2Q要在前台JSP面中显C行过E信息(׃q行旉长,希望让客L(fng)到运行过E中产生的信息)(j)如何完成Q?br />
{:(x)
zL可以?q行一个shell让它去运行后台就?但不可能取出q行信息,因ؓ(f)HTTP的超旉制不可能永远{你后台q行?而且信息如果要动?br />
实时推出来就得用SERVER PUSH技术?br />
45. 问:(x)数据库是datetime ?Q插入当前时间到数据库?
{:(x)
java.sql.Date sqlDate = new java.sql.Date();
PreparedStatement pstmt = conn.prepareStatement("insert into foo(time) values(?)");
pstmt.setDate(1,sqlDate);
pstmt.executeUpdate();
46. 问:(x)怎样L字符串前后的I格?br />{:(x)String.trim()
47. 问:(x)session怎样存取intcd的变量?
{:(x)
session.setAttribute("int", i+"");
int i = Integer.parseInt(session.getAttribute("int"));
48. 问:(x)在javascript中如何输出的floatcd的数据保留两位小数?br />{:(x)Math.round(aaaaa*100)/100?br />
49. 问:(x)在beanU如何调用session
{:(x)
你可把session对象作ؓ(f)一个参Clbean
在BEAN中定义HttpServletRequest request;HttpSession session;
然后
session = request.getSession(false);
false为如果session为空,不徏立新的session
session作ؓ(f)参数传入.其实只要request传入可?br />
50. 问:(x)如何把txt或word文g按原格式昄在jsp面或servlet上?
{:(x)
其实一个非常简单的解决Ҏ(gu)是在服务器的MIME中指点定TEXT和W(xu)ORD的解释方?然后用JSP或SERVLET生成它就行了(jin),客户端就?x)自动调用?br />
应程序打开你的文档?br />如果是希望按原格式的昄在页面上Q而不是调用其他程序打开那么你可以试试用WEBDEV协议,可以说这是MS的一个亮?它是在WEB方式下打开
文档,和共享一?完全W合的要求?br />
51. 问:(x)object的cloneҎ(gu)Z么不能直接调用?
{:(x)
q个Ҏ(gu)在object中是protected
Z么要把这个方法定义ؓ(f)protected,q是一个折?sh)?它的目的是想知道你这个方法在Object里只是一个标?而不是一个实?比如
public class Object
{
.............
protected Object clone()
{}
}
所以直接承的clone()Ҏ(gu)q不能做M?你要使用q个Ҏ(gu)p重蝲q个Ҏ(gu)q放宽访问权限ؓ(f)public,或实现cloneable接口. 但它没法
q样告诉你它没有真的实现,只好用protected Ҏ(gu)加以警示
52. 问:(x)一个页面中如何h另外一个页面?
{:(x)
要求是这些面必L兌,一是它们都有一个共同的层?也就是说是一个内的分面,当然可以是Q意,帧内再分帧也可以,另一个可
能是当前H口弹出的窗?如果没有联系,那就不可能用一个页面刷新另一个页? 帧内只要一U一U引用就行了(jin).
比如在左帧中一个页面中写top.right.location.reload();那么名ؓ(f)right的右帧中的页面就?x)刷? 弹出的一?用open时的名称h子窗?
子窗口用openerhȝ?br />
53. 问:(x)如何在jsp中怎么样向客户端写cookiesQ?br />{:(x)
Cookie coo = new Cookie(name, value);
HttpServletResponse.addCookie(name);
54. 问:(x)Z么jTextField1.setText("aaabbb");jTextField2.setText("AAABBB"); 得到的字体宽度不一P
{:(x)是说如果不是指定ؓ(f){宽字体,每个字体的宽度都是不一L(fng).因此JAVA中用FontMetrics cL取字W宽度?br />
55. 问:(x)String kk=application/octet-stream; name="G:/SMBCrack.exe";如何得到SMBCrack.exeQ?br />{:(x)
q应该是解析上传时候的二进制流得到的这一行里面格式是固定的,取到name="后面的字W串Q然后把";L。然后取最后一?后面的所有字
W组成一个新字符串就行了(jin)?br />
56. 问:(x)如何传值ƈ不刷新页面?
{:(x)
弹出一个页面进行值的选择或者输入,ok后用将gl原H口Q用javascript关闭打开的窗口即可:(x)
window.close();opener.focus();
57. 问:(x)有一个字W串Q?EF0C114EA4"Q如何变?sh)a[0] = 0xEF a[1] = 0x0C a[2] = 0x11 a[3] = 0x4E a[4] = 0xA4Q?br />{:(x)
String str="EF0C114EA4F";
out.print(str+"<br>");
int l=str.length()/2+str.length()%2,j=0,k=0;
String[] a=new String[l];
for(int i=0;i<l;i++){
if(str.length()-j==1)
k=str.length();
else
k=j+2;
a="0x"+str.substring(j,k);
out.print("a["+Integer.toString(i)+"]="+a+"<br>");
j+=2;
}
58. 问:(x)怎样一个int转换成一个四字节的byte数组Q?br />{:(x)
int x = 1234567;
byte[] b = new byte[4];
for(int i=0;i<b.length;i++)
{
b = (x >>( i*8)) & 0xFF;
}
59. 问:(x)indexOf()的用需要注意什么?
{:(x)参数是指从第几位Q?Q?Q?Q?..Q开始搜索,而返回值是指搜索到的位|(0Q?Q?Q?.......Q注意是从零v的?br />
60. 问:(x)在Java应用E序中如何动态的d一个按钮?
{:(x)
q里涉及(qing)一个组仉l的问题,lg要先于panel被显CZ处存?如果一panel已经昄?那么加在上面你能看到?但如果在同一个panel?
先有button A,假如按下它加?jin)butt on B,q时你如果整个panel重给,那么A本n要重l?它的事g监听没有了(jin),当然也就加不成B?所以如
果要先有另一个panel,当按A时把B加在q个panel上ƈ重绘q个paenl,其实更好的方法是先把B加在panel?同一个也?把它setVisiable(flas
e),按A时设?true?br />
61. 问:(x)book mybook=new book(bookid);book是servlet,出错?br />{:(x)
book是servlet,能book mybook=new book(bookid);
说明自己实现?jin)servlet容器?不然,servlet能让你自己去调用? servlet如果调用其实和EJBq?%的区别都没有,它们都是自己l承或实C些接
?在这些父cL接口中实C(jin)如果和容?打交?的方?然后容器调用q些Ҏ(gu)来管理它,让它生成实例,池化,钝化,销?再生{?所以这?br />
写是错误的?br />
62. 问:(x)l定一个字W串5*(5+9)/7怎样计算出结果?
{:(x)
可有两种Ҏ(gu)
1。用堆栈完成
2。最单的Ҏ(gu)Q不用编E,如果有Q何一个数据库的化Q用select (5*(5+9)/7) from oneTable
63. 问:(x)如何实现递交表单内容的加密解密?
{:(x)
如果你用IE目前只能用SSL协议,q一层不要你考虑,否则只你用你自己的工具加密传?接收后再解密?至于如何加解,如果要和公认的系l结
?q通用的MD5,RAS{公开法,如果你只是自׃自己?你随便按你的x把数据加上一些东?取回来按规则减掉q些东西,我敢保证?br />
你自己没有Q何h能知道解密方?
64. 问:(x)Z么Integer.parseInt("+1");?x)抛出NumberFormatException的异常?
{:(x)因ؓ(f)"+"q行在JAVA中被重蝲.pȝ无法定你用的是术加还是字W??br />q一点可以在JAVASCRIPT中更好地理解:
<form name="t"><input name=s value=1234></form>
var a = document.t.s.value+1;
q时a = 12345,因ؓ(f)document.t.s.value作ؓ(f)字符?但var a = document.t.s.value-1;
a 是1233,因ؓ(f)pȝ知道-q算肯定是算术运?所以把document.t.s.value转换成数?
65. 问:(x)hashCode() 有什么用Z么有时候需要覆盖Object里的hashcode()Ҏ(gu)Q?br />{:(x)q就是这个对象的w䆾证啊,要不如何区分哪个对象?br />
66. 问:(x)怎样在tomcat中实C个定时执行的东东Q?br />{:(x)
在应用程序启动时自动q行。servlet2.3中定义了(jin)ServletListener,监听Servlet Con text的启动或则关闭(可在配置文g中配|)(j)Q启动时
触发一个守护程序的q行(可以实现java.util.Timer或则 javax.swing.Timer).
67. 问:(x)E序可以输出自己吗?
{:(x)孔d(zhn)论q个非常有名的法?是说Q何程序都不可能输?gu)?
68. 问:(x)能够把字W{化成ASCII码?比如?A 转化?65Q?br />{:(x)
int a='A';
out.println(a);
69. 问:(x)如何区分输入的文字中的全角与半角Q?br />{:(x)׃不能分L出全角和半角字符的值有什么规?只好把全角符L(fng)丑և来了(jin).
70. 问:(x)用户注册后的自动发信E序该怎么做?
{:(x)
q种发信E序不考虑性能,因ؓ(f)不可?U就有一个h注册,我们说的考虑性能的发信程序是指上百万信在队列里要不停发送的那种,象你q个
随便怎么写一个程序都?没有必要用JAVAMAIL.只要指定一个发信的服务器然后用cocketq它?5口就行了(jin).自己用SOCKETqSMTP?5口发一?br />
信就好象两个d之间送一样东?直接递过d?用JAVAMAIL,消息机制是你把q个东西从邮局寄给你的d?
]]>
common-fileuploadlg是apache的一个开源项目之一Q可以从 http://jakarta.apache.org/commons/fileupload/ 下蝲。该lg单易用,可实Cơ上传一个或多个文gQƈ可限制文件大?/font>
下蝲后解压zip包,commons-fileupload-1.0.jar复制到tomcat的webapps\你的webapp\WEB-INF\lib\下,如果目录不存在请自徏目录?/font>
新徏一个servlet: Upload.java用于文g上传Q?/font>
~译该servletQ注意要指定classpathQ确保包含commons-upload-1.0.jar和tomcat\common\lib\servlet-api.jar?/font>
配置servletQ用C本打开tomcat\webapps\你的webapp\WEB-INF\web.xmlQ没有的话新Z个。典型配|如下:(x)
注意action="fileupload"其中fileupload是配|servlet时指定的url-pattern?br />
摘自Q?/font>
http://www.j2medev.com/Article/Class10/j2eeopensource/200409/62.html
在读我自q认识之前
,
我们先来看一?/span>
servet
的结构图
:
以下是我自己的一Ҏ(gu)见:(x)
① Servlet 在初始化的时?/span> , 是通过 init(ServletConfig (tng) 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>
(tng) (tng) (tng) public String getInitParameter(String name); ?/span>
(tng) (tng) (tng) public Enumeration getInitParameterNames();
Ҏ(gu)来取得你已经配置好的参数Q也是_(d)你对 servlet 的配|都已经记录?/span> ServletConfig 对象中了(jin)?/span>
l论Q你?/span> Servlet 的配|,?/span> Servlet 的初始化旉由容器来攉q且记录?/span> ServletConfig 的实现类中?/span>
(tng)
③ 我们来看一?/span> Servlet 的配|?/span>
(tng) <servlet>
(tng) (tng) (tng) <servlet-name>index</servlet-name>
(tng) (tng) (tng) <servlet-class>org.zy.pro.sw.servlet.IndexServlet</servlet-class>
(tng) (tng) (tng) <init-param>
(tng) (tng) (tng) (tng) (tng) <param-name>dbconfig</param-name>
(tng) (tng) (tng) (tng) (tng) <param-value>/WEB-INF/dbconfig.xml</param-value>
(tng) (tng) (tng) </init-param>
(tng) </servlet>
在此Q我们实现对数据库的配置文g的加载?/span>
?/span> Servlet 初始化完成后Q我们可以通过
String (tng) dbconf=this.getServletConfig().getInitParameter("dbconfig")
来取得我们的配置的参数的倹{?/span>
但是Q我们仅能得C个配|的字符丌Ӏ之后我们可以通过配置文g取得我们的数据库的配|参敎ͼ然后Ҏ(gu)据库q行初始化?/span>
其实我们也可以通过传递一个类的名字串Q然后再实例化?/span>
(tng) (tng) (tng) <init-param>
(tng) (tng) (tng) (tng) (tng) <param-name>dbconfig</param-name>
(tng) (tng) (tng) (tng) (tng) <param-value>org.zy.util.db.DBUtil</param-value>
(tng) (tng)
(tng)</init-param>
我们先取得配|参敎ͼ(x)
String (tng) dbconf=this.getServletConfig().getInitParameter("dbconfig") Q?/span>
然后通过
Class.forName(dbconf).getInstance();
来实例化对象Q就可以实现Ҏ(gu)据库的调用了(jin)?/span>
l论Q在 web.xml 中对 Servlet 的初始化Q只能传递字W串cd的数?/span>
④ ServletContext
ServletContext 是负责和 Servlet 的上文和下文交互Q上面和 Servlet 容器交互Q下面和 Servlet 中的h和相应进行交互?/span>
?/span> ServletConfig 中, (tng) (tng) (tng)
public ServletContext getServletContext(); Ҏ(gu)实现取得当前 ServletContext 的对象?/span>
你可能要问, ServletContext 是一个接口,那么你如何取得他的对象呢Q?/span>
其实q个问题?/span> ServletConfig 相同Q都是在 Servlet q行初始化的时候生的对象Q是由容器来初始化的?/span>