﻿<?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-JAVA-文章分类-Servlet</title><link>http://www.blogjava.net/hitlang/category/11573.html</link><description>学以致用</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 02:33:51 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 02:33:51 GMT</pubDate><ttl>60</ttl><item><title>servlet学习笔记</title><link>http://www.blogjava.net/hitlang/articles/71851.html</link><dc:creator>liulang</dc:creator><author>liulang</author><pubDate>Mon, 25 Sep 2006 15:09:00 GMT</pubDate><guid>http://www.blogjava.net/hitlang/articles/71851.html</guid><wfw:comment>http://www.blogjava.net/hitlang/comments/71851.html</wfw:comment><comments>http://www.blogjava.net/hitlang/articles/71851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hitlang/comments/commentRss/71851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hitlang/services/trackbacks/71851.html</trackback:ping><description><![CDATA[
		<p>2004-9-16      星期四      晴</p>
		<p>Servlet的基础概念</p>
		<p>1.  Servlet是什么?<br />答：1) 模块化的程序，运行在服务器端，增强了请求/响应导向服务;<br />    2) 应用示例：<br />       a. 访问远端对象;<br />       b. 跟踪大量信息;<br />       c. 多用户协作</p>
		<p>2.  HTTP和Servlets<br />答：1) Servlet是HTTP协议中作为CGI的一个替代品;<br />    2) HttpServlet类用于开发HTTP为基础的Servlet</p>
		<p>3.  HttpServlet<br />答：1) 继承抽象类javax.servlet.GenericServlet，实现接口java.io.Serializable;<br />    2) 用以开发Http协议为基础的Servlet</p>
		<p>4.  服务方法<br />答：1) 每当服务接收到对Servlet的请求时，服务器就会产生一个新线程，并调用Service。service方法检查HTTP请求类型(GET、POST、PUT、DELETE等),并相应地调用doGet、doPost、doPut、doDelete等。<br />    2) doGet/doPost方法接收HttpServletRequest和HttpServletResponse对象。<br />    3) 99%的时间里，只需注意GET和/或POST请求;<br />    4) 没有任何doHead方法。</p>
		<p>5.  返回响应<br />答：1) PrintWriter out = response.getWriter                 // 用于返回文本数据给客户端<br />    2) ServletOutputStream out = response.getOutputStream   // 用于返回二进制数据给客户端</p>
		<p>6.  支持Servlet的Web服务器<br />答：1) J2EE应用服务器包括：Web Container和EJB Container;<br />    2) Web Container的Servlet Engine提供对Servlet的运行支持;</p>
		<p>                                                                                <br />2004-9-17      星期五      晴 </p>
		<p>用Servlet处理表单数据</p>
		<p>1. Form元素的属性<br />答：1) ACTION: 用来指定要处理FORM数据的Servlet的URL，也可以指定FORM数据将要发送到的电子邮件;<br />    2) METHOD: 指定数据传送给HTTP服务器的方法;<br />    3) ENCTYPE: 指定数据在传输之前进行编码的方式, 例multipart/form-data 编码将每个字段作为MIME可兼容的文档的单独部分传输。</p>
		<p>2. 解析请求<br />答：1) 对于所有的请求：<br />       a. getParameterNames: 以Enumeration形式获取表单中清单, 每一项都可以转换成String;<br />       b. getParameter: 返回表单中参数名(区分大小写)对应的值(没有这样的参数，返回null;没有任何值，返回空String);<br />       c. getParameterValues: 返回表单中参数名(区分大小写)对应的字符串数组(没有这样的参数，返回null;只有一个值，返回值为单一元素组);</p>
		<p>
				<br />Servlet的生命周期</p>
		<p>1.  Servlet的生命周期<br />答：1) 通过web Container装载(J2EE的组件都是被动地装载入Container)并实例化Servlet对象;<br />    2) 调用init()方法(在整个生命周期中只被调用一次);<br />    3) 调用service()方法(在整个生命周期中可被调用多次);<br />    4) 调用destroy()方法(在整个生命周期中只被调用一次);</p>
		<p>2.  init方法<br />答：1) 当首次创建Servlet时就会调用init方法, 而不是每个用户请求都会调用该方法。<br />    2) 除非被destroy方法移除，否则不能被重载;<br />    3) init方法一结束，servlet即可接受客户端请求;<br />    <br />3.  init方法实例<br />答：1) 在编写接受ServletConfig作为参数的init方法时，应该总是在首行调用super.init;<br />    2) init方法接受ServletConfig作为参数, 用以下方法获得参数值：<br />       a. getInitParameter: 返回指定参数名称对应的值，如果参数不存在，返回null;<br />       b. getInitParameterNames: 返回指定参数名称对应的值枚举，如果参数不存在，返回的空枚举;</p>
		<p>2004-9-20      星期一      阴</p>
		<p>3.  service方法<br />答：1) 每当服务器接收到对Servlet的请求时，服务器就会产生一个新线程, 并调用service。service方法检查HTTP请求类型，请相应地调用doGet、doPost、doPut、doDelete。<br />    2) 被container调用去响应(ServletResponse)来自客户端的请求(ServletRequest);</p>
		<p>4.  Servlets的多线程安全<br />答：1) 多线程占用资源少，处理速度快，提高了效率。<br />    2) 一些编码建议：<br />       a. 对变量和方法定义适当的访问方式, 例如单纯取值操作不会有多线程安全问题;<br />       b. 同步化所有访问重要数据的实例变量;<br />       c. 创建访问类变量的访问方法。</p>
		<p>5.  SingleThreadModel接口<br />答：1) 如果希望禁止多线程访问，可以让Servlet使用SingleThreadModel接口:<br />       public class YourServlet extends HttpServlet implements SingleThreadModel{<br />       ...<br />       }<br />    2) 使用此接口，系统将保证不会存在多个请求线程同时访问Servlet的单个实例。但是仍然需要同步对存储在Servlet外部的类变量或共享字段的访问。<br />    3) 如Servlet频繁被访问，则Servlet访问的同步将严重影响性能(延时)。</p>
		<p>6.  destroy方法<br />答：1) 服务器决定删除已经加载的Servlet实例之前将调用Servlet的destroy方法;<br />    2) 该方法允许Servlet:<br />       a. 关闭数据库连接;<br />       b. 中止后台线程;<br />       c. 将Cookie程序清单或访问计数写到磁盘以及执行其他类似的收尾工作。</p>
		<p>7. 在Servlet终止时处理Service线程<br />答：1) 在destroy()方法中：如有服务(通过一个同步化的实例方法取得当前线程数大于0)，则置关闭状态为true(通过一个同步化的实例方法实现)。然后循环等待服务线程数为0. <br />    2) 在Service()方法中: 如见关闭状态为true，便不执行具体逻辑方法，直接退出。</p>
		<p>2004-9-21      星期二      晴</p>
		<p>资源访问</p>
		<p>1. 分布式JAVA技术<br />答：1) JDBC;<br />       a. 实现了Data和Client的分开;<br />       b. 通过简单的配置可以适用不同种类的数据库。<br />    2) RMI(RMI使用的协议为Internet Inter ORB Protocol);<br />    3) CORBA(核心技术为ORB：相应的你的请求转为另一个物理地址另一个不同语言对象的请求。纯Java的情况下根本不用CORBA);</p>
		<p>2.  转发结果至可视页面<br />答：1) 用JavaBean(用来装载一组值，遵从一定协议的class)封装结果;<br />    2) 每个JVM中的每一个应用程序里都存在一个上下文;<br />    3) servletContext在servletConfig的对象中;<br />    4) ServletContext.getRequestDispatcher(String path)：返回一个RequestDispatcher<br />    5) 通过RequestDispatcher的forward()或include()方法传送请求。</p>
		<p>3. 转发请求至新的资源<br />答：1) request dispatcher的二种传送请求方式<br />       a. Forward: 将请求从一个servlet传到服务器上的其他资源(servlet、JSP、HTML);<br />       b. Include: 包括静态或动态内容;<br />    2) 获得request dispatcher的二种方式：<br />       a. ServletRequest.getRequestDispatcher()       // 相对路径<br />       b. ServletContext.getRequestDispatcher()       // 绝对路径<br />    3) 四种资源范围<br />       a. javax.servlet.ServletContext: 整个应用程序范围内;<br />       b. javax.servlet.http.HttpSession: 会话期间;<br />       c. javax.servlet.ServletRequest: 一个请求期间;<br />       d. javax.servlet.jsp.PageContext: 一个JSP页面;</p>
		<p>2004-9-22      星期三      晴</p>
		<p>Servlets中的持久状态</p>
		<p>1. HTTP协议中无状态的优缺点：<br />答：优点：可以服务很多客户端;<br />    缺点：不能在多个请求之间共享信息(通过Cookie和Session解决);</p>
		<p>2. Cookies<br />答：1) Cookies是Web服务器发送到浏览器的简短文本信息，以后在访问同一个Web站点或域时浏览器就会毫无更改地返回该文本信息。<br />    2) 用户可以决定是否接受Cookie。<br />    3) 一个Cookie由以下内容组成：<br />       a. 名称;<br />       b. 单个值;<br />       c. 一些操作属性：路径或所在域、有效期以及版本号。<br />    4) 每个站点，浏览器通常只接受20条Cookie,总共接受300条，以及每条Cookie限制为4KB。</p>
		<p>3.  设置Cookie<br />答：1) 创建Cookie: <br />       Cookie c = new Cookie("CookieName", "CookieValue");<br />    2) 设置有效期：<br />       c.setMaxAge(int lifetime); 黙认为负值，只作用于当前会话，不能存储在磁盘上;如为0值表示删除Cookie；有效值为秒为单位。<br />    3) 在响应头中放置Cookie: <br />       response.addCookie(c);<br />    4) 从客户端读取Cookie: <br />       Cookie[] cookies = request.getCookies();<br />       Cookie cookie;<br />       for(int i=0; i&lt;cookies.length; i++)<br />       {<br />          cookie = cookies[i];<br />          out.println("&lt;tr&gt;&lt;td&gt;" + cookie.getName() + "&lt;/td&gt;&lt;td&gt;" + cookie.getValue());<br />       }</p>
		<p>4. Sessions<br />答：1) 一个客户端和一个服务器端一次连接信息的所有集合，通过brower发出，由服务器端的servlet调用;<br />    2) 提供一种方式在多个页面请求间确认用户或者储存关于用户的信息;<br />    3) 实现会话跟踪的三种方式：a. cookie; b. URL重写; c. 隐藏的表单段</p>
		<p>5. 设置Sessions<br />答：1) 创建Sessions: <br />       HttpSession session = request.getSession(true);      // true表示如不存在则创建一个新的session<br />    2) 用指定名称将一个对象绑定到session: <br />       public void setAttribute(String name, Object value);<br />    3) 删除与指定名称相关的所有值：<br />       public void removeAttribute(String name);<br />    4) 返回会话中所有属性名<br />       public Enumeration getAttributeNames();<br />    5) 返回指定名称对象<br />       public Object getAttribute(String name);</p>
		<p>6. Cookies和Sessions的比较<br />答：1) Cookies可由用户决定是否需要, Sessions不能;  <br />    2) Cookies是一种装载sessionID的可能;<br />    3) Cookies存储在客户端, Sessions存储于服务器端;<br />    4) Cookies可以构造，可以由Request取出，由Response返回</p>
		<p>2004-9-23      星期四      晴</p>
		<p>过滤器</p>
		<p>1.  什么是过滤器?<br />答：与Servlet相似，过滤器是一些Web应用程序组件，可以绑定到一个Web应用程序档案中。但是与其他Web应用程序组件不同的是，过滤器是“链”在容器的处理过程中的。这就意味着它们会在servlet处理器之前访问一个进入的请求，并且在外发的响应信息返回到客户前访问这些响应信息。这种访问使得过滤器可以检查并修改请求和响应的内容。</p>
		<p>2.  过滤器可以用于：<br />答：1) 为一个Web应用程序的新功能建立原型(可被添加到Web应用程序中或者从Web应用程序中删除而不需重写基层应用程序代码);<br />    2) 向过去的代码中添加新功能。</p>
		<p>3.  过滤器放在容器结构什么位置？<br />答：过滤器放在Web资源之前，可以在请求抵达它所应用的Web资源(可以是一个servlet、一个JSP页面，甚至是一个HTML页面这样的静态内容)之前截获进入的请求，并且在它返回到客户之前截获输出请求。</p>
		<p>4.  过滤器的存活周期<br />答：过滤器有四个阶段(与servlet类似)：<br />    1) 实例化;<br />    2) 初始化(调用init()方法);<br />    3) 过滤(调用doFilter()方法);<br />    4) 销毁(调用destroy()方法);</p>
		<p>5. 过滤器类和接口<br />答：所有的过滤器都必须实现javax.servlet.Filter接口:<br />    1) 容器调用init()方法初始化过滤器实例：<br />       public void init(FilterConfig config) throws ServletException<br />    2) doFilter()方法包含过滤器逻辑：<br />       public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException<br />    3) destroy()方法由容器在销毁过滤器实例之前调用：<br />       public void destroy();<br />    4) FilterChain的doFilter()方法之后的代码构成了后期处理过滤器调用。</p>
		<p>6.  配置过滤器<br />答：使用&lt;filter&gt;和&lt;filter-mapping&gt;元素来配置：<br />    &lt;filter&gt;<br />       &lt;filter-name&gt;XSLTFilter&lt;/filter-name&gt;                   //过滤器名<br />       &lt;filter-class&gt;filters.SmartXSLFilter&lt;/filter-class&gt;     //具体过滤器类<br />       &lt;init-param&gt;                                            //初始化参数<br />          &lt;param-name&gt;xsltfile&lt;/param-name&gt;<br />          &lt;param-value&gt;/xsl/stockquotes.xsl&lt;/param-value&gt;<br />       &lt;/init-param&gt;<br />    &lt;/filter&gt;<br />    &lt;filter-mapping&gt;                        //将过滤器应用于Web应用程序中的每个Web资源<br />       &lt;filter-name&gt;Logger&lt;/filter-name&gt;<br />       &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />    &lt;/filter-mapping&gt;</p>
		<p>
				<br />2004-9-24      星期五      晴</p>
		<p>Web应用程序生命周期事件及监听器(Servlet V2.3版本以后新增功能)</p>
		<p>1. 什么是事件监听器?<br />答：1) 支持ServletContext、HttpSession(since v2.3)及ServletRequest(since v2.4)中状态改变的事件通知;<br />    2) 实现了一个或多个servlet事件监听器接口的类型;<br />    3) 控制ServletContext、HttpSession(since v2.3)及ServletRequest(since v2.4)中的生命周期;</p>
		<p>2. Servlet Context事件监听器<br />答：1) 对于应用程序而言在JVM层别管理资源或保存状态<br />    2) 有二种类型的事件监听器：<br />       a. ServletContextListener(以下是该监听器的方法)<br />          contextDestroyed(ServletContextEvent sce)<br />          contextInitialized(ServletContextEvent sce)<br />       b. ServletContextAttributeListener(以下是该监听器的方法)<br />          attributeAdded(ServletContextAttributeEvent scab)<br />          attributeRemoved(ServletContextAttributeEvent scab)<br />          attributeReplaced(ServletContextAttributeEvent scab)</p>
		<p>3. HTTP Session事件监听器<br />答：1) 管理从同一个客户端或用户向一个Web应用程序发出的一系列请求相关的状态或资源;<br />    2) 有二种类型的事件监听器:<br />       a. HttpSessionListener(以下是该监听器的方法)<br />          sessionCreated(HttpSessionEvent se)<br />          sessionDestroyed(HttpSessionEvent se)<br />       b. HttpSessionAttributeListener(以下是该监听器的方法)<br />          attributeAdded(HttpSessionBindingEvent se)<br />          attributeRemoved(HttpSessionBindingEvent se)<br />          attributeReplaced(HttpSessionBindingEvent se)</p>
		<p>4. Servlet Requst事件监听器<br />答：1) 管理整个request生命周期的状态<br />    2) 有二种类型的事件监听器<br />       a. ServletRequestListener(以下是该监听器的方法)<br />          requestDestroyed(ServletRequestEvent sre) <br />          requestInitialized(ServletRequestEvent sre)<br />       b. ServletRequestAttributeListener(以下是该监听器的方法)<br />          attributeAdded(ServletRequestAttributeEvent srae)<br />          attributeRemoved(ServletRequestAttributeEvent srae)<br />          attributeReplaced(ServletRequestAttributeEvent srae)</p>
		<p>5. 监听器类的规定<br />答：1) 必须在部署描述符中配置实现类;</p>
		<p> </p>
<img src ="http://www.blogjava.net/hitlang/aggbug/71851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hitlang/" target="_blank">liulang</a> 2006-09-25 23:09 <a href="http://www.blogjava.net/hitlang/articles/71851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>