﻿<?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</title><link>http://www.blogjava.net/yuxh/category/42716.html</link><description>way</description><language>zh-cn</language><lastBuildDate>Thu, 24 Sep 2015 02:35:48 GMT</lastBuildDate><pubDate>Thu, 24 Sep 2015 02:35:48 GMT</pubDate><ttl>60</ttl><item><title>JBoss Forge 2入门教程</title><link>http://www.blogjava.net/yuxh/archive/2015/09/23/427327.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Wed, 23 Sep 2015 13:14:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2015/09/23/427327.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/427327.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2015/09/23/427327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/427327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/427327.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/yuxh/archive/2015/09/23/427327.html'>阅读全文</a><img src ="http://www.blogjava.net/yuxh/aggbug/427327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2015-09-23 21:14 <a href="http://www.blogjava.net/yuxh/archive/2015/09/23/427327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC Recipes(一Introduction）</title><link>http://www.blogjava.net/yuxh/archive/2010/04/30/319799.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Fri, 30 Apr 2010 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2010/04/30/319799.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/319799.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2010/04/30/319799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/319799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/319799.html</trackback:ping><description><![CDATA[<p>What Is JDBC ？</p> <p>&nbsp; JDBC 是java编程中一系列允许简单连接到很多数据库（特别是关系型数据库）编程APIs . In Java 2 Platform, Standard Edition (J2SE) 5.0,<br>JDBC API 由两个包定义:  <p>java.sql ：提供java访问处理贮存在数据源（特别是关系型数据库）中的数据，有最基础常用的对象如Connection, ResultSet, Statement, and PreparedStatement。这个包j2se 和j2ee平台都可使用。  <p>javax.sql：提供java访问处理服务器端数据源。这个包给j2ee提供服务，如DataSource 和RowSet。  <p>ODBC bridge是以ODBC标准 C API 方式实现JDBC 的库。  <p>简而言之，JDBC是一个和database-independent 的访问数据库的API。  <p>DriverManager是唯一可以创建数据库连接的类。DriverManager根据各个厂商（如Oracle, MySQL, and Sybase）提供的驱动创建数据库。  <p>What Is ODBC ？  <p>&nbsp; Open Database Connectivity (ODBC) 是一种来自微软的编程接口，他为Windows应用程序访问网络上数据库提供了通用语言。 ODBC is a C-based interface<br>to SQL-based database systems. It provides a consistent interface for communicating with a database and for accessing database metadata (information about the database system vendor and how the tables, views, and data are stored).ODBC作为标准出现。厂商为各自的DBMS提供了各种的驱动或bridges。从java客户端访问ODBC-based数据库，可以使用JDBC-ODBC bridge，因此可以使用JDBC-ODBC bridge访问支持ODBC的数据库，比如Microsoft Access。微软为他的操作系统提供ODBC driver manager。ODBC driver manager协调访问ODBC驱动和对应的数据源。  <p>问题：如果用c++写数据库客户端，你不得不在另一平台重新写客户端；PC版的不能在Macintosh上运行。两个原因：1.c++不是跨平台的，很多东西没有特别指定（如int型用多少位表示）2 更重要的是，想网络访问，GUI框架库等在各个平台不同。ODBC的另一个问题是，接口复杂学习时间长。JDBC去除了这些问题，为访问关系数据库引入平台无关的解决方案。因为性能问题和缺少事务支持, JDBC-ODBC bridge 驱动只适合实验用或没有其他可选方法。  <p>What Is a JDBC-ODBC Bridge?  <p>&nbsp;&nbsp; 简而言之，JDBC-ODBC bridge通过大多数ODBC驱动来提供JDBC访问。它是一个把JDBC操作转换为ODBC操作的JDBC驱动。（ODBC操作是由 C-based libraries实现的——ODBC功能仍然在二进制代码库中；如果数据库或硬件平台更换，需要替换ODBC库）。brige作为sun.jdbc.odbc包实现，包含一个native library用来访问ODBC。sun.jdbc.odbc包在/jre/lib/rt.jar中，包含一个sun.jdbc.odbc.JdbcOdbcDriver类，用来JDBC驱动。注意，JDBC-ODBC bridge是一种“万能”的方式，因此可能比一些特别设计的JDBC驱动慢。  <p>SQL is a Data Manipulation Language (DML—影响数据库对象内容的命令集) and a Data Definition Language (DDL—影响数据库对象结构的命令集).SQL also 提供控制事务命令 (such as commit and rollback)  <p>连接jdbc的过程参考<a href="http://www.blogjava.net/yuxh/archive/2009/04/24/267280.html" target="_blank">JDBC加载分析</a> 。总之JDBC驱动的作用是提供各种数据库的具体实现(实现了java.sql.Driver接口)，隐藏具体数据库的细节（每个数据库厂商可能会为同一个数据库提供不止一个驱动，这些效率，价格/性能会有不同）。  <p>在fianlly中立刻关闭/释放 JDBC资源(such as the ResultSet, Statement, PreparedStatement, and Connection objects)，而不是等他们自己关闭，会改进应用程序的性能。写一个工具类释放这些资源是一个好办法。 <p>JDBC API主要用来传SQL statement给数据库，但也能读写表格式数据源的数据，这种来自javax.sql.RowSet组接口的读写能力可以被定制去使用更新spreadsheet,flat file 类似表格式数据源的数据。 <p>JDBC有四种类型的驱动连接数据库。</p> <p>异常：SQLException:有getNextException()可以链接一系列异常，还有很多方法可以展示额外的错误/异常信息。SQLWarning:SQLException的子类，表示非致命可忽略BatchUpdateException:批量更新时出现的错误，除了SQLException提供的信息，还有错误发生前已成功执行多少条数据DataTruncation:意外truancate 数据抛出。</p><img src ="http://www.blogjava.net/yuxh/aggbug/319799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2010-04-30 13:54 <a href="http://www.blogjava.net/yuxh/archive/2010/04/30/319799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JNDI</title><link>http://www.blogjava.net/yuxh/archive/2010/04/29/319685.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Thu, 29 Apr 2010 06:59:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2010/04/29/319685.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/319685.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2010/04/29/319685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/319685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/319685.html</trackback:ping><description><![CDATA[<p>Java Naming and Directory Interface (JNDI) is an API that supports accessing naming and directory services<a name="IDX-CHP-9-1361"></a> in Java programs.</p> <p>命名服务目的：把命名和对象联系起来，提供用命名访问对象的方法。</p> <p>目录服务：允许属性和对象联系，比如用户对象的email地址属性，（命名服务不提供），因此能利用目录服务访问对象属性或以属性为基础查找对象。</p><img src ="http://www.blogjava.net/yuxh/aggbug/319685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2010-04-29 14:59 <a href="http://www.blogjava.net/yuxh/archive/2010/04/29/319685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP基础</title><link>http://www.blogjava.net/yuxh/archive/2010/04/02/317324.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Fri, 02 Apr 2010 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2010/04/02/317324.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/317324.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2010/04/02/317324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/317324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/317324.html</trackback:ping><description><![CDATA[<p>HTTP在TCP/IP的顶层，他是一种有web特性的网络协议。HTTP会话结构是一种简单的请求/响应序列；浏览器请求，服务器响应 。HTTP 响应可以 包含HTML，HTTP在响应内容（服务器返回的任何东西）之上添加头信息。浏览器利用头信息来帮助处理html页面。把hml内容看作粘贴在HTTP响应中的数据。HTTP请求中有几个方法，最常用的是POST和GET(<a href="http://www.blogjava.net/yuxh/archive/2009/11/22/303258.html">区别</a>)。HTTP响应中包含状态代码（如404),内容类型（也称为MIME类型，他告诉浏览器将会收到什么类型的数据以便处理，比如展示图片，提供html），响应的真实内容（html，图片等）。</p><img src ="http://www.blogjava.net/yuxh/aggbug/317324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2010-04-02 16:16 <a href="http://www.blogjava.net/yuxh/archive/2010/04/02/317324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpServletRequestWrapper相关</title><link>http://www.blogjava.net/yuxh/archive/2009/11/22/303262.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Sun, 22 Nov 2009 14:30:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2009/11/22/303262.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/303262.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2009/11/22/303262.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/303262.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/303262.html</trackback:ping><description><![CDATA[<p>应用一：解决<span style="font-family: Times New Roman">tomcat</span>下中文乱码问题（先来个简单的）&nbsp;</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">在<span style="font-family: Times New Roman">tomcat</span>下，我们通常这样来解决中文乱码问题：</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">过滤器代码：</p>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;filter;&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span><span class="keyword">import</span><span>&nbsp;java.io.*;&nbsp;&nbsp;</span></span>
    <li><span><span class="keyword">import</span><span>&nbsp;javax.servlet.*;&nbsp;&nbsp;</span></span>
    <li><span><span class="keyword">import</span><span>&nbsp;javax.servlet.http.*;&nbsp;&nbsp;</span></span>
    <li><span><span class="keyword">import</span><span>&nbsp;wrapper.GetHttpServletRequestWrapper;&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ContentTypeFilter&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Filter&nbsp;{&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;String&nbsp;charset&nbsp;=&nbsp;</span><span class="string">"UTF-8"</span><span>;&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;FilterConfig&nbsp;config;&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;destroy()&nbsp;{&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(config.getFilterName()+<span class="string">"被销毁"</span><span>);&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;charset&nbsp;=&nbsp;<span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config&nbsp;=&nbsp;<span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doFilter(ServletRequest&nbsp;request,&nbsp;ServletResponse&nbsp;response,&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FilterChain&nbsp;chain)&nbsp;<span class="keyword">throws</span><span>&nbsp;IOException,&nbsp;ServletException&nbsp;{&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//设置请求响应字符编码</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setCharacterEncoding(charset);&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setCharacterEncoding(charset);&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;req&nbsp;=&nbsp;(HttpServletRequest)request;&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"----请求被"</span><span>+config.getFilterName()+</span><span class="string">"过滤"</span><span>);&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//执行下一个过滤器（如果有的话,否则执行目标servlet）</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chain.doFilter(req,&nbsp;response);&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"----响应被"</span><span>+config.getFilterName()+</span><span class="string">"过滤"</span><span>);&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;init(FilterConfig&nbsp;config)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;ServletException&nbsp;{&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.config&nbsp;=&nbsp;config;&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;charset&nbsp;=&nbsp;config.getServletContext().getInitParameter(<span class="string">"charset"</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(&nbsp;charset&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;&amp;&amp;&nbsp;charset.trim().length()&nbsp;!=&nbsp;</span><span class="number">0</span><span>)&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.charset&nbsp;=&nbsp;charset;&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>}&nbsp;&nbsp;</span> </li>
</ol>
<p>web.xml中过滤器配置<br />
&lt;!--将采用的字符编码配置成应用初始化参数而不是过滤器私有的初始化参数是因为在JSP和其他地方也可能需要使用--&gt;<br />
&nbsp;&lt;context-param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param-name&gt;charset&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param-value&gt;UTF-8&lt;/param-value&gt;<br />
&nbsp;&lt;/context-param&gt;</p>
<p>&nbsp;&lt;filter&gt;<br />
&nbsp;&nbsp;&lt;filter-name&gt;ContentTypeFilter&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&lt;filter-class&gt;filter.ContentTypeFilter&lt;/filter-class&gt;<br />
&nbsp;&lt;/filter&gt;</p>
<p>&nbsp;&lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&lt;filter-name&gt;ContentTypeFilter&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&nbsp;&lt;/filter-mapping&gt;</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">equest.setCharacterEncoding(charset); 必须写在第一次使用request.getParameter()之前，这样才能保证参数是按照已经设置的字符编码来获取。<br />
response.setCharacterEncoding(charset);必须写在PrintWriter out = request.getWriter()之前，这样才能保证out按照已经设置的字符编码来进行字符输出。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">通过过滤器，我们可以保证在Servlet或JSP执行之前就设置好了请求和响应的字符编码。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">但是这样并不能完全解决中文乱码问题：</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">对于post请求，无论是&#8220;获取参数环节&#8221;还是&#8220;输出环节"都是没问题的；</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">对于get请求，"输出环节"没有问题，但是"获取参数环节"依然出现中文乱码，所以在输出时直接将乱码输出了。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">&nbsp;</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">原因是post请求和get请求存放参数位置是不同的：</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">post方式参数存放在请求数据包的消息体中。 get方式参数存放在请求数据包的请求行的URI字段中，以？开始以param=value&amp;parame2=value2的形式附加在URI字段之后。而request.setCharacterEncoding(charset); 只对消息体中的数据起作用，对于URI字段中的参数不起作用，我们通常通过下面的代码来完成编码转换：</p>
<p>&nbsp;String paramValue = request.getParameter("paramName");<br />
paramValue = new String(paramValue.trim().getBytes("ISO-8859-1"), charset);<br />
</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">但是每次进行这样的转换实在是很麻烦，有没有统一的解决方案呢？</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><strong>解决方案1</strong>: 在tomcat_home"conf"server.xml 中的Connector元素中设置URIEncoding属性为合适的字符编码</p>
&nbsp;&nbsp;&nbsp; &lt;Connector port="8080" protocol="HTTP/1.1" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionTimeout="20000" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; redirectPort="8443" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URIEncoding="UTF-8"<br />
&nbsp;&nbsp;&nbsp;&nbsp; /&gt;<br />
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">这样做的缺点是，同一个tomcat下的其他应用也将受到影响。而其每次部署时都需要类修改配置也很麻烦。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><strong>解决方案2</strong>:自定义请求包装器包装请求，将字符编码转换的工作添加到getParameter()方法中<br />
</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;wrapper;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.UnsupportedEncodingException;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.net.URLDecoder;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.http.HttpServletRequest;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.http.HttpServletRequestWrapper;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img id="Codehighlighter1_268_1049_Open_Image" onclick="this.style.display='none'; Codehighlighter1_268_1049_Open_Text.style.display='none'; Codehighlighter1_268_1049_Closed_Image.style.display='inline'; Codehighlighter1_268_1049_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_268_1049_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_268_1049_Closed_Text.style.display='none'; Codehighlighter1_268_1049_Open_Image.style.display='inline'; Codehighlighter1_268_1049_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;GetHttpServletRequestWrapper&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;HttpServletRequestWrapper&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_268_1049_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_268_1049_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;charset&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_372_393_Open_Image" onclick="this.style.display='none'; Codehighlighter1_372_393_Open_Text.style.display='none'; Codehighlighter1_372_393_Closed_Image.style.display='inline'; Codehighlighter1_372_393_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_372_393_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_372_393_Closed_Text.style.display='none'; Codehighlighter1_372_393_Open_Image.style.display='inline'; Codehighlighter1_372_393_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;GetHttpServletRequestWrapper(HttpServletRequest&nbsp;request)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_372_393_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_372_393_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(request);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_397_470_Open_Image" onclick="this.style.display='none'; Codehighlighter1_397_470_Open_Text.style.display='none'; Codehighlighter1_397_470_Closed_Image.style.display='inline'; Codehighlighter1_397_470_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_397_470_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_397_470_Closed_Text.style.display='none'; Codehighlighter1_397_470_Open_Image.style.display='inline'; Codehighlighter1_397_470_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_397_470_Closed_Text">/**&nbsp;*/</span><span id="Codehighlighter1_397_470_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获得被装饰对象的引用和采用的字符编码<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;request<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;charset<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;GetHttpServletRequestWrapper(HttpServletRequest&nbsp;request,<br />
<img id="Codehighlighter1_556_603_Open_Image" onclick="this.style.display='none'; Codehighlighter1_556_603_Open_Text.style.display='none'; Codehighlighter1_556_603_Closed_Image.style.display='inline'; Codehighlighter1_556_603_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_556_603_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_556_603_Closed_Text.style.display='none'; Codehighlighter1_556_603_Open_Image.style.display='inline'; Codehighlighter1_556_603_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;charset)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_556_603_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_556_603_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(request);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.charset&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;charset;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_607_663_Open_Image" onclick="this.style.display='none'; Codehighlighter1_607_663_Open_Text.style.display='none'; Codehighlighter1_607_663_Closed_Image.style.display='inline'; Codehighlighter1_607_663_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_607_663_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_607_663_Closed_Text.style.display='none'; Codehighlighter1_607_663_Open_Image.style.display='inline'; Codehighlighter1_607_663_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_607_663_Closed_Text">/**&nbsp;*/</span><span id="Codehighlighter1_607_663_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;实际上就是调用被包装的请求对象的getParameter方法获得参数，然后再进行编码转换<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_706_817_Open_Image" onclick="this.style.display='none'; Codehighlighter1_706_817_Open_Text.style.display='none'; Codehighlighter1_706_817_Closed_Image.style.display='inline'; Codehighlighter1_706_817_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_706_817_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_706_817_Closed_Text.style.display='none'; Codehighlighter1_706_817_Open_Image.style.display='inline'; Codehighlighter1_706_817_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getParameter(String&nbsp;name)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_706_817_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_706_817_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.getParameter(name);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;:&nbsp;convert(value);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;value;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_858_1047_Open_Image" onclick="this.style.display='none'; Codehighlighter1_858_1047_Open_Text.style.display='none'; Codehighlighter1_858_1047_Closed_Image.style.display='inline'; Codehighlighter1_858_1047_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_858_1047_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_858_1047_Closed_Text.style.display='none'; Codehighlighter1_858_1047_Open_Image.style.display='inline'; Codehighlighter1_858_1047_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;convert(String&nbsp;target)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_858_1047_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_858_1047_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">编码转换之前：</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;target);<br />
<img id="Codehighlighter1_908_981_Open_Image" onclick="this.style.display='none'; Codehighlighter1_908_981_Open_Text.style.display='none'; Codehighlighter1_908_981_Closed_Image.style.display='inline'; Codehighlighter1_908_981_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_908_981_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_908_981_Closed_Text.style.display='none'; Codehighlighter1_908_981_Open_Image.style.display='inline'; Codehighlighter1_908_981_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_908_981_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_908_981_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(target.trim().getBytes(</span><span style="color: #000000">"</span><span style="color: #000000">ISO-8859-1</span><span style="color: #000000">"</span><span style="color: #000000">),&nbsp;charset);<br />
<img id="Codehighlighter1_1022_1044_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1022_1044_Open_Text.style.display='none'; Codehighlighter1_1022_1044_Closed_Image.style.display='inline'; Codehighlighter1_1022_1044_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_1022_1044_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1022_1044_Closed_Text.style.display='none'; Codehighlighter1_1022_1044_Open_Image.style.display='inline'; Codehighlighter1_1022_1044_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(UnsupportedEncodingException&nbsp;e)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1022_1044_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1022_1044_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;target;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p><br />
修改过滤器的doFilter方法 代码如下：<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;doFilter(ServletRequest&nbsp;request,&nbsp;ServletResponse&nbsp;response,<br />
<img id="Codehighlighter1_131_640_Open_Image" onclick="this.style.display='none'; Codehighlighter1_131_640_Open_Text.style.display='none'; Codehighlighter1_131_640_Closed_Image.style.display='inline'; Codehighlighter1_131_640_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_131_640_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_131_640_Closed_Text.style.display='none'; Codehighlighter1_131_640_Open_Image.style.display='inline'; Codehighlighter1_131_640_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FilterChain&nbsp;chain)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException,&nbsp;ServletException&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_131_640_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_131_640_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置请求响应字符编码</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setCharacterEncoding(charset);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setCharacterEncoding(charset);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;新增加的代码</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;req&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(HttpServletRequest)&nbsp;request;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_349_410_Open_Image" onclick="this.style.display='none'; Codehighlighter1_349_410_Open_Text.style.display='none'; Codehighlighter1_349_410_Closed_Image.style.display='inline'; Codehighlighter1_349_410_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_349_410_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_349_410_Closed_Text.style.display='none'; Codehighlighter1_349_410_Open_Image.style.display='inline'; Codehighlighter1_349_410_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(req.getMethod().equalsIgnoreCase(</span><span style="color: #000000">"</span><span style="color: #000000">get</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_349_410_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_349_410_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GetHttpServletRequestWrapper(req,&nbsp;charset);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">----请求被</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;config.getFilterName()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">过滤</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;传递给目标servlet或jsp的实际上时包装器对象的引用，而不是原始的HttpServletRequest对象</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chain.doFilter(req,&nbsp;response);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">----响应被</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;config.getFilterName()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">过滤</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
这样一来，在servlet中调用包装器的getParameters方法来获取参数，就已经完成了字符编码的转换过程，我们就不需要在每次获取参数时来进行字符编码转换了。<br />
<span style="background-color: yellow">总结：自己写类继承HttpServletRequestWrapper，HttpServletRequestWrapper实现了HttpServletRequest接口。看tomcat的源代码可以发现，ServletRequest作为一个Component&nbsp;，ServletRequestWrapper作为一个比较标准的Decorator&nbsp;，实现ServletRequest接口并把ServletRequest当作成员变量，其他继承Decorator&nbsp;的类（比如本例中的GetHttpServletRequestWrapper&nbsp;）就可以很好的操控ServletRequest及其子类（比如本例中的HttpServletRequest），HttpServletRequest的很多方法就可以根据我们的需求做改变，比如设置字符，去掉空格。</span><br />
参考：<br />
http://www.javaeye.com/topic/483158<br />
<a href="http://fishhappy365.javaeye.com/blog/484185">http://fishhappy365.javaeye.com/blog/484185</a> <br />
<a href="http://www.javaeye.com/topic/220230">http://www.javaeye.com/topic/220230</a>
 <img src ="http://www.blogjava.net/yuxh/aggbug/303262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2009-11-22 22:30 <a href="http://www.blogjava.net/yuxh/archive/2009/11/22/303262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP GET/POST请求区别</title><link>http://www.blogjava.net/yuxh/archive/2009/11/22/303258.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Sun, 22 Nov 2009 13:12:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2009/11/22/303258.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/303258.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2009/11/22/303258.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/303258.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/303258.html</trackback:ping><description><![CDATA[<ol>
    <li>HTTP 定义了与服务器交互的不同方法，最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求，而保留 POST 仅用于更新站点。根据 HTTP 规范，GET 用于信息获取，而且应该是 安全的和 幂等的。所谓<strong>安全的</strong>意味着该操作用于获取信息而非修改信息。换句话说，GET 请求一般不应产生副作用。<strong>幂等的</strong>意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。从根本上讲，其目标是当用户打开一个链接时，她可以确信从自身的角度来看没有改变资源。比如，新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻，该操作仍然被认为是安全的和幂等的，因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能<span style="color: rgb(255,0,51)">改变</span>服务器上的资源的请求。仍然以新闻站点为例，读者对文章的注解应该通过 POST 请求实现，因为在注解提交之后站点已经不同了（比方说文章下面出现一条注解）；
    <li><span style="color: red">在FORM提交的时候，如果不指定Method，则默认为GET请求</span>，Form中提交的数据将会附加在url之后，以?分开与url分开。字母数字字符原样发送，但空格转换为&#8220;+&#8220;号，其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII（或ISO Latin-1）值。GET请求请提交的数据放置在HTTP请求协议头中，而POST提交的数据则放在实体数据中；
    <li>GET方式提交的数据最多只能有1024字节，而POST则没有此限制。 </li>
</ol>
<p>Web 上最常用的两种 Http 请求就是 Get 请求和 Post 请求了。我们在做 java web 开发时，也总会在 servlet 中通过 doGet 和 doPost 方法来处理请求；更经常地，我们会在 doGet 方法的实现中调用 doPost 方法。尽管做了近两年的 web 开发，我对诸如 Get 请求和 Post 请求的基本概念仍不是十分了解。近日阅读《 javascript 高级程序设计》重新整理了一下 Get 请求和 Post 请求的概念，算是读书笔记吧。 </p>
<p>Get 是从服务器上获取数据，这是最常见的请求类型。每次在浏览器中输入 URL 打开页面时，就是向服务器发送一个 Get 请求。 Get 请求的参数是用问号追加到 URL 结尾，后面跟着用＆连接起来的名称／值对。比如网址 <a href="http://bt.neupioneer.com/viewthread.php?tid=87813" linkindex="38"><span style="color: rgb(51,102,153)">http://bt.neupioneer.com/viewthread.php?tid=87813</span></a> ，其中 tid 为参数名， 87813 为参数的值。在编程中，使用 Get 最多的地方就是超链接列表，其中的参数多是从数据库读出的字段拼接而成。在 Ajax 中，我们也经常使用 Get ，通过提取出页面的标签值，拼成串后构造一个 URL 。 Get 在使用上是有限制的， URL 的最大长度为 2KB ，因此，如果表单中包含textarea这样的大文本段，就不要用Get了。对于表单来说， Get 是把参数数据队列加到提交表单的 ACTION 属性所指的 URL 中，值和表单内各个字段一一对应，通过 URL 可以看到中传递的参数。因此，相比于 Post ，它是不安全的。 </p>
<p>Post 的使用场合多是在表单提交的地方，因为和 Get 相比， Post 可以发送更多的数据，《 javascript 高级程序设计》中说最多可以发送 2GB ，这多少让我不太相信，网上一些文章说 IIS4 中最大量为 80KB ， IIS5 中为 100KB ，不知道 Tomcat 中的情况如何。 Post 是通过 HTTP Post 机制，将表单内各个字段与其内容放置在 HTML Header 内一起传送到 ACTION 属性所指的 URL 地址。 和 Get 相比， Post 的内容是不会在 URL 中显现出来的，这多少是安全一些的。 我在做登录这样的表单时，只是将请求方式设为 Post ，使得用户名和密码信息不在浏览器中显现，但不清楚的是，是否有更好的方法加密密码等信息（实在不知道如果请求不传到服务器的话，怎么对未知的请求加密，清楚的朋友不妨给个解决方案）。在 Ajax 中，如果要和服务器交互，记得加上 request.setRequestHeader(&#8220;Content-Type&#8221;,&#8221;application/x-www-urlencoded&#8221;); 这一脚本，尽管很多 Ajax 教材中都提到了这一点。另外要说的是，被传递的参数是要经过编码的。在 javascript 中，编码函数是 encodeURIComponent(xx) 。&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;以上转自 http://blog.csdn.net/yoland/archive/2009/03/19/4005740.aspx<br />
一个get的发送请求例子：<br />
GET /select/selectBeerTaste.jsp<span style="color: red">?color=dark&amp;taste=malty HTTP/1.1<br />
</span>Host: www.wickedlysmart.com<br />
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.4) Gecko/<br />
20030624 Netscape/7.1<br />
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/<br />
plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1<br />
Accept-Language: en-us,en;q=0.5<br />
Accept-Encoding: gzip,deflate<br />
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<br />
Keep-Alive: 300<br />
Connection: keep-alive</p>
一个post的发送请求例子：<br />
POST /advisor/selectBeerTaste.do HTTP/1.1<br />
Host: www.wickedlysmart.com<br />
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.4) Gecko/<br />
20030624 Netscape/7.1<br />
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/<br />
plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1<br />
Accept-Language: en-us,en;q=0.5<br />
Accept-Encoding: gzip,deflate<br />
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<br />
Keep-Alive: 300<br />
Connection: keep-alive<br />
<span style="color: #ff0000">color=dark&amp;taste=malty <span style="color: #000000">(Request headers 后面有一个传参数的body)<br />
</span><span style="color: #000000">两个例子的红色的部分很好的看出了get和post传参数区别</span></span>
<img src ="http://www.blogjava.net/yuxh/aggbug/303258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2009-11-22 21:12 <a href="http://www.blogjava.net/yuxh/archive/2009/11/22/303258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CAS</title><link>http://www.blogjava.net/yuxh/archive/2009/11/12/302145.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Thu, 12 Nov 2009 12:57:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2009/11/12/302145.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/302145.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2009/11/12/302145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/302145.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/302145.html</trackback:ping><description><![CDATA[<img alt="" src="http://www.blogjava.net/images/blogjava_net/yuxh/image001.jpg" height="341" width="467" /><br />
<strong><a name="N10098"><strong>上面是CAS 基础协议图&nbsp; <br />
</strong></a></strong>
<p><a name="2.CAS 介绍">CAS 介绍</a></p>
<p>CAS 具有以下特点：</p>
<ul>
    <li>
    开源的企业级单点登录解决方案。</li>
    <li>
    CAS Server 为需要独立部署的 Web 应用。</li>
    <li>
    CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用)，包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。</li>
</ul>
<p><a name="N1008D">CAS 原理和协议</a></p>
从结构上看，CAS 包含两个部分： CAS Server 和 CAS Client。CAS Server 需要独立部署，主要负责对用户的认证工作；CAS Client 负责处理对客户端受保护资源的访问请求，需要登录时，重定向到 CAS Server。
<p>CAS Client 与受保护的客户端应用部署在一起，以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web
请求，CAS Client 会分析该请求的 Http 请求中是否包含 Service
Ticket，如果没有，则说明当前用户尚未登录，于是将请求重定向到指定好的 CAS Server 登录地址，并传递 Service
（也就是要访问的目的资源地址），以便登录成功过后转回该地址。用户在第 3 步中输入认证信息，如果登录成功，CAS Server
随机产生一个相当长度、唯一、不可伪造的 Service Ticket，并缓存以待将来验证，之后系统自动重定向到 Service
所在地址，并为客户端浏览器设置一个 Ticket Granted Cookie（TGC），CAS Client 在拿到 Service
和新产生的 Ticket 过后，在第 5，6 步中与 CAS Server 进行身份合适，以确保 Service Ticket 的合法性。</p>
<p> 在该协议中，所有与 CAS 的交互均采用 SSL 协议，确保，ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程，但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。</p>
<p>另外，CAS 协议中还提供了 Proxy （代理）模式，以适应更加高级、复杂的应用场景，具体介绍可以参考 CAS 官方网站上的相关文档。</p>
<strong>
<p><strong>在 Tomcat 上部署一个完整的 CAS Server 主要按照以下几个步骤</strong>：</p>
<p><a name="N100DD">配置 Tomcat 使用 Https 协议</a></p>
<p> 如果希望 Tomcat 支持 Https，主要的工作是配置 SSL 协议，其配置过程和配置方法可以参考 Tomcat 的相关文档。不过在生成证书的过程中，会有需要用到主机名的地方，CAS 建议不要使用 IP 地址，而要使用机器名或域名。（项目过程中没使用）</p>
<p><a name="N100E6">部署 CAS Server</a></p>
<p>CAS
Server 是一个 Web 应用包，将前面下载的 cas-server-3.1.1-release.zip 解开，把其中的
cas-server-webapp-3.1.1.war 拷贝到 tomcat的 webapps 目录，并更名为
cas.war。由于前面已配置好 tomcat 的 https 协议，可以重新启动
tomcat，然后访问：https://localhost:8443/cas（没配置ssh应该是http://localhost:8080/cas） ，如果能出现正常的 CAS 登录页面，则说明 CAS
Server 已经部署成功。</p>
<p>虽然 CAS Server 已经部署成功，但这只是一个缺省的实现，在实际使用的时候，还需要根据实际概况做扩展和定制，最主要的是扩展认证 (Authentication) 接口和 CAS Server 的界面。</p>
<strong><a name="N10098"& gt;<strong>参考</strong><a name="N10098">http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/index.html</a><br />
项目也采用jdbc验证,文章介绍了三个基于 JDBC 的 AuthenticationHandler，我使用的cas-server 3.3 多了一个AbstractJdbcUsernamePasswordAuthenticationHandler 直接使用。<br />
<br />

<p><strong><a name="4.部署客户端应用">部署客户端应用</a></strong></p>
单点登录的目的是为了让多个相关联的应用使用相同的登录过程，使用的是cas-client-core- 3.1.9.jar 放入要使用单点登录项目的lib下。cas客户端使用的是过滤器，在web.xml配置。可以使用spring配置bean。官方网站http://www.ja-sig.org/wiki/display/CASC/Configuring+the+JA- SIG+CAS+Client+for+Java+using+Spring 有配置。<br />
用类扩展 Cas20ProxyReceivingTicketValidationFilter复写onSuccessfulValidation方法，写入验证成功后做的事情，比如把用户信息放入session。写了一个a.jsp用于跳转，过滤器针对他，访问这个页面的时候，会到cas服务器端，如果成功的话，返回到a.jsp，这个页面用sendRedirect调用了一个action方法处理登录成功后直接进入项目首页。<br />
<br />


<img src ="http://www.blogjava.net/yuxh/aggbug/302145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2009-11-12 20:57 <a href="http://www.blogjava.net/yuxh/archive/2009/11/12/302145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet控制共享(RequestDispatcher)</title><link>http://www.blogjava.net/yuxh/archive/2009/11/05/301316.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Thu, 05 Nov 2009 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2009/11/05/301316.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/301316.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2009/11/05/301316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/301316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/301316.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 为了支持请求代理，Servlet API 2.1 引入<tt class="monofont">javax.servlet.RequestDispatcher接口。servlet调用请求对象的<tt class="monofont">getRequestDispatcher()的方法获得<tt class="monofont">RequestDispatcher实例，此实例可以dispatch到指定的路径上的组件(如servlet, JSP,静态文件等)：<br>&nbsp;&nbsp;&nbsp; public RequestDispatcher ServletRequest.getRequestDispatcher(String path)</tt></tt></tt> ，可以是相对路径但不能超过当前的servlet context，不过可以使用getContext方法转发到当前context之外的地方，只是没有任何方法转发到另一个服务器上的context。如果路径以“/”开始，它被解释为相对于当前context根，如果路径包含查询字符，参数会被包含到接受组件的参数集的开始处。如果servlet容器由于任何原因不能返回<tt class="monofont">RequestDispatcher</tt> 该方法返回null。在<tt class="monofont">ServletContext类中有同名方法<br>public RequestDispatcher ServletContext.getRequestDispatcher(String path)，不同之处在于<tt class="monofont">ServletContext</tt> 中的方法(sevlet2.1引入)只接受绝对URLs(以/开头)，而<tt class="monofont">ServletRequest</tt> 中的方法接受绝对和相对。因此没有理由使用ServletContext中的该方法，可以看作只为历史版本兼容(不过servlet2.5仍然有此方法)。除了用路径还可以用名字指定资源来获得<tt class="monofont">RequestDispatcher</tt>，ServletContext中的方法：<br>&nbsp;&nbsp;&nbsp; public RequestDispatcher ServletContext.getNamedDispatcher(String name)，此方法允许转发到没必要公开发布的资源，servlet或jsp可能通过web应用描述符获得名字。不能获取<tt class="monofont">RequestDispatcher</tt>仍然返回null。<br>&nbsp;&nbsp;&nbsp; <tt class="monofont">RequestDispatcher有两个方法：<tt class="monofont">forward()</tt>and <tt class="monofont">include()。</tt><tt class="monofont">forward把整个请求交给代理；<tt class="monofont">include</tt>把代理的输出加入调用servlet（个人理解为初始的那个servlet）的response中并且调用servlet仍然处于控制状态，即请求转发后，原先的Servlet还可以继续输出响应信息，转发到的Servlet对请求做出的响应将并入原先Servlet的响应对象中<br>&nbsp;&nbsp;&nbsp; forward把请求从一个servlet转发到服务器上的另一个资源，它允许一个servlet对请求做初始处理，然后另一个资源来产生response，不像<tt class="monofont">sendRedirect</tt>，forward的整个操作都在服务器内部，对客户是透明的。<tt class="monofont">附加查询字符串或使用请求的<tt class="monofont">setAttribute的方法可以传递信息给代理</tt></tt></tt></tt></tt> 。<br> <p>The rules a forwarding servlet must follow are relatively strict:</p> <ul> <li> <p>It may set headers and the status code but may not send any response body to the client (that's the job for an include). Consequently, the <tt class="monofont">forward( )</tt> must be called before the response has been committed.</p> <li> <p>If the response already has been committed, the <tt class="monofont">forward( )</tt> call throws an <tt class="monofont">IllegalStateException</tt>.</p> <li> <p>If the response has not been committed but there's content within the response buffer, the buffer is automatically cleared as part of the forward.</p> <li> <p>In addition, you can't get creative by substituting new request and response objects. The <tt class="monofont">forward( )</tt> method must be called with the same request and response objects as were passed to the calling servlet's service method, and the <tt class="monofont">forward( )</tt> must be called from within the same handler thread.</p></li></ul> <p>如果servlet A转发到servlet B，B得到的路径信息应该是和直接调用B一样的，从这方面来说B完全控制请求。这也是为什么确保response的缓存会在调用之前冲掉，response没有被提交是很重要的事情。<br>&nbsp;&nbsp;&nbsp; 用路径转发的问题是：目标组件不但对服务器组件可见，也必须对客户端可见。出于安全考虑，可能会让一些组件不是公共可见的，所以用名字代替路径做转发：<tt class="monofont">getNamedDispatcher</tt> 不过没有URI路径也就不能加上查询字符串，路径也不能做调整。<br>&nbsp;&nbsp;&nbsp; <tt class="monofont"><span style="color: red"><tt class="monofont">forward</tt> 和<tt style="color: rgb(0,0,0)" class="monofont"><span style="color: rgb(255,0,0)"><tt class="monofont">sendRedirect谁更好</tt></span>：request dispatch 在服务器端发生，redirect在客户端发生。<tt class="monofont">forward</tt>最好用在一个组件必须处理业务逻辑而且和另一个组件分享结果的情况。sendRedirict最好用于客户需要从一页重定向于另一页。看起来用forward比较有诱惑，因为forward在服务器内部完成，sendRedirect还需要从客户端倒一遍，所以forward更快。不幸的是处理相对URL的时候会引起问题。例：<br>public class HomePageForward extends HttpServlet {<br><br>&nbsp; public void doGet(HttpServletRequest req, HttpServletResponse res)<br>&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; throws ServletException, IOException {<br>&nbsp;&nbsp;&nbsp; RequestDispatcher dispatcher = req.getRequestDispatcher("/index.html");<br>&nbsp;&nbsp;&nbsp; dispatcher.forward(req, res);<br>&nbsp; }<br>}</tt></span></tt></p> <p align="justify">如果index.html中有&lt;img src="../../../images/trans.gif"/&gt;则图片不能读取。<tt class="monofont">sendRedirect</tt>会告诉客户端文件来源于文件根目录，forward不会。因为不需要调用<tt class="monofont">getContext</tt>查询，<tt class="monofont">sendRedirect</tt>更容易转发到其他context的资源中。<span style="background-color: rgb(255,0,0)">所以建议是尽量用<tt class="monofont"><tt class="monofont">sendRedirect，必须的情况下才用forward。</tt></tt></span>&nbsp;<br>&nbsp;&nbsp;&nbsp; RequestDispatcher的include方法把资源的内容放入当前的respongse中。它实现了一种我们可以称为编程式服务器端 include。不同于forward，在调用include后的servlet A仍然控制response而且可能包含 被包含进来内容的前后内容。<br> 例1：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doGet(..){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.setContentType("text/html");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintWriter out = res.getWriter(); </p> <p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;Welcome to Nile&lt;/TITLE&gt;&lt;/HEAD&gt;");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;BODY&gt;");</p> <p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Show an item in an online catalog<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("Feast your eyes on this beauty:");</p> <p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RequestDispatcher dispatcher =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; req.getRequestDispatcher("/servlet/NileItem?item=0596000405");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dispatcher.include(req, res);</p> <p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("And, since I like you, it's 20% off!");&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;/BODY&gt;&lt;/HTML&gt;");<br>&nbsp;&nbsp;&nbsp; } </p>使用<tt class="monofont">forward</tt>，通过附加查询字符或<tt class="monofont">setAttribute</tt>方法，信息可以传到被调用资源。Using attributes instead of parameters gives you the ability to pass objects instead of simple strings，例<br>&nbsp;&nbsp;&nbsp; doGet(..){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.setContentType("text/html");<br>&nbsp;&nbsp;&nbsp; PrintWriter out = res.getWriter();<br><br>&nbsp;&nbsp;&nbsp; out.println("&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;Welcome to Nile&lt;/TITLE&gt;&lt;/HEAD&gt;");<br>&nbsp;&nbsp;&nbsp; out.println("&lt;BODY&gt;");<br><br>&nbsp;&nbsp;&nbsp; // Show items in an online catalog<br>&nbsp;&nbsp;&nbsp; RequestDispatcher dispatcher =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; req.getRequestDispatcher("/servlet/NileItem");<br><br>&nbsp;&nbsp;&nbsp; out.println("Feast your eyes on this beauty:");<br>&nbsp;&nbsp;&nbsp; req.setAttribute("item", Book.getBook("0596000405"));<br>&nbsp;&nbsp;&nbsp; dispatcher.include(req, res);<br><br>&nbsp;&nbsp;&nbsp; // Remove the "item" attribute after use<br>&nbsp;&nbsp;&nbsp; req.removeAttribute("item");<br><br>&nbsp;&nbsp;&nbsp; out.println("Or how about this one:");<br>&nbsp;&nbsp;&nbsp; req.setAttribute("item", Book.getBook("0395282659"));<br>&nbsp;&nbsp;&nbsp; dispatcher.include(req, res);<br><br>&nbsp;&nbsp;&nbsp; out.println("And, since I like you, they're all 20% off!");<br><br>&nbsp;&nbsp;&nbsp; out.println("&lt;/BODY&gt;&lt;/HTML&gt;");<br>&nbsp;&nbsp;&nbsp; } <br>接受servlet<br>public class NileItem extends HttpServlet {<br><br>&nbsp; public void doGet(HttpServletRequest req, HttpServletResponse res)<br>&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; throws ServletException, IOException {<br><br>&nbsp;&nbsp;&nbsp; // We do not set the content type<br><br>&nbsp;&nbsp;&nbsp; PrintWriter out = res.getWriter();<br><br>&nbsp;&nbsp;&nbsp; Book book = (Book) req.getAttribute("item");<br><br>&nbsp;&nbsp;&nbsp; out.println("&lt;BR&gt;");<br>&nbsp;&nbsp;&nbsp; if (book != null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;I&gt;" + book.getTitle() + "&lt;/I&gt;");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(" by " + book.getAuthor());<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;I&gt;No book record found&lt;/I&gt;");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; out.println("&lt;BR&gt;");<br>&nbsp; }<br>}<br>通过实例可以很好理解include，就是把下一个资源的内容直接放入本页面的任何地方，被包含的资源不能改变status code or HTTP headers ，所以NileItem 做任何改变这些的操作都会被忽略（NileItem 所以没有做这些操作）。不像forward，路径元素和请求参数仍然和调用端一样。如果被包含资源要求获得自己的路径元素和请求参数， it may retrieve them using the following server-assigned request attributes:<br>javax.servlet.include.request_uri<br>javax.servlet.include.context_path<br>javax.servlet.include.servlet_path<br>javax.servlet.include.path_info<br> <p>The request and response parameters must be the same objects as were passed to the calling servlet's service method, and the <tt class="monofont">include( )</tt> must be called from within the same handler thread.</p> <p>The included resource must use an output mechanism that matches the caller's. If the caller uses a <tt class="monofont">PrintWriter</tt>, then the included resource must use a <tt class="monofont">PrintWriter</tt>. If the caller uses an <tt class="monofont">OutputStream</tt>, then the included resource must use an <tt class="monofont">OutputStream</tt>. If the mechanisms don't match, the included servlet throws an <tt class="monofont">IllegalStateException</tt>. If you can, make sure to use the <tt class="monofont">PrintWriter</tt> for all text output, and this won't be a problem.</p><img src ="http://www.blogjava.net/yuxh/aggbug/301316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2009-11-05 17:11 <a href="http://www.blogjava.net/yuxh/archive/2009/11/05/301316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet</title><link>http://www.blogjava.net/yuxh/archive/2009/05/15/267983.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Fri, 15 May 2009 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2009/05/15/267983.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/267983.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2009/05/15/267983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/267983.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/267983.html</trackback:ping><description><![CDATA[<p>servlet没有main方法，他受一个叫做容器的java应用（比如Tomcat）控制。当web server应用（比如Apache）收到容器访问servlet请求，server不是先把请求直接给servlet，而是先给部署这个servlet的容器，容器“看到”找的是servlet，创建两个对象：HttpServletResponse和HttpServletRequest。容器根据URL找到servlet类，为这个请求创建或从池里分配线程，把request和response对象传给该线程，servlet的生命周期就开始了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 容器启动的时候这步就发生了，一启动容器就开始找部署的web项目。第一寻找其servlet类，第二就开始加载这个类。A servlet moves from <span style="color: red"><em>does not exist</em></span> to <em style="color: red">initialized</em> (which really means ready to service client requests), beginning with a constructor. But the constructor makes only an object, not a servlet. To be a servlet, the object needs to be granted servletness. 所以在构造函数和init()之间的状态是一种“半死半活状态”，这时候不能接触很多作为servlet能接触的资源（like getting web app configuration info, or looking up a reference to another part of the application），所以init()之前都不要做什么操作，不要在构造函数中放东西。在创建servlet实例之后在为任何客户端请求服务之前，容器就调用init方法，你可以在处理请求之前在里面初始化你的servlet（重写此方法可以建立数据库连接，用其他对象注册自己等）。接着调用service方法（重写此方法的可能性不大），接着doGet/doPost（至少重写其中一个方法）。service结束后，线程就消亡或者放回池里。但第二个请求来，容器再次创建或从池里分配线程，继续service-&gt;doGet/doPost 序列。因此，在一个时间段内，有多少客户请求就有多少运行的线程，当然也受容器的策略、配置或资源限制（比如指定容器的最大并发线程数，当请求的客户数超过的时候，客户就必须等待）。<font color="#ff0000">容器运行多个线程来处理多个对一个servlet的请求（不管是不是同一个客户发出请求，一个请求一个线程），对于分布式web应用，一个JVM只对应一个servlet实例</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 成为一个servlet可以给你什么：一个ServletConfig对象，一个ServletContext。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red">ServletConfig</span>对象：每个servlet有一个；Use it to pass deploy-time information to the servlet (a database or enterprise bean lookup name, for example)that you don’t want to hard-code into the servlet (servlet init parameters)；访问ServletContext；Parameters are configured in the Deployment Descriptor（如&lt;init-param&gt;方式配置）.我们可以通过servletconfig获得初始化参数（getServletConfig().getInitParameter(“foo”);），然后通过setAttribute dispatch给某个jsp页面，但是针对一个servlet的初始化参数很有局限性，所以引入针对应用的&lt;context-param&gt;，这时候通过servletContext获得初始化参数（getServletContext().getInitParameter(“foo”)），这个初始化参数可以被应用的任意servlet，jsp访问。<span style="color: red">注意初始化参数是一个deploy-time constants，不能在runtime改变他们，只能通过重新部署</span>。<br><span style="color: red"><br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red">ServletContext </span>：每个web app有一个（严格说来如果是分布式的话，应该是<span style="color: red">每个JVM一个</span>）；Use it to access web app parameters (also confi gured in the Deployment Descriptor) ；类似application bulletin-board功能，让其他应用也能访问；用来获得服务器信息，比如容器名字和版本，以及支持的API版本。<span style="color: red">ServletContextListener </span>可以监听<span style="color: red">ServletContext </span>的初始化（从ServletContext中获得初始化参数，用参数连接数据库，把连接作为attribute存起来以便所有应用都可以访问）和销毁阶段（关闭连接）。为了使context attributes 线程安全，可以对context进行同步锁的方式：</p> <p></p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:dd237cc0-8512-4a40-be3d-a46cd6d3c35b" class="wlWriterEditableSmartContent"><pre style="background-color:#FFFFFF;overflow: auto;"><span style="color: #0000FF;">synchronized</span><span style="color: #000000;">(getServletContext()) {
     getServletContext().setAttribute(“foo”, “</span><span style="color: #000000;">22</span><span style="color: #000000;">”);
     getServletContext().setAttribute(“bar”, “</span><span style="color: #000000;">42</span><span style="color: #000000;">”);
     out.println(getServletContext().getAttribute(“foo”));
     out.println(getServletContext().getAttribute(“bar”));
 }
