﻿<?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-思想比知识更重要 成长比成功更重要-随笔分类-JSP &amp; Servlet</title><link>http://www.blogjava.net/renyangok/category/17023.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:52:44 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:52:44 GMT</pubDate><ttl>60</ttl><item><title>jsp学习笔记(不断更新)</title><link>http://www.blogjava.net/renyangok/archive/2007/02/13/99654.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Tue, 13 Feb 2007 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/02/13/99654.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/99654.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/02/13/99654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/99654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/99654.html</trackback:ping><description><![CDATA[
		<div>
				<div>1.尽量用&lt;jsp:include&gt;标签把相同部分放在一起，以后更改的时候方便。</div>
				<div> </div>
				<div>2.request.getAttribute()/.getParameter()中的参数如果之前没有内容，则得到的是null。</div>
		</div>
		<div> </div>
		<div>3.表单提交的信息不能换行，下面是解决办法。同理，""变为&amp;nbsp就能处理空格问题。</div>
		<div>//换行的处理，就是将获得的文本框的换行标记转化为相应的HTML标识，即&lt;br&gt;,下面我以变量description来说明，</div>
		<div>//--------------程序开始<br />//接收description从前边提交的值<br />String description.getParameter("Content"); <br />//----------用循环来转换，用到的JAVA函数有indexOf和substring，对于这两个函数不清楚的请查阅相关资料<br />//转换换行符<a href="file://r//n"><font color="#6fbc4c">\\r\\n</font></a>成为HTML换行标记&lt;BR&gt;<br />while(description.indexOf("\r\n")&gt;=0 || description.indexOf(" ")&gt;=0) //判断Content中是否含有换行标记"\r\n"和空格标记" "<br />{<br />  int i=description.indexOf("\r\n");//记录换行标记的位置<br />  if(i&gt;=0)<br />  {<br />    =description.substring(0,i)+"&lt;br&gt;"+description.substring(i+2);//替换<br />  }<br />  int j = description.indexOf(" ");<br />  (j &gt;= 0) <br />  {<br />  description=description.substring(0,j)+"&amp;nbsp;"+description.substring(j+1);//替换<br />  }<br />}</div>
		<div> </div>
		<div>4.对于不支持cookies的浏览器，要用encodeURL或encodeRedirectedURL()来支持URL重写。</div>
		<div>比如：&lt;a href="answer.jsp?answer=haha"&gt;answer&lt;/a&gt;要改为</div>
		<div>&lt;% String code = response.encodeURL("answer.jsp?answer=haha"); %&gt;</div>
		<div>&lt;a href="answer.jsp?answer=haha"&gt;answer&lt;/a&gt;</div>
		<div> </div>
		<div>5.JSP实现浏览器关闭cookies情况下的会话管理</div>
		<div>    通常，会话管理是通过服务器将SessionID作为一个cookie存储在用户的Web浏览器中来唯一标识每个用户会话。如果浏览器不支持cookies，或者将浏览器设置为不接受cookies，我们可以通过URL重写来实现会话管理。<br />　　实质上URL重写是通过向URL连接添加参数，并把sessionID作为值包含在连接中。然而，为使这生效，你需要为你的servlet响应部分的每个连接添加sessionID。<br />　　把sessionID加到一个连接可以使用一对方法来简化：response.encodeURL()使URL包含sessionID，如果你需要使用重定向，可以使用response.encodeRedirectURL()来对URL进行编码。<br />　　encodeURL()及encodeRedirectedURL()方法首先判断cookies是否被浏览器支持；如果支持，则参数URL被原样返回，sessionID将通过cookies来维持。<br />　　来看下面的例子，两个JSP文件：hello1.jsp和hello2.jsp，及它们之间的影响。我们在hello1.jsp中简单的创建一个会话，并在session中存储一个对象实例。接着用户可以点击页面的连接到达hello2.jsp。在hello2.jsp中，我们从session中获取原先放置的对象并显示它的内容。注意，我们在hello1.jsp中调用了encodeURL()方法来获得hello2.jsp的链接，使得在浏览器停用cookies的情况下，sessionID自动添加到URL，hello2.jsp仍能得到session对象。<br />　　首先在启用cookies的情况下运行。然后关闭对cookie的支持，重启浏览器，再运行一次。每次你都可以看到会话管理在起作用，并能在页之间传递信息。<br />注意，如果你想让这个例子能在关闭了cookies的浏览器中工作，你的JSP引擎必须支持URL重写。<br />hello1.jsp</div>
		<div>&lt;%<br />Integer num=new Integer(100);<br />session.putValue("num",num);<br />String url=response.encodeURL("hello2.jsp");<br />%&gt;<br />&lt;a href='&lt;%=url%&gt;'&gt;hello2.jsp&lt;/a&gt;</div>
		<div> </div>
		<div>hello2.jsp</div>
		<div>&lt;%<br />Integer i=(Integer)session.getValue("num");<br />out.println("Numvalueinsessionis"+i.intValue());<br />%&gt;<br /><br />6、首页如何写，例index.jsp<br />&lt;%@ page language="java" pageEncoding="UTF-8"%&gt;<br />&lt;%<br /> response.sendRedirect("home.do");//表示直接转到action<br />%&gt;<br />&lt;!--<br /> web.xml中要：<br />&lt;welcome-file-list&gt;<br />    &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />  &lt;/welcome-file-list&gt;<br />因为web.xml不能用***.do形式，所以要新建一个index.jsp来转到想去的action。<br />--&gt;<br /><br />7、<br />&lt;%@ page contentType="text/html;charset=UTF-8"%&gt;定义了jsp字符和页面响应的MIME类型，即生成的servlet如何相应http请求，此设置表示返回UTF-8编码的HTML文件。<br />&lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt;定义了脚本语言只能是java和jsp的页面的字符编码，即定义了脚本语言的种类和jsp页面的编码方式。</div>
