﻿<?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-歧途-随笔分类-Servlets&amp;JSP</title><link>http://www.blogjava.net/run2u/category/26925.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 29 Oct 2007 15:50:12 GMT</lastBuildDate><pubDate>Mon, 29 Oct 2007 15:50:12 GMT</pubDate><ttl>60</ttl><item><title>ServletConfig与ServletContext的区别</title><link>http://www.blogjava.net/run2u/archive/2007/10/29/156702.html</link><dc:creator>空杯</dc:creator><author>空杯</author><pubDate>Mon, 29 Oct 2007 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/run2u/archive/2007/10/29/156702.html</guid><wfw:comment>http://www.blogjava.net/run2u/comments/156702.html</wfw:comment><comments>http://www.blogjava.net/run2u/archive/2007/10/29/156702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/run2u/comments/commentRss/156702.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/run2u/services/trackbacks/156702.html</trackback:ping><description><![CDATA[from: http://www.blogjava.net/software5168/archive/2006/09/05/67752.html<br />
<br />
HttpServletRequest,HttpServletResponse:这两个属性的作用范围最小。<br />
&nbsp;&nbsp;&nbsp;&nbsp;时间上：只是本身请求和应答完成就失效，当然转发是把当前的request对象取出来传给另一<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;个资源，其实本身的request对象还是只生存到本次请求结束，response也同样。<br />
&nbsp;&nbsp;&nbsp;&nbsp;空间上：只能发送请求的客户端有效。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;HttpSession:一次连结到客户端关闭，时间作用范围比上面两个大，空间任用范围相同。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ServletConfig:从一个servlet被实例化后，对任何客户端在任何时候访问有效，但仅对本servlet<br />
&nbsp;&nbsp;&nbsp;&nbsp;有效，一个servlet的ServletConfig对象不能被另一个servlet访问。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ServletContext:对任何servlet，任何人在任何时间都有效，这才是真正全局的对象。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;那么，ServletConfig参数和ServletContext参数到底应该如何使用，如何取得？<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;一般来说，对整个应用的配置，为了不使用&#8220;硬编码&#8221;，应该配置为ServletContext参数，比如字<br />
&nbsp;&nbsp;&nbsp;&nbsp;符集设定。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;web-app&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.................<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;charset&lt;/param-name&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;GB2312&lt;/param-value&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.................<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/web-app&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;注意以上格式只是2。0以后的标准格式，旧容器（引擎）采用服务商自己的格式配置。注意它的<br />
&nbsp;&nbsp;&nbsp;&nbsp;父元素应该是&lt;web-app&gt;也就是说它是对一个应用作用的。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;而如果只有一个特定的servlet要设定的参数，其它servlet不能共享，应该配置为ServletConfig<br />
&nbsp;&nbsp;&nbsp;&nbsp;参数，如一个读取附件的servlet要用到绝对目录，而别的servlet不会用到：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;GetAtt&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;mail.GetAttServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;absPath&lt;/param-name&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;/usr/mail/ax/axman/Maildir/&lt;/param-value&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;不用说，因为在&lt;servlet&gt;标签中已经指定了name和class,也就是说只有mail.GetAttServlet这个<br />
&nbsp;&nbsp;&nbsp;&nbsp;servlet中才能取到path,而别的Servlet是不能取到的。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;那么如何访问这两个对象的参数呢？<br />
&nbsp;&nbsp;&nbsp;&nbsp;访问ServletConfig参数：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先要取得ServletConfig对象，然后调用它的getInitParameter();方法。要访问<br />
&nbsp;&nbsp;&nbsp;&nbsp;ServletConfig对象，jsp中直接使用config内置对象，但因为你的JSP编译后的servlet一般不会被<br />
&nbsp;&nbsp;&nbsp;&nbsp;加到web.xml中的，所以一般不会通过jsp来取对本JSP编译后的servlet的配置参数，那么在servlet<br />
&nbsp;&nbsp;&nbsp;&nbsp;中要得到ServletConfig对象有两种方法：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;在inii()方法中取到：通过init的重载方法传递<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;.....<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;Test&nbsp;extends&nbsp;HttpServlet&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletConfig&nbsp;config;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;init(ServletConfig&nbsp;config)&nbsp;throws&nbsp;ServletException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.config&nbsp;=&nbsp;config;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..................<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;然后在下面的方法中就可以访问config对象。但要注意，为了确保能从构造方法中到到当前servlet的<br />
&nbsp;&nbsp;&nbsp;&nbsp;config对象，应该调用父类的构造方法：<br />
&nbsp;&nbsp;&nbsp;&nbsp;.....<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;Test&nbsp;extends&nbsp;HttpServlet&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletConfig&nbsp;config;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;init(ServletConfig&nbsp;config)&nbsp;throws&nbsp;ServletException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.init(config);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.config&nbsp;=&nbsp;config;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..................<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;通过getServletConfig()方法直接到时，这样做的好处是不必调手工传递属性，想在任何时候都可<br />
&nbsp;&nbsp;&nbsp;&nbsp;以得到。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;还有第三种方法，要自己实现一些接口，这里作为一般讨论就不介绍了。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;要访问ServletContext对象，只要从现有的ServletConfig对象getServletContext（）就可以了，然后<br />
&nbsp;&nbsp;&nbsp;&nbsp;调用它的getInitParameter()方法就可以获取它的参数。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;按说：ServletContext对象的作用域比ServletConfig作用域大，为什么要从ServletConfig中到得<br />
&nbsp;&nbsp;&nbsp;&nbsp;ServletContext对象呢？我个人认为：容器保存了很多个ServletContext对象，请求时容器到底取哪一个<br />
&nbsp;&nbsp;&nbsp;&nbsp;给你呢？那就取其中包含ServletConfig信息的那个给你，就是说取ServletConfig对象的父级对象。就好<br />
&nbsp;&nbsp;&nbsp;&nbsp;象HttpSession要从requset中取得一样，就是取那个包含当前requese对象的session对象给你，这只是我<br />
&nbsp;&nbsp;&nbsp;&nbsp;的个人想法，还没有来得及看具体实现。反正就这么用吧。 
<img src ="http://www.blogjava.net/run2u/aggbug/156702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/run2u/" target="_blank">空杯</a> 2007-10-29 15:59 <a href="http://www.blogjava.net/run2u/archive/2007/10/29/156702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>