﻿<?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-Kevin's Java Life-文章分类-编程技巧</title><link>http://www.blogjava.net/kevin/category/848.html</link><description>    喝一杯咖啡，生活变得从容和清新</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:37:23 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:37:23 GMT</pubDate><ttl>60</ttl><item><title>【转载】JSP中的include的两种用法</title><link>http://www.blogjava.net/Kevin/articles/34295.html</link><dc:creator>Kevin</dc:creator><author>Kevin</author><pubDate>Wed, 08 Mar 2006 08:48:00 GMT</pubDate><guid>http://www.blogjava.net/Kevin/articles/34295.html</guid><wfw:comment>http://www.blogjava.net/Kevin/comments/34295.html</wfw:comment><comments>http://www.blogjava.net/Kevin/articles/34295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Kevin/comments/commentRss/34295.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kevin/services/trackbacks/34295.html</trackback:ping><description><![CDATA[<p><font style="BACKGROUND-COLOR: #ffffff" size="4">我们都知道在jsp中<font size="3">include</font>有两种形式,分别是<br /><span class="Code">&lt;%@ include file=&rdquo; &rdquo;%&gt; <br />&lt;jsp:include page=&rdquo; &rdquo; flush=&rdquo;true&rdquo;/&gt;<br /></span>前者是指令元素、后者是行为元素。具体它们将在何处用？如何用及它们有什么区别？这应该是很多人看到它都会想到的问题。下面一起来看看吧。</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">通常当应用程序中所有的页面的某些部分（例如标题、页脚和导航栏）都相同的时候，我们就可以考虑用include。具体在哪些时候用&lt;%@ include file=&rdquo; &rdquo;%&gt;，哪些时候用<br />&lt;jsp:include page=&rdquo; &rdquo; flush=&rdquo;true&rdquo;/&gt;.这种形式。首先要明白的是它们之间的区别。只有了解了它们用法的不同才理解该在何时去用以及如何选择。<br />&lt;%@ include file=&rdquo; &rdquo;%&gt; <br />jsp的include指令元素读入指定页面的内容。并把这些内容和原来的页面融合到一起。（这个过程是在翻译阶段:也就是jsp被转化成servlet的阶段进行的。<br />这里对翻译阶段进行一下说明:我们知道，jsp页面不能原封不动地被传送给浏览器，所有的jsp元素都必须首先由服务器进行处理。这是通过将jsp页面转达化成servlet，然后执行这个servlet来完成的。服务器需要一个jsp容器来处理jsp页面。jsp容器通常以servlet的形式来实现，这个servlet经过配置，可以处理对jsp页面的所有请求。<br />Jsp容器负责将jsp页面转化成servlet（称为jsp页面实现类&mdash;JSP Page implementation class）,并编译这个servlet。这两步就构成了翻译阶段.<br />由此我们就会知道：jsp页面是把include指令元素所指定的页面的实际内容（也就是代码段）加入到引入它的jsp页面中,合成一个文件后被jsp容器将它转化成servlet。可以看到这时会产生一个临时class文件和一个java文件。下面举个例子。<br />服务器用tomcat，引入页面的jsp文件叫test.jsp。被引入的页面叫date.jsp.这个jsp文件里存放的是一个有关时间的jsp代码,当前的上下文根设为test<br />//======date.jsp的源文件=====//<br /></font><font style="BACKGROUND-COLOR: #d3d3d3" size="4"><span class="Code"><font style="BACKGROUND-COLOR: #d3d3d3" size="4">&lt;%@ page language=&rdquo;java&rdquo; contentType=&quot;text/html;charset=gb2312&quot;%&gt;<br />&lt;%<br />&nbsp; java.util.Date date=new java.util.Date();<br />&nbsp; String date_cn =&quot;&quot;;<br />&nbsp; String dateStr = &quot;&quot;;<br />&nbsp; switch(date.getDay())<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0:date_cn =&quot;日&quot;; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1:date_cn =&quot;一&quot;; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 2:date_cn =&quot;二&quot;; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 3:date_cn =&quot;三&quot;; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 4:date_cn =&quot;四&quot;; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 5:date_cn =&quot;五&quot;; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 6:date_cn =&quot;六&quot;; break;<br />&nbsp; }<br />&nbsp;&nbsp; dateStr = (1900+date.getYear()) + &quot;年&quot; + (date.getMonth()+1) + &quot;月&quot; + date.getDate() + &quot;日(星期&quot; + date_cn + &quot;)&quot;;<br />%&gt;<br />&nbsp; document.write(&quot;&lt;%=dateStr%&gt;&quot;);<br /></font></span>//======以下是test.jsp的源文件=============//<br /><span class="Code"><font style="BACKGROUND-COLOR: #d3d3d3" size="4">&lt;%@ page language=&rdquo;java&rdquo; contentType=&rdquo;text/html;charset=gb2312&rdquo;%&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;include的两种用法&lt;/title&gt;<br />&lt;jsp:include page=&rdquo;date.jsp&rdquo; flush=&rdquo;true&rdquo;/&gt;<br />&lt;%--@ include file=&rdquo;date.jsp&rdquo; %--&gt;<br />&nbsp; //我们在这里用include的两种不同形式来引入date.jsp这个文件.<br />&lt;head&gt;<br />&lt;body&gt;<br />&lt;table&gt;&lt;tr&gt;&lt;td&gt;<br />有关jsp中include的两种用法.敬请关注。<br />&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</font></span></font><font style="BACKGROUND-COLOR: #ffffff" size="4">在test.jsp文件中，我们只输出了一行文本&ldquo; 有关jsp中include的两种用法.敬请关注。&rdquo;,现在让我们先用&lt;%@ include file=&rdquo;date.jsp&rdquo; %&gt;这种形式引入date.jsp这个文件。你想会出现什么问题了吗？此时出现了错误提示：<br /></font><font style="BACKGROUND-COLOR: #d3d3d3" size="4">HTTP Status 500 &ndash;<br />org.apache.jasper.JasperException: /date.jsp(0,0) Page directive: can't have multiple occurrences of contentType</font></p>
<p><font size="4"><font style="BACKGROUND-COLOR: #ffffff">以下还有一堆错误，但我们只要看这里就知道问题的所在了。状态码为http 500服务器内部错误。再看下面的提示。在date.jsp页面中不能指定多个contentType.<br />原因就在这里了。是因为在翻译阶段,date.jsp文件的代码被原封不动地加入到了test.jsp页面从而合成一个文件。合成后的文件中就会相同的：<br /></font><font style="BACKGROUND-COLOR: #d3d3d3"><span class="Code"><font style="BACKGROUND-COLOR: #d3d3d3">&lt;%@ page language=&rdquo;java&rdquo; contentType=&rdquo;text/html;charset=gb2312&rdquo;%&gt;</font></span></font></font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">这句代码。解决的办法是把date.jsp文件中的这句删掉。刷新后再请求test.jsp页面<br />请求test.jsp在页面显示如下</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">2003年12月10日 13:12:40<br />有关jsp中include的两种用法.敬请关注。</font></p>
<p><br /><font style="BACKGROUND-COLOR: #ffffff" size="4">这时我们还不能发现什么。还是去查看tomcat下的临时文件吧。到那里去看看date.jsp文件的内容是否已被加入到了test.jsp文件中。<br />&lt;注.此处的tomcat装在E盘根目录下&gt;</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">目录 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E:\tomcat\work\Standalone\localhost\test.</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">在这个目录下会看到<br />test_jsp.java和test_jsp.class两个文件。</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">这里的java文件就是jsp容器将jsp转化成了servlet而得到的test_jsp.java这个文件。<br />相对应的test_jsp.class这个文件就是编译test_jsp.java这个servlet文件产生的类文件了。打开所产生的servlet文件（test_jsp.java）。此时我们会发现，</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">在test.jsp文件被转化成servlet文件时，在输出的&lt;haed&gt;之间加入了一些不是test.jsp页面里面的代码,新加入的内容就是date.jsp里面的代码: 新加入了哪些内容或是否真的加入了新的内容请自己测试去看一下就会一目了然了.在这里不再详述.<br />以上就是我们用&lt;%@ include file=&rdquo;date.jsp&rdquo;%&gt;这种形式得到的结果.</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">下面我们换用&lt;jsp:include page=&rdquo;dae.jsp&rdquo; flush=&rdquo;true&rdquo;/&gt;也就是将</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">&lt;%@ include file=&rdquo;date.jsp&rdquo;%&gt;换成&lt;jsp:include page=&rdquo;dae.jsp&rdquo; flush=&rdquo;true&rdquo;/&gt;,然后请求test.jsp.</font></p>
<p><font style="BACKGROUND-COLOR: #d3d3d3" size="4">2003? &ecirc; 12??10?? 13:30:13<br />有关jsp中include的两种用法.敬请关注。</font></p>
<p><br /><font style="BACKGROUND-COLOR: #ffffff" size="4">此时会在页面上看见.我们所引入date.jsp输出的日期中中文出现了乱码.什么原因?<br />是因为include行为元素是在请求处理阶段执行的.(此处要对请求处理阶段进行说明一下.<br />Jsp容器除了上面提到的负责将jsp页面转化成servlet外,还负责调用jsp页面实现类以处理每个请求并产生应答.这个阶段我们就称为请求处理阶段.请求处理阶段仅执行类文件.)<br />所以在我们作include行为元素引入页面时,实际只是引用了date.jsp这个文件被转化并被编译后产生的servlet类文件.既如此,date.jsp就是作为一个单独的文件在执行后才被test.jsp文件运行时调用.由于date.jsp文件中没有指定字符编码.所以出现了乱码.解决办法是在date.jsp文件中重新把刚才去掉的</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4"><span class="Code"><font style="BACKGROUND-COLOR: #ffffff" size="4">&lt;%@ page language=&rdquo;java&rdquo; contentType=&rdquo;text/html;charset=gb2312&rdquo;%&gt;</font></span></font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">这行语句加入后刷新重新运行.此时页面显示正确,并跟用include指令正常运行时一样.再查看tomcat下的临时文件会发现.此时多出了一个date_jsp.java文件和一个date_jsp.class文件.这两个文件得来的方式跟test_jsp.java和test_jsp.class文件得来的方式一样.再查看一下此时test_jsp.java文件的代码会发现.此时只新增加了一句代码:<br /><span class="Code">JspRuntimeLibrary.include(request, response, &quot;date.jsp&quot;, out, true);</span></font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">它并没有把date.jsp文件的代码加入到test.jsp.<br />只是在运行时引入了date.jsp页面执行后所产生的应答.这意味着我们可以指定任何能够产生应答的Web资源,(例如一个servlet或一个jsp页面),只要这些资源所产生的类型和jsp页面产生的内容类型相同.JSP容器将通过一个内部的函数调用来执行指定的资源.因此,这些被引入的资源可以帮助处理原来的请求,所以这些资源可以访问请求作用域内的所有对象.以及所有原来的请求参数.</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">由于在主页面被请求时,这些页面还没有被引入到主页面中,所以你可以对page属性使用一个请求时属性值,以便根据运行时的情况来决定要引入哪一个页面.还可以添加一些将被引入的页面读取的请求参数.</font></p>
<p><font style="BACKGROUND-COLOR: #d3d3d3" size="4"><span class="Code"><font style="BACKGROUND-COLOR: #d3d3d3" size="4">&lt;jsp:include page=&rdquo;&lt;%=pageSelectedAtRuntime%&gt;&rdquo; flush=&rdquo;true&rdquo; &gt;<br />&lt;jsp:param name=&rdquo;fitstParamer&rdquo; value=&rdquo;firstValue&rdquo;&gt;<br />&lt;jsp:param name=&rdquo;lastParamer&rdquo; value=&rdquo;lastValue&rdquo;&gt;<br />&lt;/jsp:include&gt;</font></span></font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">如果修改了被引入的jsp页面,那么可以立刻使用该页面的最新版本,这是因为对待被引入的页面的方式与对待由浏览器直接调用的jsp页面的方式完全相同.即容器检测页面的变化,并自动进入翻译阶段,以得到页面的最新版本.</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">(注意,include行为元素同jsp其它元素一样,没有行为体时要以&rdquo;/&rdquo;结束.就像下面这样.<br /><span class="Code"><span class="Code">&lt;jsp:include page=&rdquo;&lt;%=pageSelectedAtRuntime%&gt;&rdquo; flush=&rdquo;true&rdquo; /&gt;)</span><span class="Title"></span></span></font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4"></font>&nbsp;</p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">以下是对include 两种用法的区别</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">主要有两个方面的不同;</font></p>
<p><font style="BACKGROUND-COLOR: #d3d3d3" size="4">一:执行时间上:</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4"><span class="Code"><font style="BACKGROUND-COLOR: #ffffff" size="4">&lt;%@ include file=&rdquo;relativeURI&rdquo;%&gt;&nbsp;</font></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是在翻译阶段执行<br /><span class="Code">&lt;jsp:include page=&rdquo;relativeURI&rdquo; flush=&rdquo;true&rdquo; /&gt;</span>&nbsp; 在请求处理阶段执行.</font></p>
<p><font style="BACKGROUND-COLOR: #d3d3d3" size="4">二:引入内容的不同:</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4"><span class="Code"><font style="BACKGROUND-COLOR: #ffffff" size="4">&lt;%@ include file=&rdquo;relativeURI&rdquo;%&gt;</font></span><br />引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起.</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4"><span class="Code"><font style="BACKGROUND-COLOR: #ffffff" size="4">&lt;jsp:include page=&rdquo;relativeURI&rdquo; flush=&rdquo;true&rdquo; /&gt;<br /></font></span>引入执行页面或servlet所生成的应答文本.</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">另外在两种用法中file和page属性都被解释为一个相对的URI.如果它以斜杠开头,那么它就</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4">是一个环境相关的路径.将根据赋给应用程序的URI的前缀进行解释,如果它不是以斜杠开头,那么就是页面相关的路径就根据引入这个文件的页面所在的路径进行解释.更多有关URL是如何解释的请参考相关资料或书籍.</font></p><img src ="http://www.blogjava.net/Kevin/aggbug/34295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Kevin/" target="_blank">Kevin</a> 2006-03-08 16:48 <a href="http://www.blogjava.net/Kevin/articles/34295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pageEncoding,ContentType以及其他</title><link>http://www.blogjava.net/Kevin/articles/15970.html</link><dc:creator>Kevin</dc:creator><author>Kevin</author><pubDate>Wed, 19 Oct 2005 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/Kevin/articles/15970.html</guid><wfw:comment>http://www.blogjava.net/Kevin/comments/15970.html</wfw:comment><comments>http://www.blogjava.net/Kevin/articles/15970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Kevin/comments/commentRss/15970.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kevin/services/trackbacks/15970.html</trackback:ping><description><![CDATA[前不久使用Sitemesh遇到乱码问题，偶然了解到pageEncoding这一属性，并用google搜到一些资料，在此记录之。<BR><BR><STRONG>SCWCD Exam Study Kit</STRONG> 对<STRONG>contentType</STRONG> 的敘述<BR>The <B>contentType</B> attribute specifies the MIME type and character encoding of the <BR>output. The default value of the MIME type is text/html; the default value of the <BR>character encoding is ISO-8859-1. The MIME type and character encoding are <BR>separated by a semicolon, as shown here: <BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&lt;%@ page contentType=<FONT class=java-string>"text/html;charset=ISO-8859-1"</FONT> %&gt;<%</SPAN><SPAN style="COLOR: #000000">@ page contentType</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">text/html;charset=ISO-8859-1</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">%></DIV><BR>This is equivalent to writing the following line in a servlet: <BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">response.setContentType(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">text/html;charset=ISO-8859-1</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);</SPAN></DIV><BR><FONT color=#0000ff>这样是否说明，如果使用SetCharacterEncodingFilter来过滤所有的request的话，就不需要在每个JSP页面加上&lt;% @page&gt;指令了？<%@ page contentType>指令了？<BR><BR><FONT color=#000000>对<STRONG>pageEncoding</STRONG> </FONT><BR><FONT color=#000000>The <B>pageEncoding</B> attribute specifies the character encoding of the JSP page. The <BR>default value is ISO-8859-1. The following line illustrates the syntax: </FONT><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000"><%</SPAN><SPAN style="COLOR: #000000">@ page pageEncoding</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">ISO-8859-1</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">%></SPAN>
<DIV></DIV>
<P><BR><FONT color=#000000>在<STRONG>JSP 2.0 Spec 的JSP.4.1</STRONG> 对<STRONG>pageEncoding</STRONG>的叙述<BR><BR>Describes the character encoding for the JSP page.<BR><BR>For JSP pages in standard syntax, the page character encoding is determined <BR>from the following sources: <BR><BR>• A JSP configuration element <B>page-encoding</B> value whose URL pattern matches <BR>the page. <BR><BR>• The <B>pageEncoding</B> attribute of the page directive of the page. It is a translation- <BR>time error to name different encodings in the <B>pageEncoding</B> attribute of <BR>the page directive of a JSP page and in a JSP configuration element whose <BR>URL pattern matches the page. <BR><BR>• The <B>charset</B> value of the <B>contentType</B> attribute of the page directive. This is <BR>used to determine the page character encoding if neither a JSP configuration <BR>element <B>page-encoding</B> nor the <B>pageEncoding</B> attribute are provided. <BR><BR>• If none of the above is provided, ISO-8859-1 is used as the default character <BR>encoding. <BR></FONT><BR>the character encoding for the JSP page是什么意思呢？<BR><BR><FONT color=#000000>这样说就清楚了：pageEncoding是当jsp转译成_jsp.java时使用的encoding。<BR></FONT><BR></FONT><FONT color=#000000>要了解JSP的乱码问题，最重要的是了解jsp的编译输出流程。<BR>1. 从JSP“翻译”成*_jsp.java，此时JSPC根据<STRONG>pageEncoding</STRONG>来读取JSP（注意是读取），然后把它翻译成<STRONG>统一的utf-8</STRONG> JAVA源码(.java).。如果pageEncoding设定错了，此时出来的中文已经是乱码了。<BR><BR>2. 从Java源码编译成Java ByteCode，此时JavaC将utf-8编码的Java源码编译成同样utf-8的二进制码(.class).<BR><BR>3. Tomcat或者其他应用服务器载入并执行Java ByteCode，并使用<STRONG>contentType</STRONG>设定的的字符集来输出结果(html页面)。<BR><BR>了解了以上流程，应该对JSP页面的乱码问题有本质的理解了。</FONT></P>
<P>以上文字参考：<BR>1.&nbsp;JavaWorld@TW：<A href="http://www.javaworld.com.tw/jute/post/view?bid=6&amp;id=21986&amp;tpg=1&amp;ppg=1&amp;sty=1&amp;age=0#21986">page指令：contentType VS. pageEncoding</A><BR>2. Matrix：<A href="http://matrix.org.cn/thread.shtml;jsessionid=5CC981759F0BCBD0AD71962E0EFC2403?topicId=21142&amp;forumId=14">jsp,db,apache中文乱码的解决方案</A><FONT color=#000000><FONT style="BACKGROUND-COLOR: #000000"><BR></FONT></FONT></P><img src ="http://www.blogjava.net/Kevin/aggbug/15970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Kevin/" target="_blank">Kevin</a> 2005-10-19 17:41 <a href="http://www.blogjava.net/Kevin/articles/15970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>拒绝访问</title><link>http://www.blogjava.net/Kevin/articles/4090.html</link><dc:creator>Kevin</dc:creator><author>Kevin</author><pubDate>Sun, 08 May 2005 11:01:00 GMT</pubDate><guid>http://www.blogjava.net/Kevin/articles/4090.html</guid><wfw:comment>http://www.blogjava.net/Kevin/comments/4090.html</wfw:comment><comments>http://www.blogjava.net/Kevin/articles/4090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Kevin/comments/commentRss/4090.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kevin/services/trackbacks/4090.html</trackback:ping><description><![CDATA[5.1前遇到一个问题，至今未能解决，记录在这里，留待以后解决<IMG height=20 src="http://www.blogjava.net/Emoticons/QQ/42.gif" width=20 border=0><BR><BR>事情起因是一段javascript脚本：<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">script&nbsp;language</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">javascript&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;var&nbsp;url&nbsp;=&nbsp;window.locatin.href;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;//doSomething&nbsp;on&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">url</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;window.location.href&nbsp;=&nbsp;url;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;//2:&nbsp;window.locatino.replace(url);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&lt;/script&gt;</SPAN></DIV></DIV><BR>执行这段脚本一般情况下是没有问题的，但是如果连着执行两遍的话，就会弹出“拒绝访问”的警告：<IMG title=拒绝访问 height=326 alt=error.jpg src="http://www.blogjava.net/images/blogjava_net/kevin/error.jpg" width=504 border=0><BR><BR>更麻烦的是在另一个应用中模拟这种状况却不会发生问题<IMG height=20 src="http://www.blogjava.net/Emoticons/QQ/16.gif" width=20 border=0>。<BR>关于“拒绝访问”（待续）<BR><img src ="http://www.blogjava.net/Kevin/aggbug/4090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Kevin/" target="_blank">Kevin</a> 2005-05-08 19:01 <a href="http://www.blogjava.net/Kevin/articles/4090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Foward与Redirect</title><link>http://www.blogjava.net/Kevin/articles/3216.html</link><dc:creator>Kevin</dc:creator><author>Kevin</author><pubDate>Wed, 13 Apr 2005 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/Kevin/articles/3216.html</guid><wfw:comment>http://www.blogjava.net/Kevin/comments/3216.html</wfw:comment><comments>http://www.blogjava.net/Kevin/articles/3216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Kevin/comments/commentRss/3216.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kevin/services/trackbacks/3216.html</trackback:ping><description><![CDATA[<STRONG>Foward（转发）</STRONG><BR><STRONG>使用：</STRONG> 
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">HttpServletRequest.getRequestDispatcher(URL).forward(request,&nbsp;response)<BR>或者<SPAN style="COLOR: #000000">&nbsp;&nbsp; HttpServletContext.getRequestDispatcher(URL).forward(request,&nbsp;response)</SPAN></SPAN></DIV></DIV><STRONG>原理：</STRONG><BR>当使用转发时, JSP容器将使用一个内部的方法来调用目标页面，新的页面继续处理同一个请求，而浏览器将不会知道这个过程。 <BR><STRONG>特点：</STRONG><BR>浏览器中所显示的URL不会被修改．<BR>由于request并没有中止，所以其中的对象仍然可用．<BR><BR><STRONG>Redirect（重定向）</STRONG><BR><STRONG>使用：</STRONG><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">HttpServletResponse.sendRedirect(URL);</SPAN></DIV></DIV><STRONG>原理：</STRONG><BR>重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求<BR><STRONG>特点：</STRONG><BR>当你使用重定向时，浏览器中所显示的URL会变成新页面的URL．<BR>由于重定向方式产生了一个新的请求，所以经过一次重定向后，request内的对象将无法使用。<BR><BR>怎么选择是重定向还是转发呢？通常情况下转发更快，而且能保持request内的对象，所以他是第一选择。但是由于在转发之后，浏览器中URL仍然指向开始页面，此时如果重载当前页面，开始页面将会被重新调用。如果你不想看到这样的情况，则选择重定向。<img src ="http://www.blogjava.net/Kevin/aggbug/3216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Kevin/" target="_blank">Kevin</a> 2005-04-13 14:52 <a href="http://www.blogjava.net/Kevin/articles/3216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>do...while(false)的妙用</title><link>http://www.blogjava.net/Kevin/articles/2401.html</link><dc:creator>Kevin</dc:creator><author>Kevin</author><pubDate>Thu, 24 Mar 2005 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/Kevin/articles/2401.html</guid><wfw:comment>http://www.blogjava.net/Kevin/comments/2401.html</wfw:comment><comments>http://www.blogjava.net/Kevin/articles/2401.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Kevin/comments/commentRss/2401.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kevin/services/trackbacks/2401.html</trackback:ping><description><![CDATA[今天从<A href="http://www.javayou.com">Java自由人</A>看到一篇Blog：<A href="http://www.javayou.com/trackback.do?log_id=700 ">do...while(false)的探讨</A>，刚好解决了一直困扰我的一个小麻烦<IMG height=19 src="http://www.blogjava.net/Emoticons/teeth_smile.gif" width=19 border=0><BR>经常会遇到这样的情况，一大段代码，中间遇到某种情况,比如someObj == null,需要跳出这段代码，但是又不在循环之中，只好处理成这样：<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_19_93_Open_Image onclick="this.style.display='none'; Codehighlighter1_19_93_Open_Text.style.display='none'; Codehighlighter1_19_93_Closed_Image.style.display='inline'; Codehighlighter1_19_93_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_19_93_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_19_93_Closed_Text.style.display='none'; Codehighlighter1_19_93_Open_Image.style.display='inline'; Codehighlighter1_19_93_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(someObj&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)</SPAN><SPAN id=Codehighlighter1_19_93_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_19_93_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">doSomething<IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;<IMG src="http://www.blogjava.net/images/dot.gif"><BR><IMG id=Codehighlighter1_79_91_Open_Image onclick="this.style.display='none'; Codehighlighter1_79_91_Open_Text.style.display='none'; Codehighlighter1_79_91_Closed_Image.style.display='inline'; Codehighlighter1_79_91_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_79_91_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_79_91_Closed_Text.style.display='none'; Codehighlighter1_79_91_Open_Image.style.display='inline'; Codehighlighter1_79_91_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(someOther&nbsp;fit&nbsp;someCondition)</SPAN><SPAN id=Codehighlighter1_79_91_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_79_91_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<IMG src="http://www.blogjava.net/images/dot.gif"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV></DIV>最后造成一大堆括号，写起来不舒服，可读性也很差。<BR><BR>巧用do...while(false)可以解决这个问题，看下面的代码：<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">function</SPAN><SPAN style="COLOR: #000000">&nbsp;LTrim(s){<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">do</SPAN><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">s</SPAN><SPAN style="COLOR: #000000">||</SPAN><SPAN style="COLOR: #000000">s.length</SPAN><SPAN style="COLOR: #000000">&lt;=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">break</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">var</SPAN><SPAN style="COLOR: #000000">&nbsp;whitespace</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;\t\r\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(whitespace.indexOf(s.charAt(</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">))</SPAN><SPAN style="COLOR: #000000">&gt;=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">){<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">var</SPAN><SPAN style="COLOR: #000000">&nbsp;len</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">s.length;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">var</SPAN><SPAN style="COLOR: #000000">&nbsp;index;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(index</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;index&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(whitespace.indexOf(s.charAt(index))</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">break</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(index&nbsp;s</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">s.substring(index);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;s</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;}</SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(Ab){<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;s</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;s;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>}</SPAN></DIV></DIV>
<P><BR>这个函数是用来去掉字符串前端的空白。使用do...while(false)的用意就在于在do{}的过程中可以break，使得函数唯一的出口就是最后一行的return。<BR>嗯，这是一个不错的方法。以后可以采用，避免过多的嵌套括号。<BR>(以上部分摘抄Blog：<A href="http://www.javayou.com/trackback.do?log_id=700">do...while(false)的探讨</A>)</P><img src ="http://www.blogjava.net/Kevin/aggbug/2401.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Kevin/" target="_blank">Kevin</a> 2005-03-24 11:13 <a href="http://www.blogjava.net/Kevin/articles/2401.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>