<img src ="http://www.blogjava.net/renyangok/aggbug/99654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-02-13 11:28 <a href="http://www.blogjava.net/renyangok/archive/2007/02/13/99654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp:include与include的区别</title><link>http://www.blogjava.net/renyangok/archive/2007/02/13/99652.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Tue, 13 Feb 2007 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/02/13/99652.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/99652.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/02/13/99652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/99652.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/99652.html</trackback:ping><description><![CDATA[
		<p>（题外话：引入的文件如果是jsp则应定义为***.jspf文件，如果其他文件可定义为***.inc文件，即include file。而且&lt;%@ inlucde page="" %&gt;除了可以引jspf还可以引servlet——很重要）<br />近日做一项目要用到JSP动态包含JSP，本想肯定很简单，但不想这么复杂，而且目前还没有求到好的答案，问题如下：<br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />#文件：one.jsp<br />&lt;%!<br />String var1="China";<br />%&gt;<br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />#文件 two.jsp<br />&lt;%!<br /><a href="file://String/"></a>String var1="America";<br />String var2="England";<br />%&gt;<br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />#文件 three.jsp<br />&lt;%<br />int j=1;<br />if (j==1){<br />%&gt;<br />&lt;%@ include file="one.jsp"%&gt;<br />&lt;%<br />}else{<br />%&gt;<br />&lt;%@ include file="two.jsp"%&gt;<br />&lt;%}%&gt;<br />&lt;%=var1%&gt;<br />&lt;%=var2%&gt;<br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />执行three.jsp会出什么结果？<br />a.编译错误<br />b.显示China England</p>
		<p>很多人理所当然的觉得肯定是a,因为j=1所以只包含one.jsp,two.jsp不会包含进来，但答案是b,上机测试就知道。<br />为什么？<br />因为@include要先于jsp的其他代码执行，所以两个文件都会被包含进来！<br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />如果你说用jsp:include可以解决问题，好，把three.jsp改成如下：<br />＃文件 three.jsp<br />&lt;%<br />int j=1;<br />String includeFile="";<br />if (j==1){<br />includeFile = "one.jsp";<br />}else{<br />includeFile = "two.jsp";<br />}<br />%&gt;<br />&lt;jsp:include page=´&lt;%=includeFile%&gt;´ /&gt;<br />&lt;%=var1%&gt;</p>
		<p>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />结果是什么？<br />a.编译错误<br />b.显示 China</p>
		<p>是b吗，不，是a,编译错误！提示var1未定义。</p>
		<p>为什么？因为jsp:include是动态包含，相当于把包含文件与被包含文件分开编译。<br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</p>
		<p> 现把include的问题总结如下：<br />【引用 gfzhx(小小)的话】<br />    动态包含相当于作了一个页面跳转，也就是相当于重新访问了另一个servlet，所以当然会提示变量没有定义，你想一想，一个类中申明了一个变量，第二个类直接是用这个变量，你说可以吗？其实你的情况和这个例子很像，这就是动态包含，而静态包含你可以看一看jsp编译后的java文件就知道了，它是直接将你包含的页面直接包含进去，然后再编译的。所以你的问题采用静态包含就可以了。不过不管怎么，还是不推荐采用这种形式，会给程序造成很多问题，至少比较难以维护了，可以说是一种不好的编程风格。建议采用其他方法解决问题。</p>
		<p>【引用 xiao_yuer(小鱼儿)的话】<br /> 要使用引入文件中定义的变量，只能用@include指令。<br />也就是&lt;%@ include file="one.jsp" %&gt;,但这在一般情况下都不是动态的，是在jsp页面第一次编译时，把它导入的。而jsp编译后，这两个文件再作修改很多jsp服务器都不会侦测到，因为包含这两的jsp的jsp文件本身并没有发生变化。但很奇怪，weblogic6好像可以。你可以试试，不过不要抱太大希望，因为你这种要求不是很合理。向你这种情况，完全应该引入一个java类，这个类中定义一些变量（按你的说法都应该算是常量了，jsp取出来直接用而不会修改它再存回去），然后再jsp中得到那个类的实例，来进行处理。那样如果你要修改这些常量的值，就修改java类，而不用修改jsp.</p>
		<p>【自己的:-))】<br /> @include包含是静态包含，是把被包含文件加入到包含文件中然后进行编译，所以这种包含与解释执行的语言很象（例如php)，而且JSP中@开头的语句都要先于其他语句执行，所以如上，用if.else来判断然后包含是不行的，所以以前如果是做PHP这种解释语言的人会觉得不适应（象我，：（（）<br /> <br /> jsp:include是既可以静态包含又可以动态包含，与@include不同的是，jsp:include没有@include那样的优先权，即不是现于其他语句执行的，所以jsp:include可以又选择性的包含。不过更重要的一点是，用jsp:include相当于编译两个不同的文件，所以如果被包含文件中仅仅是显示某些东西（例如被包含文件是纯HTML）的话，这种情况下，用jsp:include和@include来包含文件的效果是一样的，但如果要用jsp:include来显示被包含文件中定义的变量就不行了（为什么？见上面的引用吧，就不赘述了）。</p>
		<p>【感谢】<br /> gfzhx(小小)、xiao_yuer(小鱼儿)</p>
		<p>【致版主】<br /> 问题贴地址如下：<br /><a href="http://www.csdn.net/Expert/FAQ/FAQ_Index.asp?id=1380">http://www.csdn.net/Expert/FAQ/FAQ_Index.asp?id=1380</a><br /><a href="http://www.csdn.net/expert/topic/707/707524.xml?temp=1.226443E-02">http://www.csdn.net/expert/topic/707/707524.xml?temp=1.226443E-02</a><br />希望版主能够更正一下。</p>