</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletResponse接口有两种流可供输出：ServletOutputStream for bytes, or a PrintWriter for character data.<br>例：1&nbsp;&nbsp; PrintWriter writer = response.getWriter();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.println(“some text and HTML”);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp; ServletOutputStream out = response.getOutputStream();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write(aByteArray);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果不想自己处理，可通过redirect给一个全新的URL（注意如果response已提交后不能再redirect），或者dispatch the request 给你应用中的某个组件（如jsp）。redirect会先返回给客户，客户再重新发请求，而dispatch 的话，服务器会直接转给某个组件。这样两种方式的区别就很明显了。 
<p></p>servlet-&gt;容器调用service()-&gt;doGet()/doPost() 产生动态页面并把页面放入response对象，记住此时容器仍然有引用指向该response对象！线程完成，容器把response对象转换为HTTP对象，送回客户端，然后删除request和response对象。 
<img src ="http://www.blogjava.net/yuxh/aggbug/267983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2009-05-15 10:22 <a href="http://www.blogjava.net/yuxh/archive/2009/05/15/267983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP</title><link>http://www.blogjava.net/yuxh/archive/2009/05/15/269553.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Fri, 15 May 2009 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2009/05/15/269553.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/269553.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2009/05/15/269553.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/269553.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/269553.html</trackback:ping><description><![CDATA[jsp中的所有东西都可分为两大类：<span class="docEmphasis">elements</span> 和<span class="docEmphasis">template data。<span class="docEmphasis">elements</span> 是jsp的动态部分，他们按照jsp规范作为自定义操作，标签，以及之间的允许内容，jsp容器会解释<span class="docEmphasis">elements</span> ，当产生response的时候<span class="docEmphasis">elements</span> 定义的操作会运行（dynamic）。<span class="docEmphasis">template data</span>是静态文本部分，他们被任意放在jsp页面上直接发送给客户端（not change）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="docEmphasis">elements</span> 又可分为三类：scripting elements, directives, and actions</span> 。<br><span style="background-color: yellow">scripting elements</span> ：有三种类型：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Scriptlets即常见到的&lt;%.... %&gt;,<span style="color: red">注意</span>scriptlet 的内容不会发送给客户端，只有scriptlet 的结果会发送，这表明scriptlet 被容器解释，scriptlet 的代码默认情况下不会被访问者分享。 代码编译成servlet后在jspService() 内。这里面写的java代码最后结果以out.print(…);输出<br>&nbsp;&nbsp;&nbsp;&nbsp; 2 Expressions:<tt>&lt;%=...=&gt;: 发送字符串给客户端，表达式可以是任意有toString方法的对象，或者是primitive。代码编译成servlet后在jspService() 内。<font color="#ff0000">不要在后面加分号，否则会以out.print(...;); 形式输出，引起编译错误</font><br>&nbsp;&nbsp; 3 Declarations：&lt;!=...=&gt;: declaration 就像scriptlet一样用来向jsp嵌入代码，这些声明编译成servlet后都是在jspService() 方法外面的，所以声明里可用来定义新方法（可以被scriptlet调用）或全局类变量，但声明里代码不是线程安全的，必须自己控制。</tt> <br><br><span style="background-color: yellow">directives</span>&nbsp; 并不用来向客户端输出，用来定义页面属性，包括定制标签库和包含其他页面，语法 ：<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;%@ directive {attribute="value"}* %&gt;<br>三种不同的jsp directives ：<tt>page</tt>, <tt>taglib</tt>, and <tt>include。<br>&nbsp; &lt;%@ page %&gt;给jsp容器提供页面的相关信息<br>&lt;%@ include %&gt; is used to include text and/or code at <span style="color: red" class="docEmphasis">translation time</span> of a JSP，语法<tt>&lt;%@ include file="relativeURL" %&gt;</tt>,这个文件必须是web 应用的一部分，由于在转换阶段被包括，相当于在编译之前把文件源代码直接放进来，所以不影响runtime阶段的性能。<a class="docLink" href="mk:@MSITStore:E:\Computer%20eBook\j2EE&amp;Web\JSP&amp;Servlet\j2ee技术web层：servlet和jsp\Addison.Wesley.Servlets.and.JavaServer.Pages.The.J2EE.Technology.Web.Tier.eBook-LiB.chm::/0321136497_ch03lev1sec4.html#ch03lev3sec6"><tt>&lt;jsp:include /&gt;</tt></a> 在runtime阶段触发，虽然效能没前面<span style="color: red" class="docEmphasis">translation time</span> include好，但保证被包括文件的实时性。<br>&lt;%@ taglib %&gt; 自定义标签库，语法<tt>&lt;%@ taglib uri="uri" prefix="prefixOfTag" %&gt;</tt></tt> <br><span style="background-color: yellow">Actions</span>&nbsp; 可以方便的把动态代码链入简单的jsp页面，功能类似scripting elements ，但是把和jsp打交道的java代码抽象出来了，有两种：standard and custom 语法 <tt>&lt;prefix:element {attribute="value"}* /&gt;<br><br>jsp中有<span class="docEmphasis">implicit objects</span>，就像在Servlets中的对象，在scripting elements中可以使用：config，request，response，session（默认jsp持有一个session，在scripting elements 用这个对象，就像调用<tt>HttpServletRequest getSession()</tt> 一样），application（<tt>javax.servlet.ServletContext</tt> 对象实例，就像调用<tt>ServletConfig getServletContext()</tt> 一样）</tt> 还有一些没有直接和Servlet 对应的，但是隐含的对象：<tt>pageContext（含有一个jsp的许多对象资源信息，在定制标签的时候用得较多）</tt>, <tt>page</tt>, <tt>out</tt>, and <tt>exception</tt><img src ="http://www.blogjava.net/yuxh/aggbug/269553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2009-05-15 10:21 <a href="http://www.blogjava.net/yuxh/archive/2009/05/15/269553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Filter</title><link>http://www.blogjava.net/yuxh/archive/2009/05/15/269022.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Fri, 15 May 2009 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2009/05/15/269022.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/269022.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2009/05/15/269022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/269022.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/269022.html</trackback:ping><description><![CDATA[<p><tt>javax.servlet.Filter接口定义了接口的生命周期，该接口定义了三个方法：<br />
1 init(FilterConfig config) ：容器加载filter的时候触发此方法，可以用来从<tt>web.xml文件收集初始化参数以及做些初始化操作。<tt>FilterConfig可用来获得初始化数据，此方法被调用一次且仅一次。<br />
</tt></tt></tt>2 destroy()：当Filter被从内存中unload的时候调用（最典型的是关闭应用的时候），该方法最好用来关闭Filter初始化的外部资源。<br />
3 doFilter(ServletRequest request, ServletResponse response, FilterChain chain) ：执行filter要完成的事情，HttpServlet情况下， <tt>ServletRequest</tt>和<tt>ServletResponse</tt> 对象是HttpServletRequest 和HttpServletResponse的实例。Filter 需要类型转换他们以便使用HttpServletRequest 和HttpServletResponse对象的方法。<br />
<tt><span style="color: red;"><tt>FilterConfig</tt> </span></tt>对象用来配置filter，<tt><span style="color: red;"><tt>FilterChain</tt> </span></tt>对象用来表示filters链中当前应用到request和response中的filter。Filter 和Servlet的功能基本类似，唯一区别时候他强制分开链中的各个资源。可以说Filter是有额外功能的Servlet。<tt>FilterChain对象可以形象的理解为一种Stack，statck中的某个filter正在某个request和response上运行。<tt><span style="color: red;"><tt>FilterConfig</tt> 和</span></tt><tt>ServletConfig</tt> 极为类似<br />
&nbsp;&nbsp; 默认情况filters链只能用来处理客户端发送的request，如果用<tt>RequestDispatcher</tt> 对象的<tt>forward()</tt> 或者<tt>include()</tt> 方法发送请求，filter是不能处理的，但是可通过配置web.xml处理：<tt>dispatcher</tt>元素中有<tt>REQUEST</tt>, <tt>INCLUDE</tt>, <tt>FORWARD</tt>, <tt>ERROR四种值可用来配置。<br />
</tt><br />
二 Wrapper<br />
</tt>&nbsp;&nbsp;&nbsp;&nbsp; 定制request或者response对象的时候，只需要简单的继承request或response的相应wrapper类（就是对request或response进行扩展实现）。sun公司提供四个方便的wrapper类：<br />
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;">ServletRequestWrapper<br />
HttpServletRequestWrapper<br />
ServletResponseWrapper<br />
HttpServletResponseWrapper</span></div>
wrapper类实际上使用了Decorator模式<img src ="http://www.blogjava.net/yuxh/aggbug/269022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2009-05-15 10:21 <a href="http://www.blogjava.net/yuxh/archive/2009/05/15/269022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 in action笔记(一)</title><link>http://www.blogjava.net/yuxh/archive/2009/02/22/256098.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Sun, 22 Feb 2009 14:53:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2009/02/22/256098.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/256098.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2009/02/22/256098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/256098.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/256098.html</trackback:ping><description><![CDATA[<p align="left">先复习下JAVA SERVLET API：<br />
servlet API使HTTP直接面向java平台，这一意味着java开发人员能一种直观的方式写HTTP server 代码，这种方式是对HTTP client/server通讯模式的面向对象的抽象。Servlet API有三个核心部分：servlet, request以及response 对象。A servlet is a singleton Java object whose whole purpose is to receive requests and return responses after some arbitrary back-end processing. The request object encapsulates the various details of the request, including the all-important request parameters as submitted via form fields and querystring parameters. The response object includes such key items as the response headers and the output stream that will generate the text of the response. In short, a servlet receives a request object, examines its data, does the appropriate back-end magic, and then writes and returns the response to the client.抽时间看下Servlet Specification，他规定API必须遵守的设计规则（具体实现是由第三方的servlet 容器提供的，容器既可以是独立的，比如tomcat，也可以是一些更大的application server的一部份）。部署servlet之前，必须按规则打包，最基础的打包单位是web application。Servlet Specification defines a web application as &#8220;a collection of servlets, HTML pages,classes, and other resources.&#8221; servlet容器收到请求后会决定哪一个servlet处理请求，调用该servlet的service()方法，传给他request和response作为参数。Servlet API有三个关键角色：servlets,web applications, and the servlet container。一个servlet container可以拥有多个web applications。Servlet API还提供一些重要的高层功能，像session机制，他能把某一客户的相关的请求都联系起来（不要忘了HTTP的stateless特性），Without it, we&#8217;d be handling cookies and parsing embedded querystring session keys.（这个没有完全理解，cookies 里是不是嵌入了查询条件参数等?）。Servlet API直接以一种面向对象抽象的方式封装client/sever交换模式，这样我们就不需要亲历亲为的解析HTTP请求，事实上我们收到的是一个整洁的用java封装的request对象。说这些，最终是要强调the Servlet API is an infrastructure-level technology in the scope of modern web applications. As infrastructure, servlets provide the solid low-level foundation upon which robust web applications can be built. If you consider the routine needs of a web application, the Servlet API doesn&#8217;t attempt to provide solutions for such things. Now that we know what servlets can do,let&#8217;s look at what they leave undone. These common tasks of the domain are what a web application framework like Struts 2 will need to address.<br />
&nbsp;&nbsp;&nbsp;&nbsp;The execution of an interceptor can be broken into three phases: preprocessing, passing control on to the rest of the action invocation by calling invoke(), and postprocessing. Interceptors can also divert workflow by returning a control string instead of calling invoke().They also have access to all key data via the ActionInvocation instance they receive.Ultimately, interceptors can do just about anything.</p>
<img src ="http://www.blogjava.net/yuxh/aggbug/256098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2009-02-22 22:53 <a href="http://www.blogjava.net/yuxh/archive/2009/02/22/256098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>