﻿<?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-semovy-文章分类-JSP</title><link>http://www.blogjava.net/WshmAndLily/category/10975.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 24 Apr 2008 05:57:49 GMT</lastBuildDate><pubDate>Thu, 24 Apr 2008 05:57:49 GMT</pubDate><ttl>60</ttl><item><title>URLEncoder.encode(str,"编码") new URLDecoder().decode(str,"编码")</title><link>http://www.blogjava.net/WshmAndLily/articles/195459.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Thu, 24 Apr 2008 03:03:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/195459.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/195459.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/195459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/195459.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/195459.html</trackback:ping><description><![CDATA[try&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String enUft = URLEncoder.encode("广东省福利彩票开奖信息网", "UTF-8");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(enUft); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.net.URLDecoder&nbsp;&nbsp; urlDecoder&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; java.net.URLDecoder();&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; s&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp; urlDecoder.decode(enUft,"UTF-8");&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(s);&nbsp;&nbsp; <br />
&nbsp;&nbsp;}&nbsp;&nbsp; catch&nbsp;&nbsp; (Exception&nbsp;&nbsp; e)&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;} <br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;try&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String enUft = URLEncoder.encode("广东省福利彩票开奖信息网", "GB2312");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(enUft); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.net.URLDecoder&nbsp;&nbsp; urlDecoder&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; java.net.URLDecoder();&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; s&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp; urlDecoder.decode(enUft,"GB2312");&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(s);&nbsp;&nbsp; <br />
&nbsp;&nbsp;}&nbsp;&nbsp; catch&nbsp;&nbsp; (Exception&nbsp;&nbsp; e)&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;} <br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;try&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String enUft = URLEncoder.encode("广东省福利彩票开奖信息网", "UTF-8");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(enUft); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.net.URLDecoder&nbsp;&nbsp; urlDecoder&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; java.net.URLDecoder();&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; s&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp; urlDecoder.decode(enUft,"GB2312");&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(s);&nbsp;&nbsp; <br />
&nbsp;&nbsp;}&nbsp;&nbsp; catch&nbsp;&nbsp; (Exception&nbsp;&nbsp; e)&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;} <br />
<br />
<br />
<br />
结果:<br />
<br />
%E5%B9%BF%E4%B8%9C%E7%9C%81%E7%A6%8F%E5%88%A9%E5%BD%A9%E7%A5%A8%E5%BC%80%E5%A5%96%E4%BF%A1%E6%81%AF%E7%BD%91<br />
广东省福利彩票开奖信息网<br />
%B9%E3%B6%AB%CA%A1%B8%A3%C0%FB%B2%CA%C6%B1%BF%AA%BD%B1%D0%C5%CF%A2%CD%F8<br />
广东省福利彩票开奖信息网<br />
%E5%B9%BF%E4%B8%9C%E7%9C%81%E7%A6%8F%E5%88%A9%E5%BD%A9%E7%A5%A8%E5%BC%80%E5%A5%96%E4%BF%A1%E6%81%AF%E7%BD%91<br />
骞夸?????绂???╁僵绁ㄥ??濂?淇℃??缃?<br />
<br />
<br />
<br />
<div class="cnt" id="blog_text">
<table class="FCK__ShowTableBorders" cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td valign="top" align="left" width="509" height="86">/* <br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp; 网页中的表单使用POST方法提交时，数据内容的类型是 application/x-www-form-urlencoded，这种类型会：
            <p>1.字符"a"-"z"，"A"-"Z"，"0"-"9"，"."，"-"，"*"，和"_" 都不会被编码;<br />
            2.将空格转换为加号 (+) ;<br />
            3.将非文本内容转换成"%xy"的形式,xy是<span class="commentform"><span class="postText">两位16进制的数值</span></span>;<br />
            4.在每个 name=value 对之间放置 &amp; 符号。<br />
            */</p>
            <p>&nbsp;&nbsp;&nbsp; URLEncoder类包含将字符串转换为application/x-www-form-urlencoded MIME 格式的静态方法。</p>
            <p><span class="postText">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; web设计者面临的众多难题之一便是怎样处理不同操作系统间的差异性。这些差异性能引起URL方面的问题：例如，一些操作系统允许文件名中含有空格符，有些又不允许。大多数操作系统不会认为文件名中含有符号&#8220;#&#8221;会有什么特殊含义；但是在一个URL中，符号&#8220;#&#8221;表示该文件名已经结束，后面会紧跟一个fragment（部分）标识符。其他的特殊字符，非字母数字字符集，它们在URL或另一个操作系统上都有其特殊的含义，表述着相似的问题。为了解决这些问题，我们<span class="style1"><font color="#0000ff">在URL中使用的字符就必须是一个ASCII字符集的固定字集中的元素</font></span>，具体如下：<br />
            <br />
            1.大写字母A-Z<br />
            2.小写字母a-z<br />
            3.数字 0-9<br />
            4.标点符 - _ . ! ~ * ' (和 ,)<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 诸如字符: / &amp; ? @ # ; $ + = 和 %也可以被使用，但是它们各有其特殊的用途，如果一个文件名包括了这些字符（ / &amp; ? @ # ; $ + = %），这些字符和所有其他字符就应该被编码。<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编码过程非常简单，任何字符只要不是ASCII码数字，字母，或者前面提到的标点符，它们都将被转换成字节形式，每个字节都写成这种形式：一个&#8220;%&#8221;后面跟着两位16进制的数值。空格是一个特殊情况，因为它们太平常了。它除了被编码成&#8220;%20&#8221;以外，还能编码为一个&#8220;+&#8221;。加号（+）本身被编码为%2B。当/ # = &amp; 和?作为名字的一部分来使用时，而不是作为URL部分之间的分隔符来使用时，它们都应该被编码。<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARNING这种策略在存在大量字符集的异构环境中效果不甚理想。例如：在U.S. Windows 系统中, &#233; 被编码为 %E9. 在 U.S. Mac中被编码为%8E。这种不确定性的存在是现存的URI的一个明显的不足。所以在将来URI的规范当中应该通过国际资源标识符(IRIs)进行改善。<br />
            <br />
            </span></p>
            </td>
            <td valign="top" width="175">
            <div align="center"></div>
            </td>
        </tr>
    </tbody>
