﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-morcble的blog-文章分类-转载技术文章</title><link>http://www.blogjava.net/fengliangjun/category/1701.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 09 Apr 2007 12:48:54 GMT</lastBuildDate><pubDate>Mon, 09 Apr 2007 12:48:54 GMT</pubDate><ttl>60</ttl><item><title> 日期 正则表达式</title><link>http://www.blogjava.net/fengliangjun/articles/109332.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Mon, 09 Apr 2007 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/109332.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/109332.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/109332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/109332.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/109332.html</trackback:ping><description><![CDATA[一个很强的正则表达式，几乎把所有的日期特例情况都考虑进去了，比如润年,2月等，分享一下<br><br>function&nbsp;isDate(str){&nbsp;<br>var&nbsp;reg&nbsp;=&nbsp;/^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$/<br>if&nbsp;(reg.test(str))&nbsp;return&nbsp;true;<br>return&nbsp;false;<br>}
<img src ="http://www.blogjava.net/fengliangjun/aggbug/109332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2007-04-09 10:30 <a href="http://www.blogjava.net/fengliangjun/articles/109332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>servlet 相关的Listener应用</title><link>http://www.blogjava.net/fengliangjun/articles/6683.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Fri, 24 Jun 2005 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/6683.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/6683.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/6683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/6683.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/6683.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=1 cellPadding=1 width="98%" border=0>
<TBODY>
<TR>
<TD>关键词 : servlet listener timer 定时器</TD></TR>
<TR>
<TD>
<P>从作用域范围来说,Servlet的作用域有ServletContext,HttpSession,ServletRequest.<BR><BR>Context范围:<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>ServletContextListener:<BR>对一个应用进行全局监听.随应用启动而启动,随应用消失而消失主要有两个方法:<BR>contextDestroyed(ServletContextEvent&nbsp;event)&nbsp;<BR>&nbsp;在应用关闭的时候调用<BR>contextInitialized(ServletContextEvent&nbsp;event)&nbsp;<BR>在应用启动的时候调用<BR><BR>这个监听器主要用于一些随着应用启动而要完成的工作,也就是很多人说的我想在容器<BR>启动的时候干..........<BR>一般来说对"全局变量"初始化,如<BR>public&nbsp;void&nbsp;contextInitialized(ServletContextEvent&nbsp;event){<BR>&nbsp;&nbsp;&nbsp;&nbsp;ServletContex&nbsp;sc&nbsp;=&nbsp;event.getServletContext();<BR>&nbsp;&nbsp;&nbsp;&nbsp;sc.setAttribute(name,value);<BR>}<BR>以后你就可以在任何servlet中getServletContext().getAttribute(name);<BR>我最喜欢用它来做守护性工作,就是在contextInitialized(ServletContextEvent&nbsp;event)&nbsp;<BR>方法中实现一个Timer,然后就让应用在每次启动的时候让这个Timer工作:<BR>public&nbsp;void&nbsp;contextInitialized(ServletContextEvent&nbsp;event){<BR>&nbsp;&nbsp;&nbsp;&nbsp;timer&nbsp;=&nbsp;new&nbsp;Timer();<BR>&nbsp;&nbsp;&nbsp;&nbsp;timer.schedule(new&nbsp;TimerTask(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;run(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//do&nbsp;any&nbsp;things<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;},0,时间间隔);<BR>}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;有人说Timer只能规定从现在开始的多长时间后,每隔多久做一次事或在什么时间做<BR>一次事,那我想在每月1号或每天12点做一项工作如何做呢?<BR>你只要设一个间隔,然后每次判断一下当时是不是那个时间段就行了啊,比如每月一号做,那你<BR>时间间隔设为天,即24小时一个循环,然后在run方法中判断当时日期new&nbsp;Date().getDate()==1<BR>就行了啊.如果是每天的12点,那你时间间隔设为小时,然后在run中判断new&nbsp;Date().getHour()<BR>==12,再做某事就行了.<BR><BR>ServletContextAttributeListener:<BR><BR>这个监听器主要监听ServletContex对象在setAttribute()和removeAttribute()的事件,注意<BR>也就是一个"全局变量"在被Add(第一次set),replace(对已有的变量重新赋值)和remove的时候.<BR>分别调用下面三个方法:<BR>public&nbsp;void&nbsp;attributeAdded(ServletContextAttributeEvent&nbsp;scab)这个方法不仅可以知道<BR>哪些全局变量被加进来,而且可获取容器在启动时自动设置了哪些context变量:<BR><BR>public&nbsp;void&nbsp;attributeAdded(ServletContextAttributeEvent&nbsp;scab){<BR>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(scab.getName());<BR>}<BR>&nbsp;&nbsp;public&nbsp;void&nbsp;attributeRemoved(ServletContextAttributeEvent&nbsp;scab)&nbsp;<BR><BR>&nbsp;&nbsp;public&nbsp;void&nbsp;attributeReplaced(ServletContextAttributeEvent&nbsp;scab)&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR><BR><BR><BR><BR><BR><BR><BR><BR>Session范围:<BR>HttpSessionListener:<BR>这个监听器主要监听一个Session对象被生成和销毁时发生的事件.对应有两个方法:<BR>&nbsp;&nbsp;public&nbsp;void&nbsp;sessionCreated(HttpSessionEvent&nbsp;se)&nbsp;<BR><BR>&nbsp;&nbsp;public&nbsp;void&nbsp;sessionDestroyed(HttpSessionEvent&nbsp;se)<BR><BR>&nbsp;&nbsp;一般来说,一个session对象被create时,可以说明有一个新客端进入.可以用来粗略统计在线人<BR>数,注意这不是精确的,因为这个客户端可能立即就关闭了,但sessionDestroyed方法却会按一定<BR>的策略很久以后才会发生.<BR><BR>HttpSessionAttributeListener:<BR>和ServletContextAttributeListener一样,它监听一个session对象的Attribut被Add(一个特定<BR>名称的Attribute每一次被设置),replace(已有名称的Attribute的值被重设)和remove时的事件.<BR>对就的有三个方法.<BR>&nbsp;&nbsp;public&nbsp;void&nbsp;attributeAdded(HttpSessionBindingEvent&nbsp;se)&nbsp;<BR><BR>&nbsp;&nbsp;public&nbsp;void&nbsp;attributeRemoved(HttpSessionBindingEvent&nbsp;se)&nbsp;<BR><BR>&nbsp;&nbsp;public&nbsp;void&nbsp;attributeReplaced(HttpSessionBindingEvent&nbsp;se)&nbsp;<BR><BR>&nbsp;&nbsp;上面的几个监听器的方法,都是在监听应用逻辑中servlet逻辑中发生了什么事,一般的来说.<BR>我们只要完成逻辑功能,比如session.setAttribute("aaa","111");我只要把一个名为aaa的变量<BR>放在session中以便以后我能获取它,我并不关心当session.setAttribute("aaa","111");发生时<BR>我还要干什么.(当然有些时候要利用的),但对于下面这个监听器,你应该好好发解一下:<BR><BR>HttpSessionBindingListener:<BR>上面的监听器都是作为一个独立的Listener在容器中控制事件的.而HttpSessionBindingListener<BR>对在一对象中监听该对象的状态,实现了该接口的对象如果被作为value被add到一个session中或从<BR>session中remove,它就会知道自己已经作为一个session对象或已经从session删除,这对于一些非<BR>纯JAVA对象,生命周期长于session的对象,以及其它需要释放资源或改变状态的对象非常重要.<BR>比如:<BR>session.setAttribute("abcd","1111");<BR>以后session.removeAttribute("abcd");因为abcd是一个字符中,你从session中remove后,它就会<BR>自动被垃圾回收器回收,而如果是一个connection:(只是举例,你千万不要加connection往session<BR>中加入)<BR>session.setAttribute("abcd",conn);<BR>以后session.removeAttribute("abcd");这时这个conn被从session中remove了,你已经无法获取它<BR>的句柄,所以你根本没法关闭它.而在没有remove之前你根本不知道什么时候要被remove,你又无法<BR>close(),那么这个connection对象就死了.另外还有一些对象可以在被加入一个session时要锁定<BR>还要被remove时要解锁,应因你在程序中无法判断什么时候被remove(),add还好操作,我可以先加锁<BR>再add,但remove就后你就找不到它的句柄了,根本没法解锁,所以这些操作只能在对象自身中实现.<BR>也就是在对象被add时或remove时通知对象自己回调相应的方法:<BR><BR>MyConn&nbsp;extends&nbsp;Connection&nbsp;implements&nbsp;HttpSessionBindingListener{<BR>&nbsp;&nbsp;public&nbsp;void&nbsp;valueBound(HttpSessionBindingEvent&nbsp;se){<BR>&nbsp;&nbsp;&nbsp;&nbsp;this.initXXX();<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;public&nbsp;void&nbsp;valueUnbound(HttpSessionBindingEvent&nbsp;se){<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;this.close();<BR>&nbsp;&nbsp;}<BR>}<BR><BR>session.setAttribute("aaa",new&nbsp;MyConn());<BR>这时如果调用session.removeAttribute("aaa"),则触发valueUnbound方法,就会自动关闭自己.<BR>而其它的需要改变状态的对象了是一样.<BR><BR>另外还有一个HttpSessionActivationListener监听器是实现分布式应用中session同步的.不作<BR>多介绍,如果有要实现该功能的朋友可以和我联系.<BR><BR><BR><BR><BR>在servlet2.4中,对于request范围已经实现对应的监听器:<BR>ServletRequestListener，ServletRequestAttributeListener<BR></P></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/fengliangjun/aggbug/6683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2005-06-24 15:58 <a href="http://www.blogjava.net/fengliangjun/articles/6683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse的乱码问题</title><link>http://www.blogjava.net/fengliangjun/articles/5888.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Fri, 10 Jun 2005 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/5888.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/5888.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/5888.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/5888.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/5888.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<P>
<DIV align=center><FONT color=#990000><STRONG>JSP与MySQL交互的中文乱码解决方案及总结</STRONG></FONT></DIV><BR><SPAN>首先实现了一个StringConvert bean（GBtoISO()和ISOtoGB()两个方法），解决了与MySQL数据库交互的时候的部分中文乱码问题：在JSP程序中读取MySQL的中文内容，用这两个方法可以解决乱码问题。 <BR><BR>但是从JSP写入到MySQL的中文内容都成了乱码，并且再读出来的时候也显示为"？？"，在这里应该出现了编码转换过程中的字符信息丢失。郁闷的是，我在命令行窗口中登陆到MySQL后，执行如"INSERT INTO customer VALUES('字符',...)"这样的语句时，写入到数据表中的中文内容又是显示正常的！！！数据库使用的字符集是utf8。 <BR><BR><BR><BR>碰壁多次，终于发现一条解决问题的路径：查看MySQL手册的时候，看到一条这样的语句：To allow multiple character sets to be sent from the client, the "UTF-8" encoding should be used, either by configuring "utf8" as the default server character set, or by configuring the JDBC driver to use "UTF-8" through the characterEncoding property. <BR><BR><BR><BR>此外，在查阅《MySQL权威指南》时，发现在查询语句中可以使用这样的语法将字符串转换到一个给定的字符集：_charset str。 <BR><BR>其中charset必须是服务器支持的某个字符集。在本例中，shopdb数据库使用的默认字符集是utf8，于是开始测试： <BR><BR>先输入INSERT INTO　publish Values('8',_gb2312 '高等教育出版社') 写入后中文变成"？？" <BR><BR>再试INSERT INTO　publish Values('8',_gbk '高等教育出版社') 结果同上 <BR><BR>INSERT INTO　publish Values('8',_utf8 '高等教育出版社') 这下更干脆，什么都没有！！ <BR><BR><BR><BR>　　快疯了!!没办法，用show character set;命令查看MySQL支持的字符集，心想我都试一遍总有一个能成功吧。浏览了一下，发现没有几个熟悉的字符集，就只剩下一个latin1(ISO-8859-1)比较常见了，不会是它吧，一试之下果然便是。 <BR><BR>INSERT INTO　publish Values('8',_latin1 '高等教育出版社') 输入中文能够正确显示。 <BR><BR><BR><BR>　　这下总算找到方法了，把Tomcat下配置的数据库连接池的url改为＂...characterEncoding=UTF-8＂，然后把写入数据库的中文内容用 <BR><BR>String s2 = new String(s1.getBytes("gb2312"),"ISO-8859-1")进行转码，其中s1为中文字符串．然后再写入到数据库一切显示正常。 <BR><BR><BR><BR>　　为解决这个问题查看了n多资料，现作一个总结：由于字符集和字符编码方式的不同，在OS以及程序之间传递数据（尤其是multiple character sets中的数据）时便会产生乱码以及字符信息的丢失．解决这个问题的关键便是了解数据输出端和接收端使用的字符集和字符编码方式，如果这两种编码方式不同，便需要在数据出口或入口处进行 转码。一般的说，在编写代码,编译，以及运行期间都会字符数据的传递，因此需要特别小心。 <BR><BR>　在编写代码的时候，你可能会使用某种开发工具，例如我正在使用的Eclipse．或许在写的时候一切正常，可是一旦保存后再次打开文档，所有的中文字符都变成了乱码。这是因为在编写的时候，这些字符数据都在内存的某个stream中，ok，这没问题，可是保存的时候这个stream中的数据会被写入到硬盘，使用的就是你的开发工具默认的编码方式，如果很不幸你的开发工具默认编码方式是ISO-8859-1，中文字符信息就不能正确地存储。Eclipse中可以这样查看并修改默认字符编码方式：Project-&gt;Properties-&gt;info，这里有＂default <BR>encoding for text file＂。如果设置为GBK，那么编写代码并保存这关就过了。 <BR><BR>　对于JSP程序而言，编写完代码后就交给Container，首先它们会被转成.java文件，然后编译成.class才能提交给服务器执行．这个过程也存在字符编码问题．java编译器(javac)使用操作系统的语言环境作为默认的字符编码方式，JRE(Java Runtime Environment)也是这样。只有当编译和运行环境的字符编码方式与存储源文件的编码方式相同时，中文字符才能正确地显示。否则就需要在运行时进行转码，使它们使用兼容的编码。这里的设置可以分为几个层次：操作系统层支持的语言，这是最重要的，因为它会影响ＪＶＭ的默认字符编码方式，同时对字符的显示，如字体等有直接影响；J2EE服务器层，大多数服务器都可以对字符编码进行自定义的配置，例如Tomcat就可以通过web.xml中设置javaEncoding参数设置字符编码，默认是UTF-8． <BR><BR>IE也可以设置成总是使用UTF-8编码来发送请求．应用程序层，每个配置在服务器下的程序都可以设置自己的编码方式，这个我目前还没有用到，以后再学习。 <BR><BR>　运行时的转码，运行时期，应用程序很可能需要与外部系统进行交互，例如对数据库进行读写，对外部文件进行读写．在这些情况下，应用程序免不了要和外部系统进行数据交换。那么对于中文字符， 数据出入口的编码方式就显得特别重要了。一般外部系统都有自己的字符编码方式，我的例子中配置的MySQL就是使用的UTF-8编码。JSP页面通过设定＂charset=gb2312＂, <BR><BR>使用gb2312编码，在它与数据库交互的时候就需要进行显式的转码才能正确处理中文字符。 <BR><BR>from:http://publishblog.blogchina.com/blog/tb.b?diaryID=1169246 </SPAN><img src ="http://www.blogjava.net/fengliangjun/aggbug/5888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2005-06-10 17:08 <a href="http://www.blogjava.net/fengliangjun/articles/5888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>