??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品亚洲中文字幕无码网站,亚洲制服丝袜中文字幕,亚洲区日韩区无码区http://www.tkk7.com/savage100/category/12824.htmlzh-cnThu, 01 Mar 2007 15:36:38 GMTThu, 01 Mar 2007 15:36:38 GMT60Session & Cookies 详解http://www.tkk7.com/savage100/articles/67986.html谢玮谢玮Wed, 06 Sep 2006 03:33:00 GMThttp://www.tkk7.com/savage100/articles/67986.htmlhttp://www.tkk7.com/savage100/comments/67986.htmlhttp://www.tkk7.com/savage100/articles/67986.html#Feedback0http://www.tkk7.com/savage100/comments/commentRss/67986.htmlhttp://www.tkk7.com/savage100/services/trackbacks/67986.html[转脓]关于sessionQ你了解多少Q?/div>
 
【摘要?br />摘要Q虽然session机制在web应用E序中被采用已经很长旉了,但是仍然有很多h不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制ƈ且对在Java web application中应用session机制时常见的问题作出解答?br />
【全文?br />目录Q?br />一、术语session
二、HTTP协议与状态保?br />三、理解cookie机制
四、理解session机制
五、理解javax.servlet.http.HttpSession
六、HttpSession常见问题
七、跨应用E序的session׃n
八、ȝ
参考文?br />
一、术语session
在我的经验里Qsessionq个词被滥用的程度大概仅ơ于transactionQ更加有的是transaction与session在某些语境下的含义是相同的?br />
sessionQ中文经常翻译ؓ会话Q其本来的含义是指有始有l的一pd动作/消息Q比如打电话时从拿v电话拨号到挂断电话这中间的一pdq程可以UCZ个 session。有时候我们可以看到这L话“在一个浏览器会话期间Q?..”,q里的会话一词用的就是其本义Q是指从一个浏览器H口打开到关闭这个期闾b①。最混ؕ的是“用P客户端)在一ơ会话期间”这样一句话Q它可能指用L一pd动作Q一般情况下是同某个具体目的相关的一pd动作Q比如从d到选购商品到结账登样一个网上购物的q程Q有时候也被称Z个transactionQ,然而有时候也可能仅仅是指一ơ连接,也有可能是指含义①,其中的差别只能靠上下文来推断②?br />
然而当session一词与|络协议相关联时Q它又往往隐含了“面向连接”和/或“保持状态”这样两个含义, “面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到Ҏ接了电话通信才能开始,与此相对的是写信Q在你把信发出去的时候你q不能确认对方的地址是否正确Q通信渠道不一定能建立Q但对发信h来说Q通信已经开始了。“保持状态”则是指通信的一方能够把一pd的消息关联v来,使得消息之间可以互相依赖Q比如一个服务员能够认出再次光的老顾客ƈ且记得上ơ这个顾客还Ơ店里一块钱。这一cȝ例子有“一个TCP session”或者 “一个POP3 session”③?br />
而到了web服务器蓬勃发展的时代Qsession在web开发语境下的语义又有了新的扩展Q它的含义是指一cȝ来在客户端与服务器之间保持状态的解决Ҏ④。有时候session也用来指q种解决Ҏ的存储结构,如“把xxx保存在session 里”⑤。由于各U用于web开发的语言在一定程度上都提供了对这U解x案的支持Q所以在某种特定语言的语境下Qsession也被用来指代该语a的解x案,比如l常把Java里提供的javax.servlet.http.HttpSessionUCؓsession⑥?br />
鉴于q种混ؕ已不可改变,本文中session一词的q用也会Ҏ上下文有不同的含义,请大家注意分辨?br />在本文中Q用中文“浏览器会话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表辑֐义⑤Q用具体的“HttpSession”来表达含义?br />
二、HTTP协议与状态保?br />HTTP 协议本n是无状态的Q这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器h下蝲某些文gQ无论是客户端还是服务器都没有必要纪录彼此过ȝ行ؓQ每一ơ请求之间都是独立的Q好比一个顾客和一个自动售货机或者一个普通的Q非会员Ӟ大卖Z间的关系一栗?br />
然而聪明(或者贪心?Q的Z很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用Q就像给有线电视加上Ҏ功能一栗这U需求一斚wqHTML逐步d了表单、脚本、DOM{客L行ؓQ另一斚w在服务器端则出现了CGI规范以响应客L的动态请求,作ؓ传输载体的HTTP协议也添加了文g上蝲、 cookieq些Ҏ。其中cookie的作用就是ؓ了解决HTTP协议无状态的~陷所作出的努力。至于后来出现的session机制则是又一U在客户端与服务器之间保持状态的解决Ҏ?br />
让我们用几个例子来描qC下cookie和session机制之间的区别与联系。笔者曾l常ȝ一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠Q然而一ơ性消?杯咖啡的Z微乎其微Q这时就需要某U方式来U录某位֮的消Ҏ量。想象一下其实也无外乎下面的几种ҎQ?br />1、该店的店员很厉宻I能记住每位顾客的消费数量Q只要顾客一走进咖啡店,店员q道该怎么对待了。这U做法就是协议本w支持状态?br />2、发l顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每ơ消ҎQ如果顾客出C张卡片,则此ơ消费就会与以前或以后的消费相联pv来。这U做法就是在客户端保持状态?br />3、发l顾客一张会员卡Q除了卡号之外什么信息也不纪录,每次消费Ӟ如果֮出示该卡片,则店员在店里的纪录本上找到这个卡号对应的U录d一些消费信息。这U做法就是在服务器端保持状态?br />
׃HTTP协议是无状态的Q而出于种U考虑也不希望使之成ؓ有状态的Q因此,后面两种Ҏ成为现实的选择。具体来说cookie机制采用的是在客L保持状态的ҎQ而session机制采用的是在服务器端保持状态的Ҏ。同时我们也看到Q由于采用服务器端保持状态的Ҏ在客L也需要保存一个标识,所以session机制可能需要借助于cookie机制来达C存标识的目的Q但实际上它q有其他选择?br />
三、理解cookie机制 
cookie机制的基本原理就如上面的例子一L单,但是q有几个问题需要解冻I“会员卡”如何分发;“会员卡”的内容Q以及客户如何用“会员卡”?br />
正统的cookie分发是通过扩展HTTP协议来实现的Q服务器通过在HTTP的响应头中加上一行特D的指示以提C浏览器按照指示生成相应的cookie。然而纯_的客户端脚本如JavaScript或者VBScript也可以生成cookie?br />
而cookie 的用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器查所有存储的cookieQ如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置Q则把该cookie附在h资源的HTTPh头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示Q如果某家分店还发行了自q会员卡,那么q这家店的时候除了要出示麦当劳的会员卡,q要出示q家店的会员卡?br />
cookie的内容主要包括:名字Q|q期旉Q\径和域?br />其中域可以指定某一个域比如.google.comQ相当于d招牌Q比如宝z公司,也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.comQ可以用飘柔来做比?br />路径是跟在域名后面的URL路径Q比?或?foo{等Q可以用某飘柔专柜做比?br />路径与域合在一起就构成了cookie的作用范围?br />如果不设|过期时_则表C个cookie的生命期为浏览器会话期间Q只要关闭浏览器H口Qcookie消׃。这U生命期为浏览器会话期的 cookie被称Z话cookie。会话cookie一般不存储在硬盘上而是保存在内存里Q当然这U行为ƈ不是规范规定的。如果设|了q期旉Q浏览器׃把cookie保存到硬盘上Q关闭后再次打开览器,q些cookie仍然有效直到过讑֮的过期时间?br />
存储在硬盘上的cookie 可以在不同的览器进E间׃nQ比如两个IEH口。而对于保存在内存里的cookieQ不同的览器有不同的处理方式。对于IEQ在一个打开的窗口上按 Ctrl-NQ或者从文g菜单Q打开的窗口可以与原窗口共享,而用其他方式新开的IEq程则不能共享已l打开的窗口的内存cookieQ对于 Mozilla Firefox0.8Q所有的q程和标{N都可以共享同Lcookie。一般来说是用javascript的window.open打开的窗口会与原H口׃n内存cookie。浏览器对于会话cookie的这U只认cookie不认人的处理方式l常l采用session机制的web应用E序开发者造成很大的困扰?br />
下面是一个goolge讄cookie的响应头的例?br />HTTP/1.1 302 Found
Location: http://www.google.com/intl/zh-CN/
Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Content-Type: text/html




q是使用HTTPLookq个HTTP Sniffer软g来俘LHTTP通讯U录的一部分




览器在再次讉Kgoolge的资源时自动向外发送cookie




使用Firefox可以很容易的观察现有的cookie的?br />使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理?br />



IE也可以设|在接受cookie前询?br />



q是一个询问接受cookie的对话框?br />
四、理解session机制
session机制是一U服务器端的机制Q服务器使用一U类g散列表的l构Q也可能是使用散列表)来保存信息?br />
当程序需要ؓ某个客户端的h创徏一个session的时候,服务器首先检查这个客L的请求里是否已包含了一个session标识 - UCؓ session idQ如果已包含一个session id则说明以前已lؓ此客L创徏qsessionQ服务器按照session id把这个 session索出来用(如果索不刎ͼ可能会新Z个)Q如果客Lh不包含session idQ则为此客户端创Z个sessionq且生成一个与此session相关联的session idQsession id的值应该是一个既不会重复Q又不容易被扑ֈ规律以仿造的字符Ԍq个 session id被在本ơ响应中q回l客L保存?br />
保存q个session id的方式可以采用cookieQ这样在交互q程中浏览器可以自动的按照规则把q个标识发挥l服务器。一般这个cookie的名字都是类gSEEESIONIDQ而。比如weblogic对于web应用E序生成的cookieQJSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764Q它的名字就是 JSESSIONID?br />
׃cookie可以被h为的止Q必L其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一U技术叫做URL重写Q就是把session id直接附加在URL路径的后面,附加方式也有两种Q一U是作ؓURL路径的附加信息,表现形式?a href="http://...../xxx;jsessionid=">http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
另一U是作ؓ查询字符串附加在URL后面Q表现Ş式ؓhttp://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
q两U方式对于用h说是没有区别的,只是服务器在解析的时候处理的方式不同Q采用第一U方式也有利于把session id的信息和正常E序参数区分开来?br />Z在整个交互过E中始终保持状态,必d每个客户端可能请求的路径后面都包含这个session id?br />
另一U技术叫做表单隐藏字Dc就是服务器会自动修改表单,d一个隐藏字D,以便在表单提交时能够把session id传递回服务器。比如下面的表单
<form name="testform" action="/xxx">
<input type="text">
</form>
在被传递给客户端之前将被改写成
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
q种技术现在已较少应用Q笔者接触过的很古老的iPlanet6(SunONE应用服务器的前n)׃用了q种技术?br />实际上这U技术可以简单的用对action应用URL重写来代ѝ?br />
在谈论session机制的时候,常常听到q样一U误解“只要关闭浏览器Qsession消׃”。其实可以想象一下会员卡的例子,除非֮d对店家提出销卡,否则店家l对不会L删除֮的资料。对session来说也是一LQ除非程序通知服务器删除一个sessionQ否则服务器会一直保留,E序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会d在关闭之前通知服务器它要关闭Q因此服务器Ҏ不会有机会知道浏览器已经关闭Q之所以会有这U错觉,是大部分session机制都用会话cookie来保存session idQ而关闭浏览器后这个 session id消׃Q再ơ连接服务器时也无法找到原来的session。如果服务器讄的cookie被保存到盘上,或者用某U手D|写浏览器发出的HTTPh_把原来的session id发送给服务器,则再ơ打开览器仍然能够找到原来的session?br />
恰恰是由于关闭浏览器不会Dsession被删除,q服务器ؓseesion讄了一个失效时_当距dL上一ơ用session的时间超q这个失效时间时Q服务器可以认为客L已经停止了活动,才会把session删除以节省存储空间?br />
五、理解javax.servlet.http.HttpSession
HttpSession是Javaq_对session机制的实现规范,因ؓ它仅仅是个接口,具体到每个web应用服务器的提供商,除了对规范支持之外,仍然会有一些规范里没有规定的细微差异。这里我们以BEA的Weblogic Server8.1作ؓ例子来演C?br />
首先QWeblogic Server提供了一pd的参数来控制它的HttpSession的实玎ͼ包括使用cookie的开关选项Q用URL重写的开关选项Qsession持久化的讄Qsession失效旉的设|,以及针对cookie的各U设|,比如讄cookie的名字、\径、域Q cookie的生存时间等?br />
一般情况下Qsession都是存储在内存里Q当服务器进E被停止或者重启的时候,内存里的session也会被清I,如果讄了session的持久化Ҏ,服务器就会把session保存到硬盘上Q当服务器进E重新启动或q些信息能够被再次使用Q Weblogic Server支持的持久性方式包括文件、数据库、客Lcookie保存和复制?br />
复制严格说来不算持久化保存,因ؓsession实际上还是保存在内存里,不过同样的信息被复制到各个cluster内的服务器进E中Q这样即使某个服务器q程停止工作也仍然可以从其他q程中取得session?br />
cookie生存旉的设|则会媄响浏览器生成的cookie是否是一个会话cookie。默认是使用会话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解?br />
cookie的\径对于web应用E序来说是一个非帔R要的选项QWeblogic Server对这个选项的默认处理方式得它与其他服务器有明昄区别。后面我们会专题讨论?br />
关于session的设|参考[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869

六、HttpSession常见问题
Q在本小节中session的含义ؓ⑤和⑥的混合Q?br />

1、session在何时被创徏
一个常见的误解是以为session在有客户端访问时p创徏Q然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)q样的语句时才被创徏Q注意如果JSP没有昄的用?lt;% @page session="false"%> 关闭sessionQ则JSP文g在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);q也是JSP中隐含的 session对象的来历?br />
׃session会消耗内存资源,因此Q如果不打算使用sessionQ应该在所有的JSP中关闭它?br />
2、session何时被删?br />l合前面的讨论,session在下列情况下被删除a.E序调用HttpSession.invalidate();或b.距离上一ơ收到客L发送的session id旉间隔过了session的超时设|?或c.服务器进E被停止Q非持久sessionQ?br />
3、如何做到在览器关闭时删除session
严格的讲Q做不到q一炏V可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进E这些非常规手段仍然无能为力?br />
4、有个HttpSessionListener是怎么回事
你可以创Llistenerȝ控session的创建和销毁事Ӟ使得在发生这L事g时你可以做一些相应的工作。注意是session的创建和销毁动作触发listenerQ而不是相反。类似的与HttpSession有关的listenerq有 HttpSessionBindingListenerQHttpSessionActivationListener和 HttpSessionAttributeListener?br />
5、存攑֜session中的对象必须是可序列化的?br />不是必需的。要求对象可序列化只是ؓ了session能够在集中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在 Weblogic Server的session中放|一个不可序列化的对象在控制C会收C个警告。我所用过的某个iPlanet版本如果 session中有不可序列化的对象Q在session销毁时会有一个ExceptionQ很奇怪?br />
6、如何才能正的应付客户端禁止cookie的可能?br />Ҏ有的URL使用URL重写Q包括超链接Qform的actionQ和重定向的URLQ具体做法参见[6]
http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770

7、开两个览器窗口访问应用程序会使用同一个sessionq是不同的session
参见W三节对cookie的讨论,对session来说是只认id不认人,因此不同的浏览器Q不同的H口打开方式以及不同的cookie存储方式都会对这个问题的{案有媄响?br />
8、如何防止用h开两个览器窗口操作导致的session混ؕ
q个问题与防止表单多ơ提交是cM的,可以通过讄客户端的令牌来解冟뀂就是在服务器每ơ生成一个不同的idq回l客LQ同时保存在session里,客户端提交表单时必须把这个id也返回服务器Q程序首先比较返回的id与保存在session里的值是否一_如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表C层模式的部分。需要注意的是对于用javascript window.open打开的窗口,一般不讄q个idQ或者用单独的idQ以防主H口无法操作Q徏议不要再window.open打开的窗口里做修Ҏ作,q样可以不用设|?br />
9、ؓ什么在Weblogic Server中改变session的值后要重新调用一ơsession.setValue
做这个动作主要是Z在集环境中提示Weblogic Server session中的值发生了改变Q需要向其他服务器进E复制新的session倹{?br />
10、ؓ什么session不见?br />排除session正常失效的因素之外,服务器本w的可能性应该是微乎其微的,虽然W者在iPlanet6SP1加若q补丁的Solaris版本上倒也遇到q;览器插件的可能性次之,W者也遇到q?721插g造成的问题;理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题?br />出现q一问题的大部分原因都是E序的错误,最常见的就是在一个应用程序中去访问另外一个应用程序。我们在下一节讨个问题?br />
七、跨应用E序的session׃n

常常有这L情况Q一个大目被分割成若干项目开发,Z能够互不q扰Q要求每个小目作ؓ一个单独的web应用E序开发,可是C最后突然发现某几个项目之间需要共享一些信息,或者想使用session来实现SSO(single sign on)Q在session中保存login的用户信息,最自然的要求是应用E序间能够访问彼此的session?br />
然而按照Servlet规范Qsession的作用范围应该仅仅限于当前应用程序下Q不同的应用E序之间是不能够互相讉KҎ的session的。各个应用服务器从实际效果上都遵守了q一规范Q但是实现的l节却可能各有不同,因此解决跨应用程序session׃n的方法也各不相同?br />
首先来看一下Tomcat是如何实现web应用E序之间session的隔ȝQ从 Tomcat讄的cookie路径来看Q它对不同的应用E序讄的cookie路径是不同的Q这样不同的应用E序所用的session id是不同的Q因此即使在同一个浏览器H口里访问不同的应用E序Q发送给服务器的session id也可以是不同的?br />

  

Ҏq个Ҏ,我们可以推测Tomcat中session的内存结构大致如下?br />



W者以前用q的iPlanet也采用的是同L方式Q估计SunONE与iPlanet之间不会有太大的差别。对于这U方式的服务器,解决的思\很简单,实际实行h也不难。要么让所有的应用E序׃n一个session idQ要么让应用E序能够获得其他应用E序的session id?br />
iPlanet中有一U很单的Ҏ来实现共享一个session idQ那是把各个应用程序的cookie路径都设?Q实际上应该?NASAppQ对于应用程序来讲它的作用相当于根)?br /><session-info>
<path>/NASApp</path>
</session-info>

需要注意的是,操作׃n的session应该遵@一些编E约定,比如在session attribute名字的前面加上应用程序的前缀Q得 setAttribute("name", "neo")变成setAttribute("app1.name", "neo")Q以防止命名I间冲突Q导致互相覆盖?br />

在Tomcat中则没有q么方便的选择。在Tomcat版本3上,我们q可以有一些手D|׃nsession。对于版?以上的TomcatQ目前笔者尚未发现简单的办法。只能借助于第三方的力量,比如使用文g、数据库、JMS或者客LcookieQURL参数或者隐藏字D늭手段?br />
我们再看一下Weblogic Server是如何处理session的?br />

  

从截屏画面上可以看到Weblogic ServerҎ有的应用E序讄的cookie的\径都?Q这是不是意味着在Weblogic Server中默认的可以共享session了呢Q然而一个小实验卛_证明即不同的应用程序用的是同一个sessionQ各个应用程序仍然只能访问自己所讄的那些属性。这说明Weblogic Server中的session的内存结构可能如?br />



对于q样一U结构,在 session机制本n上来解决session׃n的问题应该是不可能的了。除了借助于第三方的力量,比如使用文g、数据库、JMS或者客L cookieQURL参数或者隐藏字D늭手段Q还有一U较为方便的做法Q就是把一个应用程序的session攑ֈServletContext中,q样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下,

应用E序A
context.setAttribute("appA", session); 

应用E序B
contextA = context.getContext("/appA");
HttpSession sessionA = (HttpSession)contextA.getAttribute("appA"); 

值得注意的是q种用法不可ULQ因为根据ServletContext的JavaDocQ应用服务器可以处于安全的原因对于context.getContext("/appA");q回I|以上做法在Weblogic Server 8.1中通过?br />
那么Weblogic ServerZ么要把所有的应用E序的cookie路径都设?呢?原来是ؓ了SSOQ凡是共享这个session的应用程序都可以׃n认证的信息。一个简单的实验可以证明这一点,修改首先d的那个应用程序的描述Wweblogic.xmlQ把cookie路径修改?appA 讉K另外一个应用程序会重新要求dQ即使是反过来,先访问cookie路径?的应用程序,再访问修改过路径的这个,虽然不再提示dQ但是登录的用户信息也会丢失。注意做q个实验时认证方式应该用FORMQ因为浏览器和web服务器对basic认证方式有其他的处理方式Q第二次h的认证不是通过 session来实现的。具体请参看[7] secion 14.8 AuthorizationQ你可以修改所附的CZE序来做q些试验?br />
八、ȝ
session机制本nq不复杂Q然而其实现和配|上的灵zL却使得具体情况复杂多变。这也要求我们不能把仅仅某一ơ的l验或者某一个浏览器Q服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析?br />摘要Q虽然session机制在web应用E序中被采用已经很长旉了,但是仍然有很多h不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制ƈ且对在Java web application中应用session机制时常见的问题作出解答?/div>

谢玮 2006-09-06 11:33 发表评论
]]>Struts 中forward之后的\径问?/title><link>http://www.tkk7.com/savage100/articles/67791.html</link><dc:creator>谢玮</dc:creator><author>谢玮</author><pubDate>Tue, 05 Sep 2006 05:55:00 GMT</pubDate><guid>http://www.tkk7.com/savage100/articles/67791.html</guid><wfw:comment>http://www.tkk7.com/savage100/comments/67791.html</wfw:comment><comments>http://www.tkk7.com/savage100/articles/67791.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/savage100/comments/commentRss/67791.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/savage100/services/trackbacks/67791.html</trackback:ping><description><![CDATA[问题出在映射?do?jsp不在同一路径下(或\径的同一层次下)Q它们forwardq去相当于带上下文的Ҏ调用Q所以设计时?span style="FONT-WEIGHT: bold">相对路径</span>,q行时是相对?do的,因此找不到?<br /><br /><br />Ҏ1Q全部改为绝对\径?<br />Ҏ2Q把.do和它要forward的jsp文g映射到同一目录l构?<br />Ҏ3Qhtml:base(其实生成了base标签Q?<br />Ҏ4Q代码{?<br /><br />forward跌{后图片不能刷新的问题Q在url 后加个随机数 i<br /><img src="aaaa.gif?<%=i%>" width="572" height="69"><br /><br />另一U方?br />Internet 选项> 常规> Internet临时文g讄->查网늚较新版本?选择“每ơ访问此|查?br /><img src ="http://www.tkk7.com/savage100/aggbug/67791.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/savage100/" target="_blank">谢玮</a> 2006-09-05 13:55 <a href="http://www.tkk7.com/savage100/articles/67791.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sturts ---DispatchAction的?/title><link>http://www.tkk7.com/savage100/articles/64770.html</link><dc:creator>谢玮</dc:creator><author>谢玮</author><pubDate>Mon, 21 Aug 2006 05:32:00 GMT</pubDate><guid>http://www.tkk7.com/savage100/articles/64770.html</guid><wfw:comment>http://www.tkk7.com/savage100/comments/64770.html</wfw:comment><comments>http://www.tkk7.com/savage100/articles/64770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/savage100/comments/commentRss/64770.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/savage100/services/trackbacks/64770.html</trackback:ping><description><![CDATA[ <strong> <span id="337vv7b" class="tpc_title">Struts心得--DispatchAction使用日记</span> <br /> <!----> <br /> </strong> <span id="ztx7fxj" class="tpc_content">Struts1.1发布了这么长旉了,我才刚刚开始系l地学习Struts的相关知识,l过前一阉|心研IӞ对Struts1.1中已有的cDispatchAction有了q一步的认识。我在q里ȝ一下,希望能对大家有所帮助?br />  <br />  ?.0版本中我们通常都是用executeҎ来完成我们对业务逻辑的处理及面的{发。通常在一个Action中我们都只能够完成一U业务逻辑的操作。如果要是完成多个业务逻辑Q比如:d、删除等Q功能相q的业务逻辑我们没有办法了么?{案是否定的Q我们可以通过在页面中定义一个隐藏变量,在不同的面要求处理不同的业务逻辑的时候我们可以赋予这个变量不同的|q在executeҎ中通过对变量值的判断来完成不同的业务逻辑操作?br />  <br />  举例来说Q我们首先在面中定义一个隐藏变量?br />  <br />  <QhtmlQhidden property="operAt"/><br />  <br />  然后定义一个JavaScript函数Q我们可以在通过点击提交按钮的时候,在函C里面修改它的倹{?br />  <br />  <QSCRIPT><br />  <br />  function setQkeyQ?{<br />  <br />  withQdocument.forms[0]Q{<br />  <br />  operAt.value=keyQ?br />  <br />  }<br />  <br />  }<br />  <br />  <Q?SCRIPT><br />  <br />  当我们点L交按钮便触发该事Ӟ修改变量的倹{?br />  <br />  <QhtmlQsubmit onclick="setQ?save'Q;">SAVE<Q?htmlQsubmit><br />  <br />  那我们在后台execute中又如何处理相关逻辑呢?<br />  <br />  String operAt = myForm.getOperAtQ)Q?br />  <br />  if QoperAt.equalsQ?create"Q) { …?br />  <br />  if QoperAt.equalsQ?save"Q) { …?br />  <br />  很简单吧Q虽然说q样做我们可以实现多个业务逻辑在同一个Action中实玎ͼ可是带来的代价便是代码的冗长Q不易理解?br />  <br />  下面我们p介绍一下DispatchActioncM。它是Action的一个子c,它可以实现多个业务逻辑在同一个Action当中的实玎ͼ而上面的例子在DispatchAction中也变成了下面的Ş式:<br />  <br />  public ActionForward createQ?br />  <br />  ActionMapping mappingQ?br />  <br />  ActionForm formQ?br />  <br />  HttpServletRequest requestQ?br />  <br />  HttpServletResponse responseQ?br />  <br />  throws Exception { …?br />  <br />  public ActionForward saveQ?br />  <br />  ActionMapping mappingQ?br />  <br />  ActionForm formQ?br />  <br />  HttpServletRequest requestQ?br />  <br />  HttpServletResponse responseQ?br />  <br />  throws Exception { …?br />  <br />  每一U业务逻辑都能在DispatchAction当中扑ֈ对应的方法。那么我们如何去实现q样的调用呢QDispatchAction中对struts-config.xml的配|比一般的Action配置E显ȝQD例来Ԍ<br />  <br />  <Qaction path="/telConsle" type="com.meng.action.TelConsleDispatch"<br />  <br />  name="telForm" scope="request" validate="false" parameter="method"/><br />  <br />  我们在这里指定了parameter的gؓmethodQ而当我们hAction的时候我们必L定method的值来定L们想要调用哪个ActionҎ。如Q?br />  <br />  <a href="http://localhost/" target="_blank">http://localhost</a>Q?080/tsss/telConsle.doQmethod=save<br />  <br />  昄Q通过昄链接指定参数值的Ҏ可以辑ֈ我们调用Ҏ的目的。然而我们如果不xC用的话我们应该怎样处理呢?q记得前面讲q的Ҏ么?我们在页面中定义一个隐藏的变量Q然后通过对变量的赋值来定我们来确定我们将要执行的业务Ҏ。在q里我们可不可以一栯样用呢Q?br />  <br />  {案是肯定的Q我们当然可以通过定义一个类g<QhtmlQhidden property="operAt"/>的变量,只要对该变量赋上对应DispatchAction中的Ҏ的值来定我们要调用的业务Ҏ。然而笔者比提倡用Struts标签来定义这L隐含的变量,因ؓStruts标签为动态标{,它可能需要在FormBean中定义该属性的get和setҎQ而在parameter中定义的g需要在FormBean当中定义get和setҎ。笔者徏议用html的标准标{?lt;Qinput>来定义该隐藏变量。因标签为静态标{,如果我们该用Struts标签的话可能D面出错?/span> <br /> <span id="j9jbdb9" class="tpc_content"> <br />我们在页面上有多个按?br />我们q那么DispatchAction<br />控制我们惌做的?br />我们先在面用其所?lt;html:hidden property="method " value=""/>来隐葛_?br />我们用javascript告诉我们要做什么事也就是用LM那个?\\<br />我想我们用这个就有一点好处就是页面有javaxcript提示出来是有一点h性化<br />我相我们用他的子cM更好?br />我认为我们用了javacript以后我们的页面就多了很多代码?br />我们用lookupdispacthaction也行</span> <img src ="http://www.tkk7.com/savage100/aggbug/64770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/savage100/" target="_blank">谢玮</a> 2006-08-21 13:32 <a href="http://www.tkk7.com/savage100/articles/64770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>q用Jakarta Struts的七大实战心?/title><link>http://www.tkk7.com/savage100/articles/64766.html</link><dc:creator>谢玮</dc:creator><author>谢玮</author><pubDate>Mon, 21 Aug 2006 05:21:00 GMT</pubDate><guid>http://www.tkk7.com/savage100/articles/64766.html</guid><wfw:comment>http://www.tkk7.com/savage100/comments/64766.html</wfw:comment><comments>http://www.tkk7.com/savage100/articles/64766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/savage100/comments/commentRss/64766.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/savage100/services/trackbacks/64766.html</trackback:ping><description><![CDATA[ <center> <h4>q用Jakarta Struts的七大实战心?/h4> </center> <br />(原文 http://www.onjava.com/pub/a/onjava/2002/10/30/jakarta.html?page=1) <br />(作者Chuck Cavaness, ~译 邱文? <br /><br /><br />~者按Q当作?Chuck CavanessQ著有《Programming Jakarta Struts》一书)所在的|络公司军_采用Struts框架之后QChuck曄p了好几个月来研究如何用它来构建公司的应用pȝ。本文叙q的正是作者在q用Strutsq程中来之不易的若干l验和心得。如果你是个负责通过jsp和servlet开发Web应用的JavaE序员,q且也正在考虑采用ZStruts的构建方法的话,那么你会在这里发现很多颇有见地同时也很有价值的信息?br /><br />1. 只在必要的时候才考虑扩展Struts框架 <br /><br />一个好的framework有很多优点,首先Q它必须能够满用户的可预见的需求。ؓ?Struts为Web 应用提供了一个通用的架构,q样开发h员可以把_֊集中在如何解军_际业务问题上。其ơ,一个好的frameworkq必能够在适当的地Ҏ供扩展接口,以便应用E序能扩展该框架来更好的适应使用者的实际需要?br /><br />如果Struts framework在Q何场合,M目中都能很好的满需求,那真是太了。但是实际上Q没有一个框架声U能做到q一炏V一定会有一些特定的应用需求是框架的开发者们无法预见到的。因此,最好的办法是提供_的扩展接口,使得开发工E师能够调整struts来更好的W合他们的特D要求?br /><br />在Struts framework中有很多地方可供扩展和定制。几乎所有的配置c都能被替换为某个用户定制的版本Q这只要单的修改一下Struts的配|文件就可以做到?br /><br />其他lg如ActionServlet?RequestProcessor 也能用自定义的版本代? 甚至qStruts 1.1里才有的新特性也是按照扩展的原则来设计的。例如,在异常处理机制中允许用户定制异常处理的句柄Q以便更好的对应用系l发生的错误做出响应?br /><br />作ؓ框架的这U可调整Ҏ在它更适合你的应用的同时也在很大的E度上媄响了目开发的效果。首先,׃您的应用是基于一个现有的成熟的、稳定的framework如StrutsQ测试过E中发现的错误数量将会大大减,同时也能~短开发时间和减少资源的投入。因Z不再需要投入开发力量用于编写基框架的代码了?br /><br />然? 实现更多的功能是要花Ҏ大的代h的。我们必d心避免不必要的滥用扩展性能Q?Struts是由核心包加上很多工具包构成的,它们已经提供了很多已l实现的功能。因此不要盲目的扩展Struts框架Q要先确定能不能采用其他Ҏ使用现有的功能来实现?在决定编写扩展代码前务必要确认Struts的确没有实现你要的功能。否则重复的功能会导致؜乱将来还得花贚w外的_֊清除它?br /><br />2. 使用异常处理声明<br /><br />要定义应用程序的逻辑程Q成熟的l验是推荐在代码之外Q用配置的方法来实现Q而不是写dE序代码中的。在J2EE中,q样的例子比比皆是。从实现EJB的安全性和事务性行为到描述JMS消息和目的地之间的关p,很多q行时的处理程都是可以在程序之外定义的?br /><br />Struts 创徏者从一开始就采用q种ҎQ通过配置Struts的配|文件来定制应用pȝq行时的各个斚w。这一点在版本1.1的新Ҏ上得到延箋Q包括新的异常处理功能。在Struts framework以前的版本中Q开发h员不得不自己处理Struts应用中发生的错误情况。在最新的版本中,情况大大的改观了QStruts Framework提供了内|的一个称?ExceptionHandler 的类Q?用于pȝ~省处理actionc运行中产生的错误。这也是在上一个技巧中我们提到的framework许多可扩展接口之一?br /><br />Struts~省?ExceptionHandlercM生成一个ActionError对象q保存在适当的范_scopeQ对象中。这样就允许JSP面使用错误cL提醒用户出现什么问题。如果你认ؓq不能满你的需求,那么可以很方便的实现你自qExcepionHandlercR?br /><br />具体定制异常处理的方法和机制<br /><br />要定制自q异常处理机制Q第一步是l承org.apache.struts.action.ExceptionHandlercR这个类?个方法可以覆盖,一个是excute()另外一个是storeException(). 在多数情况下Q只需要覆盖其中的excute()Ҏ。下面是ExceptionHandlercȝexcute()Ҏ声明Q?br /><br /><br /><br />正如你看到的Q该Ҏ有好几个参数Q其中包括原始的异常。方法返回一个ActionForward对象Q用于异常处理结束后controllercd到请求必{发的地方厅R?br /><br />当然您可以实CQ何处理,但一般而言Q我们必L查抛出的异常,q对该cd的异常进行特定的处理。缺省的Q系l的异常处理功能是创Z个出错信息,同时把请求{发到配置文g中指定的地方厅R?定制异常处理的一个常见的例子是处理嵌套异常。假设该异常包含有嵌套异常,q些嵌套异常又包含了其他异常Q因此我们必覆盖原来的execute()ҎQ对每个异常~写出错信息?br /><br />一旦你创徏了自qExceptionHandler c,应该在Struts配置文g中的部分声明q个c,以便让Struts知道改用你自定义的异常处理取代缺省的异常处理. <br /><br />可以配置你自qExceptionHandler cL用于Action Mapping特定的部分还是所有的Action对象。如果是用于Action Mapping特定的部分就?lt;action>元素中配|。如果想让这个类可用于所有的Action对象,可以?lt;global-sections> 元素中指定。例如,假设我们创徏了异常处理类CustomizedExceptionHandler用于所有的Actionc? <global-exceptions>元素定义如下所C:<br /><br /><br /><br />?lt;exception />元素中可以对很多属性进行设|。在本文中,最重要的属性莫q于handler属? handler属性的值就是自定义的承了ExceptionHandlercȝ子类的全名?假如该属性没有定义,Struts会采用自q~省倹{当Ӟ其他的属性也很重要,但如果想覆盖~省的异常处理的话,handler无疑是最重要的属性?br /><br />最后必L出的一ҎQ你可以有不同的异常处理cL处理不同的异常。在上面的例子中QCustomizedExceptionHandler用来处理Mjava.lang.Exception的子c? 其实Q你也可以定义多个异常处理类Q每一个专门处理不同的异常树。下面的XML片断解释了如何配|以实现q一炏V?br /><br /><br /><br />在这里,一旦有异常抛出Qstruts framework试囑֜配置文g中找到ExceptionHandlerQ如果没有找刎ͼ那么struts沿着该异常的父类链一层层往上找直到发现匚w的ؓ止。因此,我们可以定义一个层ơ型的异常处理关pȝ构,在配|文件中已经体现了这一炏V?br /><br />3. 使用应用模块QApplication ModulesQ?br /><br />Struts 1.1的一个新Ҏ是应用模块的概c应用模块允许将单个Struts应用划分成几个模块,每个模块有自qStruts配置文gQJSP面QAction{等。这个新Ҏ是Z解决大中型的开发队伍抱怨最多的一个问题,即ؓ了更好的支持q行开发允许多个配|文件而不是单个配|文件?br /><br />注:在早期的beta版本中,该特性被UCؓ子应用(sub-applicationsQ,最q的改名目的是ؓ了更多地反映它们在逻辑上的分工?br /><br />昄Q当很多开发h员一起参加一个项目时Q单个的Struts配置文g很容易引赯源冲H。应用模块允许Struts按照功能要求q行划分Q许多情况已l证明这h贴近实际。例如,假设我们要开发一个典型的商店应用E序。可以将l成部分划分成模块比如catalogQ商品目录), customerQ顾客), customer serviceQ顾客服务), orderQ订单){。每个模块可以分布到不同的目录下Q这样各部分的资源很Ҏ定位Q有助于开发和部v。图1 昄了该应用的目录结构?<br /><br />?1. 一个典型的商店应用E序的目录结?br /><img src="http://www.huihoo.com/framework/struts/jakarta1.jpg" /><br /><br /><br />注:如果你无需项目划分成多个模块QStruts框架支持一个缺省的应用模块。这׃得应用程序也可以?.0版本下创建,h可移植性,因ؓ应用E序会自动作为缺省的应用模块?br /><br />Z使用多应用模块功能,必须执行以下几个准备步骤Q?br /><br />&#8226; 为每个应用模块创建独立的Struts配置文g?br /><br />&#8226; 配置Web 部v描述W?Web.xml文g?br /><br />&#8226; 使用org.apache.struts.actions.SwitchAction 来实现程序在模块之间的蟩? <br /><br />创徏独立的Struts配置文g<br /><br />每个Struts应用模块必须拥有自己的配|文件。允许创q独立于其他模块的ActionQActionFormQ异常处理甚x多?br /><br />l箋以上面的商店应用E序ZQ我们可以创Z下的配置文gQ一个文件名为struts-config-catalog.xmlQ包含catalogQ商品目录)、items(商品清单)、和其它与库存相关的功能的配|信息;另一个文件名为struts- config-order.xml, 包含对orderQ订单)和order trackingQ订单跟t)的设|。第三个配置文g是struts-config.xml,其中含有属于~省的应用模块中的一般性的功能?br /><br />配置Web部v描述W?<br /><br />在Struts的早期版本中Q我们在Web.xml中指定Struts配置文g的\径。好在这Ҏ变,有助于向后兼宏V但对于多个应用模块Q我们需要在Web部v描述W中增加新的配置文g的设定?br /><br />对于~省的应用(包括Struts的早期版本)QStruts framework 在Web.xml文g中查扑ָ有config的元?lt;init-param>Q用于蝲入Action mapping 和其它的应用E序讑֮。作Z子,以下的XML片断展现一个典型的<init-param>元素Q?br /><br /><br /><br />注:如果在现有的<init-param>元素中找不到"config"关键字,Struts framework缺省地使用/WEB/struts-config.xml<br /><br />Z支持多个应用模块(Struts 1.1的新Ҏ?Q必d加附加的<init-param>元素。与~省?lt;init-param>元素不同的是Q附加的<init-param>元素与每个应用模块对应,必须以config/xxx的Ş式命名,其中字符串xxx代表该模块唯一的名字。例如,在商店应用程序的例子中,<init-param>元素可定义如下(注意_体字部分)Q?br /><br />W一?<init-param>元素对应~省的应用模块。第二和W三个元素分别代表非~省应用模块catalog ?order?br /><br />当Struts载入应用E序Ӟ它首先蝲入缺省应用模块的配置文g。然后查扑ָ有字W串config/xxx 形式的附加的初始化参数。对每个附加的配|文件也q行解析q蝲入内存。这一步完成后Q用户就可以很随意地用config/后面的字W串也就是名字来调用相应的应用模块?br /><br />多个应用模块之间调用Actionc?br /><br />在ؓ每个应用模块创徏独立的配|文件之后,我们有可能需要调用不同的模块中Action。ؓ此必M用Struts框架提供的SwitchActioncRStruts 会自动将应用模块的名字添加到URL,如Struts 自动d应用E序的名字加到URL一栗应用模块是Ҏ架的一个新的扩充,有助于进行ƈ行的团队开发。如果你的团队很那没必要用到q个Ҏ,不必q行模块化。当Ӟq是只有一个模块,pȝq是一Lq作?br /><br />4. 把JSP攑ֈWEB-INF后以保护JSP源代?br /><br />Z更好C护你的JSP避免未经授权的访问和H视Q?一个好办法是将面文g存放在Web应用的WEB-INF目录下?br /><br />通常JSP开发h员会把他们的面文g存放在Web应用相应的子目录下。一个典型的商店应用E序的目录结构如?所C。跟catalog Q商品目录)相关的JSP被保存在catalog子目录下。跟customer相关的JSPQ跟订单相关的JSP{都按照q种Ҏ存放?br /><br /><br /><br />?2.Z不同的功?JSP 被放|在不同的目录下<br /><img src="http://www.huihoo.com/framework/struts/jakarta2.jpg" /><br /><br /><br />q种Ҏ的问题是q些面文gҎ被偷看到源代码,或被直接调用。某些场合下q可能不是个大问题,可是在特定情形中却可能构成安全隐患。用户可以绕qStruts的controller直接调用JSP同样也是个问题?br /><br />Z减少风险Q可以把q些面文gUdWEB-INF 目录下。基于Servlet的声明,WEB-INF不作为Web应用的公共文档树的一部分。因此,WEB-INF 目录下的资源不是为客L接服务的。我们仍然可以用WEB-INF目录下的JSP面来提供视囄客户Q客户却不能直接h讉KJSP?br /><br />采用前面的例子,?昄JSP面UdWEB-INF 目录下后的目录结?br /><br />?3. JSP存放?WEB-INF 目录下更为安?br /><img src="http://www.huihoo.com/framework/struts/jakarta3.jpg" /><br /><br />如果把这些JSP面文gUdWEB-INF 目录下,在调用页面的时候就必须?WEB-INF"d到URL中。例如,在一个Struts配置文g中ؓ一个logoff action写一个Action mapping。其中JSP的\径必M"WEB-INF"开头。如下所C:h意粗体部?<br /><br />q个Ҏ在Q何情况下都不׃ؓStruts实践中的一个好Ҏ。是唯一要注意的技巧是你必LJSP和一个Struts action联系h。即使该Action只是一个很基本的很单JSPQ也L要调用一个ActionQ再由它调用JSP?br /><br />最后要说明的是Qƈ不是所有的容器都能支持q个Ҏ。WebLogic早期的版本不能解释Servlet声明Q因此无法提供支持,据报道在新版本中已经改进了。M使用之前先检查一下你的Servlet容器?br /><br />5. 使用 Prebuilt ActioncL升开发效?br /><br />Struts framework带有好几个prebuilt Actionc,使用它们可以大大节省开发时间。其中最有用的是org.apache.struts.actions.ForwardAction ?org.apache.struts.actions.DispatchAction.<br /><br />使用 ForwardAction<br /><br />在应用程序中Q可能会l常出现只要Action对象转发到某个JSP的情c在上一点中曾提到L由Action调用JSP是个好习惯。如果我们不必在Action中执行Q何业务逻辑Q却又想遵@从Action讉K面的话Q就可以使用ForwardActionQ它可以使你免去创徏许多I的ActioncR运用ForwardAction的好处是不必创徏自己的Actionc,你需要做的仅仅是在Struts配置文g中配|一个Action mapping?br /><br />举个例子Q假定你有一个JSP文gindex.jsp Q而且不能直接调用该页面,必须让程序通过一个Actionc调用,那么Q你可以建立以下的Action mapping来实现这一点:<br /><br />正如你看到的Q当 /home 被调用时, ׃调用ForwardAction q把h转发?index.jsp 面.<br /><br />再讨Z下不通过一个Actioncȝ接{发到某个面的情况,必须注意我们仍然使用<action>元素中的forward属性来实现转发的目标。这?lt;action>元素定义如下Q?br /><br />以上两种Ҏ都可以节省你的时_q有助于减少一个应用所需的文件数?br /><br />使用 DispatchAction<br /><br />DispatchAction是Struts包含的另一个能大量节省开发时间的ActioncR与其它ActioncM提供单个execute()Ҏ实现单个业务不同QDispatchAction允许你在单个ActioncM~写多个与业务相关的Ҏ。这样可以减Actioncȝ数量Qƈ且把相关的业务方法集合在一起得维护v来更Ҏ?br /><br />要用DispatchAction的功能,需要自己创Z个类Q通过l承抽象的DispatchAction得到。对每个要提供的业务Ҏ必须有特定的Ҏsignature。例如,我们惌提供一个方法来实现对购物Rd商品清单Q创Z一个类ShoppingCartDispatchAction提供以下的方法:<br /><br />那么Q这个类很可能还需要一个deleteItem()Ҏ从客L购物车中删除商品清单Q还有clearCart()Ҏ清除购物车等{。这时我们就可以把这些方法集合在单个Actionc,不用为每个方法都提供一个ActioncR?br /><br />在调用ShoppingCartDispatchAction里的某个ҎӞ只需在URL中提供方法名作ؓ参数倹{就是说Q调用addItem()Ҏ?URL看v来可能类gQ?br /><br />http://myhost/storefront/action/cart?method=addItem<br /><br />其中method参数指定ShoppingCartDispatchAction中要调用的方法。参数的名称可以L配置Q这里用的"method"只是一个例子。参数的名称可以在Struts配置文g中自行设定?br /><br />6.使用动态ActionForm<br /><br />在Struts framework中,ActionForm对象用来包装HTML表格数据Q包括请求)Qƈq回q回动态显C给用户的数据。它们必L完全的JavaBeanQƈl承.Struts 里面的ActionFormc,同时Q用户可以有选择地覆盖两个缺省方法?br /><br />该特性能节省很多旉Q因为它可以协助q行自动的表现层的验证。ActionForm的唯一~点是必Mؓ不同的HTML表格生成多个ActionForm cM保存数据。例如,如果有一个页面含有用L注册信息Q另一个页面则含有用户的介lh的信息,那么需要有两个不同的ActionFormcR这在大的应用系l中׃Dq多的ActionFormcRStruts 1.1Ҏ做出了很好的改进Q引入了动态ActionFormcL?br /><br />通过Struts framework中的DynaActionFormcd其子cd以实现动态的ActionForm Q动态的ActionForm允许你通过Struts的配|文件完成ActionForm的全部配|;再也没有必要在应用程序中创徏具体的ActionFormcR具体配|方法是Q在Struts的配|文仉过增加一?lt;form-bean>元素Q将type属性设定成DynaActionForm或它的某个子cȝ全名。下面的例子创徏了一个动态的ActionForm名ؓlogonFormQ它包含两个实例变量Qusername ?password.<br /><br /><br /><br />动态的ActionForm可以用于ActioncdJSPQ用方法跟普通的ActionForm相同Q只有一个小差别。如果用普通的ActionForm对象则需要提供get ?setҎ取得和设|数据。以上面的例子而言Q我们需要提供getUsername() ?setUsername()Ҏ取得和设|username变量Q同样地有一Ҏ法用于取得和讄password变量.<br /><br />q里我们使用的是DynaActionFormQ它变量保存在一个Mapcd象中Q所以必M用DynaActionForm cM的get(name) ?set(name)ҎQ其中参数name是要讉K的实例变量名。例如要讉KDynaActionForm中username的|可以采用cM的代码:<br /><br />String username = (String)form.get("username");<br /><br />׃值存攑֜一个Map对象Q所以要记得对get()Ҏq回的Object对象做强制性类型{换?br /><br />DynaActionForm有好几个很有用的子类。其中最重要的是DynaValidatorForm Q这个动态的ActionForm和Validator 一起利用公qValidator包来提供自动验证。这个特性你得以在E序代码之外指定验证规则。将两个Ҏ结合用对开发h员来说将非常有吸引力?br /><br />7. 使用可视化工?br /><br />自从Struts 1.0 分布以来Q就出现了不可视化工具用于协助创徏Q修改和l护Struts的配|文件。配|文件本w是ZXML格式Q在大中型的开发应用中会增大变得很W拙。ؓ了更方便的管理这些文Ӟ一旦文件大C无法一目了然的时候,试着采用其中的一UGUI 工具协助开发。商业性的和开放源代码的工具都有不,?列出了可用的工具和其相关链接Q从那里可以获取更多信息?br /><br />?1. Struts GUI 工具<br /><table cellspacing="0" cellpadding="4" border="1"><tbody><tr bgcolor="#cccccc"><th align="left">应用E序</th><th align="left">性质</th><th align="left">|址</th></tr><tr><td>Adalon</td><td>商业软g</td><td><a >http://www.synthis.com/products/adalon</a></td></tr><tr><td>Easy Struts</td><td>开放源?/td><td><a >http://easystruts.sourceforge.net/</a></td></tr><tr><td>Struts Console</td><td>免费</td><td><a >http://www.jamesholmes.com/struts/console</a></td></tr><tr><td>JForms</td><td>商业软g</td><td><a >http://www.solanasoft.com/</a></td></tr><tr><td>Camino</td><td>商业软g</td><td><a >http://www.scioworks.com/scioworks_camino.html</a></td></tr><tr><td>Struts Builder</td><td>开放源?/td><td><a >http://sourceforge.net/projects/rivernorth/</a></td></tr><tr><td>StrutsGUI</td><td>免费</td><td><a >http://www.alien-factory.co.uk/struts/struts-index.html</a></td></tr></tbody></table><img src ="http://www.tkk7.com/savage100/aggbug/64766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/savage100/" target="_blank">谢玮</a> 2006-08-21 13:21 <a href="http://www.tkk7.com/savage100/articles/64766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSON 入门与JavaScript提高(原创)http://www.tkk7.com/savage100/articles/60754.html谢玮谢玮Sat, 29 Jul 2006 07:13:00 GMThttp://www.tkk7.com/savage100/articles/60754.htmlhttp://www.tkk7.com/savage100/comments/60754.htmlhttp://www.tkk7.com/savage100/articles/60754.html#Feedback0http://www.tkk7.com/savage100/comments/commentRss/60754.htmlhttp://www.tkk7.com/savage100/services/trackbacks/60754.html出处 http://www.sergiopereira.com/articles/advjs.html


什么是JSONQ?JavaScript Object Notation -------javascript对象W号,一个Ajax中砰然出现的新话?其实它就是javascript中申明对象的Ҏ。让我们来看一个示?br />
var myPet = 
   color: 'black', 
   leg_count: 
4
   communicate: 
function(repeatCount)
for(i=0;i<repeatCount;i++) alert('Woof!');}
 
}
;

