httpcontexttdestroyed方法能打印输出日志吗

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
&MyCharsetFilter.java&编码过滤器&&&package&...;&&&import&...;&&&//&主要目的:过滤字符编码;其次,做一些应用逻辑判断等.&&&//&Filter跟web应用一起启动&&&//&当web应用重新启动或销毁时,Filter也被销毁&&&public&class&MyCharsetFilter&implements&Filter&{&&&&&&&&private&FilterConfig&config&=&null;&&&&&&&&public&void&destroy()&{&&&&&&&&&&&&System.out.println("MyCharsetFilter准备销毁...");&&&&&&&&}&&&&&&&&&&&&public&void&doFilter(ServletRequest&arg0,&ServletResponse&arg1,&FilterChain&chain)&throws&IOException,&ServletException&{&&&&&&&&&&&&//&强制类型转换&&&&&&&&&&&&HttpServletRequest&request&=&(HttpServletRequest)arg0;&&&&&&&&&&&&HttpServletResponse&response&=&(HttpServletResponse)arg1;&&&&&&&&&&&&//&获 取web.xm设置的编码集,设置到Request、Response 中&&&&&&&&&request.setCharacterEncoding(config.getInitParameter("charset"));&&&&&&&&&&response.setContentType(config.getInitParameter("contentType"));&&&&&&&&&&response.setCharacterEncoding(config.getInitParameter("charset"));&&&&&&&&&&&&&&&&&&&&//&将请求转发到目的地&&&&&&&&&&&&chain.doFilter(request,&response);&&&&&&&&}&&&&&&&&&&&&public&void&init(FilterConfig&arg0)&throws&ServletException&{&&&&&&&&&&&&this.config&=&arg0;&&&&&&&&&&&&System.out.println("MyCharsetFilter初始化...");&&&&&&&&}&&&&}&&&& 以下是 MyCharsetFilter.java 在web.xml 中配置:& &filter&&&&&&&&&&&filter-name&filter&/filter-name&&&&&&&&&&&filter-class&dc.gz.filters.MyCharsetFilter&/filter-class&&&&&&&&&&&init-param&&&&&&&&&&&&&&&param-name&charset&/param-name&&&&&&&&&&&&&&&param-value&UTF-8&/param-value&&&&&&&&&&&/init-param&&&&&&&&&&&init-param&&&&&&&&&&&&&&&param-name&contentType&/param-name&&&&&&&&&&&&&&&param-value&text/charset=UTF-8&/param-value&&&&&&&&&&&/init-param&&&&&&&/filter&&&&&&&filter-mapping&&&&&&&&&&&filter-name&filter&/filter-name&&&&&&&&&&&!--&*&代表截获所有的请求&&或指定请求/test.do&&/xxx.do&--&&&&&&&&&&&url-pattern&/*&/url-pattern&&&&&&&/filter-mapping&&&&& & & &以上的例子简单的说明了Filter的使用,具体其他的应用可以看具体的场景。& 2.监听器 现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener
接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:
做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。下面利用监听器对数据库连接池DataSource的初始化演 示它的使用:& MyServletContextListener.java&&&&package&dc.gz.&&&&import&javax.servlet.ServletC&&&&import&javax.servlet.ServletContextE&&&&import&javax.servlet.ServletContextL&&&&import&mons.dbcp.BasicDataS&&&&&&&&&/**&&&&*&Web应用监听器&&&&*/&&&&public&class&MyServletContextListener&implements&ServletContextListener&{&&&&&&&&&&//&应用监听器的销毁方法&&&&&&&&public&void&contextDestroyed(ServletContextEvent&event)&{&&&&&&&&&&&&ServletContext&sc&=&event.getServletContext();&&&&&&&&&&&&//&在整个web应用销毁之前调用,将所有应用空间所设置的内容清空&&&&&&&&&&&&sc.removeAttribute("dataSource");&&&&&&&&&&&System.out.println("销毁工作完成...");&&&&&&&&}&&&&&&&&&&&&//&应用监听器的初始化方法&&&&&&&&public&void&contextInitialized(ServletContextEvent&event)&{&&&&&&&&&&&&//&通过这个事件可以获取整个应用的空间&&&&&&&&&&&&//&在整个web应用下面启动的时候做一些初始化的内容添加工作&&&&&&&&&&&&ServletContext&sc&=&event.getServletContext();&&&&&&&&&&&&//&设置一些基本的内容;比如一些参数或者是一些固定的对象&&&&&&&&&&&&//&创建DataSource对象,连接池技术&dbcp&&&&&&&&&&&&BasicDataSource&bds&=&new&BasicDataSource();&&&&&&&&&&&&bds.setDriverClassName("com.mysql.jdbc.Driver");&&&&&&&&&&&&&&&&&&&&&&&bds.setUrl("jdbc:mysql://localhost:3306/hibernate");&&&&&&&&&&&&bds.setUsername("root");&&&&&&&&&&&&bds.setPassword("root");&&&&&&&&&&&&bds.setMaxActive(10);//最大连接数&&&&&&&&&&&&bds.setMaxIdle(5);//最大管理数&&&&&&&&&&&&//bds.setMaxWait(maxWait);&最大等待时间&&&&&&&&&&&&//&把&DataSource&放入ServletContext空间中,&&&&&&&&&&&&//&供整个web应用的使用(获取数据库连接)&&&&&&&&&&&&sc.setAttribute("dataSource",&bds);&&&&&&&&&&&&System.out.println("应用监听器初始化工作完成...");&&&&&&&&&&&&System.out.println("已经创建DataSource...");&&&&&&&&}&&&&}&&&& web.xml中配置如下,很简单: &!--&配置应用监听器&&--&&&&&&&listener&&&&&&&&&&&listener-class&dc.gz.listeners.MyServletContextListener&/listener-class&&&&&&&/listener&&&&& 这样配置好了之后,以后在web应用中就可以通过ServletContext取得BasicDataSource对象,从而获取与数据库的连接,提高性能,方便使用。 3.拦截器 拦截器是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制。拦截器不是在web.xml,比如struts在struts.xml中配置, public&Object&invoke(Object&proxy,&Method&method,&Object[]&args)&throws&Throwable&&{&&Object&result&=&null;&&System.out.println("before&invoke&method&:"&+&method.getName());&&result&=&method.invoke(this.targetObj,&args);&&System.out.println("after&invoke&method&:&"&+&method.getName());&&return&&&}&&& 总结: 1.过滤器:所谓过滤器顾名思义是用来过滤的,在java
web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符(聊天室经常用到的,一些骂人的话)。filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等. 2.监听器:这个东西在c/s模式里面经常用到,他会对特定的事件产生产生一个处理。监听在很多模式下用 到。比如说观察者模式,就是一个监听来的。又比如struts可以用监听来启动。Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情 发生前、发生后可以做一些必要的处理。 3.java的拦截器 主要是用在插件上,扩展件上比如 hivernate spring struts2等 有点类似面向切片的技术,在用之前先要在配置文件即xml文件里声明一段的那个东西。
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'过滤器、监听器、拦截器的区别',
blogAbstract:'过滤器、监听器、拦截器的区别&
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
阅读(5817)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'applicationContext.xml 配置方法',
blogAbstract:'&?xml version=\"1.0\" encoding=\"UTF-8\"?&&&beans&xmlns=\"http://www.springframework.org/schema/beans\"&xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"&',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:4,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}2472人阅读
Q:如何打印当前的函数和行号?
A:我们可以在打印时使用一些预编译宏作为打印参数,来打印当前的函数和行号。如:
NSLog(@&%s:%d
__func__, __LINE__, obj);
其中__func__和__LINE__都是预编译的宏,编译时会分别替换为当前函数和当前行号。
下面是一些常用于打印日志的宏。
打印当前函数或方法,c字符串
打印当前行号,整数
打印当前文件路径,c字符串
__PRETTY_FUNCTION__
打印当前函数或方法(在C++中会包含参数类型),c字符串
Q:如何打印一个类名,消息名,当前堆栈信息?
A:你可以使用以下方法在运行时动态获取这些信息。
NSStringFromSelector(SEL)
获取selector的名字
NSStringFromSelector(_cmd)
获取当前方法名
NSStringFromClass([object class])
获取object的类名
NSThread callStackSymbols]
获取当前线程的栈,是一个NSArry,包含堆栈中所有函数名。
Q:如何将日志打印到一个文件
A:可以使用freopen函数重定向标准输出和标准出错文件。因为printf函数会向标准输出(stdout)打印,而NSLog函数会向标准出错(stderr)打印。重新定向标准输出(stdout)和标准出错(stderr)到一个文件将会使他们打印日志到一个文件中。
freopen(&/tmp/log.txt&,
&a+&, stdout);
freopen(&/tmp/log.txt&,
&a+&, stderr);
#define NSLog(FORMAT, ...) {\
& & & & & & & & & & & & & & NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];\
& & & & & & & & & & & & & & [dateFormatter setDateStyle:NSDateFormatterMediumStyle];\
& & & & & & & & & & & & & & [dateFormatter setTimeStyle:NSDateFormatterShortStyle];\
& & & & & & & & & & & & & & [dateFormatter setDateFormat:@&HH:mm:ss:SSSSSS&]; \
& & & & & & & & & & & & & & NSString *str = [dateFormatter stringFromDate:[NSDate date]];\
& & & & & & & & & & & & & & [dateFormatter release];\
& & & & & & & & & & & & & & fprintf(stderr,&[--%s--]*[--%s--]*[--%s:%d--]\n&,[str UTF8String], [[NSString stringWithFormat:FORMAT,
##__VA_ARGS__] UTF8String],[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__);\
& & & & & & & & & & & & & & }
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:57925次
积分:1026
积分:1026
排名:第19204名
原创:26篇
转载:131篇
(2)(1)(2)(4)(6)(1)(5)(3)(5)(4)(1)(2)(7)(3)(6)(13)(5)(5)(14)(47)(21)输出日志方法LogPrint
'**********************************************************
'功能:输出日志方法LogPrint
'参数:logFilePath,logMessage
'**********************************************************
LogMessage1 = "this is my log message"
LogPrint "c:\test.log", LogMessage1
'msgbox logMessage1
Public Function LogPrint(logFilePath, ByVal
logMessage)&&&&&'ByVal表示传值
Dim fso, logFile
Set fso = CreateObject("Scripting.FileSystemObject")
fso.FileExists(LogFilePath) Then
&&&fso.CreateTextFile(LogFilePath)
Set logFile = fso.OpenTextFile (LogFilePath, 8,
True)&& '8即“ForAppending”表示在一个打开的文件中续写
logMessage = now & ":
"&logMessage&&&
为当前时期时间
&logFile.WriteLine(logMessage)
logFile.Close
End Function
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 httpcontext 的文章

 

随机推荐