﻿<?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-J2EE,Documentum,GWT,EJB学习路程-随笔分类-J2EE总结</title><link>http://www.blogjava.net/todd841026/category/21423.html</link><description>为了所爱的，和爱我的人努力</description><language>zh-cn</language><lastBuildDate>Mon, 17 Dec 2007 16:15:51 GMT</lastBuildDate><pubDate>Mon, 17 Dec 2007 16:15:51 GMT</pubDate><ttl>60</ttl><item><title>节省使用httpsession（此文引用于Effective Enterprise java：39）</title><link>http://www.blogjava.net/todd841026/archive/2007/12/17/168150.html</link><dc:creator>田亮</dc:creator><author>田亮</author><pubDate>Mon, 17 Dec 2007 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/todd841026/archive/2007/12/17/168150.html</guid><wfw:comment>http://www.blogjava.net/todd841026/comments/168150.html</wfw:comment><comments>http://www.blogjava.net/todd841026/archive/2007/12/17/168150.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/todd841026/comments/commentRss/168150.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/todd841026/services/trackbacks/168150.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 基于html/http的应用中，为了维护代表客户端的瞬时状态，servlet容器提供了一种称为会话空间的设施，被表示为HttpSession接口。这个思想本身是简单而直接的，servlet程序员可以将任意的可序列化对象置于会话空间，而下一次，同一个用户对同一个Web应用的任何部分发出请求时，servlet容器将确保同样的对象会处在HttpSession对象中。这使得servlet开发者可以为在服务器上的Web应用在多个HTTP请求之间维护每个客户端的状态信息；</p>
&nbsp;&nbsp;&nbsp; 遗憾的是，这种机制并非完全免费的。首先，在服务器端为每个客户端存储数据将会减少该服务器上的可用资源，这意味着服务器的最大负载能力会成比例下降。这个算式很简单：在会话空间中保存越多的数据，机器能够处理的会话就越少。由此推导出，为了令给定的机器能够支持尽可能多的客户端，必须将会话的存储量保持在最小。实际上，对于真正具备可扩展性的系统而言，无论何时都应该避免使用会话。如果在服务器端可以不产生任何为每个客户端进行处理的开销，那么机器的负载能力（在理论上）可以到达无限，能够支持任意多连接到它的客户端。<br />
<img src ="http://www.blogjava.net/todd841026/aggbug/168150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/todd841026/" target="_blank">田亮</a> 2007-12-17 10:04 <a href="http://www.blogjava.net/todd841026/archive/2007/12/17/168150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE总结---JNDI技术          我的所有随笔属于个人总结，有不足之处请回复指出</title><link>http://www.blogjava.net/todd841026/archive/2007/04/09/JNDI.html</link><dc:creator>田亮</dc:creator><author>田亮</author><pubDate>Mon, 09 Apr 2007 00:16:00 GMT</pubDate><guid>http://www.blogjava.net/todd841026/archive/2007/04/09/JNDI.html</guid><wfw:comment>http://www.blogjava.net/todd841026/comments/109315.html</wfw:comment><comments>http://www.blogjava.net/todd841026/archive/2007/04/09/JNDI.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/todd841026/comments/commentRss/109315.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/todd841026/services/trackbacks/109315.html</trackback:ping><description><![CDATA[&nbsp;
<p><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>什么是</span><span>JNDI</span><span>（</span><span>Java Naming and Directory Interface</span><span>）</span></p>
<p><span>JNDI</span><span>是用于访问不同命名和目录服务的统一</span><span>API</span><span>接口；</span></p>
<p><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>JNDI</span><span>的架构和原理</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>架构：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第一层：</span><span>java</span><span>代码，是访问</span><span>JNDI</span><span>的代码；</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第二层：</span><span>JNDI API</span><span>：统一的命名和目录服务接口</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第三层：</span><span>JNDI Naming Manager</span><span>：</span><span>JNDI</span><span>管理器</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第四层：</span><span>JNDI SPI</span><span>：用于构建</span><span>JNDI</span><span>实现的框架，能够动态的插入命名和目录服务提供商的产品；</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第五层：命名和目录服务提供商的产品；</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;命名和目录服务提供商的产品</span><span>,</span><span>例如：</span><span>DNS,LDAP,NIS,NDS&#8230;&#8230;..;</span><span>因为这些产品都是不同的提供商提供的产品，所以他们的命名和目录服务的标准不一致，各个目录服务采用的访问协议也是不一样的，所以，要是直接访问他们的话，就要编写不同的</span><span>java</span><span>代码来访问他们；因此，</span><span>JNDI SPI</span><span>就解决了这个问题，它能动态的插入这些命名和目录服务，能够将其协议专属的目录产品集成到系统中，使得我们能只需要调用一个统一的</span><span>javaAPI</span><span>就能够访问插入的产品了；</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2</span><span>．原理：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JNDI</span><span>其实很好理解，他就是一个树状的结构，它的最顶是一个</span><span>initialContext</span><span>节点，然后它的下面就是绑定的一些对象或是一些</span><span>subContext</span><span>，用</span><span>JNDI</span><span>树就能够查找到树中每一个绑定上的节点上的对象的引用；</span></p>
<p><span>3.</span><span>怎样连接到</span><span>JNDI</span><span>上？</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Environment environment = new Environment() ;//</span><span>创建一个环境对象</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>environment.setProviderurl(&#8220;t3://www.blogjava.net&#8221;) ;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>environment.setSecurityPrincipal(&#8220;todd&#8221;) ;//</span><span>认证的用户名</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>environment.setSecurityCredentials(&#8220;841026&#8221;) ;//</span><span>密码</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Context context = environment.getInitialContext() ;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span>创建一个</span><span>subContext</span><span>并绑定一个对象：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Context subContext = context.createSubcontext(&#8220;subContext&#8221;) ;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>subContext.rebind(&#8220;newObject&#8221;,object) ;//</span><span>绑定的对象必须是可序列化的</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>subContext.close() ;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>context.close() ;</span></p>
<p><span>4.</span><span>如何通过</span><span>JNDI</span><span>查找</span><span>bind</span><span>的对象？</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Object object = context.lookup(&#8220;User&#8221;) ;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span>把</span><span>user</span><span>窄化到原型</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>User user = (User)javax.rmi.PortableRemoteObject.narrow(object, User.class) ;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>context.close() ;</span></p>
<img src ="http://www.blogjava.net/todd841026/aggbug/109315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/todd841026/" target="_blank">田亮</a> 2007-04-09 08:16 <a href="http://www.blogjava.net/todd841026/archive/2007/04/09/JNDI.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE总结--Servlet技术               我的所有随笔属于个人总结，有不足之处请回复指出</title><link>http://www.blogjava.net/todd841026/archive/2007/04/08/Servlet.html</link><dc:creator>田亮</dc:creator><author>田亮</author><pubDate>Sun, 08 Apr 2007 05:31:00 GMT</pubDate><guid>http://www.blogjava.net/todd841026/archive/2007/04/08/Servlet.html</guid><wfw:comment>http://www.blogjava.net/todd841026/comments/109227.html</wfw:comment><comments>http://www.blogjava.net/todd841026/archive/2007/04/08/Servlet.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/todd841026/comments/commentRss/109227.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/todd841026/services/trackbacks/109227.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>Servlet</span><span>技术：</span></p>
<p><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>什么是</span><span>servlet</span><span>？</span></p>
<p><span>Servlet</span><span>是一个</span><span>java</span><span>类，是一个提供基于协议请求和响应的</span><span>java</span><span>类；</span></p>
<p><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>它的生命周期</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>启动服务器时就会实例化并加载</span><span>servlet</span><span>实例；</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>进行初始化：自动调用</span><span>init</span><span>（</span><span>ServletConfig servletConfig</span><span>）方法；</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Servlet</span><span>就绪：调用</span><span>service</span><span>（</span><span>HttpServletRequest request</span><span>，</span><span>HttpServletResponse response</span><span>）方法（其&nbsp;&nbsp;&nbsp;中</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service</span><span>&nbsp;&nbsp;&nbsp;就是</span><span>dopost</span><span>（）或</span><span>doget</span><span>（）方法），这是客户提交时，自动调用的；</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Servlet</span><span>销毁：自动调用调用</span><span>distory</span><span>（）</span> <span>；</span></p>
<p><span>&nbsp;&nbsp;&nbsp;注意：在实例化并加载</span><span>servlet</span><span>后，步骤二和四只调用一次，而步骤三，是在每次客户端发出请求时都调用；</span></p>
<p><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>怎样部署一个</span><span>servlet</span><span>？</span></p>
<p><span>Servlet</span><span>类是必须在</span><span>web.xml</span><span>中注册才能使用的，例如，我有一个</span><span>MyServlet</span><span>类：</span></p>
<p><span>必须在</span><span>web.xml</span><span>中注册：</span></p>
<p><span>&lt;web-app&gt;</span></p>
<p><span>//-----------------------Servlet</span><span>声明</span><span>----------------------</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;servlet&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-name&gt;myServlet&lt;/servlet-name&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-class&gt;servletPakage.MyServlet&lt;/servlet-class&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/servlet&gt;</span></p>
<p><span>//------------------------Servlet</span><span>注册</span><span>(</span><span>镜像</span><span>)---------------</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-mapping&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-name&gt;myServlet&lt;/servlet-name&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;url-pattern&gt;myServletURL&lt;/ url-pattern &gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/servlet-mapping&gt;</span></p>
<p><span>&lt;/web-app&gt;</span></p>
<p><span>这样你在提交时的</span><span>Url</span><span>地址就是</span><span>/myServletURL</span><span>了；</span></p>
<p><span><span>4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>什么是</span><span>service</span><span>（</span><span>HttpServletRequest request</span><span>，</span><span>HttpServletResponse response</span><span>）方法？</span></p>
<p><span>其中</span><span>service</span><span>（</span><span>HttpServletRequest request</span><span>，</span><span>HttpServletResponse response</span><span>）方法包括两种：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>doget</span><span>（</span><span>HttpServletRequest request</span><span>，</span><span>HttpServletResponse response</span><span>）方法：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这种方法被称为显式提交方法，主要原因是它的得到的参数放在</span><span>url</span><span>中，可以被看到，所以称为显示提&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;交；</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例如：有个表单：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form action<a href="http://www.blogjava.net/myServletURL?name=todd">=&#8221;/myServletURL?name=todd</a>&#8221; method=&#8221;get&#8221;&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这种方法其</span><span>request</span><span>获得的参数就是你看到的</span><span>name=todd</span><span>；</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例如：</span><span>String s=request.getParameter(&#8220;name&#8221;);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>其结果</span><span>s=&#8221;todd&#8221;;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>dopost</span><span>（</span><span>HttpServletRequest request</span><span>，</span><span>HttpServletResponse response</span><span>）方法：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这种方法被称为隐式提交方法，它的参数不会在</span><span>url</span><span>里得到，而是在请求数据体得到参数；</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例如：有个表单：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;form action=&#8221;/myServletURL&#8221; method=&#8221;post&#8221;&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;input type=&#8221;text&#8221; name=&#8221;name&#8221; value=&#8221;todd&#8221;&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这种方法其</span><span>request</span><span>获得的参数就是表单体的</span><span>name=todd</span><span>；</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>例如：</span><span>String s=request.getParameter(&#8220;name&#8221;);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>其结果</span><span>s=&#8221;todd&#8221;;</span></p>
<p><span><span>5.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>什么是</span><span>ServletContext?</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletContext</span><span>是一个接口，是</span><span>WebApplication</span><span>的视图，它的作用域时</span><span>Application</span><span>，它能访问</span><span>Application</span><span>中的初始化参数和属性，它不局限域一个</span><span>Servlet</span><span>，它属于整个</span><span>Application</span><span>；</span></p>
<p><span>ServletContext</span><span>的初始化参数：</span></p>
<p><span>在</span><span>web.xml</span><span>中：</span></p>
<p><span>&lt;web-app&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>&lt;context-param&gt;</span></p>
<p><span>&lt;param-name&gt;myBlog&lt;/param-name&gt;</span></p>
<p><span>&lt;param-value&gt;www.blogjava.net/todd841026&lt;/param-value&gt;</span></p>
<p><span>&lt;/context-param&gt;</span></p>
<p><span>&lt;/web-app&gt;</span></p>
<p>&nbsp;<span>这样在</span><span>application</span><span>中任意一个</span><span>Servlet</span><span>中可以得到这个参数，</span></p>
<p><span>例如：</span><span>ServletContext sc = getServletContext ();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;String s = sc.getInitParameter(&#8220;myBlog&#8221;);</span></p>
<p><span>那么结果</span><span>s</span><span>就是</span><span>&#8221;www.blogjava.net/todd841026&#8221;</span></p>
<p><span><span>6.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>什么是</span><span>ServletConfig</span><span>？</span></p>
<p><span>是单独的</span><span>Servlet</span><span>初始化配置；</span></p>
<p><span>例如：在</span><span>web.xml</span><span>中</span></p>
<p><span>&lt;web-app&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;servlet&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-name&gt;myServlet&lt;/servlet-name&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-class&gt;servletPakage.MyServlet&lt;/servlet-class&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/servlet&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;init-param&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;param-name&gt;cache&lt;/param-name&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;param-value&gt;off&lt;/param-value&gt;</span></p>
<p><span>&lt;/init-param&gt;</span></p>
<p><span>&lt;/web-app&gt;</span></p>
<p><span>在这个</span><span>Servlet</span><span>中：</span><span>ServletConfig sc = getServletConfig();</span></p>
<p><span><span>&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; </span>String s = sc.getInitParameter(&#8220;cache&#8221;);</span></p>
<p><span>那么结果</span><span>s</span><span>就是</span><span>&#8221;</span><span>off&#8221;;</span></p>
<p><span><span>7.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Servlet</span><span>怎样处理多线程</span></p>
<p><span>在默认的情况下，单个</span><span>Servlet</span><span>实例是可以处理多个并发请求的，所以要考虑到多线程的共享同一对象的问题，例如：</span></p>
<p><span>//</span><span>做个</span><span>Servlet</span><span>中产生了多少个</span><span>object</span><span>对象一个变量的例子</span></p>
<p><span>Private int count = 0 ;</span></p>
<p><span>Public void dopost(HttpServletRequest request,HttpServletResponse response){</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Object object = new Object() ;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>count++ ;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println(&#8220;count = &#8221; + count) ;</span></p>
<p><span>}</span></p>
<p><span>当有</span><span>5</span><span>个用户提交数据时，因为</span><span>Servlet</span><span>是处理多线程的，所以可能出现，第四个用户的程序已经执行了</span><span>count++</span><span>，而第五个用户刚执行完</span><span>Object object = new Object() </span><span>，就会出现数据不一致性，因为当前有</span><span>5</span><span>个</span><span>object</span><span>对象，但是</span><span>count</span><span>却是</span><span>4</span><span>；</span></p>
<p><span>解决方案一：</span></p>
<p><span>Private boolean flag = false </span><span>；</span></p>
<p><span>Private int count = 0 ;</span></p>
<p><span>Public void dopost(HttpServletRequest request,HttpServletResponse response){</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>synchronized(flag){</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Object object = new Object() ;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>count++ ;</span></p>
<p><span>}<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println(&#8220;count = &#8221; + count) ;</span></p>
<p><span>}</span></p>
<p><span>用同步程序块解决多线程的问题，这样在同一时刻就只能有一个访问该程序块了；</span></p>
<p><span>解决方案二：</span></p>
<p><span>Private int count = 0 ;</span></p>
<p><span>Public void dopost(HttpServletRequest request,HttpServletResponse response)</span></p>
<p><span>Implements SingleThreadModel{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Object object = new Object() ;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>count++ ;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println(&#8220;count = &#8221; + count) ;</span></p>
<p><span>}</span></p>
<p><span>实现</span><span>SingleThreadModel</span><span>接口，可以解决多线程问题；</span></p>
<p><span><span>8.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>什么是</span><span>servlet</span><span>过滤器？</span></p>
<p><span>也是一个</span><span>java</span><span>类，只是它实现了</span><span>Filter</span><span>这个接口；</span></p>
<p><span><span>9.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>servlet</span><span>过滤器的生命周期；</span></p>
<p><span>初始化：自动调用</span><span>init(FilterConfig config)</span><span>方法</span></p>
<p><span>执行：自动调用</span><span>doFilter()</span><span>方法；</span></p>
<p><span>销毁：自动调用</span><span>destory()</span><span>方法；</span></p>
<p><span><span>10.<span>&nbsp;&nbsp; </span></span></span><span>servlet</span><span>过滤器有什么用途？</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;个人认为目前自己用到的Servlet</span><span>过滤器的主要用途：是安全性检查</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当然过滤器在</span><span>Servlet</span><span>之前也可以修改请求，要是在</span><span>Servlet</span><span>之后，也可以修改响应；</span>&nbsp;</p>
<p><span><span>11.<span>&nbsp;&nbsp; </span></span></span><span>servlet</span><span>过滤器怎样部署？</span></p>
<p><span>在</span><span>web.xml</span><span>中：</span></p>
<p><span>&lt;web-app&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>&lt;filter&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;filter-name&gt;myFilter&lt;/filter-name&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;filter-class&gt;filterPage.MyFilter&lt;/filter-class&gt;</span></p>
<p><span>&lt;/filter&gt;</span></p>
<p><span>&lt;filter-mapping&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;filter-name&gt;myFilter&lt;/filter-name&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;url-pattern&gt;/Todd/*&lt;/url-pattern&gt;</span></p>
<p><span>&lt;/filter-mapping&gt;</span></p>
<p><span>&lt;/web-app&gt;</span></p>
<p><span>这样就是说要访问</span><span>WEB-INF</span><span>下的</span><span>Todd</span><span>包下的</span><span>jsp</span><span>或</span><span>Servlet</span><span>的话，就必须要先通过</span><span>myFilter</span><span>这个类；</span></p>
<img src ="http://www.blogjava.net/todd841026/aggbug/109227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/todd841026/" target="_blank">田亮</a> 2007-04-08 13:31 <a href="http://www.blogjava.net/todd841026/archive/2007/04/08/Servlet.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>