q里我们创Z一个对象引用,q个对象包含?个属?color,leg_count)和一个方?communicate),
在myPet对象的列表中不难看出Q这些属性和Ҏ之间都是用逗号","分隔开来的。属性很好理解,而方法的创徏则是׃个匿名function标记的?br />
在该对象被创Z后ƈ且以myPet变量声明了以后我们就可以q样使用了:
alert('my pet is ' + myPet.color);
alert('my pet has ' 
+ myPet.legCount + ' legs');
//if you are a dog, bark three times:
myPet.communicate(3);

大家可以看到QJSON可以漂亮地应用到javascript中Q何一个地方,作ؓfunction参数、返回倹{服务器响应...

你理解了吗?function同样也是一个对象?br />---------------------------------------------------------------
或许JSE序员中有些Z来就不这么认为,但是function实也是一个Object。下面我们可以做个实验来验证一下,你的functionl你的另一个function做ؓ参数传递,׃一个String一栗?br />
var myDog = {
    bark: 
function(){
        alert('Woof
!');
    }

}
;

var myCat = {
    meow: 
function(){
        alert('I am a lazy cat. I will not meow 
for you.');
    }

}
;
 
function annoyThePet(petFunction){
    
//let's see what the pet can do
    petFunction();
}


//annoy the dog:
annoyThePet(myDog.bark);
//annoy the cat:
annoyThePet(myCat.meow);

在这里我们传递了myDog.bark和myCat.meowlannoyThePet。注意它们后面都没有带括?font color="#ff0000">"()"
Q如果不q样做的话我们传递的不?Ҏ",而是该方法的q回|在此例中?font color="#ff0000">"Undefine"Q?br />
如果你想我的懒猫学狗狗叫Q你可以q样做:
myCat.meow = myDog.bark;
myCat.meow(); 
//alerts 'Woof!'

 
Arrays, items 和对象成员object members
L下面2?br />

var a = new Array();
var b = [];

 

你可以在array中添加items:

var a = ['first', 'second', 'third'];
var v1 = a[0];
var v2 = a[1];
var v3 = a[2];

但是你在声明时对索引不做数量限制Q你可以通过它的名字讉Kq个JS对象中的M成员,pq样Q创Z个空的对象,然后可以不停地d了:

var obj = {}//new, empty object
obj['member_1'] = 'this is the member value';
obj['flag_2'] 
= false;
obj['some_function'] 
= function()/* do something */};
            
{h?

var obj = {
    member_1:'
this is the member value',
    flag_2: 
false,
    some_function: 
function()/* do something */}
}
;

在JS中,对象和关pd数组QhashesQ两个概念通常是没有区别,下面的这两行代码是等LQ?br />


obj.some_function();
obj['some_function']();


{了q么久,我可以拥有自qClass了么Q?br />OO的强大力量来自于cClass。当然了我们的JavaScript同样也可以做到这一点,L?

//defining a new class called Pet
var Pet = function(petName, age){
    
this.name = petName;
    
this.age = age;
}
;

//let's create an object of the Pet class
var famousDog = new Pet('Santa\'s Little Helper', 15);
alert('This pet is called ' 
+ famousDog.name);

但是我们如何能够方法加到我们的Pet  Class中来呢。我们可以ؓ我们所有的cd义一个prototype属性。prototype属性其实也是一个对象,它包含一个类所拥有的一切其他对象。甚至默认JSc(Date,String,NumberQ也可以拥有prototype对象Q得各U新的方法和属性能扩充其中Q让基础c获得更多的Ҏ?br />
Pet.prototype.communicate = function()
    alert('I 
do not know what I should say, but my name is ' + this.name);
}
;
别忘了,我们得先导入 prototype.js才行?br />ps: 个h认ؓ象下面创建类Q可能更z一炏V?br />
var Pet = Class.create();
Pet.prototype 
= {
    
//our 'constructor'
    initialize: function(petName, age){
        
this.name = petName;
        
this.age = age;
    }
,
    
    communicate: 
function(){
        alert('I 
do not know what I should say, but my name is ' + this.name);
    }

}
;    

方法做为参?br />如果你没有用过支持closure的语aQ象Ruby,C#Q你会发现象q样的语法真是太有趣?
var myArray = ['first', 'second', 'third'];
myArray.each( 
function(item, index){
    alert('The item 
in the position #' + index + ' is:' + item);
}
);

未完带箋.........


谢玮 2006-07-29 15:13 发表评论
]]>
SQL注入技术和跨站脚本d的检?http://www.tkk7.com/savage100/articles/58740.html谢玮谢玮Tue, 18 Jul 2006 06:02:00 GMThttp://www.tkk7.com/savage100/articles/58740.htmlhttp://www.tkk7.com/savage100/comments/58740.htmlhttp://www.tkk7.com/savage100/articles/58740.html#Feedback0http://www.tkk7.com/savage100/comments/commentRss/58740.htmlhttp://www.tkk7.com/savage100/services/trackbacks/58740.html阅读全文

谢玮 2006-07-18 14:02 发表评论
]]>
开发系l中的常见问题ȝhttp://www.tkk7.com/savage100/articles/58737.html谢玮谢玮Tue, 18 Jul 2006 05:58:00 GMThttp://www.tkk7.com/savage100/articles/58737.htmlhttp://www.tkk7.com/savage100/comments/58737.htmlhttp://www.tkk7.com/savage100/articles/58737.html#Feedback0http://www.tkk7.com/savage100/comments/commentRss/58737.htmlhttp://www.tkk7.com/savage100/services/trackbacks/58737.html pȝ做大Q问题越来越多,有些d解决了,有些凑合解决了,有些q没有办法,现在把碰到的主要问题列出来,l大家前车之覆:

1
跨浏览器布局的问题: ׃览器之间的微小差距Q在布局复杂的页面时会到ȝ

2
日期控g
如何实现跨浏览器的日期控Ӟ如何讑֮~省|如何实现大范围的日期直接定位Q如何自适应多区域格式问题?

3
、分辨率
如何支持常见分L率,例如 800*600 Q?/span> 1024*768 Q?/span> 1280*1024 Q表格和层如何自适应Q?/span>

4
、防?/span> SQL 注入式攻?/span>

5
Q防止脚本攻凅R?/span> 有时候需要在面允许部分 html ?/span> javascript 代码 , 如显C多行文本?/span>

6
、用户非授权面讉K
如何实现每个面的安全验证,如何防止用户通过直接拯具体面地址{方式,讉KpȝQ?/span> ?br />括没有链接的某些面?/span>jsp 面?/span>如何控制部分权限Q最控制单元是什么?

7
、重复提交问?/span>
功能操作完成后,鼠标右键点击所在页面,选择弹出菜单的刷新功能,Ҏ出现重复提交问题?/span>
功能操作完成后,通过览器的后退键进行重复操作,Ҏ出现重复提交问题?/span>
URL
没有重定向,h面出现重复提交问题?/span>
某功能键反应旉延迟Ӟ在短旉内重复点击该功能键,Ҏ出现重复提交问题Q?/span>
某些用户习惯双击按钮Q某些用户错误地点了两次按钮Q某些鼠标出现故障,D单击变成双击Q结果发生重复提交?/span>

如果不加处理Q这些请求都会被服务器处理,从而导致错误的l果?/span>

8
Q如何锁定资源如记录Q这是一个老大N题了Qؓ此还搞了不少东西出来?/span>

9
Q如何防止浏览器C数据Q某些浏览器能够为每一?/span>URLC用户输入的数据,在某些情况下是危险的。比如我修改了某些数据,但由于某些原因我惛_斎ͼ此时数据已经被其他用户修改,但在览器里面你看到的是你修改的数据Q你用刷新按钮也不能看到新数据)。如果你再次保存Q你认ؓ你没有修Ҏ据,但数据已l被修改了。当面是脚本动态生成的时候,q个问题更严重?/span>

10
Q如何防止或侦测客户修改览器设|,比如客户在打开面之后关闭脚本功能?/span>

11
Q回退问题Q对于工作流熟悉的h对这个问题很清楚Q某个操作节点如何回到启动点Q如何回C一节点Q如何避免硬~码Q?/span>

12
Q校验问题,如何同时实现客户端和服务器端校验Q客L调用服务器端的校验功能?/span>

13
Q如何防止数据伪造,如何防止客户使用Ҏ工具和技术伪造数据提交到服务器?/span>
14
Q?/span>如何q踪定位错误Q如何处理异常?
15
Q如何在两个操作之间传递大量数据,其是非存储数据?/span>
16
Q?/span>带安全控制的断点l传的上?/span>和下?/span>
17
Q分布式环境的特D处理,
18
Q如何提高开发效率?



谢玮 2006-07-18 13:58 发表评论
]]>
Sturts中的常见异常http://www.tkk7.com/savage100/articles/58605.html谢玮谢玮Mon, 17 Jul 2006 09:02:00 GMThttp://www.tkk7.com/savage100/articles/58605.htmlhttp://www.tkk7.com/savage100/comments/58605.htmlhttp://www.tkk7.com/savage100/articles/58605.html#Feedback0http://www.tkk7.com/savage100/comments/commentRss/58605.htmlhttp://www.tkk7.com/savage100/services/trackbacks/58605.html Sturts 中的常见异常Q?/span>