</table>
<p><span class="postText">&nbsp;&nbsp;&nbsp;&nbsp; 类URL并不自动执行编码或解码工作。你能生成一个URL对象，它可以包括非法的ASCII和非ASCII字符和/或%xx。当用方法getPath() 和toExternalForm( ) 作为输出方法时，这种字符和转移符不会自动编码或解码。你应对被用来生成一个URL对象的字符串对象负责，确保所有字符都会被恰当地编码。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 幸运的是，java提供了一个类URLEncoder把string编码成这种形式。Java1.2增加了一个类URLDecoder它能以这种形式解码string。这两个类都不用初始化：<br />
public class URLDecoder extends Object<br />
public class URLEncoder extends Object<br />
<br />
<font color="#0000ff"><span class="style1">一、URLEncoder</span><br />
<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp; 在java1.3和早期版本中，类java.net.URLEncoder包括一个简单的静态方法encode( )， 它对string以如下规则进行编码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static String encode(String s)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 这个方法总是用它所在平台的默认编码形式，所以在不同系统上，它就会产生不同的结果。结果java1.4中，这个方法被另一种方法取代了。该方法要求你自己指定编码形式：<br />
<br />
public static String encode(String s, String encoding) throws UnsupportedEncodingException<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 两种关于编码的方法，都把任何非字母数字字符转换成%xx（除了空格，下划线(_)，连字符（?）,句号（。）,和星号（*））。两者也都编码所以的非ASCII字符。空格被转换成一个加号。这些方法有一点过分累赘了；它们也把&#8220;~&#8221;，&#8220;&#8216;&#8221;，&#8220;（）&#8221;转换成%xx，即使它们完全用不着这样做。尽管这样，但是这种转换并没被URL规范所禁止。所以web浏览器会自然地处理这些被过分编码后的URL。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 两中关于编码的方法都返回一个新的被编码后的string，java1.3的方法encode( ) 使用了平台的默认编码形式，得到%xx。这些编码形式典型的有：在 U.S. Unix 系统上的ISO-8859-1, 在U.S. Windows 系统上的Cp1252,在U.S. Macs上的MacRoman，和其他本地字符集等。因为编码解码过程都是与本地操作平台相关的，所以这些方法是令人不爽的，不能跨平台的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这就明确地回答了为什么在java1.4中这种方法被抛弃了，转而投向了要求以自己指定编码形式的这种方法。尽管如此，如果你执意要使用所在平台的默认编码形式，你的程序将会像在java1.3中的程序一样，是本地平台相关的。在另一种编码的方法中，你应该总是用UTF-8，而不是其他什么。UTF-8比起你选的其他的编码形式来说，它能与新的web浏览器和更多的其他软件相兼容。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子7-8是使用URLEncoder.encode( ) 来打印输出各种被编码后的string。它需要在java1.4或更新的版本中编译和运行。<br />
<br />
Example 7-8. x-www-form-urlencoded strings <br />
</span>
<p><span class="postText">下面就是它的输出。需要注意的是这些代码应该以其他编码形式被保存而不是以ASCII码的形式，还有就是你选择的编码形式应该作为一个参数传给编译器，让编译器能据此对源代码中的非ASCII字符作出正确的解释。<br />
<br />
% javac -encoding UTF8 EncoderTest % <br />
<br />
java EncoderTest<br />
This+string+has+spaces<br />
This*string*has*asterisks<br />
This%25string%25has%25percent%25signs<br />
This%2Bstring%2Bhas%2Bpluses<br />
This%2Fstring%2Fhas%2Fslashes<br />
This%22string%22has%22quote%22marks<br />
This%3Astring%3Ahas%3Acolons<br />
This%7Estring%7Ehas%7Etildes<br />
This%28string%29has%28parentheses%29<br />
This.string.has.periods<br />
This%3Dstring%3Dhas%3Dequals%3Dsigns<br />
This%26string%26has%26ampersands<br />
This%C3%A9string%C3%A9has%C3%A9non-ASCII+characters<br />
<br />
特别需要注意的是这个方法编码了符号，&#8220;\&#8221; ,&amp;,=,和：。它不会尝试着去规定在一个URL中这些字符怎样被使用。由此，所以你不得不分块编码你的URL,而不是把整个URL一次传给这个方法。这是很重要的，因为对类URLEncoder最通常的用法就是查询string，为了和服务器端使用GET方法的程序进行交互。例如，假设你想编码这个查询sting，它用来搜索AltaVista网站：<br />
pg=q&amp;kl=XX&amp;stype=stext&amp;q=+"Java+I/O"&amp;search.x=38&amp;search.y=3<br />
<br />
这段代码对其进行编码：<br />
String query = URLEncoder.encode( "pg=q&amp;kl=XX&amp;stype=stext&amp;q=+\"Java+I/O\"&amp;search.x=38&amp;search.y=3");System.out.println(query);<br />
<br />
不幸的是，得到的输出是:<br />
pg%3Dq%26kl%3DXX%26stype%3Dstext%26q%3D%2B%22Java%2BI%2FO%22%26search.x%3D38%26search.y%3D3<br />
<br />
出现这个问题就是方法URLEncoder.encode( ) 在进行盲目地编码。它不能区分在URL或者查询string中被用到的特殊字符（象前面string中的&#8220;＝&#8221;，和&#8220;&amp;&#8221;）和确实需要被编码的字符。由此，所以URL需要像下面这样一次只编码一块：<br />
<br />
String query = URLEncoder.encode("pg");<br />
query += "=";<br />
query += URLEncoder.encode("q");<br />
query += "&amp;";<br />
query += URLEncoder.encode("kl");<br />
query += "=";<br />
query += URLEncoder.encode("XX");<br />
query += "&amp;";<br />
query += URLEncoder.encode("stype");<br />
query += "=";<br />
query += URLEncoder.encode("stext");<br />
query += "&amp;";<br />
query += URLEncoder.encode("q");<br />
query += "=";<br />
query += URLEncoder.encode("\"Java I/O\"");<br />
query += "&amp;";<br />
query += URLEncoder.encode("search.x");<br />
query += "=";<br />
query += URLEncoder.encode("38");<br />
query += "&amp;";<br />
query += URLEncoder.encode("search.y");<br />
query += "=";<br />
query += URLEncoder.encode("3");<br />
System.out.println(query);<br />
<br />
这才是你真正想得到的输出：<br />
pg=q&amp;kl=XX&amp;stype=stext&amp;q=%2B%22Java+I%2FO%22&amp;search.x=38&amp;search.y=3<br />
<br />
例子7-9是一个QueryString类。在一个java对象中，它使用了类URLEncoder来编码连续的属性名和属性值对，这个java对象被用来发送数据到服务器端的程序。<br />
<br />
当你在创建一个QueryString对象时，你可以把查询string中的第一个属性对传递给类QueryString的构造函数，得到初始string。如果要继续加入后面的属性对，就应调用方法add（），它也能接受两个string作为参数，能对它们进行编码。方法getQuery( )返回一个属性对被逐个编码后得到的整个string。<br />
<br />
Example 7-9. -The QueryString class<br />
package com.macfaq.net;<br />
<br />
import java.net.URLEncoder;<br />
import java.io.UnsupportedEncodingException;<br />
<br />
public class QueryString {<br />
&nbsp;&nbsp; private StringBuffer query = new StringBuffer();<br />
<br />
public QueryString(String name, String value) { <br />
&nbsp;&nbsp; encode(name, value);<br />
}<br />
<br />
public synchronized void add(String name, String value) {<br />
&nbsp;&nbsp; query.append('&amp;');<br />
&nbsp;&nbsp; encode(name, value);<br />
}<br />
<br />
private synchronized void encode(String name, String value) {<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp; query.append(URLEncoder.encode(name, "UTF-8"));<br />
&nbsp;&nbsp;&nbsp;&nbsp; query.append('=');<br />
&nbsp;&nbsp;&nbsp;&nbsp; query.append(URLEncoder.encode(value, "UTF-8"));<br />
} catch (UnsupportedEncodingException ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new RuntimeException("Broken VM does not support UTF-8");<br />
}<br />
}<br />
<br />
public String getQuery() {<br />
&nbsp;&nbsp; return query.toString();<br />
}<br />
<br />
public String toString() {<br />
&nbsp;&nbsp; return getQuery();<br />
}<br />
}<br />
<br />
利用这个类，现在我们就能对前面那个例子中的string进行编码了:<br />
QueryString qs = new QueryString("pg", "q");<br />
qs.add("kl", "XX");<br />
qs.add("stype", "stext");<br />
qs.add("q", "+\"Java I/O\"");<br />
qs.add("search.x", "38");<br />
qs.add("search.y", "3");<br />
String url = "<a href='http://www.altavista.com/cgi-bin/query?"' target="_blank" href_cetemp='http://www.altavista.com/cgi-bin/query?"'><font color="#909d73">http://www.altavista.com/cgi-bin/query?"</font></a> + qs;<br />
System.out.println(url);<br />
<br />
<font color="#0000ff"><span class="style1">二、URLDecoder</span><br />
</font>&nbsp;&nbsp;&nbsp;&nbsp; 与URLEncoder 类相对应的URLDecoder 类有两种静态方法。它们解码以x-www-form-url-encoded这种形式编码的string。也就是说，它们把所有的加号（+）转换成空格符，把所有的%xx分别转换成与之相对应的字符：<br />
public static String decode(String s) throws Exception<br />
public static String decode(String s, String encoding) // Java 1.4 throws UnsupportedEncodingException<br />
<br />
第一种解码方法在java1.3和java1.2中使用。第二种解码方法在java1.4和更新的版本中使用。如果你拿不定主意用哪种编码方式，那就选择UTF-8吧。它比其他任何的编码形式更有可能得到正确的结果。<br />
<br />
如果string包含了一个&#8220;%&#8221;，但紧跟其后的不是两位16进制的数或者被解码成非法序列，该方法就会抛出IllegalArgumentException 异常。当下次再出现这种情况时，它可能就不会被抛出了。这是与运行环境相关的，当检查到有非法序列时，抛不抛出IllegalArgumentException 异常，这时到底会发生什么是不确定的。在Sun's JDK 1.4中，不会抛出什么异常，它会把一些莫名其妙的字节加进不能被顺利编码的string中。这的确令人头疼，可能就是一个安全漏洞。<br />
<br />
由于这个方法没有触及到非转义字符，所以你可以把整个URL作为参数传给该方法，不用像之前那样分块进行。例如：<br />
String input = "<a href="http://www.altavista.com/cgi-bin/%22" target="_blank"><font color="#909d73">http://www.altavista.com/cgi-bin/"</font></a> + "query?pg=q&amp;kl=XX&amp;stype=stext&amp;q=%2B%22Java+I%2FO%22&amp;search.x=38&amp;search.y=3"; <br />
try { <br />
&nbsp;&nbsp; String output = URLDecoder.decode(input, "UTF-8"); <br />
&nbsp;&nbsp; System.out.println(output); <br />
}</span></p>
<p>&nbsp;</p>
<pre>import java.net.URLEncoder;
import java.net.URLDecoder;
import java.io.UnsupportedEncodingException;
public class EncoderTest {
public static void main(String[] args) {
try {
System.out.println(URLEncoder.encode("This string has spaces","UTF-8"));
System.out.println(URLEncoder.encode("This*string*has*asterisks","UTF-8"));
System.out.println(URLEncoder.encode("This%string%has%percent%signs", "UTF-8"));
System.out.println(URLEncoder.encode("This+string+has+pluses","UTF-8"));
System.out.println(URLEncoder.encode("This/string/has/slashes","UTF-8"));
System.out.println(URLEncoder.encode("This\"string\"has\"quote\"marks", "UTF-8"));
System.out.println(URLEncoder.encode("This:string:has:colons","UTF-8"));
System.out.println(URLEncoder.encode("This~string~has~tildes","UTF-8"));
System.out.println(URLEncoder.encode("This(string)has(parentheses)", "UTF-8"));
System.out.println(URLEncoder.encode("This.string.has.periods","UTF-8"));
System.out.println(URLEncoder.encode("This=string=has=equals=signs", "UTF-8"));
System.out.println(URLEncoder.encode("This&amp;string&amp;has&amp;ersands","UTF-8"));
System.out.println(URLEncoder.encode("This&#233;string&#233;has&#233; non-ASCII characters","UTF-8"));
// System.out.println(URLEncoder.encode("this中华人民共和国","UTF-8"));
} catch (UnsupportedEncodingException ex) {throw new RuntimeException("Broken VM does not support UTF-8");
}
}
}</pre>
</div>
<br />
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/195459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2008-04-24 11:03 <a href="http://www.blogjava.net/WshmAndLily/articles/195459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp 统计在线人数</title><link>http://www.blogjava.net/WshmAndLily/articles/157914.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sat, 03 Nov 2007 06:15:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/157914.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/157914.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/157914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/157914.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/157914.html</trackback:ping><description><![CDATA[首先写个类: <br />
import javax.servlet.*; <br />
import javax.servlet.http.*; <br />
<br />
public class SessionCounter implements <span style="color: red">HttpSessionListener</span> { <br />
<br />
private static int activeSessions = 0; <br />
<br />
public void <span style="color: red">sessionCreated</span>(HttpSessionEvent se) { <br />
<span style="color: red">activeSessions++; </span><br />
} <br />
<br />
public void <span style="color: red">sessionDestroyed</span>(HttpSessionEvent se) { <br />
if(activeSessions &gt; 0) <br />
<span style="color: red">activeSessions--; <br />
</span>} <br />
<br />
public static int getActiveSessions() { <br />
return activeSessions; <br />
} <br />
} <br />
然后配置web.xml <br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />
&lt;web-app version="2.4" <br />
xmlns="<a href="http://java.sun.com/xml/ns/j2ee" target="_blank">http://java.sun.com/xml/ns/j2ee</a>" <br />
xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance" target="_blank">http://www.w3.org/2001/XMLSchema-instance</a>" <br />
xsi:schemaLocation="<a href="http://java.sun.com/xml/ns/j2ee" target="_blank">http://java.sun.com/xml/ns/j2ee</a> <br />
<a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" target="_blank">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>"&gt; <br />
**************************************** <br />
&lt;!-- Listeners --&gt; <br />
<span style="color: red">&lt;listener&gt; <br />
&lt;listener-class&gt; <br />
SessionCount.SessionCounter (注意此处) <br />
&lt;/listener-class&gt; <br />
&lt;/listener&gt; <br />
</span>***************************************** <br />
&lt;/web-app&gt; <br />
<br />
建个JSP测试: <br />
test.jsp <br />
&lt;%@ page language="Java" contentType="text/html;charset=GBK"%&gt; <br />
&lt;%@ page import="java.sql.*"%&gt; <br />
&lt;%@ page import="SessionCount.SessionCounter" %&gt; <br />
&lt;html&gt; <br />
&lt;head&gt; <br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=GBK"&gt; <br />
&lt;title&gt;无标题文档&lt;/title&gt; <br />
<br />
<br />
&lt;body bgcolor="#FFFFFF"&gt; <br />
在线人数:&lt;%=SessionCounter.getActiveSessions()%&gt; <br />
&lt;/body&gt; <br />
<br />
&lt;/html&gt; <br />
<br />
<br />
看看可以实现不?我也是找到的,我用了,可以统计出来.</ca>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/157914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-11-03 14:15 <a href="http://www.blogjava.net/WshmAndLily/articles/157914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>web设计95％是排版</title><link>http://www.blogjava.net/WshmAndLily/articles/143455.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 07 Sep 2007 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/143455.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/143455.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/143455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/143455.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/143455.html</trackback:ping><description><![CDATA[<p class="first_line">看到这个题目，第一感觉是耸人听闻。不管是95%或是更多或是更少，排版确实是一个不可忽略的问题。在我所遇到的web设计师中，或许是遇到的还少，我没有发现谁真正在意web排版。看到这篇文章，感触颇深（因为我刚使用linux的时候需要配置字体，顺便学习了不少的字体知识，也顺便成了一个爱好），周日在家挺闲，为了提高英语水平，顺手翻译了出来。希望对大家有所启发。</p>
<p>这篇文章来自一个研究并提供信息架构的网站：<a href="http://www.informationarchitects.jp/">Information Architects Japan</a>，原文：<a href="http://www.informationarchitects.jp/the-web-is-all-about-typography-period">Web design is 95% typography</a>.</p>
<p>又及，文章多次出现typography这个单词。正规的中文翻译应该是&#8220;排印&#8221;，但考虑web这个非印刷媒体，使用排印并不见得好。于是我根据语境，有时用&#8220;排版&#8221;，有时用&#8220;排印&#8221;，请读者明鉴。以下是翻译正文。</p>
<p>web中的信息有95%是成文的语言。为何web设计师应该好好学习一下设计成文信息的主要准则，换句话说，排版？这就是最佳的理由。</p>
<h3>信息设计就是排版</h3>
<p>回到1969年，Emil Ruder, 一个瑞士著名的排印大师，其笔下关于当时的印刷氛围，简直就是我们今天网站的写照：</p>
<blockquote>
<p>今天印刷术的泛滥成灾让我们的个人价值被轻视，因为郁闷的我们现在并不能掌控印刷中的一切。分割、组织和实现印刷术的一切是排印师应有的任务，只有这样，读者才有更好的机会找出吸引她／他的东西。</p>
</blockquote>
<h4>信息设计师是21世纪的排版师</h4>
<p>稍微联想一下（请用在线排版取代印刷），这就像是信息设计师的职务描述。<strong>分割、组织和实现印刷术的一切是&#8220;信息设计师&#8221;应有的任务，只有这样，读者才有更好的机会找出吸引她／他的东西。</strong>宏观排版（所有的文本结构）跟微观排版（样式和空间的细节方面）包括我们今天称为&#8220;信息设计&#8221;的很多方面。也就是说，信息设计师今天正在做排印师30年前的工作：</p>
<p>排版面临一个很直白的职责，这就是传达信息。没有理由能免除排版的这一职责。一个并不能阅读的印刷品只能变成一个无用的产品。</p>
<p>优化排版就是优化阅读，亲和力，可用性（！），综合文本平衡等。组织文本块并结合图片，难道不是图形设计师、可用性专家、信息架构师应该做的吗？但为什么这是一个被忽视的主题呢？</p>
<h3>为什么这是一个被忽视的主题？</h3>
<h4>字体太少？分辨率低？</h4>
<p>主要原因——抱怨连天的——不看好在线排版准则的观点是，能用的字太少了。第二个观点是屏幕分辨率太低，让像素或者反锯齿字体之一很难阅读。</p>
<h4>文艺复兴：只有一个字体</h4>
<p>认为我们没有足够的字体可用的观点是不切题的：在意大利文艺复兴时期，排印师只有一个字体可用，但这个时期还是产生一些顶级漂亮的排版品：</p>
<p><a href="http://www.flickr.com/photos/realazy/282043044/" info="Photo Sharing"><img style="width: 525px; cursor: pointer" src="http://ajax.cnrui.cn/article/UploadPic/2006-10/20061031161017253.gif" width="700"  alt="" /></a></p>
<p>该排印师应该没有太在意他手中手能掌握的字体种类，实际上也不应该太在意字体的选择。他应该更关心时代能赋予自己手中掌握的，并尽力发挥。</p>
<h4>选择字样并不是排版</h4>
<p>第二个观点也并不见得好到哪儿去。在印刷初期，印出来的字母质量比我们今天在显示器上看到的更差。更重要的是，如果处理得专业，屏幕字体更易于阅读。信息设计不是关于使用好的字样，而是关于使用好的排版。两者的区别很大。谁都可以使用字样，有人可以选择好的字样，但只有少数人能够精通排版。</p>
<h4>把文本当作用户界面</h4>
<p>对，不同平台和不同浏览器如何处理字体是恼人的，也对，分辨率问题很难让注意力集中坚持到五分钟的。但是，好啦，确保文本在所有主要平台和浏览器中赏心悦目是web设计师的职责。正确的行间距，单词和字母间距，留白，一定量颜色的使用有助于可读性。但还不彻底。一个优秀的web设计师知道如何跟文本而不仅仅是内容打交道，<a href="http://www.cameronmoll.com/archives/001266.html">&#8220;把文本当作用户界面&#8221;</a>。瞧瞧<a href="http://www.subtraction.com/">Kohi Vinh的网站</a>，你大概会明白他的意思：</p>
<p><a href="http://www.flickr.com/photos/realazy/282055763/" info="Photo Sharing"><img style="width: 521px; cursor: pointer" src="http://ajax.cnrui.cn/article/UploadPic/2006-10/20061031161020381.gif" width="695"  alt="" /></a></p>
<p>稍微著名把文本当作用户界面的<a href="http://en.wikipedia.org/wiki/Ornament_and_Crime">unornamental</a>网站例子有： <a href="http://www.google.com/" info="google"><font color="#800080">google</font></a>, <a href="http://www.ebay.com/" info="ebay">ebay</a>, <a href="http://www.craigslist.org/" info="craigslist">craigslist</a>, <a href="http://www.youtube.com/" info="youtube">youtube</a>, <a href="http://www.flickr.com/" info="flickr">flickr</a>, <a href="http://digg.com/design/web_design_is_95_typography" info="digg">Digg</a>, <a href="http://reddit.com/search?q=typography" info="reddit">reddit</a>, <a href="http://del.icio.us/post?url=http://www.informationarchitects.jp/the-web-is-all-about-typography-period" info="delicious">delicious</a>. 一个难以争辩的必然事实是，把文本当作用户界面是成功的唯一参数。成功的网站设法同时创建简单的界面和强烈的特征。但这是另外一个主题了。</p>
<h3>从哪开始</h3>
<dl>
<dt><a href="http://webtypography.net/toc/">web排版</a>
<dd>为了&#8220;破除关于web排版的某些荒谬想法&#8221;，他已经&#8220;按照Bringhurst的工作原则来构建他的网站，并解答如何通过HTML和CSS中可用的技术来达成各项目标&#8221;。
<dt><a href="http://www.markboulton.co.uk/journal/comments/five_simple_steps_to_better_typography/">优化排版的5个简单步骤</a>
<dd>他所谈论的排版&#8220;并不是你典型的&#8216;该用哪种字体&#8217;的排版&#8221;。对于相信让字号和行间距默认大小使得文本能够任意缩放会提高网站可用性的人，这是一个不错的阅读材料。
<dt><a href="http://www.subtraction.com/">Khoi Vinh</a>
<dd><a href="http://www.behaviordesign.com/">behaviordesign</a>的创始人之一。现为<a href="http://www.times.com/">NYTimes.com</a>的设计主管。非常天才的一个人。
<dt><a href="http://www.rodgraves.com/">Rod Graves</a>
<dd>通讯设计师。令人赞叹的工作：&#8220;排版是我绝对的中心。排版网格和层次通常会成为我开发的视觉语言的基础。&#8221;
<dt><a href="http://www.alistapart.com/topics/design/typography/">A List Apart</a>
<dd>通过字样通讯。字体和布局。为读者设计。易读性。字样，图形设计。web排版的问题。控制web排版：字号、字体和颜色。CSS方法，浏览器问题，用户问题和解决方案。
<dt><a href="http://www.atypi.org/">Association Typographique Internationale</a>
<dd>ATypl(Association Typographique Internationale) 是一个专注于样式和排版的主要国际组织。创建于1957年，ATypl为国际样式社区之间提供通讯的结构，信息和活动。
<dt><a href="http://www.thinkingwithtype.com/">Thinking with Type</a>
<dd>书籍Thinking with Type的在线伙伴：设计师，作家，编辑和学生的关键指南。
<dt><a href="http://typetester.maratz.com/">Typetester</a>
<dd>比较屏幕字体样式。
<dt><a href="http://typophile.com/">Typophile</a>
<dd>Typophile是一个会员制和赞助商支持的社区。2000年以来Typophile引领开放合作，并且我们总是能学习到好主意。我们他们伺服超过每月3百万的网页。
<dt><a href="http://typophile.com/wiki/start">Typohile Wiki</a>
<dd>一个有关样式和设计所有一切的用户创建百科全书。用户为建立协作，有用，平衡和相关的资源而创建和编辑条目。
<dt><a href="http://www.poynter.org/column.asp?id=47&amp;aid=78683">The Next Big Thing in Online Type</a>
<dd>比尔盖茨要计算机用户，哦，微软用户，能够拥有一个更舒畅的屏幕阅读体验——太重要以至于提高屏幕阅读成为他最重要的五件事之一。
<dt><a href="http://www.amazon.com/gp/product/3721200438?ie=UTF8&amp;tag=informationar-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=3721200438">Emil Ruder, Typographie</a> (Amazon)
<dd>Emil Ruder&#8217;s Typography是一本永恒的书，几代排印师和图形设计师都从中学习基本原理。Ruder, 二十世纪最伟大的排印师之一，是一个抛弃并用新的规则取代Emil Ruder传统规则的先锋，来满足新排印技术的需求。</dd></dl>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/143455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-07 16:08 <a href="http://www.blogjava.net/WshmAndLily/articles/143455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>commons fileupload</title><link>http://www.blogjava.net/WshmAndLily/articles/133866.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Wed, 01 Aug 2007 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/133866.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/133866.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/133866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/133866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/133866.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p class="cnt">jsp文件上传大多采用采用开源项目来简化处理，这里列出常用的两个jar包的实现，并进行比较，说明他们的优缺点和应该注意的问题。</p>
<p class="cnt">Commons FileUpload，可以在<a href="http://jakarta.apache.org/commons/fileupload/"><u><font color="#0000ff">http://jakarta.apache.org/commons/fileupload/</font></u></a>下载，这个包需要Commons IO的支持，可以在<a href="http://jakarta.apache.org/commons/io/"><u><font color="#800080">http://jakarta.apache.org/commons/io/</font></u></a>下载</p>
<p class="cnt">com.oreilly.servlet，可以在<a href="http://www.servlets.com/cos/"><u><font color="#0000ff">http://www.servlets.com/cos/</font></u></a>下载 <br />
Commons FileUpload提供三种文件上传处理方式，DiskFileUpload、ServletFileUpload和PortletFileUpload三种方式，其中DiskFileUpload已经在javadoc下已经被标记为过期的方法，建议用ServletFileUpload代替，而PortletFileUpload需要配合portlet-api来使用，所以这里我们只介绍ServletFileUpload，并且这个也是最常用的。</p>
<p class="cnt">com.oreilly.servlet也提供了三种文件上传的处理方式，MultipartWrapper、MultipartRequest和MultipartParser三种方式，其中MultipartWrapper和MultipartRequest的用法基本相同，并且没有MultipartRequest提供的操作多，所以这里介绍MultipartRequest，MultipartParser和前两者有些不同，可以用来处理某些特殊情况，例如表单中有两个同名的文件上传选择框。</p>
<p class="cnt">我们暂时称三面三种文件上传方式分别为：ServletFileUpload方式（MultipartTestServlet）、MultipartRequest方式（MultipartTestServlet2）、MultipartParser方式（MultipartTestServlet3）</p>
<p class="cnt">代码如下：<br />
test.html</p>
<p class="cnt">&lt;%@ page language="java" import="java.util.*" contentType="text/html;charset=gbk" pageEncoding="gbk"%&gt;<br />
&lt;html&gt;<br />
&nbsp;&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;form action="MultipartTestServlet" enctype="multipart/form-data" method="post"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text" name="username" /&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;form action="MultipartTestServlet2" enctype="multipart/form-data" method="post"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text" name="username" /&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;form action="MultipartTestServlet3" enctype="multipart/form-data" method="post"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text" name="username" /&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />
&nbsp;&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;<br />
MultipartTestServlet.java</p>
<p class="cnt">package com.bug.servlet;</p>
<p class="cnt">import java.io.File;<br />
import java.io.IOException;<br />
import java.util.ArrayList;<br />
import java.util.Iterator;<br />
import java.util.List;</p>
<p class="cnt">import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServlet;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;</p>
<p class="cnt">import org.apache.commons.fileupload.FileItem;<br />
import org.apache.commons.fileupload.FileUpload;<br />
import org.apache.commons.fileupload.FileUploadException;<br />
import org.apache.commons.fileupload.RequestContext;<br />
import org.apache.commons.fileupload.disk.DiskFileItemFactory;<br />
import org.apache.commons.fileupload.servlet.ServletFileUpload;<br />
import org.apache.commons.fileupload.servlet.ServletRequestContext;</p>
<p class="cnt">public class MultipartTestServlet extends HttpServlet {</p>
<p class="cnt">public MultipartTestServlet() {<br />
&nbsp;&nbsp; super();<br />
}</p>
<p class="cnt">public void doPost(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp; throws ServletException, IOException {</p>
<p class="cnt">&nbsp;&nbsp; request.setCharacterEncoding("gbk");<br />
&nbsp;&nbsp; RequestContext requestContext = new ServletRequestContext(request);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; if(FileUpload.isMultipartContent(requestContext)){<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; DiskFileItemFactory factory = new DiskFileItemFactory();<br />
&nbsp;&nbsp;&nbsp; factory.setRepository(new File("c:/tmp/"));<br />
&nbsp;&nbsp;&nbsp; ServletFileUpload upload = new ServletFileUpload(factory);<br />
&nbsp;&nbsp;&nbsp; //upload.setHeaderEncoding("gbk");<br />
&nbsp;&nbsp;&nbsp; upload.setSizeMax(2000000);<br />
&nbsp;&nbsp;&nbsp; List items = new ArrayList();<br />
&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; items = upload.parseRequest(request);<br />
&nbsp;&nbsp;&nbsp;&nbsp; } catch (FileUploadException e1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("文件上传发生错误" + e1.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p class="cnt">&nbsp;&nbsp;&nbsp; Iterator it = items.iterator();<br />
&nbsp;&nbsp;&nbsp; while(it.hasNext()){<br />
&nbsp;&nbsp;&nbsp;&nbsp; FileItem fileItem = (FileItem) it.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(fileItem.isFormField()){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(fileItem.getFieldName() + "&nbsp;&nbsp;&nbsp; " + fileItem.getName() + "&nbsp;&nbsp;&nbsp; " + new String(fileItem.getString().getBytes("iso8859-1"), "gbk"));<br />
&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(fileItem.getFieldName() + "&nbsp;&nbsp;&nbsp; " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileItem.getName() + "&nbsp;&nbsp;&nbsp; " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileItem.isInMemory() + "&nbsp;&nbsp;&nbsp;&nbsp; " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileItem.getContentType() + "&nbsp;&nbsp;&nbsp; " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileItem.getSize());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(fileItem.getName()!=null &amp;&amp; fileItem.getSize()!=0){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File fullFile = new File(fileItem.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File newFile = new File("c:/temp/" + fullFile.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileItem.write(newFile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("文件没有选择 或 文件内容为空");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}</p>
<p class="cnt">}</p>
<p class="cnt">MultipartTestServlet2.java</p>
<p class="cnt">package com.bug.servlet;</p>
<p class="cnt">import java.io.IOException;<br />
import java.util.Enumeration;</p>
<p class="cnt">import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServlet;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;</p>
<p class="cnt">import com.oreilly.servlet.MultipartRequest;<br />
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;</p>
<p class="cnt">public class MultipartTestServlet2 extends HttpServlet {</p>
<p class="cnt">public MultipartTestServlet2() {<br />
&nbsp;&nbsp; super();<br />
}</p>
<p class="cnt">public void doPost(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp; throws ServletException, IOException {</p>
<p class="cnt">&nbsp;&nbsp; //request.setCharacterEncoding("gbk");&nbsp;&nbsp; 不起作用<br />
&nbsp;&nbsp; System.out.println("start ");<br />
&nbsp;&nbsp; MultipartRequest multi = new MultipartRequest(request, "c:/tmp/", 2*1024*1024, "gbk", new DefaultFileRenamePolicy());<br />
&nbsp;&nbsp; System.out.println("start ");<br />
&nbsp;&nbsp; Enumeration filesName = multi.getFileNames();<br />
&nbsp;&nbsp; Enumeration paramsName = multi.getParameterNames();<br />
&nbsp;&nbsp; while(paramsName.hasMoreElements()){<br />
&nbsp;&nbsp;&nbsp; String paramName = (String) paramsName.nextElement();<br />
&nbsp;&nbsp;&nbsp; System.out.println(multi.getParameter(paramName));<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; while(filesName.hasMoreElements()){<br />
&nbsp;&nbsp;&nbsp; String fileName = (String) filesName.nextElement();<br />
&nbsp;&nbsp;&nbsp; System.out.println(multi.getFilesystemName(fileName) + "&nbsp;&nbsp; " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multi.getOriginalFileName(fileName) + "&nbsp;&nbsp; " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multi.getContentType(fileName) + "&nbsp;&nbsp; ");<br />
&nbsp;&nbsp;&nbsp; if(multi.getFilesystemName(fileName)!=null &amp;&amp; !multi.getFilesystemName(fileName).equals(""))<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(multi.getFile(fileName).toURI());<br />
&nbsp;&nbsp; }<br />
}<br />
<br />
}</p>
<p class="cnt">MultipartTestServlet3.java</p>
<p class="cnt">package com.bug.servlet;</p>
<p class="cnt">import java.io.File;<br />
import java.io.IOException;</p>
<p class="cnt">import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServlet;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;</p>
<p class="cnt">import com.oreilly.servlet.multipart.FilePart;<br />
import com.oreilly.servlet.multipart.MultipartParser;<br />
import com.oreilly.servlet.multipart.ParamPart;<br />
import com.oreilly.servlet.multipart.Part;</p>
<p class="cnt">public class MultipartTestServlet3 extends HttpServlet {</p>
<p class="cnt">public MultipartTestServlet3() {<br />
&nbsp;&nbsp; super();<br />
}</p>
<p class="cnt">public void doPost(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp; throws ServletException, IOException {</p>
<p class="cnt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MultipartParser mp = new MultipartParser(request, 2*1024*1024, false, false, "gbk");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Part part;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((part = mp.readNextPart()) != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = part.getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (part.isParam()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ParamPart paramPart = (ParamPart) part;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String value = paramPart.getStringValue();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("param: name=" + name + "; value=" + value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (part.isFile()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // it's a file part<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FilePart filePart = (FilePart) part;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileName = filePart.getFileName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fileName != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long size = filePart.writeTo(new File("c:/tmp/"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("file: name=" + name + "; fileName=" + fileName +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ", filePath=" + filePart.getFilePath() + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ", contentType=" + filePart.getContentType() + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ", size=" + size);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("file: name=" + name + "; EMPTY");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p class="cnt">}</p>
<p class="cnt">web.xml中加入</p>
<p class="cnt">&lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.bug.servlet.MultipartTestServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp; &lt;/servlet&gt;<br />
&nbsp;&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet2&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.bug.servlet.MultipartTestServlet2&lt;/servlet-class&gt;<br />
&nbsp;&nbsp; &lt;/servlet&gt;<br />
&nbsp;&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet3&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.bug.servlet.MultipartTestServlet3&lt;/servlet-class&gt;<br />
&nbsp;&nbsp; &lt;/servlet&gt;<br />
&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/MultipartTestServlet&lt;/url-pattern&gt;<br />
&nbsp;&nbsp; &lt;/servlet-mapping&gt;<br />
&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet2&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/MultipartTestServlet2&lt;/url-pattern&gt;<br />
&nbsp;&nbsp; &lt;/servlet-mapping&gt;<br />
&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet3&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/MultipartTestServlet3&lt;/url-pattern&gt;<br />
&nbsp;&nbsp; &lt;/servlet-mapping&gt;<br />
<br />
我用过第一个例子的:<br />
<br />
&lt;!--注意:<br />
<br />
<span style="color: red">1.当利用ServletUpload时&lt;input type="radio" checked="checked"&gt;的元素会被认为是文件元素&lt;input type="file"&gt;&nbsp; <br />
从而会被解析出几个空File出来<br />
<br />
2.当使用在struts的action时,action的name不要设置,否则解析不出文件控件存在.因为actionform之前被解析掉了.<br />
</span>--&gt;<br />
<br />
</p>
<p class="cnt">问题1、中文问题：<br />
三种凡是都可以通过自己的方法来设置encoding为gbk开处理和解决中文问题，包括初始化的时候传入gbk作为参数，或是是初始化后通过setEncoding的方式来实现。<br />
另外ServletFileUpload方式也可以通过request.setCharacterEncoding("gbk");的方式来实现，而其它两种方式不支持这种方式。</p>
<p class="cnt"><br />
问题2、文件大小限制<br />
ServletFileUpload方式可以设置文件大小限制，也可以不用设置，例子中的upload.setSizeMax(2000000)就可以注释掉。如果设置upload.setSizeMax(-1)，表明不限制上传的大小。文档中没有指明默认的限制的多少，我在不设置的情况下上传了一个9M的东西，可以上传，估计默认是不限制大小的。<br />
而MultipartRequest方式和MultipartParser方式是必须设置文件的上传文件的大小限制的，如果不设置，默认是1M的大小限制。</p>
<p class="cnt"><br />
问题3、文件上传发生错误<br />
如果文件上传过程中发生任何错误，或者是文件的大小超出了范围，系统都将抛出错误。<br />
ServletFileUpload方式在upload.parseRequest(request)时抛出错误<br />
MultipartRequest方式在new MultipartRequest(。。。)时抛出错误<br />
MultipartParser方式在new MultipartParser(。。。)时抛出错误</p>
<p class="cnt"><br />
问题4、上传同名文件时，他们保存到临时目录是的冲突问题<br />
ServletFileUpload方式，不会有冲突，系统会把上传得文件按照一定的规则重新命名，保证不会冲突<br />
MultipartParser方式，会产生冲突，系统会把文件按照上传时的文件名，保存到临时目录下，如果两个用会同时上传文件名相同的文件，那么就可能会产生冲突，一方把另一方的临时文件给替换了。<br />
MultipartRequest方式，在初始化时如果提供了一个名称转换策略，就不会有冲突，如果不提桶，就会有冲突。在上面的例子中我们提供了一个new DefaultFileRenamePolicy()保证了文件名不会有冲突发生。</p>
<p class="cnt"><br />
问题5：表单中有两个同名的文件上传选择框，就像我们例子中的myfile一样，每个表单中有两个name=&#8220;myfile&#8221;的上传框<br />
ServletFileUpload方式，可以处理，可以分别得到他们各自的文件，<br />
MultipartRequest方式，不可以处理，会发生冲突，会有一个上传框的文件覆盖了另外一个。<br />
MultipartParser方式，可以处理，可以分别得到他们各自的文件，</p>
<p class="cnt"><br />
备注：<br />
代码比较乱，主要是为了说明他们间的区别。他们的详细地使用说明还是要参考他的javadoc和domo。</p>
<p class="cnt">参考：<br />
1、<a href="http://www.servlets.com/cos/#classes"><u><font color="#0000ff">http://www.servlets.com/cos/#classes</font></u></a><br />
2、<a href="http://jakarta.apache.org/commons/fileupload/apidocs/index.html"><u><font color="#0000ff">http://jakarta.apache.org/commons/fileupload/apidocs/index.html</font></u></a><br />
3、<a href="http://jakarta.apache.org/commons/fileupload/using.html"><u><font color="#0000ff">http://jakarta.apache.org/commons/fileupload/using.html</font></u></a><br />
4、<a href="http://www.onjava.com/pub/a/onjava/2003/06/25/commons.html?page=3"><font color="#0000ff"><u>http://www.onjava.com/pub/a/onjava/2003/06/25/commons.html?page=3</u></font></a></p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/133866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-08-01 21:08 <a href="http://www.blogjava.net/WshmAndLily/articles/133866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java/jsp中集成FCKeditor使用</title><link>http://www.blogjava.net/WshmAndLily/articles/117853.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Wed, 16 May 2007 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/117853.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/117853.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/117853.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/117853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/117853.html</trackback:ping><description><![CDATA[<div id=LastMDatecns!317D097BECD35E7C!242>2007/4/1</div>
<h4 class=TextColor1 id=subjcns!317D097BECD35E7C!242 style="MARGIN-BOTTOM: 0px">Java/jsp中集成FCKeditor使用</h4>
<div class=bvMsg id=msgcns!317D097BECD35E7C!242>
<div>
<p>最近一直在搞FCKeditor在线文本编辑器的裁剪和集成，总结了自己的一些
<p>心得体会，跟大家分享一下自己的经验！
<p>1.jsp/java中引用FCKeditor步骤和具体做法，参见如下的链接：
<p>&nbsp; a.<a href="http://wiki.fckeditor.net/Developer's_Guide/Integration/Javascrīpt" target=_blank><u><font color=#0000ff>jsp页面集成调用说明</font></u></a>；&nbsp;&nbsp; b.<a href="http://wiki.fckeditor.net/Developer's_Guide/Integration/Java" target=_blank><u><font color=#0000ff>后台浏览和上传功能集成指南</font></u></a>；
<p><font color=#ff0000>注意点：</font>配置好jsp页面集成FCKeditor的javascrīpt调用以后，页面将会
<p>显示如下的样子：
<p><a href="http://jysq.net/batch.download.php?aid=12408" target=_blank></a>&nbsp;【文本编辑器样式】
<p>页面上相应的代码如下：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td><font color=#0000ff>&lt;scrīpt type="text/javascrīpt" src="FCKeditor/fckeditor.js"&gt;&lt;/scrīpt&gt;</font></td>
        </tr>
    </tbody>
</table>
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td><font color=#0000ff>&lt;textarea name="content" cols="80" rows="4"&gt;<br>&lt;/textarea&gt;<br>&lt;scrīpt type="text/javascrīpt"&gt;<br>&nbsp;&nbsp;var ōFCKeditor = new FCKeditor('content') ;<br>&nbsp;&nbsp;oFCKeditor.BasePath = "FCKeditor/";<br>&nbsp;&nbsp;oFCKeditor.Height = 400;<br>&nbsp;&nbsp;oFCKeditor.ToolbarSet = "Default" ;&nbsp;<br>&nbsp;&nbsp;oFCKeditor.ReplaceTextarea();<br>&lt;/scrīpt&gt;</font></td>
        </tr>
    </tbody>
</table>
<p>如果是要想从数据库读来的文本数据或者是后台来自文件的txt/html
<p>文本数据。只要在
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td><font color=#0000ff>&lt;textarea name="content" cols="80" rows="4"&gt;<br>&lt;/textarea&gt;</font></td>
        </tr>
    </tbody>
</table>
<p>中加入自己的显示内容的formbean对应字段即可
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p><font color=#0000ff>&lt;textarea name="content" cols="80" rows="4"&gt;</font>
            <p><font color=#0000ff>&lt;c:out value="${&nbsp;contentData}" /&gt;<br>&lt;/textarea&gt;</font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>这样内容就会被显示在FCKeditor编辑框中了，点击提交按钮以后就可以
<p>在后台的相应java action中得到content参数中的内容就是页面上
<p>FCKeditor中的内容数据了。可以在struts/jsf做使用的哦。
<p>要提醒一点的是由于你给FCKeditor瘦身，所以常会报缺少对象支持
<p>等错误，只要在FCKeditor/editor/lang中加上相应的js语言文件即可
<p>如果加载页面失败（<font color=#ff0000>FCKeditor未定义</font>）还有一个可能就是引用
<p>FCKeditor/fckeditor.js文件路径不对！关于FCKeditor瘦身可以
<p>参考网上文章,我还是摘一些要点从网上：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p><font color=#0000ff><strong>1、</strong>将FCKeditor目录下及子目录下所有以&#8221;_&#8221;下划线开</font>
            <p><font color=#0000ff>头的文件夹删除</font>
            <p><br><font color=#0000ff><strong>2.</strong>FCKeditor根目录下只保留fckconfig.js,&nbsp; </font>
            <p><font color=#0000ff>fckeditor.js, fckstyles.xml, fcktemplates.xml</font>
            <p><font color=#0000ff>其余全部删除</font>
            <p><br><font color=#0000ff><strong>3.</strong>将editor/filemanager/upload目录下文件及文件夹</font>
            <p><font color=#0000ff>清空.</font>
            <p><br><font color=#0000ff><strong>4.</strong>还可以将editor/skins目录下的皮肤文件删除，只留下</font>
            <p><font color=#0000ff>default一套皮肤（如果你不需要换皮肤的话）</font>
            <p><br><font color=#0000ff><strong>5.</strong>还可以将editor/lang目录下文件删除，只保留</font>
            <p><font color=#0000ff>en.js, fcklanguagemanager.js, zh-cn.js, zh.js</font>
            <p><font color=#0000ff>文件</font>
            <p><font color=#0000ff>6.如果你是使用javascrīpt来调用加载FCKeditor，那么</font>
            <p><font color=#0000ff>就不需要在web.xml中配置fckeditor的tag文件。</font>
            <p><font color=#0000ff>7.还有一个问题刚开始使用FCKeditor的人常会遇到</font>
            <p><font color=#0000ff>就怎么控制它的toolbar的大小和元素排列，其实很简单。</font>
            <p><font color=#0000ff>在fckconfig.js中用使用这样的标签[]来划分每行的</font>
            <p><font color=#0000ff>元素的多少，这样就可以控制toolbar的长短和大小了，</font>
            <p><font color=#0000ff>具体示例参看：fckconfig.js中的toolbarset</font>
            <p><font color=#0000ff>["Default"]</font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>2.下面再说说fckconfig.js中的一些选项来控制toolbarset中的控件
<p>的功能，实现功能裁剪：
<p>1):取消超链接中的浏览服务器和上传功能，方法如下：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p><font color=#0000ff>FCKConfig.LinkBrowser = true ;</font>
            <p><font color=#0000ff>FCKConfig.LinkUpload = true ;</font>
            <p><font color=#0000ff>改为</font>
            <p><font color=#0000ff>FCKConfig.LinkBrowser =&nbsp;false ;</font>
            <p><font color=#0000ff>FCKConfig.LinkUpload =&nbsp;false ;</font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>2）：取消图片链接中的浏览服务器和上传功能，方法如下：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p><font color=#0000ff>FCKConfig.ImageUpload = true ;</font>
            <p><font color=#0000ff>FCKConfig.ImageBrowser = true ;</font>
            <p><font color=#0000ff>改为</font>
            <p><font color=#0000ff>FCKConfig.ImageUpload =&nbsp;false ;</font>
            <p><font color=#0000ff>FCKConfig.ImageBrowser =&nbsp;false ;</font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>3):Dlg Button中取消高级功能，方法如下：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p><font color=#0000ff>FCKConfig.LinkDlgHideAdvanced&nbsp;= false ;</font>
            <p><font color=#0000ff>FCKConfig.ImageDlgHideAdvanced&nbsp;= false ;</font>
            <p><font color=#0000ff>改为</font>
            <p><font color=#0000ff>FCKConfig.ImageDlgHideAdvanced&nbsp;=&nbsp;true ;</font>
            <p><font color=#0000ff>FCKConfig.LinkDlgHideTarget&nbsp;&nbsp;=&nbsp;true ;</font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>下一篇介绍FCKeditor的上传和浏览服务器功能，以及如何在里面实现动态
<p>超连接，转发到servlet经过filter以后去调用服务器的action
<p>如何实现对应用户浏览自己的图片的列表实现！
<p>&nbsp;
<p>FCKeditor集成java servlet可以实现文件的上传和服务器端列表读取功
<p>能FCKeditor自己提供了两个servlet来分别实现上传文件功能，和读取服
<p>务器端文件列表功能，这两个servlet分别为：
<p><font color=#0000ff>com.fredck.FCKeditor.connector.ConnectorServlet（读取文件列</font>
<p><font color=#0000ff>表）com.fredck.FCKeditor.uploader.SimpleUploaderServlet（实</font>
<p><font color=#0000ff>现</font><font color=#0000ff>文件上传）</font>
<p><font color=#ff0000>1.浏览服务器端文件列表</font>
<p><font color=#000000>web.xml文件中，比如ConnectorServlet中</font><font color=#000000>的</font>配置选项：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td><font color=#0000ff>&lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&lt;param-name&gt;baseDir&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&lt;param-value&gt;/UserFiles/&lt;/param-value&gt;<br>&nbsp;&nbsp;&lt;/init-param&gt;</font></td>
        </tr>
    </tbody>
</table>
<p>意思在浏览服务器上的baseDir配置指定里面的所有文件极其目录结构列表
<p>如果你的baseDir没有配置，Connector将会自动创建一个默认的文件夹
<p><font color=#ff0000>userFiles</font>，对应的ConnectorServlet中init()方法中代码如下：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td><font color=#0000ff>baseDir=getInitParameter("baseDir");<br>if(baseDir==null)<br>&nbsp;&nbsp;&nbsp;baseDir="/UserFiles/";</font></td>
        </tr>
    </tbody>
</table>
<p>还想说一下的是，FCKeditor的client调用server的servlet方法采用
<p>的是Ajax思想来实现。当你点击浏览服务器(browser server)的时候
<p>就会触发一个异步的javascrīpt + xmlhttp的调用响应，后台的servlet
<p>会去完成你要请求的事件，然后数据以xml方式返回给client来解析。
<p>很明显，你要实现去数据库或者其他的文件系统请求列表，你只要修改
<p>ConnectorServlet中两个私有方法：<font color=#ff0000>getFolders</font> 和 <font color=#ff0000>getFiles</font>
<p>让它去你指定的地方得到文件列表即可，这样你的文件可以放在任何你
<p>指定目录下。多说一句，很多人都想知道个人blog系统中怎么实现上传
<p>文件以后对应用户浏览自己的列表的，我的做法很简单，建立你用户名
<p>的文件夹，你上传只能上传到你的目录夹，浏览可以通过程序指定浏览
<p>对应用户下的文件夹即可，这个时候你要修改Connectorservlet中的
<p>路径即可！
<p><font color=#ff0000>2.超连接重定位问题</font>
<p>FCKeditor可以插入超连接，实现对文件的预览功能，只要我们稍微改变
<p>我们可以使FCKeditor编辑器支持对任意文件系统下的任意文件的客户端
<p>浏览和下载保存！FCKeditor本来提供的是相对URL超连接，只要我们修改
<p>ConnectorServlet中传递给客户端的地址的时候，把它改写成绝对URL
<p>然后再通过我们自己的filter的servlet实现重定向去一个下载/浏览
<p>文件的struts的action方法就可以实现在客户端对超连接文件的下载和
<p>浏览！说一下具体做法吧：
<p>1):修改ConnectorServlet传递给客户端javascrīpt的路径，代码如下
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p><font color=#0000ff>String currentUrl= "http://" + request.getserver +request.getServerPort + request.getContextPath +resourcePath;</font>
            <p><font color=#ff0000>以上代码请在ConnectorServlet的doGet()里面拼装！在</font>
            <p><font color=#ff0000>调用CreateCommonXml（）私有方法的时候参数传入</font>
            <p><font color=#0000ff>myEl.setAttribute("path",currentPath);<br>myEl.setAttribute("url",currentUrl);</font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>提醒一下<font color=#0000ff>resourcePath</font><font color=#000000>为在web.xml配置文件中ConnectorServlet中</font>
<p>的一个初始化参数配置，等一下利用filter实现对超连接的重定位就提取
<p>URL中的这个配置参数来判断，配置如下：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p><font color=#0000ff>&lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&lt;param-name&gt;resourcePath&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&lt;param-value&gt;/fileSystem/&lt;/param-value&gt;<br>&lt;/init-param&gt;</font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>2）：建立你的filter servlet，实现对URL的截获，对符合要求的
<p>URL进行重定位到你的对应action中去即可
<p>3）：实现你的对应action来实现文件的上传和下载功能即可！
<p>4）：扩展功能－实现对URL的加密，对连接的URL中加上一串字符，最后
<p>几位作为算法校验，对不符合要求的URL连接,filter将会拒绝重定位到
<p>指定action。此外利用自己写的扩展类还可以实现对超连接的文件类型
<p>进行限制，比如你只能超连接JPG|GIF|DOC|TXT|HTML等几种后缀名的
<p>文件，对其他文件即使你指定超连接也让你浏览和下载，这些都可以在
<p>web.xml中通过修改对应servlet的配置文件的初始化参数实现。
<p><font color=#ff0000>3.页面javascrīpt修改</font>
<p>浏览服务器的功能对应的html/javascrīpt相关的文件为：browser.html
<p>和frmresourcelist.html对应你想传递的信息你可以append在文件名的
<p>字符串后面，在<font color=#ff0000>GetFileRowHtml（）</font>的javascrīpt函数中实现对文件
<p>名的截取，这样client只会显示文件名，而你可以得到文件的数据库唯一
<p>标识，任何你想要的信息你都可以通过修改<font color=#ff0000>ConnectorServlet</font>中的私有
<p>方法<font color=#ff0000>getFiles()</font>来实现，只要修改页面frmresurcelist.html中的
<p><font color=#ff0000>GetFileRowHtml（）</font><font color=#000000>中传入变量<font color=#ff0000>fileName</font>即可。你还可以在点击选中</font>
<p>文件的时候实现一个你自己的Ajax调用，一切取决你的项目需要！
<p>4.我不是一个javascrīpt高手，其实如果我对javascrīpt了解多一些
<p>也许对客户端的代码修改以后做出更眩的功能。可以更好的完成对
<p>FCKeditor裁剪。我还发现一个问题，就是FCKeditor2.3自己提供的
<p>textarea控件一直不能获得输入焦点，接受文字输入，如果有高手知道
<p>怎么修改javascrīpt修复这个bug，请也回复我！
<p>&nbsp;
<p><a href="http://www.java99.com/zz/Image/articles/fckeditor_guide2/fckeditor_guide_02.jpg"></a>
<p><font color=#ff0000>5.注意点</font>
<p>无论怎么修改别人的东西，请一定尊重开源精神！
<p>很多人配置好了FCKeditor的上传功能以后常会遇到xmlhttp request
<p>404 error,后面是一串路径，其实就是你的servlet-mapping中的路径
<p>不对，你只要把xmlhttp request errot 404 后面跟的路径，copy到
<p>你的web.xml中对应红色文字的位置，如下：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p>&lt;servlet-mapping&gt;<br>&lt;servlet-name&gt;Connector&lt;/servlet-name&gt;<br>&lt;url-pattern&gt;
            <p><font color=#ff0000>/FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector</font>
            <p>&lt;/url-pattern&gt;
            <p>&lt;/servlet-mapping&gt;</p>
            </td>
        </tr>
    </tbody>
</table>
<p>别忘了<font color=#ff0000>SimpleUploader的servlet－mapping</font>也要做同样的修改！
<p>还有一个错误就是http 500错误，这个可能是你的URL请求不对，应该和
<p>FCKeditor没关系的! </p>
</div>
</div>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/117853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-05-16 15:33 <a href="http://www.blogjava.net/WshmAndLily/articles/117853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习JSP的一些心得</title><link>http://www.blogjava.net/WshmAndLily/articles/75938.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Wed, 18 Oct 2006 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/75938.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/75938.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/75938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/75938.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/75938.html</trackback:ping><description><![CDATA[一、JSP工作原理 
<p>在一个JSP文件第一次被请求时，JSP引擎把该JSP文件转换成为一个servlet。而这个引擎本身也是一个servlet，在JSWDK或WEBLOGIC中，它就是JspServlet。 JSP引擎先把该JSP文件转换成一个Java源文件，在转换时如果发现jsp文件有任何语法错误，转换过程将中断，并向服务端和客户端输出出错信息；如果转换成功， JSP引擎用javac把该Java源文件编译成相应的class文件。然后创建一个该SERVLET的实例，该SERVLET的jspInit()方法被执行，jspInit()方法在servlet的生命周期中只被执行一次。然后jspService()方法被调用来处理客户端的请求。对每一个请求，JSP引擎创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件，则JSP引擎会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可大大降低对系统的资源需求,提高系统的并发量及响应时间.但应该注意多线程的编程限制，由于该servlet始终驻于内存，所以响应是非常快的。 如果.jsp文件被修改了，服务器将根据设置决定是否对该文件重新编译，如果需要重新编译，则将编译结果取代内存中的servlet，并继续上述处理过程。 虽然JSP效率很高，但在第一次调用时由于需要转换和编译而有一些轻微的延迟。 此外，如果在任何时候如果由于系统资源不足的原因，JSP引擎将以某种不确定的方式将servlet从内存中移去。当这种情况发生时jspDestroy()方法首先被调用, 然后servlet实例便被标记加入"垃圾收集"处理。 jspInit()及jspDestory()格式如下：可在jspInit()中进行一些初始化工作,如建立与数据库的连接，或建立网络连接，从配置文件中取一些参数等，在jspDestory()中释放相应的资源。 </p>&lt;%!<br />public void jspInit()<br />{<br />       System.out.println("jspinit"); <br />}<br /> <br />%&gt;<br /> <br />&lt;%!<br />public void jspDestory()<br />{<br />       System.out.println("jspDestory"); <br />}<br />%&gt;<br /><!---  第二篇文章: 服务端的输出缓冲区 - --><p>二、服务端的输出缓冲区</p><p>缺省情况下:服务端要输出到客户端的内容,不直接写到客户端,而是先写到一个输出缓冲区中.只有在下面三中情况下，才会把该缓冲区的内容输出到客户端上：<br /></p><ol><li>该JSP网页已完成信息的输出 
</li><li>输出缓冲区已满 
</li><li>JSP中调用了out.flush()或response.flushbuffer() </li></ol>输出缓冲区的大小可以用: &lt;%@page buffer="none"|"nkb"%&gt;或response.setBufferSize()设置,如下： 
<ol><li>设置输出缓冲区的大小为1KB。 &lt;%@page buffer="1kb"%&gt;或response.setBufferSize(1); 
</li><li>设置输出缓冲区的大小为0，即不缓冲。 &lt;%@page buffer="none" %&gt;或response.setBufferSize(0); </li></ol>用response.getBufferSize()或out.getBufferSize()可取的输出缓冲区的大小,单位为字节. 用response.isCommitted()可检查看服务端是否已将数据输出到客户端. 如果返回值是TRUE则已将数据输出到客户端,是FALSE则还没有. 
<p></p><!---  第三篇文章: 服务端输出重定向 - --><p>三、服务端输出重定向</p><p>有以下3种方法可以做到输出重定向: 
</p><ol><li>RESPONSE.SETREDERECT("URL") 该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,使浏览器显示重定向网页的内容. response.sendRedirect("http://localhost:7001/index.html"); 
</li><li>下面的方法也能改变HTTP HEADER属性，它的原理和 1 是一样的. <br />&lt;% <br />response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); <br />String newLocn="/index.html"; <br />response.setHeader("Location",newLocn); <br />% &gt; 
</li><li>采用&lt;JSP:FORWORD&gt; 该方法是利用服务器端先将数据输出到缓冲区的机制,在把缓冲区的内容发送到客户端之前,原来的不发送,改为发送该页面的内容,如果在&lt;JSP:FORWORD&gt;之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意. 如下面的例子中(1)会输出index.html的内容，2 不会输出index.html的内容，而是输出out.println("@@@@@@@@@@@@@@@@@"); 中的内容,并且在服务端会抛出:java.lang.IllegalStateException: Response already committed 异常，但客户端没有任何错误输出。 </li></ol>(1)<br />&lt;%@page buffer="1kb"%&gt;<br /> <br />&lt;%<br />long i=0;<br /> <br />for(i=0;i&lt;10;i++)<br />{<br />       out.println("@@@@@@@@@@@@@@@@@");<br />}<br />%&gt;<br /> <br />&lt;jsp:forward page="./index.html" /&gt;<br /> <br /> <br />(2)<br />&lt;%@page buffer="1kb"%&gt;<br /> <br />&lt;%<br />long i=0;<br /> <br />for(i=0;i&lt;600;i++)<br />{                 <br />       out.println("@@@@@@@@@@@@@@@@@");<br />}<br />%&gt;<br /> <br /><p>说明：<br />1. 方法(1),(2)可以使用变量表示重定向的地址;方法(3)不能使用变量表示重定向的地址。<br />String add="./index.html"; <br />&lt;jsp:forward page= add /&gt; <br />无法重定向到index.html中去 <br /><br />String add=http://localhost:7001/index.html <br />response.sendRedirect(add); <br />可以重定向到http://localhost:7001/index.html中去。 <br /><br />2. 采用方法(1),(2)request中的变量(通过request.setAttribute()保存到request中的值)不能在新的页面中采用,采用方法(3)能. 综上,我们应该采用(1),(2)重定向比较好. </p><p></p><!---  第四篇文章: JSP中正确应用类 - --><p>四、JSP中正确应用类: </p><p>应该把类当成JAVA BEAN来用，不要在&lt;% %&gt; 中直接使用. 如下的代码(1)经过JSP引擎转化后会变为代码(2):<br />从中可看出如果把一个类在JSP当成JAVA BEAN 使用,JSP会根据它的作用范围把它保存到相应的内部对象中.<br />如作用范围为request,则把它保存到request对象中.并且只在第一次调用(对象的值为null)它时进行实例化. 而如果在&lt;% %&gt;中直接创建该类的一个对象,则每次调用JSP时,都要重新创建该对象,会影响性能. 
</p><p>代码(1)<br />&lt;jsp:useBean id="test" scope="request" class="demo.com.testdemo"&gt;<br />&lt;/jsp:useBean&gt;<br /> <br />&lt;%<br />test.print("this is use java bean");<br /> <br />testdemo td= new testdemo();<br />td.print("this is use new");<br />%&gt;<br /> <br /></p><p class="MsoNormal"><span style="FONT-FAMILY: 宋体">代码</span><span lang="EN-US">(2)<br />demo.com.testdemo test = (demo.com.testdemo)request.getAttribute("test"); <br />if (test == null) <br />{ <br />       try <br />       { <br />                 test = (demo.com.testdemo) java.beans.Beans.instantiate(getClass().getClassLoader(),"demo.com.testdemo"); <br />       } <br />       catch (Exception _beanException) <br />       {<br />               throw new weblogic.utils.NestedRuntimeException("cannot instantiate 'demo.com.testdemo'",_beanException); <br />       } <br />       request.setAttribute("test", test); <br />       out.print("\r\n");<br />} <br />out.print("\r\n\r\n\r\n");<br />test.print("this is use java bean"); <br /> <br />testdemo td= new testdemo();<br />td.print("this is use new");<br /><br /> <br /></span></p><p></p><!---  第五篇文章: JSP的调试 - --><p><span lang="EN-US">五、JSP的调试 </span></p><p><span lang="EN-US">JSP的调试比较麻烦,特别是当bean是在一个session中存在时，更加困难。得从好几个页面开始往里面走才行。通常是用out.println()或System.out.print()来打一大堆的信息来查问题。如果是用jbuilder做开发,它能直接调试JSP.不过更重要的是知道错误产生的原因及解决方法。下面对一些JSP编程常见错误进行分析。 </span></p><p><span lang="EN-US">(1).java.lang.NullPointerException异常<br />一般是对一个为NULL值的变量进行操作引起的.如下面的操作就会抛出<br />java.lang.NullPointerException<br />String a = null; <br />a.substring(0,1); <br /> <br />为避免这种异常最好在对变量操作之前检查看它是否为NULL值.如:<br />&lt;% String ss=Session.getAttribute("NAME") <br />if isnull(ss) <br />{ <br /><br />} <br />else <br />{ <br /><br />} <br />%&gt; </span></p><p><span lang="EN-US">(2).JSP是用JAVA写的，所以它是大小写敏感的，用过其他编程语言的人最容易犯这个错误。另外在浏览器的地址栏中输入的访问JSP的地址也是区分大小写的.如http://localhost:7001/demo/t.jsp与http://localhost:7001/Demo/t.jsp是不一样的</span></p><p><span lang="EN-US">(3).在jsp中判断字符串要使用compareTo方法，不要用==，因为在java中String变量不是一个简单的变量而是一个类实例，不同的方法会得到 不同的结果，如下所示： </span></p><ol><span lang="EN-US">　　 </span><li><span lang="EN-US"><br />　　String str1="ABCD"; <br />　　String str2="ABCD"; (或 String str2="AB"+"CD"; ) <br />　　if (str1==str2) <br />　　 out.print("yes"); <br />　　else <br />　　 out.print("no"); <br />　　结果是"yes"。 <br />　 </span></li><li><span lang="EN-US"><br />　　String str1,str2,str3; <br />　　str1="ABCD"; <br />　　str2="AB"; <br />　　str3=str2+"CD"; <br />　　if (str1==str3) <br />　　 out.print("yes"); <br />　　else <br />　　 out.print("no"); <br />　　结果是"no"。 <br /></span></li><li><span lang="EN-US"><br />String str1=new String("ABCD"); <br />　　String str2=new String("ABCD"); <br />　　if (str1==str2) <br />　　 out.print("yes"); <br />　　else <br />　　 out.print("no"); <br />　　结果是"no"。 <br /></span></li><li><span lang="EN-US"><br />String str1=new String("ABCD"); <br />　　String str2=new String("ABCD"); <br />　　if (str1.compareTo(str2)==0) <br />　　 out.print("yes"); <br />　　else <br />　　 out.print("no"); <br />　　结果是"yes"。 <br /></span></li></ol><p><span lang="EN-US">(4)防止JSP或SERVLET中的输出被浏览器保存在缓冲区中:<br />浏览器在默认情况下会把浏览过的网页保存在缓冲区中,在调试时,一般不希望这样.把下面的脚本加入程序中,就可防止JSP或SERVLET中的输出被浏览器保存在缓冲区中 <br />&lt;% <br />response.setHeader("Cache-Control","no-store"); //HTTP 1.1 <br />response.setHeader("Pragma","no-cache"); //HTTP 1.0 <br />response.setDateHeader ("Expires", 0); //prevents caching at the proxy server <br />%&gt; <br />在IE中也可通过设置实现：把/工具/INTERNET选项/常规/设置/的检察所存页面的较新版本,设为每次访问该页时都检查.</span></p><p></p><!---  第六篇文章: COOKIE - --><p><span lang="EN-US">六、COOKIE</span></p><p><span lang="EN-US">HTTP COOKIE实质是服务端与在客户端之间传送的普通HTTP头,可保存也可不保存在客户的硬盘上.如果保存,每一个文件大小不超过4K的文本文件.多个COOKIE可保存到同一个文件中. 如果从编程角度来看,在JSP中COOKIE就是JAVA提供的一个类.常用的方法如下所表示，因为客户端可能不接受COOKIE，所以建议不用它，改用SESSION等其他方式。 <br /></span></p>public class cookie <br />{ <br />public String getDomain() //返回该COOKIE的有效域 <br />public int getMaxAge() //返回该COOKIE的有效期,单位为秒 <br />public String getName() //返回该COOKIE的名称 <br />public String getPath() //返回该COOKIE的有效路径 <br />public boolean getSecure() //返回该COOKIE的安全设置 <br />public String getValue() //返回该COOKIE的值 <br />public void setDomain(java.lang.String pattern) //设置该COOKIE的有效域 <br />public void setMaxAge(int expiry) //设置该COOKIE的有效期,单位为秒 <br />public void setPath(java.lang.String uri) //设置该COOKIE的有效路径 <br />public void setSecure(boolean flag) //设置该COOKIE的安全设置 <br />public void setValue(java.lang.String newValue) //设置该COOKIE的值 <br />} <br />一个COOKIE包含以下五部分: <br /><ol><li><span lang="EN-US">NAME/VALUE对,设置该COOKIE的名字及它保存的值 </span></li><li><span lang="EN-US">COOKIE通常和服务器相关,如果将域设为JAVA.SUN.COM,那么该COOKIE就和这个域相关,只对该网址起作用,当浏览该网址时,浏览器将把该COOKIE的内容发送给服务端,COOKIE是作为HTTP HEADER的一部分被发送的，如果没有设置域,那么COOKIE就只和创建该COOKIE的服务器相关. </span></li><li><span lang="EN-US">路径用于指定服务器上可以使用该COOKIE的文件所在的路径,它只对该网址下的该路径下的应用起作用."/"表示服务器上所有目录都可以使用该COOKIE. </span></li><li><span lang="EN-US">COOKIE都有一个有效期,有效期默认值为-1,这表示没有保存该COOKIE,当该浏览器退出时,该COOKIE立即失效. </span></li><li><span lang="EN-US">安全选项true/false,如果设置为true,那么在服务端与在客户端之间传送该COOKIE的内容时,采用HTTPS协议. </span></li></ol><p><span lang="EN-US">如何检查一个客户端是否支持COOKIE的方法: <br />用下面的方法写一个COOKIE到客户端,并确认成功 <br />try <br />{ <br />Cookie c = new Cookie("mycookie","COOKIE TEST"); <br />response.addCookie(c); <br />} <br />catch(Exception e) <br />{ <br />      System.out.println(e); <br />} <br /></span></p><p><span lang="EN-US">然后在一个新的JSP文件中:用下面的方法取客户端的COOKIE到cookies中, 如果cookies.length ==0,说明该客户端的浏览器不支持COOKIE <br />try <br />{ <br />Cookie[] cookies = request.getCookies(); <br />if(cookies.length ==0) <br />{ <br />      System.out.println("not support cookie"); <br />} <br />} <br />catch(Exception e) <br />{ <br />      System.out.println(e); <br />} <br /></span></p><p></p><!---  第七篇文章: COOKIE - --><p><span lang="EN-US">七、JSP和SERVLET的区别:</span></p><p><span lang="EN-US">SUN首先发展出SERVLET，其功能比较强劲，体系设计也很先进，只是，它输出HTML语句还是采用了老的CGI方式，是一句一句输出，所以，编写和修改HTML非常不方便。 后来SUN推出了类似于ASP的JSP，把JAVA代码嵌套到HTML语句中，这样，就大大简化和方便了网页的设计和修改。ASP，PHP，JSP都是嵌套型的SCRIPT语言。 一个分布式系统应分为三层：表示层,业务逻辑层,数据存取层,在J2EE体系结构中,SERVLET用来写业务逻辑层是很强大的，但是对于写表示层就很不方便。JSP则主要是为了方便写表示层而设计的。ENTITY BEAN实现数据存取层，SESSION BEAN实现业务逻辑层。如果是简单的应用系统,可采用JSP+BEANS的结构进行设计,JSP中应该仅仅存放与表示层有关的东西，也就是说，只放输出HTML网页的部份。而所有的数据计算，数据分析，数据库联结处理，统统是属于业务逻辑层，应该放在JAVA BEANS中。通过JSP调用JAVA BEANS，实现两层的整合。 实际上，微软的DNA技术，简单说，就是ASP+COM/DCOM技术。与JSP+BEANS完全类似，所有的表示层由ASP完成，所有的业务逻辑由COM/DCOM完成。 为什么要采用这些组件技术呢？因为单纯的ASP/JSP语言是非常低效率执行的，如果出现大量用户点击，纯SCRIPT语言很快就到达了他的功能上限，而组件技术就能大幅度提高功能上限，加快执行速度。另外一方面，纯SCRIPT语言将表示层和业务逻辑层混在一起，造成修改不方便，并且代码不能重复利用，采用组件技术就只改组件就可以了。 对于复杂的应用，应该采用ENTITY BEAN实现数据存取层，SESSION BEAN实现业务逻辑层，用JSP来调用SESSION BEAN，由SESSION BEAN调用ENTITY BEAN。即采用JSP+EJB来构建一个复杂的分布式系统。它比JSP+BEAN具有更高的吞吐量，可靠性，安全性。综上所述，对简单应用，可采用JSP+BAEN，对复杂的应用系统，应采用JSP+EJB，SERVLET变的无足轻重。用JSP完全可替代它。 </span></p><img src ="http://www.blogjava.net/WshmAndLily/aggbug/75938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2006-10-18 15:12 <a href="http://www.blogjava.net/WshmAndLily/articles/75938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>