??xml version="1.0" encoding="utf-8" standalone="yes"?>久久亚洲精品11p,亚洲精品日韩专区silk,91亚洲精品麻豆http://www.tkk7.com/nbtymm/category/11241.html</br><a ><b><font color=red>共有<script src=http://fastonlineusers.com/online.php?d=bluedavy.blogjava.net></script>人在同时阅读此Blog</font></b></a>zh-cnFri, 02 Mar 2007 07:08:37 GMTFri, 02 Mar 2007 07:08:37 GMT60JSTL详解(?http://www.tkk7.com/nbtymm/archive/2007/01/18/94664.htmlnbtnbtThu, 18 Jan 2007 07:22:00 GMThttp://www.tkk7.com/nbtymm/archive/2007/01/18/94664.htmlhttp://www.tkk7.com/nbtymm/comments/94664.htmlhttp://www.tkk7.com/nbtymm/archive/2007/01/18/94664.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/94664.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/94664.html阅读全文

nbt 2007-01-18 15:22 发表评论
]]>
JSTL详解(?http://www.tkk7.com/nbtymm/archive/2007/01/18/94661.htmlnbtnbtThu, 18 Jan 2007 07:21:00 GMThttp://www.tkk7.com/nbtymm/archive/2007/01/18/94661.htmlhttp://www.tkk7.com/nbtymm/comments/94661.htmlhttp://www.tkk7.com/nbtymm/archive/2007/01/18/94661.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/94661.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/94661.html阅读全文

nbt 2007-01-18 15:21 发表评论
]]>
JSTL详解(?http://www.tkk7.com/nbtymm/archive/2007/01/18/94658.htmlnbtnbtThu, 18 Jan 2007 07:19:00 GMThttp://www.tkk7.com/nbtymm/archive/2007/01/18/94658.htmlhttp://www.tkk7.com/nbtymm/comments/94658.htmlhttp://www.tkk7.com/nbtymm/archive/2007/01/18/94658.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/94658.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/94658.html 9.7 (tng)Functions 标签?/span>

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>

9.7.1 (tng) 长度函数 fn:length 函数

长度函数 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个问题而被设计出来的。它的参Cؓ(f) input Q将计算通过该属性传入的对象长度。该对象应该为集合类型或 String cd。其q回l果是一?/span> int cd的倹{下面看一个示例?/span>

<%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>

9.7.2 (tng) 判断函数 fn:contains 函数

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>

9.7.3 (tng)fn:containsIgnoreCase 函数

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>

9.7.4 (tng) 词头判断函数 fn:startsWith 函数

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>

9.7.5 (tng) 词尾判断函数 fn:endsWith 函数

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>

9.7.6 (tng) 字符实体转换函数 fn:escapeXml 函数

fn:escapeXml 函数用于所有特D字W{化ؓ(f)字符实体码。它只包含一?/span> string 参数Q返回一?/span> String cd的倹{?/span>

9.7.8 (tng) 字符匚w函数 fn:indexOf 函数

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>

9.7.9 (tng) 分隔W函?/span> fn:join 函数

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>

9.7.10 (tng) 替换函数 fn:replace 函数

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>

9.7.11 (tng) 分隔W{换数l函?/span> fn:split 函数

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>

9.7.12 (tng) 字符串截取函?/span> fn:substring 函数

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>

截取l果为?/span> B ”?/span>


9.7.14 (tng) 起始到定位截取字W串函数 fn:substringBefore 函数

fn:substringBefore 函数允许截取源字W从开始到某个字符丌Ӏ它的参数和 fn:substringAfter 函数相同Q不同的?/span> substring 表示的是l束字符丌Ӏ下面看一个示例?/span>

${fn:substringBefore("ABCD","BC")}<br>

截取的结果ؓ(f)?/span> A ”?/span>

9.7.15 (tng) 写转换函数 fn:toLowerCase 函数

fn:toLowerCase 函数允许源字符串中的字W全部{换成写字符。它只有一个表C源字符串的参数 string Q函数返回一?/span> String cd的倹{下面看一个示例?/span>

${fn:toLowerCase("ABCD")}<br>

转换的结果ؓ(f)?/span> abcd ”?/span>

9.7.16 大写转换函数 fn:toUpperCase 函数

fn:toUpperCase 函数允许源字符串中的字W全部{换成大写字符。它?/span> fn:toLowerCase 函数相同Q也只有一?/span> String 参数Qƈq回一?/span> String cd的倹{下面看一个示例?/span>

${fn:toUpperCase("abcd")}<br>

转换的结果ؓ(f)?/span> ABCD ”?/span>

9.7.17 I格删除函数 fn:trim 函数

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>



nbt 2007-01-18 15:19 发表评论
]]>
JSTL详解(?http://www.tkk7.com/nbtymm/archive/2007/01/18/94653.htmlnbtnbtThu, 18 Jan 2007 07:17:00 GMThttp://www.tkk7.com/nbtymm/archive/2007/01/18/94653.htmlhttp://www.tkk7.com/nbtymm/comments/94653.htmlhttp://www.tkk7.com/nbtymm/archive/2007/01/18/94653.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/94653.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/94653.html 9.5  (tng)I(yng)18N formatting 标签?/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>

9.5.1 (tng) 用于讄本地化环境的 <fmt:setLocale> 标签

<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>

9.5.2 (tng) 用于资源文gl定?/span> <fmt:bundle> ?/span> <fmt:setBundle> 标签

q两l标{于资源配|文件的l定Q唯一不同的是 <fmt:bundle> 标签资源配|文件绑定于它标{体中的昄Q?/span> <fmt:setBundle> 标签则允许将资源配置文g保存?sh)Z个变量,在之后的工作可以Ҏ(gu)该变量来q行?/span>

Ҏ(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>

9.5.3 (tng) 用于昄资源配置文g信息?/span> <fmt:message> 标签

用于信息昄的标{,显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>

9.5.4 (tng) 用于参数传递的 <fmt:param> 标签

<fmt:param> 标签应该位于 <fmt:message> 标签内,ؓ(f)该消息标{提供参数倹{它只有一个属?/span> value ?/span>

<fmt:param> 标签有两U用版本,一U是直接参数值写?/span> value 属性中Q另一U是参数值写在标{体内?/span>

9.5.6 (tng) 用于求设|字W编码的 <fmt:requestEncoding> 标签

<fmt:requestEncoding> 标签用于求设|字W编码。它只有一个属?/span> value Q在该属性中可以定义字符~码?/span>

9.5.7 (tng) 用于讑֮时区?/span> <fmt:timeZone> ?/span> <fmt:setTimeZone> 标签

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>

9.5.8 (tng) 用于格式化数字的 <fmt:formatNumber> 标签

<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"/>

该结果将被保存在?/span> money ”变量中Q将Ҏ(gu) Locale 环境昄当地的货币格式?/span>

9.5.9 (tng) 用于解析数字?/span> <fmt:parseNumber> 标签

<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>

9.5.10 (tng) 用于格式化日期的 <fmt:formatDate> 标签

<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>

9.5.11 (tng) 用于解析日期?/span> <fmt:parseDate> 标签

<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>



nbt 2007-01-18 15:17 发表评论
]]>
JSTL详解(?http://www.tkk7.com/nbtymm/archive/2007/01/18/94599.htmlnbtnbtThu, 18 Jan 2007 03:45:00 GMThttp://www.tkk7.com/nbtymm/archive/2007/01/18/94599.htmlhttp://www.tkk7.com/nbtymm/comments/94599.htmlhttp://www.tkk7.com/nbtymm/archive/2007/01/18/94599.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/94599.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/94599.html阅读全文

nbt 2007-01-18 11:45 发表评论
]]>
JSTL详解(?http://www.tkk7.com/nbtymm/archive/2007/01/18/94593.htmlnbtnbtThu, 18 Jan 2007 03:25:00 GMThttp://www.tkk7.com/nbtymm/archive/2007/01/18/94593.htmlhttp://www.tkk7.com/nbtymm/comments/94593.htmlhttp://www.tkk7.com/nbtymm/archive/2007/01/18/94593.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/94593.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/94593.html阅读全文

nbt 2007-01-18 11:25 发表评论
]]>
JSTL详解(?http://www.tkk7.com/nbtymm/archive/2007/01/18/94562.htmlnbtnbtThu, 18 Jan 2007 02:02:00 GMThttp://www.tkk7.com/nbtymm/archive/2007/01/18/94562.htmlhttp://www.tkk7.com/nbtymm/comments/94562.htmlhttp://www.tkk7.com/nbtymm/archive/2007/01/18/94562.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/94562.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/94562.html阅读全文

nbt 2007-01-18 10:02 发表评论
]]>
JSTL详解(一)http://www.tkk7.com/nbtymm/archive/2007/01/18/94558.htmlnbtnbtThu, 18 Jan 2007 01:57:00 GMThttp://www.tkk7.com/nbtymm/archive/2007/01/18/94558.htmlhttp://www.tkk7.com/nbtymm/comments/94558.htmlhttp://www.tkk7.com/nbtymm/archive/2007/01/18/94558.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/94558.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/94558.html阅读全文

nbt 2007-01-18 09:57 发表评论
]]>
Excel报表之js?/title><link>http://www.tkk7.com/nbtymm/archive/2006/08/07/62118.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Mon, 07 Aug 2006 02:16:00 GMT</pubDate><guid>http://www.tkk7.com/nbtymm/archive/2006/08/07/62118.html</guid><wfw:comment>http://www.tkk7.com/nbtymm/comments/62118.html</wfw:comment><comments>http://www.tkk7.com/nbtymm/archive/2006/08/07/62118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/nbtymm/comments/commentRss/62118.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/nbtymm/services/trackbacks/62118.html</trackback:ping><description><![CDATA[(转自--http://www.tkk7.com/beyondduke/archive/2006/08/05/61911.html)<br />半年以前做过server端生成excel的简单引擎,L觉不够轻便,其在一些固定格式,数据量又不是很大的情况下Q上周写?jin)一<br /><br />个根据表单数据在client端用js生成excle的demoQo(h)我我Ȁ动了(jin)半天------js太强?jin)?br /><br />下面分n一下这DjsQ?<br /> (tng) <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> (tng)1</span><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)excel (tng) (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> (tng)ActiveXObject(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Excel.Application</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">); (tng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">创徏AX对象excel</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> (tng)2</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">excel.visible (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">; (tng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">讄excel可见属?/span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> (tng)3</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)workbook (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)excel.Workbooks.Add; (tng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取workbook对象</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> (tng)4</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)sheet1 (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)xlBook.Worksheets(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">); (tng) (tng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">创徏sheet1</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> (tng)5</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)sheet2 (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)xlBook.Worksheets(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">); (tng) (tng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">创徏sheet2</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> (tng)6</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">sheet1.Range(sheet1.Cells(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">),sheet1.Cells(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">14</span><span style="COLOR: #000000">)).mergecells</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">; (tng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">合ƈ单元?/span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> (tng)7</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">sheet1.Range(sheet1.Cells(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">),sheet1.Cells(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">14</span><span style="COLOR: #000000">)).value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">员工月考核成W</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">; (tng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">讄单元格内?/span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> (tng)8</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">sheet1.Range(sheet1.Cells(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">),sheet1.Cells(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">14</span><span style="COLOR: #000000">)).Interior.ColorIndex</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">讄底色 (tng)</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> (tng)9</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">sheet1.Range(sheet1.Cells(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">),sheet1.Cells(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">14</span><span style="COLOR: #000000">)).Font.ColorIndex</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">讄字体色?/span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">sheet1.Rows(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">).RowHeight (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">; (tng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">讄列高</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">sheet1.Rows(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">).Font.Size</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">; (tng) (tng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">讄文字大小</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">sheet1.Rows(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">).Font.Name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">宋体</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">; (tng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">讄字体</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />//</span><span style="COLOR: #008000">讄每一列的标题</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">工程师考核?/span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">研发q度</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">出勤?/span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">执行?/span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">责Q?/span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">工作规范</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">协作_</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">q取?/span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">工作合理?/span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">解决问题能力</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">应变能力</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">人际技?/span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">14</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">理解能力</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从表单@环控件中取出数据逐行插入对应列的数据</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">29</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)count (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetAttributeValue('Repeat','Count');<br /></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img id="Codehighlighter1_1253_2657_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1253_2657_Open_Text.style.display='none'; Codehighlighter1_1253_2657_Closed_Image.style.display='inline'; Codehighlighter1_1253_2657_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1253_2657_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1253_2657_Closed_Text.style.display='none'; Codehighlighter1_1253_2657_Open_Image.style.display='inline'; Codehighlighter1_1253_2657_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)line</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;line</span><span style="COLOR: #000000"><=</span><span style="COLOR: #000000">count;line</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_1253_2657_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_1253_2657_Open_Text"><span style="COLOR: #000000">{ (tng)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">begin (tng)for</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">31</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)name (tng) (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].name');<br /></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)total</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].total');<br /></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)yfjd (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].yfjd');<br /></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)jh (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].jh');<br /></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)gcgj (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].gcgj');<br /></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)cql (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].cql');<br /></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)zxl (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].zxl');<br /></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)gzgf (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].gzgf');<br /></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)zrx (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].zrx');<br /></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)xzjs (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].xzjs');<br /></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)jqx (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].jqx');<br /></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)gzhl (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].gzh');<br /></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)jjwt (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].jjwt');<br /></span><span style="COLOR: #008080">44</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)ybnl (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].ybnl');<br /></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)rjjn (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].rjjn');<br /></span><span style="COLOR: #008080">46</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> (tng)ljnl (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)sfform.GetValue('Repeat['</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">'].ljnl');<br /></span><span style="COLOR: #008080">47</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">name;<br /></span><span style="COLOR: #008080">48</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">total;<br /></span><span style="COLOR: #008080">49</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">yfjd;<br /></span><span style="COLOR: #008080">50</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">cql;<br /></span><span style="COLOR: #008080">51</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line,</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">zxl;<br /></span><span style="COLOR: #008080">52</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line,</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">gzgf;<br /></span><span style="COLOR: #008080">53</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line,</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">zrx;<br /></span><span style="COLOR: #008080">54</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line,</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">xzjs;<br /></span><span style="COLOR: #008080">55</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line,</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">jqx;<br /></span><span style="COLOR: #008080">56</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line,</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">gzhl;<br /></span><span style="COLOR: #008080">57</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line,</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">jjwt;<br /></span><span style="COLOR: #008080">58</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line,</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">ybnl;<br /></span><span style="COLOR: #008080">59</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line,</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">rjjn;<br /></span><span style="COLOR: #008080">60</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng)sheet1.Cells(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">line,</span><span style="COLOR: #000000">14</span><span style="COLOR: #000000">).Value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">ljnl;<br /></span><span style="COLOR: #008080">61</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">62</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">end (tng)for</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">63</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">64</span><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />基本的代码已l实C(jin)Q生成excel的格式和一些统计计,用js写应该是很方便的Q以后有例子再作补充?br /><br />从代码角度来看这U写法不是很灉|Q但在能满用户的需求前提下Q这U生成方式还是很受欢q的Q给用户的感觉就是轻<br /><br />ѝ个为简单就是美Q?<img src ="http://www.tkk7.com/nbtymm/aggbug/62118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/nbtymm/" target="_blank">nbt</a> 2006-08-07 10:16 <a href="http://www.tkk7.com/nbtymm/archive/2006/08/07/62118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>l计在线人数http://www.tkk7.com/nbtymm/archive/2006/08/03/61442.htmlnbtnbtThu, 03 Aug 2006 00:33:00 GMThttp://www.tkk7.com/nbtymm/archive/2006/08/03/61442.htmlhttp://www.tkk7.com/nbtymm/comments/61442.htmlhttp://www.tkk7.com/nbtymm/archive/2006/08/03/61442.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/61442.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/61442.html//SessionCounter.java\ozdvw
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 `|*)


nbt 2006-08-03 08:33 发表评论
]]>
|页常用技?JavaScript)http://www.tkk7.com/nbtymm/archive/2006/07/25/59909.htmlnbtnbtTue, 25 Jul 2006 00:42:00 GMThttp://www.tkk7.com/nbtymm/archive/2006/07/25/59909.htmlhttp://www.tkk7.com/nbtymm/comments/59909.htmlhttp://www.tkk7.com/nbtymm/archive/2006/07/25/59909.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/59909.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/59909.html1. oncontextmenu="window.event.returnValue=false" 彻底屏蔽鼠标右?
<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=查看|页源代码?
onclick="window.location = "view-source:"+ "

12.删除时确?
<a href="javascript:if(confirm("实要删除吗?"))location="boos.asp?&areyou=删除&page=1"">删除</a> (tng)

13. 取得控g的绝对位|?
//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>

//VBScript
<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>

14. 光标是停在文本框文字的最?
<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()">

15. 判断上一늚来源
javascript:
document.referrer

16. 最化、最大化、关闭窗?
<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

17.屏蔽功能键Shift,Alt,Ctrl
<script>
function look(){ (tng)
if(event.shiftKey) (tng)
alert("止按Shift?"); //可以换成ALT CTRL
} (tng)
document.onkeydown=look; (tng)
</script>

18. |页不会(x)被缓?
<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">

19.怎样让表单没有凹凸感Q?
<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)

1 solid #000000"></textarea>

20.<div><span>&<layer>的区别? (tng)
<div>(division)用来定义大段的页面元素,?x)生{行?
<span>用来定义同一行内的元素,?lt;div>的唯一区别是不产生转行 (tng)
<layer>是ns的标讎ͼie不支持,相当?lt;div>

21.让弹出窗口L在最上面:
<body onblur="this.focus();">

22.不要滚动? (tng)
让竖条没? (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)

23.怎样L囄链接点击后,囄周围的虚U?
<a href="#" onFocus="this.blur()"><img src="logo.jpg" border=0></a>

24.?sh)子邮g处理提交表单
<form name="form1" method="post" action="
mailto:****@***.com" enctype="text/plain"> (tng)
<input type=submit>
</form>

25.在打开的子H口h父窗口的代码里如何写Q?
window.opener.location.reload()

26.如何讑֮打开面的大?
<body onload="top.resizeTo(300,200);">
打开面的位|?lt;body onload="top.moveBy(300,200);">

27.在页面中如何加入不是满铺的背景图?拉动面时背景图不动 (tng)
<STYLE> (tng)
body (tng)
{background-image:url(logo.gif); background-repeat:no-repeat; (tng)
background-position:center;background-attachment: fixed} (tng)
</STYLE> (tng)

28. (g)查一D字W串是否全由数字l成
<script language="Javascript"><!--
function checkNum(str){return str.match(//D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// --></script>

29. 获得一个窗口的大小
document.body.clientWidth; document.body.clientHeight

30. 怎么判断是否是字W?
if (/[^/x00-/xff]/g.test(s)) alert("含有汉字");
else alert("全是字符");

31.TEXTAREA自适应文字行数的多?
<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>

33. 选择?jin)哪一个Radio
<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>

34.脚本怸出错
<SCRIPT LANGUAGE="JavaScript"> (tng)
<!-- Hide (tng)
function killErrors() { (tng)
return true; (tng)
} (tng)
window.onerror = killErrors; (tng)
// --> (tng)
</SCRIPT>

35.ENTER键可以让光标Ud下一个输入框
<input onkeydown="if(event.keyCode==13)event.keyCode=9">

36. (g)某个网站的链接速度Q?
把如下代码加?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)

onclick=window.open(this.form.url"+i+".value)><br>")
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)

onerror=auto("http://"+autourl+"")>")}
run()</script>

37. 各种样式的光?
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

38.面q入和退出的Ҏ(gu)
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?

39.在规定时间内跌{
<META http-equiv=V="REFRESH" content="5;URL=http://www.51js.com"> (tng)

40.|页是否被检?
<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)索,但可查询上的链接?

41.JAVASCRIPT判断IE是否开启COOKIE

< script (tng)type = " text/javascript " >

 (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 >

 (tng)

匚w中文字符的正则表辑ּQ?[\u4e00-\u9fa5]

匚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,''))"



nbt 2006-07-25 08:42 发表评论
]]>
JSP 70?/title><link>http://www.tkk7.com/nbtymm/archive/2006/07/24/59773.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Mon, 24 Jul 2006 04:04:00 GMT</pubDate><guid>http://www.tkk7.com/nbtymm/archive/2006/07/24/59773.html</guid><wfw:comment>http://www.tkk7.com/nbtymm/comments/59773.html</wfw:comment><comments>http://www.tkk7.com/nbtymm/archive/2006/07/24/59773.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/nbtymm/comments/commentRss/59773.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/nbtymm/services/trackbacks/59773.html</trackback:ping><description><![CDATA[1. 问:(x)在JAVA与JSP中要调用一个LINUX上的脚本E序,或WINDOWS上的脚本E序,该怎么写?<br />{:(x)System.getRuntime().exec("bash < aaa.sh");<br /><br />2. 问:(x)java中用什么表C双引号<br />{:(x)"""<br /><br />3. 问:(x)如何在JSPE序里另起一个线E?<br />{:(x)<br />JSP本n是独立U程q行而不象CGI都是独立q程.<br />一?<br />Thread t = new Thread("你的对象");<br />t.start();可以了(jin).<br />要求你这个对象要实现runnable接口或承thread.<br /><br />4. 问:(x)jsp如何获得客户端的IP地址Q?br />{:(x)<br />request.getRemoteAddr()<br />看看各个webserver的API文档说明Q一般都有自带的Qresin和tomcat都有<br /><br />5. 问:(x)E序l止与输出终?br />{:(x)<br />E序中止:return;<br />输出中止out.close();q一句相当于ASP的response.end<br /><br />6. 问:(x)jsp中如何得C늚URLQ?br />{:(x)request.getHeader("referer");<br /><br />7. 问:(x)提交|页的网过期功能是怎么做的Q?br />{:(x)response.setHader("Expires","0");<br /><br />8. 问:(x)在JSP|页中如何知道自已打开的页面的名称<br />{:(x)<br />request.getRequestURI() ;//文g?br />request.getRequestURL() ;//全部QRQ?br /><br />9. 问:(x)提交表单后验证没有通过Q返回提交页面,如何使原提交面中的数据保留Q?br />{:(x)javascript的go(-1)可以把上늚表单内容重新昄出来,但password域没?br /><br />10. 问:(x)如何取得http的头信息Q?br />{:(x)request.getHader(headerName);<br /><br />11. 问:(x)&&?amp;的区别?<br />{:(x)<br />&&是短路的与操作,也就是当C个条件是false的时候,W二个条件不用执?br />&相反Q两个条件L执行?br /><br />12. 问:(x)?以正弦曲U的一个周期显C出?br />{:(x)<br />public void paint(Graphics g)<br />{<br />for(int i=0;i<200;i++)<br />g.drawString("*",i,(int)(Math.sin(i)*20)+50);<br />}<br />}<br /><br />13. 问:(x)点数相乘后l果不精如100.0 * 0.6 l果{于 60.0004<br />{:(x)<br />q不叫错?float和double是这样实现的.如果要精计,java提供?jin)一个strictfp,它的计算遵@IEEE 754标准.而普通的float和double?br /><br />由地q_点格式或硬件提供的额外_ֺ或表C围?br /><br />14. 问:(x)如何获得当前用的cursors的位|?<br />{:(x)<br />int row = rs.getRow()是当前指针行数,q有isFrist();isBeforeFist();isLast();isAfterLast();可以试是不是在Ҏ(gu)名所说的位置<br /><br />15. 问:(x)表单成功提交?jin),点后退昄|页q期<br />{:(x)<br />?lt;head></head>里面加以下代?br /><META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Expires" CONTENT="0"> <br />或者在表单中加上<br /><% <br />response.setHeader("Pragma","no-cache"); <br />response.setHeader("Cache-Control","no-cache"); <br />response.setDateHeader("Expires",0); <br />%><br /><br />16. 问:(x)接口的简单理?br />{:(x)接口Z(jin)规范,比如我在接口中定义了(jin)一个方?<br />getData()<br />q是用来从不同的数据库中取数据的,是JDBC的实现对于用?我不要知道每U数据库是如何做?但我知道如何它们要实现这个接口就一定有<br /><br />q个Ҏ(gu)可以供我调用.q样SUN把q个接口l各个数据库开发商,让他们自己实? 但ؓ(f)什么不用承而用接口?因ؓ(f)l承只能从一个你c?br /><br />l承,而接口可以实现多?是说我实现的子cL多个规定好的接口中的功能. q只是简单的理解,{你深入理解抽象的时候就知道抽象到抽?br /><br />cLZ么还要再抽象到接?<br /><br />17. 问:(x)怎样~写一个取消按钮(怎样q回上一个页面,象工h的后退按钮Q?<br />{:(x)<br />javascript把每ơ浏览过的location都压C(jin)一个栈?q个栈就是history,然后你如果要回到W几个页面它?yu)做几次POP操作,把最后POP出来<br /><br />的那个LOCATIONl你. q就是JAVASCRIPT在实现history.go(-x)的原?<br /><br />18. 问:(x)什么是回调Q?br />{:(x)<br />单说,回调用不是让你去监听谁做完了(jin)什么事,而是谁做完了(jin)什么事报告给? q就是回调用的思想.例子太多?AWT的事?SWING事g模型<br /><br />都是q样? q有多线E中,如果要控制线E数,不能L查询每个U程是否l束,要在每个U程l束时让U程自己告诉ȝE我l束?你可?br /><br />开新的U程?<br /><br />19. 问:(x)要介l一下compareToҎ(gu)<br />{:(x)<br />compareToҎ(gu)是Comparable 接口必需实现的方?只要实现Comparable <br /><br />可以用Arrays.srot()排序p实现Runnable接口的runpThread()一?<br /><br />20. 问:(x)如何可以从别的Web服务器检索页, 然后把检索到的网늚HTML代码储存在一个变量中q回q来<br />{:(x)q是一个简单的WEB ROBOT实现,用URLcdC|页中抓内容,然后自己写一个分析程序从中找出新的URL,不断递归下去p?<br /><br />21. 问:(x)applet中如何获得键盘的输入<br />{:(x)application的System.in是当前系l的标准输入,applet因ؓ(f)安全的原因不可能d当前pȝ(客户?的标准输?只能从它的ROOTlg?br /><br />事g?比如键盘?sh)g中取得键?<br /><br />22. 问:(x)怎样计算代码执行所p的时_(d)<br />{:(x)<br />代码开始取旉Q结束后取时_(d)相减<br />long t1 = System.currentTimeMillis();<br />///////////////// your code<br />long t2 = System.currentTimeMillis() ;<br />long time = t2-t1;<br /><br />23. 问:(x)如何获在E序中获得一个文件的ContentTypeQ?br />{:(x)<br />URL u = new URL("file:///aaa.txt");<br />URLConnection uc = u.openConnection();<br />String s = uc.getContentType();<br /><br />24. 问:(x)q接池的使用是徏立很多连接池Q还是一个连接池里用多个q接Q?br />{:(x)<br />只有在对象源不同的情况下才会(x)发生多个池化,如果你只q一l一个数据源,永远不要用多个连l池. 所以连l池的初始化一定要做成?rn)态的,?br /><br />且应该在构造对象之?也就是只有在cLOAD的时?别的时候不应该有Q何生成新的连l池的时候?br /><br />25. 问:(x)JavaMail要怎么安装Q?br />{:(x)下蝲两个包,一个是javamail包,另一个是jaf包。下载完直接把这两个包不解压加到CLASSPATH?br /><br />26. 问:(x)怎样把地址栏里的地址锁定Q?br />{:(x)把你的服务器的可讉K目录索引选项关闭p?M服务器都有一个conf文g,里面都有q个选项?br /><br />27. 问:(x)在JAVA中怎么取得环境变量啊。比如:(x) TEMP = CQTEMP Q?br />{:(x)String sss = System.getProperty(key)<br /><br />28. 问:(x)怎样实现四舍五入Q保留小数点后两位小敎ͼ<br />{:(x)<br />import java.text.*;<br />...<br />NumberFormat nf=NumberFormat.getNumberInstance();<br />nf.setMaximumFractionDigits(2);<br />nf.setMinimumFractionDigits(2);<br />nf.format(numb);<br /><br />29. 问:(x)Applet和form如何通信Q?br />{:(x)<br />取得的参C到param里面<br /><% <br />String xxx = request.getParameter("xxx"); <br />%> <br /><applet> <br /><param value="<%=xxx%>"> <br /></applet><br /><br /><br />30. 问:(x)java-plug-in是什么?<br />{:(x)Java Runtime Environment的插件。用来运行javaE序。不需要什么特别的讄。等于你的机器里面有?jin)jvm?br /><br />31. 问:(x)WEB上面怎么栯接上一个EXCEL表格Q?br />{:(x)<br />定义面得contentType="application/vnd.ms-excel"Q让面以excel得Ş式打开。同样也可以以word得Ş式打开Qapplication/msword?br /><br />32. 问:(x)怎样才能避免textarea字数限制Q?br />{:(x)是用了(jin)FORM的默认方法的~故,如果什么也不写默认是GET改用Post卛_Q在Form中定义mothod="post"?br /><br />33. 问:(x)Z么加?lt;%@page contentType="text/html;charset=gb2312" %>插入数据库的中文Q依然是qQ?br />{:(x)<br />q要从环境看,能显C明你的JSP引擎没有问题,但写入数据库时你的JDBC能不能处理中?同一公司不同版本的JDBC都有支持中文和不支持?br /><br />文的情况,RESIN自带的MYSQL JDBC׃支持,MM的就支持,q有你的数据库类型是否支持中?CHAR的一般支?但是否用binary存储双字节码<br /><br />34. 问:(x)对于JFrameQhide()Qshow()与setVisibel()有什么区别吗Q?br />{:(x)<br />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 <br /><br />be validated prior to being made visible. If t he Window is already visible, this will bring the Window to the front. 区别?br /><br />q?br />36. 问:(x)sendRedirectZ么不可以转到mms协议的地址的?response.sendRedirect("mms://missiah.adsldns.org:9394");<br />{:(x)javaq_目前实现的protocol中ƈ没有mms,你可以取pȝ属性java.protocol.handler.pkgs看看它的g有没有mms,所以如果要想重定向<br /><br />到mms://hostq样和URL,只有生成客户端的JAVASCRIPT让它来重定向<br /><br />37. 问:(x)JTable中怎样定义各个Columns和W(xu)idth和怎样讄表格的内定w做靠x居中Q?br />{:(x)<br />TableColumn tc = table.getColumn("Name");//取得列名?Name"的列Handle<br />int currentWidth = tc.getPreferredWidth(); //取得该列当前的宽?br />tc.setPreferredWidth(200); //讄当前列宽<br />tc.setMaxWidth(200); //讄该列最大宽?br />tc.setMinWidth(50); //讄该列最宽?br /><br />38. 问:(x)Ҏ(gu)作是否可用于select语句Q?br />{:(x)Ҏ(gu)作其实是指成批理更新的操?l对不可能用于select操作?br /><br />39. 问:(x)Z么jsp路径太深文g名太长就无法d文gQ?br />{:(x)path不能过255长度,不然找不到?q是作业pȝ的事?br /><br />40. 问:(x)如何让页面不保留~存Q?br />{:(x)<br /><% <br />response.setHeader("Pragma","No-cache"); <br />response.setHeader("Cache-Control","no-cache"); <br />response.setDateHeader("Expires", 0); <br />%><br /><br />41. 问:(x)我的applet code 中用到jbutton 时就出错是否׃ie不支持swing package 请问应怎么办?<br />{:(x)JBUTTON是SWING基本包啊,只要把jdk/jre/lib/rt.jar攑֜classpathp?不要加蝲M别的库?br /><br />42. 问:(x)不知道java是否支持midi格式Q如果支持,应该怎么把wave格式转换成midi格式Q?br />{:(x)目前q(sh)?可以看一下JMF三个版中对MIDI的格式支持是read only,而W(xu)AVE是read/write,MIDI只能播放,不能生成?br /><br />43. 问:(x)在jsp里面防止用户直接输入urlq去面Q应该怎么做呢Q?br />{:(x)<br />一是从web服务器控?Ҏ(gu)一目录的所有访问要通过验证.<br />二是在要讉K的页面中加入控制.q个一般用session,也可以用h状态码实现<br /><br />44. 问:(x)<br />例如后台有一计算应用E序Q此E序q算h很慢Q可持箋几分钟到几小Ӟq不,主要是能ȀzdQ,客户d提交后,服务器对?br /><br />务进行检无误后向服务器后台程序发送信息,q将其激zR要求如下:(x)<br />1Q首先将后台E序Ȁz,让它执行此Q务(比如Q前台将计算的C代码提交上后Q后台程序程序能马上调用Qƈ其q行Q?br />2Q要在前台JSP面中显C行过E信息(׃q行旉长,希望让客L(fng)到运行过E中产生的信息)(j)如何完成Q?br /><br />{:(x)<br />zL可以?q行一个shell让它去运行后台就?但不可能取出q行信息,因ؓ(f)HTTP的超旉制不可能永远{你后台q行?而且信息如果要动?br /><br />实时推出来就得用SERVER PUSH技术?br /><br />45. 问:(x)数据库是datetime ?Q插入当前时间到数据库?<br />{:(x)<br />java.sql.Date sqlDate = new java.sql.Date();<br />PreparedStatement pstmt = conn.prepareStatement("insert into foo(time) values(?)");<br />pstmt.setDate(1,sqlDate);<br />pstmt.executeUpdate();<br /><br />46. 问:(x)怎样L字符串前后的I格?br />{:(x)String.trim()<br /><br />47. 问:(x)session怎样存取intcd的变量?<br />{:(x)<br />session.setAttribute("int", i+"");<br />int i = Integer.parseInt(session.getAttribute("int"));<br /><br />48. 问:(x)在javascript中如何输出的floatcd的数据保留两位小数?br />{:(x)Math.round(aaaaa*100)/100?br /><br />49. 问:(x)在beanU如何调用session<br />{:(x)<br />你可把session对象作ؓ(f)一个参Clbean<br />在BEAN中定义HttpServletRequest request;HttpSession session;<br />然后<br />session = request.getSession(false);<br />false为如果session为空,不徏立新的session<br />session作ؓ(f)参数传入.其实只要request传入可?br /><br />50. 问:(x)如何把txt或word文g按原格式昄在jsp面或servlet上?<br />{:(x)<br />其实一个非常简单的解决Ҏ(gu)是在服务器的MIME中指点定TEXT和W(xu)ORD的解释方?然后用JSP或SERVLET生成它就行了(jin),客户端就?x)自动调用?br /><br />应程序打开你的文档?br />如果是希望按原格式的昄在页面上Q而不是调用其他程序打开那么你可以试试用WEBDEV协议,可以说这是MS的一个亮?它是在WEB方式下打开<br /><br />文档,和共享一?完全W合的要求?br /><br />51. 问:(x)object的cloneҎ(gu)Z么不能直接调用?<br />{:(x)<br />q个Ҏ(gu)在object中是protected<br />Z么要把这个方法定义ؓ(f)protected,q是一个折?sh)?它的目的是想知道你这个方法在Object里只是一个标?而不是一个实?比如<br /><br />public class Object<br />{<br />.............<br />protected Object clone()<br />{}<br />}<br /><br />所以直接承的clone()Ҏ(gu)q不能做M?你要使用q个Ҏ(gu)p重蝲q个Ҏ(gu)q放宽访问权限ؓ(f)public,或实现cloneable接口. 但它没法<br /><br />q样告诉你它没有真的实现,只好用protected Ҏ(gu)加以警示<br /><br />52. 问:(x)一个页面中如何h另外一个页面?<br />{:(x)<br />要求是这些面必L兌,一是它们都有一个共同的层?也就是说是一个内的分面,当然可以是Q意,帧内再分帧也可以,另一个可<br /><br />能是当前H口弹出的窗?如果没有联系,那就不可能用一个页面刷新另一个页? 帧内只要一U一U引用就行了(jin). <br /><br />比如在左帧中一个页面中写top.right.location.reload();那么名ؓ(f)right的右帧中的页面就?x)刷? 弹出的一?用open时的名称h子窗?<br /><br />子窗口用openerhȝ?br /><br />53. 问:(x)如何在jsp中怎么样向客户端写cookiesQ?br />{:(x)<br />Cookie coo = new Cookie(name, value);<br />HttpServletResponse.addCookie(name);<br /><br />54. 问:(x)Z么jTextField1.setText("aaabbb");jTextField2.setText("AAABBB"); 得到的字体宽度不一P<br />{:(x)是说如果不是指定ؓ(f){宽字体,每个字体的宽度都是不一L(fng).因此JAVA中用FontMetrics cL取字W宽度?br /><br />55. 问:(x)String kk=application/octet-stream; name="G:/SMBCrack.exe";如何得到SMBCrack.exeQ?br />{:(x)<br />q应该是解析上传时候的二进制流得到的这一行里面格式是固定的,取到name="后面的字W串Q然后把";L。然后取最后一?后面的所有字<br /><br />W组成一个新字符串就行了(jin)?br /><br />56. 问:(x)如何传值ƈ不刷新页面?<br />{:(x)<br />弹出一个页面进行值的选择或者输入,ok后用将gl原H口Q用javascript关闭打开的窗口即可:(x)<br />window.close();opener.focus();<br /><br />57. 问:(x)有一个字W串Q?EF0C114EA4"Q如何变?sh)a[0] = 0xEF a[1] = 0x0C a[2] = 0x11 a[3] = 0x4E a[4] = 0xA4Q?br />{:(x)<br />String str="EF0C114EA4F";<br />out.print(str+"<br>");<br />int l=str.length()/2+str.length()%2,j=0,k=0;<br />String[] a=new String[l];<br />for(int i=0;i<l;i++){<br />if(str.length()-j==1)<br />k=str.length();<br />else<br />k=j+2;<br />a="0x"+str.substring(j,k);<br />out.print("a["+Integer.toString(i)+"]="+a+"<br>");<br />j+=2;<br />}<br /><br />58. 问:(x)怎样一个int转换成一个四字节的byte数组Q?br />{:(x)<br />int x = 1234567;<br />byte[] b = new byte[4];<br />for(int i=0;i<b.length;i++)<br />{<br />b = (x >>( i*8)) & 0xFF;<br />}<br /><br />59. 问:(x)indexOf()的用需要注意什么?<br />{:(x)参数是指从第几位Q?Q?Q?Q?..Q开始搜索,而返回值是指搜索到的位|(0Q?Q?Q?.......Q注意是从零v的?br /><br />60. 问:(x)在Java应用E序中如何动态的d一个按钮?<br />{:(x)<br />q里涉及(qing)一个组仉l的问题,lg要先于panel被显CZ处存?如果一panel已经昄?那么加在上面你能看到?但如果在同一个panel? <br /><br />先有button A,假如按下它加?jin)butt on B,q时你如果整个panel重给,那么A本n要重l?它的事g监听没有了(jin),当然也就加不成B?所以如<br /><br />果要先有另一个panel,当按A时把B加在q个panel上ƈ重绘q个paenl,其实更好的方法是先把B加在panel?同一个也?把它setVisiable(flas<br /><br />e),按A时设?true?br /><br />61. 问:(x)book mybook=new book(bookid);book是servlet,出错?br />{:(x)<br />book是servlet,能book mybook=new book(bookid);<br />说明自己实现?jin)servlet容器?不然,servlet能让你自己去调用? servlet如果调用其实和EJBq?%的区别都没有,它们都是自己l承或实C些接<br /><br />?在这些父cL接口中实C(jin)如果和容?打交?的方?然后容器调用q些Ҏ(gu)来管理它,让它生成实例,池化,钝化,销?再生{?所以这?br /><br />写是错误的?br /><br />62. 问:(x)l定一个字W串5*(5+9)/7怎样计算出结果?<br />{:(x)<br />可有两种Ҏ(gu)<br />1。用堆栈完成<br />2。最单的Ҏ(gu)Q不用编E,如果有Q何一个数据库的化Q用select (5*(5+9)/7) from oneTable<br /><br />63. 问:(x)如何实现递交表单内容的加密解密?<br />{:(x)<br />如果你用IE目前只能用SSL协议,q一层不要你考虑,否则只你用你自己的工具加密传?接收后再解密?至于如何加解,如果要和公认的系l结<br /><br />?q通用的MD5,RAS{公开法,如果你只是自׃自己?你随便按你的x把数据加上一些东?取回来按规则减掉q些东西,我敢保证?br /><br />你自己没有Q何h能知道解密方?<br /><br />64. 问:(x)Z么Integer.parseInt("+1");?x)抛出NumberFormatException的异常?<br />{:(x)因ؓ(f)"+"q行在JAVA中被重蝲.pȝ无法定你用的是术加还是字W??br />q一点可以在JAVASCRIPT中更好地理解:<br /><form name="t"><input name=s value=1234></form><br />var a = document.t.s.value+1;<br />q时a = 12345,因ؓ(f)document.t.s.value作ؓ(f)字符?但var a = document.t.s.value-1;<br />a 是1233,因ؓ(f)pȝ知道-q算肯定是算术运?所以把document.t.s.value转换成数?<br /><br /><br />65. 问:(x)hashCode() 有什么用Z么有时候需要覆盖Object里的hashcode()Ҏ(gu)Q?br />{:(x)q就是这个对象的w䆾证啊,要不如何区分哪个对象?br /><br />66. 问:(x)怎样在tomcat中实C个定时执行的东东Q?br />{:(x)<br />在应用程序启动时自动q行。servlet2.3中定义了(jin)ServletListener,监听Servlet Con text的启动或则关闭(可在配置文g中配|)(j)Q启动时<br /><br />触发一个守护程序的q行(可以实现java.util.Timer或则 javax.swing.Timer).<br /><br />67. 问:(x)E序可以输出自己吗?<br />{:(x)孔d(zhn)论q个非常有名的法?是说Q何程序都不可能输?gu)?<br /><br />68. 问:(x)能够把字W{化成ASCII码?比如?A 转化?65Q?br />{:(x)<br />int a='A';<br />out.println(a);<br /><br />69. 问:(x)如何区分输入的文字中的全角与半角Q?br />{:(x)׃不能分L出全角和半角字符的值有什么规?只好把全角符L(fng)丑և来了(jin).<br /><br />70. 问:(x)用户注册后的自动发信E序该怎么做?<br />{:(x)<br />q种发信E序不考虑性能,因ؓ(f)不可?U就有一个h注册,我们说的考虑性能的发信程序是指上百万信在队列里要不停发送的那种,象你q个<br /><br />随便怎么写一个程序都?没有必要用JAVAMAIL.只要指定一个发信的服务器然后用cocketq它?5口就行了(jin).自己用SOCKETqSMTP?5口发一?br /><br />信就好象两个d之间送一样东?直接递过d?用JAVAMAIL,消息机制是你把q个东西从邮局寄给你的d? <img src ="http://www.tkk7.com/nbtymm/aggbug/59773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/nbtymm/" target="_blank">nbt</a> 2006-07-24 12:04 <a href="http://www.tkk7.com/nbtymm/archive/2006/07/24/59773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文g上传实现http://www.tkk7.com/nbtymm/archive/2006/07/06/56885.htmlnbtnbtThu, 06 Jul 2006 00:35:00 GMThttp://www.tkk7.com/nbtymm/archive/2006/07/06/56885.htmlhttp://www.tkk7.com/nbtymm/comments/56885.htmlhttp://www.tkk7.com/nbtymm/archive/2006/07/06/56885.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/56885.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/56885.html 文g上传在web应用中非常普遍,要在servlet/jsp环境中实现文件上传功能非常容易,因ؓ(f)|上已经有许多用java开发的lg用于文g上传Q本文以commons-fileuploadlgZQؓ(f)servlet/jsp应用d文g上传功能?/font>

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>

 (tng)1 (tng)import (tng)java.io.* ;
 (tng)2 (tng)import (tng)java.util.*
;
 (tng)3 (tng)import (tng)javax.servlet.*
;
 (tng)4 (tng)import (tng)javax.servlet.http.*
;
 (tng)5 (tng)import (tng)org.apache.commons.fileupload.*
;
 (tng)6 (tng)

 (tng)7 (tng)public (tng)class (tng)Upload (tng)extends  (tng)HttpServlet (tng){
 (tng)8 (tng)

 (tng)9 (tng) (tng) (tng) (tng) (tng)private (tng)String (tng)uploadPath (tng)= (tng)"C:\\upload\\"; (tng)// (tng)用于存放上传文g的目?/span>
10 (tng) (tng) (tng) (tng) (tng)private (tng)String (tng)tempPath (tng)= (tng)"C:\\upload\\tmp\\"; (tng)// (tng)用于存放临时文g的目?/span>
11 (tng)
12 (tng) (tng) (tng) (tng) (tng)public (tng)void  (tng)doPost(HttpServletRequest (tng)request, (tng)HttpServletResponse (tng)response)
13 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)throws
 (tng)I(yng)OException, (tng)ServletException
14 (tng)
 (tng) (tng) (tng) (tng){
15 (tng)
 (tng) (tng) (tng) (tng)}
16 (tng)
}
17 (tng)

18 (tng)//当servlet收到览器发出的Posth后,在doPost()Ҏ(gu)中实现文件上传。以下是CZ代码Q?/span>
19 (tng)
20 (tng)public (tng)void  (tng)doPost(HttpServletRequest (tng)request, (tng)HttpServletResponse (tng)response)
21 (tng) (tng) (tng) (tng) (tng)throws
 (tng)I(yng)OException, (tng)ServletException
22 (tng)
{
23 (tng) (tng) (tng) (tng) (tng)try
 (tng){
24 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)DiskFileUpload (tng)fu (tng)= (tng)new
 (tng)DiskFileUpload();
25 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// (tng)讄最大文件尺寸,q里?MB

26 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)fu.setSizeMax(4194304 );
27 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// (tng)讄~冲区大,q里?kb

28 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)fu.setSizeThreshold(4096 );
29 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// (tng)讄临时目录Q?/span>

30 (tng)  (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)fu.setRepositoryPath(tempPath);
31 (tng)

32 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// (tng)得到所有的文gQ?/span>
33 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)List (tng)fileItems (tng)=  (tng)fu.parseRequest(request);
34 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)I(yng)terator (tng)i (tng)=
 (tng)fileItems.iterator();
35 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// (tng)依次处理每一个文Ӟ(x)

36 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)while (i.hasNext()) (tng){
37 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)FileItem (tng)fi (tng)=
 (tng)(FileItem)i.next();
38 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// (tng)获得文g名,q个文g名包括\径:(x)

39 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)String (tng)fileName (tng)=  (tng)fi.getName();
40 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)if(fileName!=null
) (tng){
41 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)//
 (tng)在这里可以记录用户和文g信息
42 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)//
 (tng)
43 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// (tng)写入文ga.txtQ你也可以从fileName中提取文件名Q?/span>

44 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)fi.write(new (tng)File(uploadPath (tng)+ (tng)"a.txt" ));
45 (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}
46 (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}
47 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// (tng)跌{C传成功提C页?/span>

48 (tng)  (tng) (tng) (tng) (tng)}
49 (tng) (tng) (tng) (tng) (tng)catch
(Exception (tng)e) (tng){
50 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// (tng)可以跌{出错面

51 (tng)  (tng) (tng) (tng) (tng)}
52 (tng)
}
53 (tng)

54 (tng)//如果要在配置文g中读取指定的上传文g夹,可以在init()Ҏ(gu)中执行:(x)
55 (tng)
56 (tng)public (tng)void (tng)init() (tng)throws  (tng)ServletException (tng){
57 (tng) (tng) (tng) (tng) (tng)uploadPath (tng)=
 (tng).
58 (tng) (tng) (tng) (tng) (tng)tempPath (tng)=
 (tng).
59 (tng) (tng) (tng) (tng) (tng)// (tng)文g夹不存在p动创建:(x)

60 (tng) (tng) (tng) (tng) (tng)if(!new  (tng)File(uploadPath).isDirectory())
61 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)new
 (tng)File(uploadPath).mkdirs();
62 (tng) (tng) (tng) (tng) (tng)if(!new
 (tng)File(tempPath).isDirectory())
63 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)new
 (tng)File(tempPath).mkdirs();
64 (tng)
}
65 (tng)

~译该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)

 (tng)1 (tng)<?xml (tng)version="1.0" (tng)encoding="ISO-8859-1"?>
 (tng)2 (tng)<! DOCTYPE (tng)web-app
 (tng)3 (tng)
 (tng) (tng) (tng) (tng)PUBLIC (tng)"-//Sun (tng)Microsystems, (tng)I(yng)nc.//DTD (tng)Web (tng)Application (tng)2.3//EN"
 (tng)4 (tng) (tng) (tng) (tng) (tng)"http://java.sun.com/dtd/web-app_2_3.dtd">

 (tng)5 (tng)
 (tng)6 (tng)<web-app>
 (tng)7 (tng) (tng) (tng) (tng) (tng)<servlet>
 (tng)8 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)<servlet-name>Upload</servlet-name>
 (tng)9 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)<servlet-class>Upload</servlet-class>
10 (tng) (tng) (tng) (tng) (tng)</servlet>
11 (tng)
12 (tng) (tng) (tng) (tng) (tng)<servlet-mapping>
13 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)<servlet-name>Upload</servlet-name>
14 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)<url-pattern>/fileupload</url-pattern>
15 (tng) (tng) (tng) (tng) (tng)</servlet-mapping>
16 (tng)</web-app>
17 (tng)
配置好servlet后,启动tomcatQ写一个简单的html试Q?/font>
1 (tng)<form (tng)action="fileupload" (tng)method="post"
2 (tng)enctype="multipart/form-data" (tng)name="form1">
3 (tng) (tng) (tng)<input (tng)type="file" (tng)name="file">
4 (tng) (tng) (tng)<input (tng)type="submit" (tng)name="Submit" (tng)value="upload">
5 (tng)</form>

注意action="fileupload"其中fileupload是配|servlet时指定的url-pattern?br />
摘自Q?/font> http://www.j2medev.com/Article/Class10/j2eeopensource/200409/62.html



nbt 2006-07-06 08:35 发表评论
]]>
对Servlet的初始化的理?http://www.tkk7.com/nbtymm/archive/2006/06/12/52168.htmlnbtnbtMon, 12 Jun 2006 03:53:00 GMThttp://www.tkk7.com/nbtymm/archive/2006/06/12/52168.htmlhttp://www.tkk7.com/nbtymm/comments/52168.htmlhttp://www.tkk7.com/nbtymm/archive/2006/06/12/52168.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/52168.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/52168.html 版权所有,转蝲请声明出? zhyiwww@163.com

在读我自q认识之前 , 我们先来看一?/span> servet 的结构图 :

servlet.png
以下是我自己的一Ҏ(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>



nbt 2006-06-12 11:53 发表评论
]]>
介绍一关于session的好文章,写的很详l?/title><link>http://www.tkk7.com/nbtymm/archive/2006/06/09/51711.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Fri, 09 Jun 2006 07:54:00 GMT</pubDate><guid>http://www.tkk7.com/nbtymm/archive/2006/06/09/51711.html</guid><wfw:comment>http://www.tkk7.com/nbtymm/comments/51711.html</wfw:comment><comments>http://www.tkk7.com/nbtymm/archive/2006/06/09/51711.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/nbtymm/comments/commentRss/51711.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/nbtymm/services/trackbacks/51711.html</trackback:ping><description><![CDATA[ <div> <span> <span>摘要Q虽然session机制在web应用E序中被采用已经很长旉?jin),但是仍然有很多h不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制ƈ且对在Java (tng)web (tng)application中应用session机制时常见的问题?sh)出解答?br /><br />目录Q?br />一、术语session<br />二、HTTP协议与状态保?br />三、理解cookie机制<br />四、理解session机制<br />五、理解javax.servlet.http.HttpSession<br />六、HttpSession常见问题<br />七、跨应用E序的session׃n<br />八、ȝ<br />参考文?br /><br />一、术语session<br />在我的经验里Qsessionq个词被滥用的程度大概仅ơ于transactionQ更加有的是transaction与session在某些语境下的含义是相同的?br /><br />sessionQ中文经常翻译ؓ(f)?x)话Q其本来的含义是指有始有l的一pd动作/消息Q比如打?sh)话时从拿v?sh)话拨号到挂断?sh)话这中间的一pdq程可以UCZ个?tng)session。有时候我们可以看到这L(fng)话“在一个浏览器?x)话期间Q?..”,q里的会(x)话一词用的就是其本义Q是指从一个浏览器H口打开到关闭这个期闾b①。最混ؕ的是“用P客户端)(j)在一ơ会(x)话期间”这样一句话Q它可能指用L(fng)一pd动作Q一般情况下是同某个具体目的相关的一pd动作Q比如从d到选购商品到结账登?gu)样一个网上购物的q程Q有时候也被称Z个transactionQ,然而有时候也可能仅仅是指一ơ连接,也有可能是指含义①,其中的差别只能靠上下文来推断②?br /><br />然而当session一词与|络协议相关联时Q它又往往隐含?jin)“面向连接”和/或“保持状态”这样两个含义, (tng)“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电(sh)话,直到Ҏ(gu)接了(jin)?sh)话通信才能开始,与此相对的是写信Q在你把信发出去的时候你q不能确认对方的地址是否正确Q通信渠道不一定能建立Q但对发信h来说Q通信已经开始了(jin)。“保持状态”则是指通信的一方能够把一pd的消息关联v来,使得消息之间可以互相依赖Q比如一个服务员能够认出再次光(f)的老顾客ƈ且记得上ơ这个顾客还?gu)Ơ店里一块钱。这一cȝ例子有“一个TCP (tng)session”或者?tng)“一个POP3 (tng)session”③?br /><br />而到?jin)web服务器蓬勃发展的时代Qsession在web开发语境下的语义又有了(jin)新的扩展Q它的含义是指一cȝ来在客户端与服务器之间保持状态的解决Ҏ(gu)④。有时候session也用来指q种解决Ҏ(gu)的存储结构,如“把xxx保存在session (tng)里”⑤。由于各U用于web开发的语言在一定程度上都提供了(jin)对这U解x案的支持Q所以在某种特定语言的语境下Qsession也被用来指代该语a的解x案,比如l常把Java里提供的javax.servlet.http.HttpSessionUCؓ(f)session⑥?br /><br />鉴于q种混ؕ已不可改变,本文中session一词的q用也会(x)Ҏ(gu)上下文有不同的含义,请大家注意分辨?br />在本文中Q用中文“浏览器?x)话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表辑֐义⑤Q用具体的“HttpSession”来表达含义?br /><br />二、HTTP协议与状态保?br />HTTP (tng)协议本n是无状态的Q这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器h下蝲某些文gQ无论是客户端还是服务器都没有必要纪录彼此过ȝ行ؓ(f)Q每一ơ请求之间都是独立的Q好比一个顾客和一个自动售货机或者一个普通的Q非?x)员Ӟ?j)大卖Z间的关系一栗?br /><br />然而聪明(或者贪?j)?Q的Z很快发现如果能够提供一些按需生成的动态信息会(x)使web变得更加有用Q就像给有线?sh)视加上?gu)功能一栗这U需求一斚wqHTML逐步d?jin)表单、脚本、DOM{客L(fng)行ؓ(f)Q另一斚w在服务器端则出现?jin)CGI规范以响应客L(fng)的动态请求,作ؓ(f)传输载体的HTTP协议也添加了(jin)文g上蝲、?tng)cookieq些Ҏ(gu)。其中cookie的作用就是ؓ(f)?jin)解决HTTP协议无状态的~陷所作出的努力。至于后来出现的session机制则是又一U在客户端与服务器之间保持状态的解决Ҏ(gu)?br /><br />让我们用几个例子来描qC下cookie和session机制之间的区别与联系。笔者曾l常ȝ一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠Q然而一ơ性消?杯咖啡的Z(x)微乎其微Q这时就需要某U方式来U录某位֮的消Ҏ(gu)量。想象一下其实也无外乎下面的几种Ҏ(gu)Q?br />1、该店的店员很厉宻I能记住每位顾客的消费数量Q只要顾客一走进咖啡店,店员q道该怎么对待?jin)。这U做法就是协议本w支持状态?br />2、发l顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每ơ消Ҏ(gu)Q如果顾客出C张卡片,则此ơ消费就?x)与以前或以后的消费相联pv来。这U做法就是在客户端保持状态?br />3、发l顾客一张会(x)员卡Q除?jin)卡号之外什么信息也不纪录,每次消费Ӟ如果֮出示该卡片,则店员在店里的纪录本上找到这个卡号对应的U录d一些消费信息。这U做法就是在服务器端保持状态?br /><br />׃HTTP协议是无状态的Q而出于种U考虑也不希望使之成ؓ(f)有状态的Q因此,后面两种Ҏ(gu)成为现实的选择。具体来说cookie机制采用的是在客L(fng)保持状态的Ҏ(gu)Q而session机制采用的是在服务器端保持状态的Ҏ(gu)。同时我们也看到Q由于采用服务器端保持状态的Ҏ(gu)在客L(fng)也需要保存(sh)个标识,所以session机制可能需要借助于cookie机制来达C存标识的目的Q但实际上它q有其他选择?br /><br />三、理解cookie机制 (tng)<br />cookie机制的基本原理就如上面的例子一L(fng)单,但是q有几个问题需要解冻I(x)“会(x)员卡”如何分发;“会(x)员卡”的内容Q以?qing)客户如何用“会(x)员卡”?br /><br />正统的cookie分发是通过扩展HTTP协议来实现的Q服务器通过在HTTP的响应头中加上一行特D的指示以提C浏览器按照指示生成相应的cookie。然而纯_的客户端脚本如JavaScript或者VBScript也可以生成cookie?br /><br />而cookie (tng)的用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器(g)查所有存储的cookieQ如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置Q则把该cookie附在h资源的HTTPh头上发送给服务器。意思是麦当劳的?x)员卡只能在麦当劳的店里出示Q如果某家分店还发行?jin)自q?x)员卡,那么q这家店的时候除?jin)要出示麦当劳的会(x)员卡,q要出示q家店的?x)员卡?br /><br />cookie的内容主要包括:(x)名字Q|q期旉Q\径和域?br />其中域可以指定某一个域比如.google.comQ相当于d招牌Q比如宝z公司,也可以指定一个域下的具体某台机器比如www.google.com或者f(xi)roogle.google.comQ可以用飘柔来做比?br />路径是跟在域名后面的URL路径Q比?或?foo{等Q可以用某飘柔专柜做比?br />路径与域合在一起就构成?jin)cookie的作用范围?br />如果不设|过期时_(d)则表C个cookie的生命期为浏览器?x)话期间Q只要关闭浏览器H口Qcookie消׃(jin)。这U生命期为浏览器?x)话期的?tng)cookie被称Z(x)话cookie。会(x)话cookie一般不存储在硬盘(sh)而是保存在内存里Q当然这U行为ƈ不是规范规定的。如果设|了(jin)q期旉Q浏览器׃(x)把cookie保存到硬盘(sh)Q关闭后再次打开览器,q些cookie仍然有效直到过讑֮的过期时间?br /><br />存储在硬盘(sh)的cookie (tng)可以在不同的览器进E间׃nQ比如两个IEH口。而对于保存在内存里的cookieQ不同的览器有不同的处理方式。对于IEQ在一个打开的窗口上按?tng)Ctrl-NQ或者从文g菜单Q打开的窗口可以与原窗口共享,而用其他方式新开的IEq程则不能共享已l打开的窗口的内存cookieQ对于?tng)Mozilla (tng)Firefox0.8Q所有的q程和标{N都可以共享同L(fng)cookie。一般来说是用javascript的window.open打开的窗口会(x)与原H口׃n内存cookie。浏览器对于?x)话cookie的这U只认cookie不认人的处理方式l常l采用session机制的web应用E序开发者造成很大的困扰?br /><br />下面是一个goolge讄cookie的响应头的例?br />HTTP/1.1 (tng)302 (tng)Found<br />Location: (tng)<a ></a><a ><u><font color="#0000ff">http://www.google.com/intl/zh-CN/</font></u></a><br />Set-Cookie: (tng)PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; (tng)expires=Sun, (tng)17-Jan-2038 (tng)19:14:07 (tng)GMT; (tng)path=/; (tng)domain=.google.com<br />Content-Type: (tng)text/html<br /><br /><br /><br /><br />q是使用HTTPLookq个HTTP (tng)Sniffer软g来俘L(fng)HTTP通讯U录的一部分<br /><br /><br /><br /><br />览器在再次讉Kgoolge的资源时自动向外发送cookie<br /><br /><br /><br /><br />使用Firefox可以很容易的观察现有的cookie的?br />使用HTTPLook配合F(tun)irefox可以很容易的理解cookie的工作原理?br /><br /><br /><br /><br />IE也可以设|在接受cookie前询?br /><br /><br /><br /><br />q是一个询问接受cookie的对话框?br /><br />四、理解session机制<br />session机制是一U服务器端的机制Q服务器使用一U类g散列表的l构Q也可能是使用散列表)(j)来保存(sh)息?br /><br />当程序需要ؓ(f)某个客户端的h创徏一个session的时候,服务器首先检查这个客L(fng)的请求里是否已包含了(jin)一个session标识 (tng)- (tng)UCؓ(f) (tng)session (tng)idQ如果已包含一个session (tng)id则说明以前已lؓ(f)此客L(fng)创徏qsessionQ服务器按照session (tng)id把这个?tng)session(g)索出来用(如果(g)索不刎ͼ可能?x)新Z个)(j)Q如果客L(fng)h不包含session (tng)idQ则为此客户端创Z个sessionq且生成一个与此session相关联的session (tng)idQsession (tng)id的值应该是一个既不会(x)重复Q又不容易被扑ֈ规律以仿造的字符Ԍq个 (tng)session (tng)id被在本ơ响应中q回l客L(fng)保存?br /><br />保存q个session (tng)id的方式可以采用cookieQ这样在交互q程中浏览器可以自动的按照规则把q个标识发挥l服务器。一般这个cookie的名字都是类gSEEESIONIDQ而。比如weblogic对于web应用E序生成的cookieQJSESSIONID= (tng)ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764Q它的名字就是?tng)JSESSIONID?br /><br />׃cookie可以被h为的止Q必L其他机制以便在cookie被禁止时仍然能够把session (tng)id传递回服务器。经常被使用的一U技术叫做URL重写Q就是把session (tng)id直接附加在URL路径的后面,附加方式也有两种Q一U是作ؓ(f)URL路径的附加信息,表现形式?a href="http://...../xxx;jsessionid="></a><a href="http://...../xxx;jsessionid="><u><font color="#0000ff">http://...../xxx;jsessionid=</font></u></a> (tng)ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764<br />另一U是作ؓ(f)查询字符串附加在URL后面Q表现Ş式ؓ(f)<a href="http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"></a><a href="http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"><u><font color="#0000ff">http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764</font></u></a><br />q两U方式对于用h说是没有区别的,只是服务器在解析的时候处理的方式不同Q采用第一U方式也有利于把session (tng)id的信息和正常E序参数区分开来?br />Z(jin)在整个交互过E中始终保持状态,必d每个客户端可能请求的路径后面都包含这个session (tng)id?br /><br />另一U技术叫做表单隐藏字Dc(din)就是服务器?x)自动修改表单,d一个隐藏字D,以便在表单提交时能够把session (tng)id传递回服务器。比如下面的表单<br /><form (tng)name="testform" (tng)action="/xxx"><br /><input (tng)type="text"><br /></form><br />在被传递给客户端之前将被改写成<br /><form (tng)name="testform" (tng)action="/xxx"><br /><input (tng)type="hidden" (tng)name="jsessionid" (tng)value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"><br /><input (tng)type="text"><br /></form><br />q种技术现在已较少应用Q笔者接触过的很古老的iPlanet6(SunONE应用服务器的前n)׃用了(jin)q种技术?br />实际上这U技术可以简单的用对action应用URL重写来代ѝ?br /><br />在谈论session机制的时候,常常听到q样一U误解“只要关闭浏览器Qsession消׃(jin)”。其实可以想象一下会(x)员卡的例子,除非֮d对店家提出销卡,否则店家l对不会(x)L删除֮的资料。对session来说也是一L(fng)Q除非程序通知服务器删除一个sessionQ否则服务器?x)一直保留,E序一般都是在用户做log (tng)off的时候发个指令去删除session。然而浏览器从来不会(x)d在关闭之前通知服务器它?yu)要关闭Q因此服务器Ҏ(gu)不会(x)有机?x)知道浏览器已经关闭Q之所以会(x)有这U错觉,是大部分session机制都用会(x)话cookie来保存session (tng)idQ而关闭浏览器后这个?tng)session (tng)id消׃(jin)Q再ơ连接服务器时也无法找到原来的session。如果服务器讄的cookie被保存到盘?sh),或者用某U手D|写浏览器发出的HTTPh_(d)把原来的session (tng)id发送给服务器,则再ơ打开览器仍然能够找到原来的session?br /><br />恰恰是由于关闭浏览器不会(x)Dsession被删除,q服务器ؓ(f)seesion讄?jin)一个失效时_(d)当距dL(fng)上一ơ用session的时间超q这个失效时间时Q服务器可以认为客L(fng)已经停止?jin)活动,才?x)把session删除以节省存储空间?br /><br />五、理解javax.servlet.http.HttpSession<br />HttpSession是Javaq_对session机制的实现规范,因ؓ(f)它仅仅是个接口,具体到每个web应用服务器的提供商,除了(jin)对规范支持之外,仍然?x)有一些规范里没有规定的细微差异。这里我们以BEA的Weblogic (tng)Server8.1作ؓ(f)例子来演C?br /><br />首先QW(xu)eblogic (tng)Server提供?jin)一pd的参数来控制它的HttpSession的实玎ͼ包括使用cookie的开关选项Q用URL重写的开关选项Qsession持久化的讄Qsession失效旉的设|,以及(qing)针对cookie的各U设|,比如讄cookie的名字、\径、域Q?tng)cookie的生存时间等?br /><br />一般情况下Qsession都是存储在内存里Q当服务器进E被停止或者重启的时候,内存里的session也会(x)被清I,如果讄?jin)session的持久化Ҏ(gu),服务器就?x)把session保存到硬盘(sh)Q当服务器进E重新启动或q些信息能够被再次使用Q?tng)Weblogic (tng)Server支持的持久性方式包括文件、数据库、客L(fng)cookie保存和复制?br /><br />复制严格说来不算持久化保存,因ؓ(f)session实际上还是保存在内存里,不过同样的信息被复制到各个cluster内的服务器进E中Q这样即使某个服务器q程停止工作也仍然可以从其他q程中取得session?br /><br />cookie生存旉的设|则?x)?jing)响浏览器生成的cookie是否是一个会(x)话cookie。默认是使用?x)话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解?br /><br />cookie的\径对于web应用E序来说是一个非帔R要的选项QW(xu)eblogic (tng)Server对这个选项的默认处理方式得它与其他服务器有明昄区别。后面我们会(x)专题讨论?br /><br />关于session的设|参考[5] (tng)<a ></a><a ><u><font color="#0000ff">http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869</font></u></a><br /><br />六、HttpSession常见问题<br />Q在本小节中session的含义ؓ(f)⑤和⑥的混合Q?br /><br /><br />1、session在何时被创徏<br />一个常见的误解是以为session在有客户端访问时p创徏Q然而事实是直到某server端程序调用?tng)HttpServletRequest.getSession(true)q样的语句时才被创徏Q注意如果JSP没有昄的用?lt;% (tng)@page (tng)session="false"%> (tng)关闭sessionQ则JSP文g在编译成Servlet时将?x)自动加上这样一条语句?tng)HttpSession (tng)session (tng)= (tng)HttpServletRequest.getSession(true);q也是JSP中隐含的 (tng)session对象的来历?br /><br />׃session?x)消耗内存资源,因此Q如果不打算使用sessionQ应该在所有的JSP中关闭它?br /><br />2、session何时被删?br />l合前面的讨论,session在下列情况下被删除a.E序调用HttpSession.invalidate();或b.距离上一ơ收到客L(fng)发送的session (tng)id旉间隔过?jin)session的超时设|?或c.服务器进E被停止Q非持久sessionQ?br /><br />3、如何做到在览器关闭时删除session<br />严格的讲Q做不到q一炏V可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进E这些非常规手段仍然无能为力?br /><br />4、有个HttpSessionListener是怎么回事<br />你可以创L(fng)listenerȝ控session的创建和销毁事Ӟ使得在发生这L(fng)事g时你可以做一些相应的工作。注意是session的创建和销毁动作触发listenerQ而不是相反。类似的与HttpSession有关的listenerq有 (tng)HttpSessionBindingListenerQHttpSessionActivationListener和?tng)HttpSessionAttributeListener?br /><br />5、存攑֜session中的对象必须是可序列化的?br />不是必需的。要求对象可序列化只是ؓ(f)?jin)session能够在集中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在 (tng)Weblogic (tng)Server的session中放|一个不可序列化的对象在控制C?x)收C个警告。我所用过的某个iPlanet版本如果 (tng)session中有不可序列化的对象Q在session销毁时?x)有一个ExceptionQ很奇怪?br /><br />6、如何才能正的应付客户端禁止cookie的可能?br />Ҏ(gu)有的URL使用URL重写Q包括超链接Qform的actionQ和重定向的URLQ具体做法参见[6]<br /><a ></a><a ><u><font color="#0000ff">http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770</font></u></a><br /><br />7、开两个览器窗口访问应用程序会(x)使用同一个sessionq是不同的session<br />参见W三节对cookie的讨论,对session来说是只认id不认人,因此不同的浏览器Q不同的H口打开方式以及(qing)不同的cookie存储方式都会(x)对这个问题的{案有媄(jing)响?br /><br />8、如何防止用h开两个览器窗口操作导致的session混ؕ<br />q个问题?sh)防止表单多ơ提交是cM的,可以通过讄客户端的令牌来解冟뀂就是在服务器每ơ生成一个不同的idq回l客L(fng)Q同时保存在session里,客户端提交表单时必须把这个id也返回服务器Q程序首先比较返回的id与保存在session里的值是否一_(d)如果不一致则说明本次操作已经被提交过?jin)。可以参看《J2EE核心(j)模式》关于表C层模式的部分。需要注意的是对于用javascript (tng)window.open打开的窗口,一般不讄q个idQ或者用单独的idQ以防主H口无法操作Q徏议不要再window.open打开的窗口里做修Ҏ(gu)作,q样可以不用设|?br /><br />9、ؓ(f)什么在Weblogic (tng)Server中改变session的值后要重新调用一ơsession.setValue<br />做这个动作主要是Z(jin)在集环境中提示Weblogic (tng)Server (tng)session中的值发生了(jin)改变Q需要向其他服务器进E复制新的session倹{?br /><br />10、ؓ(f)什么session不见?br />排除session正常失效的因素之外,服务器本w的可能性应该是微乎其微的,虽然W者在iPlanet6SP1加若q补丁的Solaris版本上倒也遇到q;览器插件的可能性次之,W者也遇到q?721插g造成的问题;理论上防火墙或者代理服务器在cookie处理上也有可能会(x)出现问题?br />出现q一问题的大部分原因都是E序的错误,最常见的就是在一个应用程序中去访问另外一个应用程序。我们在下一节讨个问题?br /><br />七、跨应用E序的session׃n<br /><br />常常有这L(fng)情况Q一个大目被分割成若干项目开发,Z(jin)能够互不q扰Q要求每个小目作ؓ(f)一个单独的web应用E序开发,可是C(jin)最后突然发现某几个项目之间需要共享一些信息,或者想使用session来实现SSO(single (tng)sign (tng)on)Q在session中保存login的用户信息,最自然的要求是应用E序间能够访问彼此的session?br /><br />然而按照Servlet规范Qsession的作用范围应该仅仅限于当前应用程序下Q不同的应用E序之间是不能够互相讉KҎ(gu)的session的。各个应用服务器从实际效果上都遵守了(jin)q一规范Q但是实现的l节却可能各有不同,因此解决跨应用程序session׃n的方法也各不相同?br /><br />首先来看一下Tomcat是如何实现web应用E序之间session的隔ȝQ从 (tng)Tomcat讄的cookie路径来看Q它对不同的应用E序讄的cookie路径是不同的Q这样不同的应用E序所用的session (tng)id是不同的Q因此即使在同一个浏览器H口里访问不同的应用E序Q发送给服务器的session (tng)id也可以是不同的?br /><br /><br /> (tng) (tng)<br /><br />Ҏ(gu)q个Ҏ(gu),我们可以推测Tomcat中session的内存结构大致如下?br /><br /><br /><br /><br />W者以前用q的iPlanet也采用的是同L(fng)方式Q估计SunONE与iPlanet之间不会(x)有太大的差别。对于这U方式的服务器,解决的思\很简单,实际实行h也不难。要么让所有的应用E序׃n一个session (tng)idQ要么让应用E序能够获得其他应用E序的session (tng)id?br /><br />iPlanet中有一U很单的Ҏ(gu)来实现共享一个session (tng)idQ那是把各个应用程序的cookie路径都设?Q实际上应该?NASAppQ对于应用程序来讲它的作用相当于根)(j)?br /><session-info><br /><path>/NASApp</path><br /></session-info><br /><br />需要注意的是,操作׃n的session应该遵@一些编E约定,比如在session (tng)attribute名字的前面加上应用程序的前缀Q得?tng)setAttribute("name", (tng)"neo")变成setAttribute("app1.name", (tng)"neo")Q以防止命名I间冲突Q导致互相覆盖?br /><br /><br />在Tomcat中则没有q么方便的选择。在Tomcat版本3上,我们q可以有一些手D|׃nsession。对于版?以上的TomcatQ目前笔者尚未发现简单的办法。只能借助于第三方的力量,比如使用文g、数据库、JMS或者客L(fng)cookieQURL参数或者隐藏字D늭手段?br /><br />我们再看一下Weblogic (tng)Server是如何处理session的?br /><br /><br /> (tng) (tng)<br /><br />从截屏画面上可以看到Weblogic (tng)ServerҎ(gu)有的应用E序讄的cookie的\径都?Q这是不是意味着在Weblogic (tng)Server中默认的可以共享session?jin)呢Q然而一个小实验卛_证明即不同的应用程序用的是同一个sessionQ各个应用程序仍然只能访问自己所讄的那些属性。这说明Weblogic (tng)Server中的session的内存结构可能如?br /><br /><br /><br /><br />对于q样一U结构,在?tng)session机制本n上来解决session׃n的问题应该是不可能的?jin)。除?jin)借助于第三方的力量,比如使用文g、数据库、JMS或者客L(fng) (tng)cookieQURL参数或者隐藏字D늭手段Q还有一U较为方便的做法Q就是把一个应用程序的session攑ֈServletContext中,q样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下,<br /><br />应用E序A<br />context.setAttribute("appA", (tng)session); (tng)<br /><br />应用E序B<br />contextA (tng)= (tng)context.getContext("/appA");<br />HttpSession (tng)sessionA (tng)= (tng)(HttpSession)contextA.getAttribute("appA"); (tng)<br /><br />值得注意的是q种用法不可ULQ因为根据ServletContext的JavaDocQ应用服务器可以处于安全的原因对于context.getContext("/appA");q回I|以上做法在Weblogic (tng)Server (tng)8.1中通过?br /><br />那么Weblogic (tng)ServerZ么要把所有的应用E序的cookie路径都设?呢?原来是ؓ(f)?jin)SSOQ凡是共享这个session的应用程序都可以׃n认证的信息。一个简单的实验可以证明这一点,修改首先d的那个应用程序的描述Wweblogic.xmlQ把cookie路径修改?appA (tng)讉K另外一个应用程序会(x)重新要求dQ即使是反过来,先访问cookie路径?的应用程序,再访问修改过路径的这个,虽然不再提示dQ但是登录的用户信息也会(x)丢失。注意做q个实验时认证方式应该用FORMQ因为浏览器和web服务器对basic认证方式有其他的处理方式Q第二次h的认证不是通过 (tng)session来实现的。具体请参看[7] (tng)secion (tng)14.8 (tng)AuthorizationQ你可以修改所附的CZE序来做q些试验?br /><br />八、ȝ<br />session机制本nq不复杂Q然而其实现和配|上的灵zL却使得具体情况复杂多变。这也要求我们不能把仅仅某一ơ的l验或者某一个浏览器Q服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析?br />摘要Q虽然session机制在web应用E序中被采用已经很长旉?jin),但是仍然有很多h不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制ƈ且对在Java (tng)web (tng)application中应用session机制时常见的问题?sh)出解答?/span> </span> </div> <img src ="http://www.tkk7.com/nbtymm/aggbug/51711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/nbtymm/" target="_blank">nbt</a> 2006-06-09 15:54 <a href="http://www.tkk7.com/nbtymm/archive/2006/06/09/51711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet/JSP服务器端的重定向http://www.tkk7.com/nbtymm/archive/2006/06/09/51699.htmlnbtnbtFri, 09 Jun 2006 07:32:00 GMThttp://www.tkk7.com/nbtymm/archive/2006/06/09/51699.htmlhttp://www.tkk7.com/nbtymm/comments/51699.htmlhttp://www.tkk7.com/nbtymm/archive/2006/06/09/51699.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/51699.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/51699.html
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) 重定向技术可以分Zc,一cL客户端重定向Q一cL服务器端重定向。客L(fng)重定向可以通过讄特定的HTTP_(d)或者写JavaScript脚本实现。本文主要探讨服务器端重定向技术的实现?


服务器端的重定向相关c?br />

服务器端的重定向技术涉?qing)到javax.servlet.ServletContext、javax.servlet.RequestDispatcher、javax.servlet.http.ServletRequest、javax.servlet.http.ServletResponse{几个接口?


服务器端的重定向方式


服务器端的重定向可以有两U方式,一是用HttpServletResponse的sendRedirect()Ҏ(gu)Q一是用RequestDispatcher的forward()Ҏ(gu)。下面对q两U方式进行介l?

HttpServletResponse.sendRedirect()Ҏ(gu)

HttpServletResponse接口定义?jin)可用于转向的sendRedirect()Ҏ(gu)。代码如下:(x)

public void sendRedirect(java.lang.String location)throws java.io.IOException


q个Ҏ(gu)响应定向到参数l(f)ocation指定的、新的URL。location可以是一个绝对的URLQ如response.sendRedirect("http://java.sun.com")也可以用相对的URL。如果location以?”开_(d)则容器认为相对于当前Web应用的根Q否则,容器解析ؓ(f)相对于当前请求的URL。这U重定向的方法,导致客L(fng)览器的hURL跌{。从览器中的地址栏中可以看到新的URL地址Q作用类g上面讄HTTP响应头信息的实现?

RequestDispatcher.forward()Ҏ(gu)

RequestDispatcher是一个Web资源的包装器Q可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中。RequestDispatcher接口中定义了(jin)两个Ҏ(gu)Q参见如下代码:(x)

public interface RequestDispatcher {
void forward(ServletRequest request, ServletResponse response);
void include(ServletRequest request, ServletResponse response);
}



forward()Ҏ(gu)当前的request和response重定向到该RequestDispacher指定的资源。这在实际项目中大量使用Q因为完成一个业务操作往往需要跨多个步骤,每一步骤完成相应的处理后Q{向到下一个步骤。比如,通常业务处理在Servlet中处理,处理的结果{向到一个JSP面q行昄。这L(fng)hcM于Servlet铄功能Q但是还有一些区别。一个RequestDispatcher对象可以把请求发送到L一个服务器资源Q而不仅仅是另外一个Servlet?include()Ҏ(gu)把Request Dispatcher资源的输出包含到当前输出中?

注意Q只有在未向客L(fng)输出响应时才可以调用forward()Ҏ(gu)Q如果页面缓存(sh)为空Q在重定向前自动清除缓存。否则将抛出一个IllegalStateException异常?


如何得到RequestDispatcher


有三U方法可以得到Request Dispatcher对象?

1.javax.servlet. ServletRequest的getRequestDispatcher(String path)Ҏ(gu)Q其中path可以是相对\径,但不能越出当前Servlet上下文。如果path以?”开_(d)则解析ؓ(f)相对于当前上下文的根?

2.javax.servlet. ServletContext的getRequestDispatcher(String path)Ҏ(gu)Q其中path必须以?”开_(d)路径相对于当前的Servlet上下文。可以调用ServletContext的getContext(String uripath)得到另一个Servlet上下文,q可以{向到外部上下文的一个服务器资源链接?

3.使用javax.servlet. ServletContext的getNamedDispatcher(String name)得到名ؓ(f)name的一个Web资源Q包括Servlet和JSP面。这个资源的名字在Web应用部v描述文gweb.xml中指定?

q三U方法的使用有细微的差别。比如,下面是一个应用的配置文gweb.xmlQ?

<?xml version="1.0" ?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>org. javaresearch.redirecttest.ServletOne</servlet-class>
</servlet>
<servlet>
<servlet-name>SecondServlet</servlet-name>
<servlet-class>org.javaresearch. redirecttest.ServletTwo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/servlet/firstservlet/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SecondServlet</servlet-name>
<url-pattern>/servlet/secondservlet/</url-pattern>
</servlet-mapping>
</web-app>



其中定义?jin)两个ServletQ名字分别ؓ(f)FirstServlet和SecondServletQ对应的cd别ؓ(f)org.javaresearch. redirecttest.ServletOne和org. javaresearch.redirecttest.ServletTwo。可以在览器中通过cM于下面的链接讉KQ?

http://localhost:8080/servlet/firstservlet/

使用1中方法,例如在firstservlet可以写入下面的代码:(x)

RequestDispatcher rd = request.getRequestDispatcher("secondservlet");
rd.forward(request, response);



此时控制权将转向到第二个Servlet?jin)?

使用2中的Ҏ(gu)Q可以从Servlet Context中得到RequestDispatcher代码如下Q?

RequestDispatcher rd = getServletContext().getRequest
Dispatcher("/servlet/secondservlet");
rd.forward(request, response);



使用3中的Ҏ(gu)Q从上面的web. xml配置文g可以看到定义?jin)两个ServletQ名字分别ؓ(f)FirstServlet和SecondServletQ所以可以得到命名的DispatcherQ?

RequestDispatcher rd = getServletContext().getNamedDispatcher("SecondServlet");
rd.forward(request, response);



q样也可以重定向到SecondServlet?jin)?


JSP面中的重定?br />

JSP在解析后~译Z个Servletq行Q所以在JSP中也可以使用上面的重定向代码Qƈ且,JSPq提供了(jin)更便利的操作Q如下:(x)

<jsp:forward page= "nextpage.jsp"/>



JSP面执行到这儿,终止当前的处理Q将控制权交由nextpage.jsp?


如何选择


RequestDispatcher.forward()Ҏ(gu)和HttpServletResponse.sendRedirect()Ҏ(gu)的区别是Q前者仅是容器中控制权的转向Q在客户端浏览器地址栏中不会(x)昄?gu){向后的地址Q后者则是完全的跌{Q浏览器会(x)得到跌{的地址Qƈ重新发送请求链接。这P从浏览器的地址栏中可以看到跌{后的链接地址。所以,前者更加高效,在前者可以满需要时Q尽量用Request Dispatcher.forward()Ҏ(gu)Qƈ且,q样也有助于隐藏实际的链接。在有些情况下,比如Q需要蟩转到一个其它服务器上的资源Q则必须使用HttpServletResponse.sendRequest()Ҏ(gu)?img src ="http://www.tkk7.com/nbtymm/aggbug/51699.html" width = "1" height = "1" />

nbt 2006-06-09 15:32 发表评论
]]>
վ֩ģ壺 ޹ղ뾫Ʒ| Ƶ| Ƭһһ߹ۿ| ߹ۿ޵Ӱ| ˳Ƶ| ޴߶ר| 椸Ƶ߹ۿ| Ʒҹһ| žѹۿ嶯4 | ޹Ʒһһҳ | ҸŮˬ߳Ƭ| ѹۿ.WWW| У԰ɫ༤| þþþþþþѿ| ˾Ʒձֱ| ڵƵ߹ۿ | 鶹Ʒѹۿ| ҸŮˬ߳Ƭ| ձƬѹۿ| ޾Ʒ2021| һɫëƬ| һѹۿƵ| Ļ˾þ| 9ȾƷѹۿƵ| һ߹ۿ| ѹۿĹƵ| 91޹˾þþƷվ| ޳վ| ˵þþþƷ| ŮվɫƵѹ| ޾Ʒ˾þվ| ŮƷþþ| þøݾƷԴվ| þ˽˹ƷvA| ŷߴSUV| ѿavһ| ٸ| aëƬѹۿ| ޾Ʒ1ҳ| ҹëƬѹۿƵ| ѺܻڵƵëƬ|