异常  javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login  Q?/span> /Login 是你?/span> action 名字Q?/span>  
可能原因 :action 没有?/span> struts-config.xml  中定义,或没有找到匹配的 action Q例如在 JSP 文g中?/span>  <HTML:FORM&NBSP;ACTION="LOGIN.DO". 表单提交给 LOGIN.DO
处理 : 如果出现上述异常Q请查看 struts-config.xml 中的定义部分Q有时可能是打错了字W或者是某些不符合规则,可以使用 struts console 工具来检查?/span>  

异常  org.apache.jasper.JasperException: Cannot retrieve definition for form bean null 
 
可能原因 :   q个异常是因?/span> Struts Ҏ struts-config.xml 中的 mapping 没有扑ֈ action 期望?/span> form bean 。大部分的情况可能是因ؓ?/span> form-bean 中设|的 name 属性和 action 中设|的 name 属性不匚w所致。换句话_ action ?/span> form 都应该各自有一?/span> name 属性,q且要精匹配,包括大小写。这个错误当没有 name 属性和 action 兌时也会发生,如果没有?/span> action 中指?/span> name 属性,那么没?/span> name 属性和 action 相关联。当然当 action 制作某些控制Ӟ譬如Ҏ参数D转到相应?/span> jsp 面Q而不是处理表单数据,q是׃?/span> name 属性,q也?/span> action 的用方法之一?/span>