<img src ="http://www.blogjava.net/renyangok/aggbug/99652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-02-13 11:27 <a href="http://www.blogjava.net/renyangok/archive/2007/02/13/99652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>产生彩色验证码_(javabean实现)</title><link>http://www.blogjava.net/renyangok/archive/2007/02/13/99651.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Tue, 13 Feb 2007 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/02/13/99651.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/99651.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/02/13/99651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/99651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/99651.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="95%" border="0">
				<tbody>
						<tr>
								<td class="NEWS" id="zoom">文件名：Image.java <br />================================================================== <br />/* <br />* Created on 2004-8-4 <br />* <br />* To change the template for this generated file go to <br />* Window&amp;gt;Preferences&amp;gt;Java&amp;gt;Code Generation&amp;gt;Code and Comments <br />*/ <br />package myclass.test; <br /><br />import java.awt.*; <br />import java.awt.image.*; <br />import java.util.*; <br /><br />/** <br />* @author <br />* <br />* To change the template for this generated type comment go to <br />* Window&amp;gt;Preferences&amp;gt;Java&amp;gt;Code Generation&amp;gt;Code and Comments <br />*/ <br />public class Image { <br /><br />public String sRand=""; <br /><br />public Color getRandColor(int fc,int bc){//给定范围获得随机颜色 <br />Random random = new Random(); <br />if(fc&gt;255) fc=255; <br />if(bc&gt;255) bc=255; <br />int r=fc+random.nextInt(bc-fc); <br />int g=fc+random.nextInt(bc-fc); <br />int b=fc+random.nextInt(bc-fc); <br />return new Color(r,g,b); <br />} <br />public BufferedImage creatImage(){ <br /><br />// 在内存中创建图象 <br />int width=60, height=20; <br />BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); <br /><br />// 获取图形上下文 <br />Graphics g = image.getGraphics(); <br /><br />//生成随机类 <br />Random random = new Random(); <br /><br />// 设定背景色 <br />g.setColor(getRandColor(200,250)); <br />g.fillRect(0, 0, width, height); <br /><br />//设定字体 <br />g.setFont(new Font("Times New Roman",Font.PLAIN,18)); <br /><br />//画边框 <br />//g.setColor(new Color()); <br />//g.drawRect(0,0,width-1,height-1); <br /><br /><br />// 随机产生155条干扰线，使图象中的认证码不易被其它程序探测到 <br />g.setColor(getRandColor(160,200)); <br />for (int i=0;i&lt;155;i++) <br />{ <br />int x = random.nextInt(width); <br />int y = random.nextInt(height); <br />int xl = random.nextInt(12); <br />int yl = random.nextInt(12); <br />g.drawLine(x,y,x+xl,y+yl); <br />} <br /><br />// 取随机产生的认证码(4位数字) <br />//String rand = request.getParameter("rand"); <br />//rand = rand.substring(0,rand.indexOf(".")); <br /><br />for (int i=0;i&lt;4;i++){ <br />String rand=String.valueOf(random.nextInt(10)); <br />sRand+=rand; <br />// 将认证码显示到图象中 <br />g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同，可能是因为种子太接近，所以只能直接生成 <br />g.drawString(rand,13*i+6,16); <br />} <br />// 图象生效 <br />g.dispose(); <br />return image; <br />} <br />} <br />====================================================================== <br />image.jsp(对bean的引用) <br /><br />&lt;%@ page contentType="image/jpeg" import="javax.imageio.*" %&gt; <br />&lt;jsp:useBean id="image" scope="session" class="myclass.test.Image"/&gt; <br /><br />&lt;% <br />//设置页面不缓存 <br />response.setHeader("Pragma","No-cache"); <br />response.setHeader("Cache-Control","no-cache"); <br />response.setDateHeader("Expires", 0); <br /><br />// 将认证码存入SESSION <br />session.setAttribute("rand",image.sRand); <br /><br />// 输出图象到页面 <br />ImageIO.write(image.creatImage(), "JPEG", response.getOutputStream()); <br /><br /><br />%&gt; </td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/renyangok/aggbug/99651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-02-13 11:26 <a href="http://www.blogjava.net/renyangok/archive/2007/02/13/99651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA：Filter编码器</title><link>http://www.blogjava.net/renyangok/archive/2007/02/13/99650.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Tue, 13 Feb 2007 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/02/13/99650.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/99650.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/02/13/99650.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/99650.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/99650.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td id="fontzoom" height="37">
										<table cellspacing="0" cellpadding="10" align="left" border="0">
												<tbody>
														<tr>
																<td>
																		<script language="javascript" src="/AD/200509/5.js">
																		</script>
																</td>
														</tr>
												</tbody>
										</table>
										<p>
												<strong>〔CharacterEncodingHttpServletRequestWra<a class="Channel_KeyLink" href="http://www.52z.com/soft/pp.html">pp</a>er.java〕</strong>
										</p>
										<p>package creator.common.filter;</p>
										<p>import javax.servlet.http.*;</p>
										<p>public class CharacterEncodingHttpServletRequestWra<a class="Channel_KeyLink" href="http://www.52z.com/soft/pp.html">pp</a>er extends HttpServletRequestWra<a class="Channel_KeyLink" href="http://www.52z.com/soft/pp.html">pp</a>er {</p>
										<p>    private String ecoding = null;<br />    private String oldEncoding = null;</p>
										<p>    public CharacterEncodingHttpServletRequestWra<a class="Channel_KeyLink" href="http://www.52z.com/soft/pp.html">pp</a>er(HttpServletRequest request,String encoding) {<br />        super(request);<br />        this.ecoding = encoding;<br />        this.oldEncoding = request.getCharacterEncoding();<br />    }</p>
										<p>    public String getParameter(String value) {<br />        try{<br />            if((oldEncoding == null || isIOS88591(oldEncoding)) &amp;&amp; super.getParameter(value)!=null){<br />                return new String(super.getParameter(value).getBytes("iso-8859-1"),ecoding);<br />            }<br />            else{<br />                return super.getParameter(value);<br />            }<br />         }<br />        catch(Exception e){<br />            e.printStackTrace();<br />            return null;<br />        }<br />    }</p>
										<p>    private boolean isIOS88591(String endcoding){<br />        endcoding = endcoding.toLowerCase();<br />        return endcoding.startsWith("iso")&amp;&amp; (endcoding.indexOf("8859") != -1) &amp;&amp; endcoding.endsWith("1");<br />    }<br />}<br /></p>
										<p>
												<strong>〔CharacterEncodingHttpServletResponseWra<a class="Channel_KeyLink" href="http://www.52z.com/soft/pp.html">pp</a>er.java〕</strong>
										</p>
										<p>package creator.common.filter;</p>
										<p>import javax.servlet.http.*;</p>
										<p>public class CharacterEncodingHttpServletResponseWra<a class="Channel_KeyLink" href="http://www.52z.com/soft/pp.html">pp</a>er extends HttpServletResponseWra<a class="Channel_KeyLink" href="http://www.52z.com/soft/pp.html">pp</a>er {</p>
										<p>    private String ecoding = null;</p>
										<p>    public CharacterEncodingHttpServletResponseWra<a class="Channel_KeyLink" href="http://www.52z.com/soft/pp.html">pp</a>er(HttpServletResponse response,String encoding) {<br />        super(response);<br />        this.ecoding = encoding;<br />    }</p>
										<p>    /* (non-Javadoc)<br />     * @see javax.servlet.ServletResponse#setContentType(java.lang.String)<br />     */<br />    public void setContentType(String value) {<br />        super.setContentType("text/html;charset="+ecoding);<br />    }</p>
										<p>}<br /></p>
										<p>
												<strong>〔CharsetEncodingFilter.java〕</strong>
										</p>
										<p>package creator.common.filter;</p>
										<p>import java.io.IOException;<br />import javax.servlet.*;<br />import javax.servlet.http.*;</p>
										<p>
												<br />public class CharsetEncodingFilter implements Filter {<br />    private FilterConfig config = null;<br />    private String RequestEncoding = null;<br />    private String ResponseEncoding = null;</p>
										<p>    public void init(FilterConfig arg0) throws ServletException {<br />        this.config = arg0;<br />        this.RequestEncoding = config.getInitParameter("RequestEncoding");<br />        this.ResponseEncoding = config.getInitParameter("ResponseEncoding");<br />    }</p>
										<p>    /* (non-Javadoc)<br />     * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)<br />     */<br />    public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc)<br />        throws IOException, ServletException {<br />        if(this.config == null){<br />            return;<br />        }<br />        HttpServletRequest request = (HttpServletRequest)req;<br />        HttpServletResponse response = (HttpServletResponse)res;</p>
										<p>        CharacterEncodingHttpServletRequestWra<a class="Channel_KeyLink" href="http://www.52z.com/soft/pp.html">pp</a>er  mrequestw  = new CharacterEncodingHttpServletRequestWra<a class="Channel_KeyLink" href="http://www.52z.com/soft/pp.html">pp</a>er(request,ResponseEncoding);<br />        CharacterEncodingHttpServletResponseWra<a class="Channel_KeyLink" href="http://www.52z.com/soft/pp.html">pp</a>er wresponsew = new CharacterEncodingHttpServletResponseWra<a class="Channel_KeyLink" href="http://www.52z.com/soft/pp.html">pp</a>er(response,ResponseEncoding);<br />        fc.doFilter(mrequestw,wresponsew);<br />    }</p>
										<p>    public void destroy() {<br />    }</p>
										<p>}<br /></p>
										<p>
												<strong>〔web.xml〕</strong>
										</p>
										<p>  &lt;filter&gt;<br />    &lt;filter-name&gt;CharsetEncoding&lt;/filter-name&gt;<br />    &lt;filter-class&gt;javabean.com.CharsetEncodingFilter&lt;/filter-class&gt;<br />    &lt;init-param&gt;<br />      &lt;param-name&gt;RequestEncoding&lt;/param-name&gt;<br />      &lt;param-value&gt;iso-8859-1&lt;/param-value&gt;<br />    &lt;/init-param&gt;<br />    &lt;init-param&gt;<br />      &lt;param-name&gt;ResponseEncoding&lt;/param-name&gt;<br />      &lt;param-value&gt;gb2312&lt;/param-value&gt;<br />    &lt;/init-param&gt;<br />  &lt;/filter&gt;<br />  &lt;filter-ma<a class="Channel_KeyLink" href="http://www.52z.com/soft/pp.html">pp</a>ing&gt;<br />    &lt;filter-name&gt;CharsetEncoding&lt;/filter-name&gt;<br />    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />  &lt;/filter-ma<a class="Channel_KeyLink" href="http://www.52z.com/soft/pp.html">pp</a>ing&gt;</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/renyangok/aggbug/99650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-02-13 11:25 <a href="http://www.blogjava.net/renyangok/archive/2007/02/13/99650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>el表达式不起作用的问题</title><link>http://www.blogjava.net/renyangok/archive/2007/01/04/91760.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Thu, 04 Jan 2007 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/01/04/91760.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/91760.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/01/04/91760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/91760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/91760.html</trackback:ping><description><![CDATA[
		<p>之前大量的符合jsp1.2标准的项目中用到了${***}，比如${1+2}，但本意就是想显示${1+2}，而不是3，所以应该有控制是否解析el表达式的选项，我觉得分为三个级别：</p>
		<p>1、设置整个应用服务器下的所有项目是否解析el表达式（控制所有项目） <br />（这个我还没找到在哪，但应该有）。</p>
		<p>2、设置整个项目使用el表达式，需要在web.xml中加上 （控制一个项目） <br />&lt;jsp-config&gt; <br />&lt;jsp-property-group&gt; <br />&lt;el-ignored&gt;false&lt;/el-ignored&gt; <br />&lt;/jsp-property-group&gt; <br />&lt;/jsp-config&gt;</p>
		<p>3、设置某个jsp页面使用el表达式，需要在jsp页面加上（控制单个页面） <br />&lt;%@ page isELIgnored="false"%&gt;</p>
<img src ="http://www.blogjava.net/renyangok/aggbug/91760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-01-04 15:04 <a href="http://www.blogjava.net/renyangok/archive/2007/01/04/91760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp中的四种范围（page|request|session|application）</title><link>http://www.blogjava.net/renyangok/archive/2006/12/12/87146.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Tue, 12 Dec 2006 02:18:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2006/12/12/87146.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/87146.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2006/12/12/87146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/87146.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/87146.html</trackback:ping><description><![CDATA[
		<p>JSP的四种范围，分别为page,request,session,application可以用setAttribute("",""); getAttribute("","");其中用page时，标名pageContext.setAttribute("","");它只能在同一个页面中有效</p>
		<p>
				<br /> <br />Request。Request 的范围是指在一JSP 网页发出请求到另一个JSP 网页之间，随 这个属性就失效。设定Request 的范围时可利用request 对象中的setAttribute( )和getAttribute( )</p>
		<p>
				<br />Session 的作用范围为一段用户持续和服务器所连接的时间，但与服务 器断线 ，这个属性就无效。只要将数据存入session对象，数据的范围就为Session</p>
		<p>
				<br />Application 的作用范围在服务器一开始执行服务，到服务器关闭为止Application 的范围最、停留的时间也最久，所以使用时要特别注意不然可能会造成服务器负载越来越重的情况。只要将数据存入application对象，数据的范围范围 (Scope) 就为Application </p>
<img src ="http://www.blogjava.net/renyangok/aggbug/87146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2006-12-12 10:18 <a href="http://www.blogjava.net/renyangok/archive/2006/12/12/87146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提高JSP应用程序运行速度的七大绝招 （转载）</title><link>http://www.blogjava.net/renyangok/archive/2006/12/11/86956.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Mon, 11 Dec 2006 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2006/12/11/86956.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/86956.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2006/12/11/86956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/86956.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/86956.html</trackback:ping><description><![CDATA[
		<font color="#993300"> （<font size="2">本文转自：</font><a href="/sgsoft/articles/2378.html"><font size="2">http://www.blogjava.net/sgsoft/articles/2378.html</font></a><font color="#000000" size="2"> </font>）<br />      你时常被客户抱怨JSP页面响应速度很慢吗？你想过当客户访问次数剧增时，你的WEB应用能承受日益增加的访问量吗？本文讲述了调整JSP和servlet的一些非常实用的方法，它可使你的servlet和JSP页面响应更快，扩展性更强。而且在用户数增加的情况下，系统负载会呈现出平滑上长的趋势。在本文中，我将通过一些实际例子和配置方法使得你的应用程序的性能有出人意料的提升。<br /><br />       其中，某些调优技术是在你的编程工作中实现的。而另一些技术是与应用服务器的配置相关的。在本文中，我们将详细地描述怎样通过调整servlet和JSP页面，来提高你的应用程序的总体性能。在阅读本文之前，假设你有基本的servlet和JSP的知识。<br /><br />方法一：在servlet的init()方法中缓存数据<br /><br />当应用服务器初始化servlet实例之后，为客户端请求提供服务之前，它会调用这个servlet的init()方法。在一个servlet的生命周期中，init()方法只会被调用一次。通过在init()方法中缓存一些静态的数据或完成一些只需要执行一次的、耗时的操作，就可大大地提高系统性能。<br /><br />例如，通过在init()方法中建立一个JDBC连接池是一个最佳例子，假设我们是用jdbc2.0的DataSource接口来取得数据库连接，在通常的情况下，我们需要通过JNDI来取得具体的数据源。我们可以想象在一个具体的应用中，如果每次SQL请求都要执行一次JNDI查询的话，那系统性能将会急剧下降。解决方法是如下代码，它通过缓存DataSource，使得下一次SQL调用时仍然可以继续利用它：<br /><br /></font>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="635" align="center" bordercolorlight="#000000" border="1">
						<tbody>
								<tr>
										<td class="code" style="FONT-SIZE: 9pt" width="627" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>
														<font color="#993300" size="2">public class ControllerServlet extends HttpServlet{　<br />private javax.sql.DataSource testDS = null; 　<br />public void init(ServletConfig config) throws ServletException　{<br />　　super.init(config); 　　Context ctx = null;<br />　　try　　{ 　　　ctx = new InitialContext();<br />　　　testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS");<br />　　}　　catch(NamingException ne)　　{<br />　　　ne.printStackTrace(); 　　}　　catch(Exception e)　　{<br />　　　e.printStackTrace();　　}　}　<br />public javax.sql.DataSource getTestDS()　{　　return testDS;　}<br />　...　... <br />}</font>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<br />
		<br />
		<font color="#993300" size="2">方法 2:禁止servlet和JSP 自动重载(auto-reloading) <br /><br />     Servlet/JSP提供了一个实用的技术，即自动重载技术，它为开发人员提供了一个好的开发环境，当你改变servlet和JSP页面后而不必重启应用服务器。然而，这种技术在产品运行阶段对系统的资源是一个极大的损耗，因为它会给JSP引擎的类装载器(classloader)带来极大的负担。因此关闭自动重载功能对系统性能的提升是一个极大的帮助。 <br /><br />方法 3: 不要滥用HttpSession <br /><br />     在很多应用中，我们的程序需要保持客户端的状态，以便页面之间可以相互联系。但不幸的是由于HTTP具有天生无状态性，从而无法保存客户端的状态。因此一般的应用服务器都提供了session来保存客户的状态。在JSP应用服务器中，是通过HttpSession对像来实现session的功能的，但在方便的同时，它也给系统带来了不小的负担。因为每当你获得或更新session时，系统者要对它进行费时的序列化操作。你可以通过对HttpSession的以下几种处理方式来提升系统的性能。<br /><br />    如果没有必要，就应该关闭JSP页面中对HttpSession的缺省设置。 如果你没有明确指定的话，每个JSP页面都会缺省地创建一个HttpSession。如果你的JSP中不需要使用session的话，那可以通过如下的JSP页面指示符来禁止它：<br /><br /></font>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
						<tbody>
								<tr>
										<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>
														<font size="2">
																<font color="#993300">＜%@ page session="false"%＞</font>
														</font>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<br />
		<br />
		<font color="#993300" size="2">不要在HttpSession中存放大的数据对像：如果你在HttpSession中存放大的数据对像的话，每当对它进行读写时，应用服务器都将对其进行序列化，从而增加了系统的额外负担。你在HttpSession中存放的数据对像越大，那系统的性能就下降得越快。 <br /><br />     当你不需要HttpSession时，尽快地释放它：当你不再需要session时，你可以通过调用HttpSession.invalidate()方法来释放它。尽量将session的超时时间设得短一点：在JSP应用服务器中，有一个缺省的session的超时时间。当客户在这个时间之后没有进行任何操作的话，系统会将相关的session自动从内存中释放。超时时间设得越大，系统的性能就会越低，因此最好的方法就是尽量使得它的值保持在一个较低的水平。 <br /><br />方法 4: 将页面输出进行压缩 <br /><br />    压缩是解决数据冗余的一个好的方法，特别是在网络带宽不够发达的今天。有的浏览器支持gzip(GNU zip)进行来对HTML文件进行压缩，这种方法可以戏剧性地减少HTML文件的下载时间。因此，如果你将servlet或JSP页面生成的HTML页面进行压缩的话，那用户就会觉得页面浏览速度会非常快。但不幸的是，不是所有的浏览器都支持gzip压缩，但你可以通过在你的程序中检查客户的浏览器是否支持它。下面就是关于这种方法实现的一个代码片段： <br /><br /></font>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="640" align="center" bordercolorlight="#000000" border="1">
						<tbody>
								<tr>
										<td class="code" style="FONT-SIZE: 9pt" width="632" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>
														<font size="2">
																<font color="#993300">public void doGet(HttpServletRequest request,<br /> HttpServletResponse response)throws IOException, ServletException <br />{　<br />OutputStream out = null　String encoding = <br />request.getHeader("Accept-Encoding"); 　<br />if (encoding != null &amp;&amp; encoding.indexOf("gzip") != -1)　{　　<br />request.setHeader("Content-Encoding" , "gzip");　　<br />out = new GZIPOutputStream(request.getOutputStream());　<br />}　<br />else if (encoding != null &amp;&amp; encoding.indexOf("compress") != -1)　{<br />　　request.setHeader("Content-Encoding" , "compress");　　<br />out = new ZIPOutputStream(request.getOutputStream());　<br />} 　<br />else　{　　out = request.getOutputStream();　}　...　... }</font>
														</font>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<br />
		<br />
		<font color="#993300" size="2">方法 5: 使用线程池<br /><br />    应用服务器缺省地为每个不同的客户端请求创建一个线程进行处理，并为它们分派service()方法，当service()方法调用完成后，与之相应的线程也随之撤消。由于创建和撤消线程会耗费一定的系统资源，这种缺省模式降低了系统的性能。但所幸的是我们可以通过创建一个线程池来改变这种状况。<br /><br />    另外，我们还要为这个线程池设置一个最小线程数和一个最大线程数。在应用服务器启动时，它会创建数量等于最小线程数的一个线程池，当客户有请求时，相应地从池从取出一个线程来进行处理，当处理完成后，再将线程重新放入到池中。如果池中的线程不够地话，系统会自动地增加池中线程的数量，但总量不能超过最大线程数。通过使用线程池，当客户端请求急剧增加时，系统的负载就会呈现的平滑的上升曲线，从而提高的系统的可伸缩性。<br /><br />方法 6: 选择正确的页面包含机制<br /><br />在JSP中有两种方法可以用来包含另一个页面：<br /><br />1、使用include指示符<br /><br /></font>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
						<tbody>
								<tr>
										<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>
														<font size="2">
																<font color="#993300">＜%@ includee file=”test.jsp” %＞</font>
														</font>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<br />
		<br />
		<font color="#993300" size="2">2、使用jsp指示符 <br /><br /></font>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
						<tbody>
								<tr>
										<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>
														<font size="2">
																<font color="#993300">＜jsp:includee page=”test.jsp” flush=”true”/＞</font>
														</font>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<br />
		<br />
		<font color="#993300" size="2">在实际中发现，如果使用第一种方法的话，可以使得系统性能更高。 <br /><br />方法 7:正确地确定javabean的生命周期 <br /><br />      JSP的一个强大的地方就是对javabean的支持。通过在JSP页面中使用＜jsp:useBean＞标签，可以将javabean直接插入到一个JSP页面中。它的使用方法如下： <br /><br /></font>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="665" align="center" bordercolorlight="#000000" border="1">
						<tbody>
								<tr>
										<td class="code" style="FONT-SIZE: 9pt" width="657" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>
														<font size="2">
																<font color="#993300">＜jsp:useBean id="name" scope="page|request|session|application" <br />class="package.className" type="typeName"＞＜/jsp:useBean＞</font>
														</font>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p>
				<br />
				<br />
				<font color="#993300" size="2">其中scope属性指出了这个bean的生命周期。缺省的生命周期为page。如果你没有正确地选择bean的生命周期的话，它将影响系统的性能。 <br /><br />举例来说，如果你只想在一次请求中使用某个bean，但你却将这个bean的生命周期设置成了session，那当这次请求结束后，这个bean将仍然保留在内存中，除非session超时或用户关闭浏览器。这样会耗费一定的内存，并无谓的增加了JVM垃圾收集器的工作量。因此为bean设置正确的生命周期，并在bean的使命结束后尽快地清理它们，会使用系统性能有一个提高。 <br /><br />其它一些有用的方法 <br /><br />1、在字符串连接操作中尽量不使用“＋”操作符：在java编程中，我们常常使用“＋”操作符来将几个字符串连接起来，但你或许从来没有想到过它居然会对系统性能造成影响吧？由于字符串是常量，因此JVM会产生一些临时的对像。你使用的“＋”越多，生成的临时对像就越多，这样也会给系统性能带来一些影响。解决的方法是用StringBuffer对像来代替“＋”操作符。 <br /><br />2、避免使用System.out.println()方法：由于System.out.println()是一种同步调用，即在调用它时，磁盘I/O操作必须等待它的完成，因此我们要尽量避免对它的调用。但我们在调试程序时它又是一个必不可少的方便工具，为了解决这个矛盾，我建议你最好使用Log4j工具(http://Jakarta.apache.org )，它既可以方便调试，而不会产生System.out.println()这样的方法。 <br /><br />3、ServletOutputStream 与 PrintWriter的权衡：使用PrintWriter可能会带来一些小的开销，因为它将所有的原始输出都转换为字符流来输出，因此如果使用它来作为页面输出的话，系统要负担一个转换过程。而使用ServletOutputStream作为页面输出的话就不存在一个问题，但它是以二进制进行输出的。因此在实际应用中要权衡两者的利弊。 <br /><br />总结 <br /><br />     本文的目的是通过对servlet和JSP的一些调优技术来极大地提高你的应用程序的性能，并因此提升整个J2EE应用的性能。通过这些调优技术，你可以发现其实并不是某种技术平台（比如J2EE和.NET之争）决定了你的应用程序的性能，重要是你要对这种平台有一个较为深入的了解，这样你才能从根本上对自己的应用程序做一个优化。 </font>
				<font color="#993300" size="2">
						<br />
				</font>
		</p>
<img src ="http://www.blogjava.net/renyangok/aggbug/86956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2006-12-11 16:58 <a href="http://www.blogjava.net/renyangok/archive/2006/12/11/86956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>