异常  No action instance for path /xxxx could be created 
 
可能原因  
 
特别提示Q因为有很多中情况会Dq个错误的发生,所以推荐大家调高你?/span> web 服务器的日志 / 调试U别Q这样可以从更多的信息中看到潜在的、在试图创徏 action cL发生的错误,q个 action cM已经?/span> struts-config.xml 中设|了兌Q即d了标{)?/span>  
 
?/span> struts-config.xml 中通过 action 标签?/span> class 属性指定的 action cM能被扑ֈ有很多种原因Q例如:  

定位~译后的 .class 文gp|?/span> Failure to place compiled .class file for the action in the classpath ( ?/span> web 开发中Q?/span> class 的的位置?/span> r WEB-INF/classes Q所以你?/span> action class 必须要在q个目录下。例如你?/span> action cM?/span> WEB-INF/classes/action/Login.class, 那么?/span> struts-config.xml 中设|?/span> action 的属?/span> type 时就?/span> action.Login). 
拼写错误Q这个也时有发生Qƈ且不易找刎ͼ特别注意W一个字母的大小写和包的名称?/span>  
 
?/span> struts-config.xml 中指定的 action cL有承自 Stuts ?/span> Action c,或者你自定义的 Action cL有承自 Struts 提供?/span> Action cR?/span>  

你的 action cdȝ承自 Struts 提供?/span> Action cR?/span>  
 
你的 classpath 的问题。例?/span> web server 没有发现你的资源文gQ资源文件必d WEB-INF/classes/ 目录下?/span>  
 
4
?/span>                                                                                                          ?/span>  javax.servlet.jsp.JspException: No getter method for property username of bean org.apache.struts.taglib.html.BEAN 
 
可能原因  
 
没有?/span> form bean 中的某个变量定义 getter  Ҏ  
 
q个错误主要发生在表单提交的 FormBean 中,?/span> struts 标记 <HTML:TEXT&NBSP;PROPERTY=”USERNAME?gt; Ӟ?/span> FormBean 中必L一?/span> getUsername() Ҏ。注意字母?/span> U ”?/span>  
5 Exception  javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection 
 
可能原因  
 
不是标识 Struts actionServlet 的标记就是映?/span> .do 扩展名的标记或者两者都没有?/span> web.xml 中声明?/span>  
 
?/span> struts-config.xml 中的打字或者拼写错误也可导致这个异常的发生。例如缺一个标记的关闭W号 /> 。最好?/span> struts console 工具查一下?/span>  
 
另外Q?/span> load-on-startup 必须?/span> web.xml 中声明,q要么是一个空标记Q要么指定一个数|q个数值用来表 servlet q行的优先Q数D大优先񔭑低?/span>  
 
q有一个和使用 load-on-startup 有关的是使用 Struts 预编?/span> JSP 文g时也可能Dq个异常?/span>  

6 Exception 
 javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope 
 Probable Causes 
 
试图?/span> Struts ?/span> form 标记外?/span> form 的子元素。这常常发生在你在后面?/span> Struts ?/span> html 标记?/span>

另外要注意可能你不经意用的无主体的标记Q如 <HTML:FORM&NBSP;?amp;NBSP; /> Q这?/span> web  服务器解析时当作一个无M的标讎ͼ随后使用的所有标记都被认为是在这个标C外的Q如又用了 <HTML:TEXT&NBSP;PROPERTY=”ID?gt;

q有是在?/span> taglib 引入 HTML 标记库时Q你使用?/span> prefix 的g?/span> html ?/span>

 

 



谢玮 2006-07-17 17:02 发表评论
]]>
防范脚本dhttp://www.tkk7.com/savage100/articles/58601.html谢玮谢玮Mon, 17 Jul 2006 08:54:00 GMThttp://www.tkk7.com/savage100/articles/58601.htmlhttp://www.tkk7.com/savage100/comments/58601.htmlhttp://www.tkk7.com/savage100/articles/58601.html#Feedback0http://www.tkk7.com/savage100/comments/commentRss/58601.htmlhttp://www.tkk7.com/savage100/services/trackbacks/58601.html 一. 防范脚本d

   JS 脚本 ?/span> HTML 脚本d的防范其实很单: server.HTMLEncode Q?/span> Str Q完事。当然你q不要大叫,怎么可能Q你让我把全站类| %=uid% Q都加过滤我q不累死Qؓ了方便的qoQ我们只需要将 HTML 脚本?/span> JS 脚本中的几个关键字符qo掉就可以了:E序体( 1 Q如下:

   ?/span> 以下是过滤函?/span>

  Q?/span> %

   function CHK(fqyString)

   fqyString = replace(fqyString, " Q?/span> ", " Q?/span> ")

   fqyString = replace(fqyString, " Q?/span> ", " Q?/span> ")

   fqyString = replace(fqyString, "&#", "&")

   fqyString = Replace(fqyString, CHR(32), " ")

   fqyString = Replace(fqyString, CHR(9), " ")

   fqyString = Replace(fqyString, CHR(34), """)

   fqyString = Replace(fqyString, CHR(39), "'")

   fqyString = Replace(fqyString, CHR(13), "")

   fqyString = Replace(fqyString, CHR(10) & CHR(10), " Q?/span> /P Q< P Q?/span> ")

   fqyString = Replace(fqyString, CHR(10), " Q?/span> BR Q?/span> ")

   CHK = fqyString

   end function

   % Q?/span>

 

 


   ?/span> 以下是应用实?/span>

  Q?/span> %=CHK(Username)% Q?/span>

   Username=CHK(replace(request(“username?,”’?”?)

  使用 Include 把函数写在公有页面上Q这h率是最好的?/span>

  E序体( 1 Q?/span>

  另外Q值得我们注意的是Q很多站点在用户注册Q或者是用户资料修改的页面上也缺脚本的qoQ或者是只在其中之一q行qoQ注册进入后修改资料仍然可以q行脚本d。对用户提交的数据进行检和qoQ程序体Q?/span> 2 Q?/span> 如下Q?/span>

   ?/span> 以下是过滤函?/span>

   If Instr(request("username"),"=") Q?/span> 0 or
   Instr(request("username"),"%") Q?/span> 0 or
   Instr(request("username"),chr(32)) Q?/span> 0 or
   Instr(request("username"),"?") Q?/span> 0 or
   Instr(request("username"),"&") Q?/span> 0 or
   Instr(request("username"),";") Q?/span> 0 or
   Instr(request("username"),",") Q?/span> 0 or
   Instr(request("username"),"'") Q?/span> 0 or
   Instr(request("username"),"?") Q?/span> 0 or
   Instr(request("username"),chr(34)) Q?/span> 0 or
   Instr(request("username"),chr(9)) Q?/span> 0 or
   Instr(request("username"),"?) Q?/span> 0 or
   Instr(request("username"),"$") Q?/span> 0 or
   Instr(request("username")," Q?/span> ") Q?/span> 0 or
   Instr(request("username")," Q?/span> ") Q?/span> 0 or
   Instr(request("username"),"""") Q?/span> 0 then
   response.write " 朋友Q你的提交用户名含有非法字符Q请更改Q谢谢合?/span> Q?/span> a href='****:window.history.go(-1);' Q返回< /a Q?/span> "
   response.end
   end if

  E序体( 2 Q?/span>

  Z提供工作效率我们再将qo内容E序化,q样对多个参数的qo效率有很大E度上的提高Q如

  E序体( 3 Q?/span>

   ?/span> 以下为程序主?/span>

   dim Bword(18)
   Bword(0)="?"
   Bword(1)=";"
   Bword(2)=" Q?/span> "
   Bword(3)=" Q?/span> "
   Bword(4)="-"
   Bword(5)="?
   Bword(6)="”?
   Bword(7)="&"
   Bword(8)="%"
   Bword(9)="$"
   Bword(10)="'"
   Bword(11)=":"
   Bword(12)="   "
   Bword(13)="("
   Bword(14)=")"
   Bword(15)="--"
   Bword(16)=" chr(9)"
   Bword(17)=" chr(34)"
   Bword(18)=" chr(32)"
   errc=false

   ?/span> 以下是应用实例部?/span>

   for i= 0 to ubound(Bword)
   if instr(FQYs,Bword(i)) Q> 0 then
   errc=true
   end if
   next
   if errc then
   response.write " Q?/span> script language=""****"" Q?/span> "
   response.write "parent.alert(' 很抱?/span> ! 您的操作q法?/span> );"
   response.write "history,back();"
   response.write " Q?/span> /script Q?/span> "
   response.end
   end if

  E序体( 3 Q?/span>

  有了上面的过滤函数您可以在Q何需要过滤的地方应用qo函数直接使用可以了。这׃我们的修复工作大大的化了?/span>

  另外Q我惛_q里再次多提醒一下,一些站点的 UBB 在进行小的表情图标{化时也会出现qo问题Q由于很隐蔽所以不Ҏ发现Q?/span>

  如:

  我们标签内的文字q行修改Q?/span>

  不知道各位看懂没Q前一个单引号用来中和E序提供的左引号Q第二个单引L来中和闭合的叛_Pq样E序输出׃ؓQ?/span>

  Q?/span> img src=’img/0001.gif?onerror=****:alert(); alt=’?/span> Q?/span>

  如果囄不存在,那么激z?/span> onerror 标签执行脚本E序。对于已l过滤了单引L站点在这里用双引号一样可以完成。对于过滤了 **** 字段的,只用 alert() 也完全可以。所以说要过滤就要过滤完全,别给d者留下一丝机会?/span>



谢玮 2006-07-17 16:54 发表评论
]]>
Tomcat中文问题的处理方?/title><link>http://www.tkk7.com/savage100/articles/58096.html</link><dc:creator>谢玮</dc:creator><author>谢玮</author><pubDate>Fri, 14 Jul 2006 01:09:00 GMT</pubDate><guid>http://www.tkk7.com/savage100/articles/58096.html</guid><wfw:comment>http://www.tkk7.com/savage100/comments/58096.html</wfw:comment><comments>http://www.tkk7.com/savage100/articles/58096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/savage100/comments/commentRss/58096.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/savage100/services/trackbacks/58096.html</trackback:ping><description><![CDATA[ <font face="宋体"> <p>W一部分:  jsp  ---> java/servlet<br /><br />对于行?span lang="EN-US">Tomcat</span>来说Q有以下三种解决ҎQ?/p> <p>  <span lang="EN-US">1) </span>更改<span lang="EN-US"> D:\Tomcat\conf\server.xml</span>Q指定浏览器的编码格式ؓ<span lang="EN-US">?/span>体中?span lang="EN-US">?/span>Q?/p> <p>  Ҏ是找?span lang="EN-US"> server.xml </span>中的</p> <p> <span lang="EN-US">    <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />    enableLookups="false" redirectPort="8443" acceptCount="100"<br />    connectionTimeout="20000" disableUploadTimeout="true" <strong><span style="FONT-FAMILY: 宋体">URIEncoding='GBK'</span></strong> /></span> </p> <p>  标记Q粗体字是我d的?/p> <p>  可以q样验证你的更改是否成功Q在更改前,在你出现q的页面的<span lang="EN-US">IE</span>览器,点击菜单<span lang="EN-US">?/span>查看|编?span lang="EN-US">?/span>Q会发现<span lang="EN-US">?/span>西欧<span lang="EN-US">(ISO)?/span>处于选中状态。而更改后Q点击菜?span lang="EN-US">?/span>查看|编?span lang="EN-US">?/span>Q会发现<span lang="EN-US">?/span>体中?span lang="EN-US">(GB2312)?/span>处于选中状态。注意你的Tomcat的common下要?endorsed"?i18n"文g夹,其中包含~码所需的lib<br /></p> <p>   <br />  <span lang="EN-US">2)</span>更该<span lang="EN-US"> Java </span>E序Q?br /><span lang="EN-US"> public class ThreeParams extends HttpServlet {<br />  public void doGet(HttpServletRequest request, HttpServletResponse response)<br />   throws ServletException, IOException {<br />      <strong><span style="FONT-FAMILY: 宋体">response.setContentType("text/html; charset=GBK");</span></strong><b><br /></b>      ...<br />  }  <br />}</span></p> <p>  _体字是必需要有的,它的作用是让览器把<span lang="EN-US">Unicode</span>字符转换?span lang="EN-US">GBK</span>字符。这样页面的内容和浏览器的显C模式都设成?span lang="EN-US">GBK</span>Q就不会q了?/p> <p>   <br /><br /><br /><br /><br />W二部分    java/servlet   ---->   mysql<br />mysql和Hibernate中的中文问题解决Ҏ<br />另一U解x?mysql-4.1.11).低版本的mysqlg没出现过中文问题(mysql-4.0.17). :)</p> <p>1.d一个过滤器,字W集~码设ؓGBK.<br />修改web.xml:</p> <p> <filter><br />  <filter-name>SetCharacterEncoding</filter-name><br />  <filter-class>hxz.filter.SetEncodingFilter</filter-class><br />  <init-param><br />   <param-name>encoding</param-name><br />   <param-value>GBK</param-value><br />  </init-param><br /> </filter><br /> <br /> <filter-mapping><br />  <filter-name>SetCharacterEncoding</filter-name><br />  <url-pattern>/*</url-pattern><br /> </filter-mapping></p> <p>新徏一个过滤器:<br />package hxz.filter;</p> <p>import java.io.IOException;</p> <p>import javax.servlet.*;</p> <p>public class SetEncodingFilter implements Filter {<br /> <br /> // default character encoding<br /> String defaultEncoding = "GBK"; <br /> <br /> public void init(FilterConfig config) throws ServletException {<br />  String encoding = config.getInitParameter("encoding");<br />  if (encoding != null) {<br />   defaultEncoding = encoding;<br />  }<br /> }</p> <p> public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {<br />  request.setCharacterEncoding(defaultEncoding);<br />  chain.doFilter(request, response);<br /> }</p> <p> public void destroy() {<br />  defaultEncoding = null;<br /> }</p> <p>}</p> <p>2.修改hibernate配置文g:<br /><property name="url"><br />  <value>jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=GBK</value><br /></property><br />注意后面?useUnicode=true&amp;characterEncoding=GBK, 在xml?amp;要改?amp;</p> <p>3.在新版本中mysql?你可以选择一U字W集,它设ؓGBK.<br />jsp或servlet中把字符集改为GBK.</p> <p> </p> </font> <img src ="http://www.tkk7.com/savage100/aggbug/58096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/savage100/" target="_blank">谢玮</a> 2006-07-14 09:09 <a href="http://www.tkk7.com/savage100/articles/58096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用站点http://www.tkk7.com/savage100/articles/56979.html谢玮谢玮Thu, 06 Jul 2006 08:55:00 GMThttp://www.tkk7.com/savage100/articles/56979.htmlhttp://www.tkk7.com/savage100/comments/56979.htmlhttp://www.tkk7.com/savage100/articles/56979.html#Feedback0http://www.tkk7.com/savage100/comments/commentRss/56979.htmlhttp://www.tkk7.com/savage100/services/trackbacks/56979.html Ajax
dojo         http://download.dojotoolkit.org/
dwr          http://getahead.ltd.uk/dwr/download
prototype  http://prototype.conio.net/
prototype 在线学习指南   http://www.sergiopereira.com/articles/prototype.js.html
prototype 1.4中文手册(hot!!!)  http://thinhunan.cnblogs.com/archive/2006/04/01/DeveloperNotesForPrototype.html
wiki.script.aculo.us API
http://wiki.script.aculo.us/scriptaculous/show/Prototype
某prototype W记   https://compdoc2cn.dev.java.net/prototype/html/prototype.js.cn.html 

json  指南: Quick guide to somewhat advanced JavaScript  tour of some OO features
http://www.sergiopereira.com/articles/advjs.html
《征服Ajax web2.0详解》作者的blog
http://www.x2blog.cn/supNate/#sid.0/page.1/
Eclipse
eclipse     http://www.eclipse.org
csdn文章中心        http://kb.csdn.net/java/Articles/200606/7105353e-2f75-4398-9282-119b58937764.html
JSEclipse 插g下蝲地址       http://www.apple.com/downloads/macosx/development_tools/jseclipse.html
JSEclipse 插g官方地址       http://www.interaktonline.com/
视频教程                              http://www.interaktonline.com/Products/Eclipse/JSEclipse/Flash-Demos/
java视线                 http://www.hibernate.org.cn
Ҏ刚满江红        http://www.redsaga.com/mambo/content/view/42/2/

在线javascript手册   http://www.8esky.com/handbook/JavaScript/index.html
Mysql 手册         http://www.uplinux.com/download/doc/mysql/mysql4/index.html
CVSclient入门     http://www.redsaga.com/CVS_newbie_win32/
一个不错的Ajax Blog      https://blueprints.dev.java.net/ajax-faq-zh.html#ajax-libraries
框架视频教程   http://www.tkk7.com/oksonic/archive/2005/11/06/18370.aspx

Java开?/font>

开源站?http://sourceforge.net/new/
一个国内的java开源站点 HOT  http://www.ideagrace.com/sf/bloggers/ 
java自由人  ?a >http://www.javayou.com/
开发工具下载站点?http://www.topdownloads.org/software/view.php?id=75020

谢玮 2006-07-06 16:55 发表评论
]]>
修改默认的tomcat的welcomePage http://www.tkk7.com/savage100/articles/56965.html谢玮谢玮Thu, 06 Jul 2006 07:51:00 GMThttp://www.tkk7.com/savage100/articles/56965.htmlhttp://www.tkk7.com/savage100/comments/56965.htmlhttp://www.tkk7.com/savage100/articles/56965.html#Feedback0http://www.tkk7.com/savage100/comments/commentRss/56965.htmlhttp://www.tkk7.com/savage100/services/trackbacks/56965.html修改tomcat的默认首|2U方法,
      1>删除root目录
      2>替换root下的index.jsp


Ҏ2.直接用一个index.jsp代替root下的index.jsp

隐藏主页URL后面路径的方法,直接自qsubindex.jsp作ؓiframe插入index.jsp中就可以?br /> 
   <table width="1124" height="768" cellspacing="0" cellspacing="0" >
     <tr valign="top" >
      <td width="100%" height="100%"><iframe height="100%" width="100%"  frameborder="1" src="index.jsp" scrolling="no"></iframe></td>
  </tr>
   </table >



谢玮 2006-07-06 15:51 发表评论
]]>
վ֩ģ壺 ŮaܴƬ| ޳˸߹ۿ| Դ߹ۿѸ| һ˿wwwƵ| avպavav| ƷۺϾþĻ| ۺϾþþƷ| ˾ƷþѶ| ڵֻˬվ | ĻӰӰԺ߹ۿƵ| ޾avĻ| ޻ɫ߲| ݺɫۺϳ| ޾ƷŮþþþ99С˵| һһëƬa| 91ƷѾþþþþ| ϼ˳߹ۿƵ| AëƬѹۿվ| ɫƵ߹ۿwww| רҳ| ˳77777߲վ| ޹Ʒ˾þ| þ㽶߿ۿƬ| ۺAVһҳ| Ƶ߾Ʒ| þ99ۺϾƷҳ| ĻƷѾþӰԺ| ձվ߹ۿ| ҹëƬѹۿƵ| ӰԺ߹ۿ| | һ߹ۿѸ߹ۿ | ˳ھþۺվ| ҹƷ| һĻ| ഺɫƷ| ޾Ʒһ| ޸ҹӰ| avר| վ߹ۿ| պƷƵ|