??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品一区蜜桃臀影院,久久亚洲影视,久久亚洲精品视频http://www.aygfsteel.com/simie/category/23730.htmlzh-cnSun, 29 Jul 2007 13:33:01 GMTSun, 29 Jul 2007 13:33:01 GMT60 java中相对\径,l对路径问题ȝhttp://www.aygfsteel.com/simie/archive/2007/07/29/133094.html和田?/dc:creator>和田?/author>Sun, 29 Jul 2007 03:08:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/29/133094.htmlhttp://www.aygfsteel.com/simie/comments/133094.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/29/133094.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/133094.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/133094.html  l对路径Q绝对\径就是你的主上的文件或目录在硬盘上真正的\径,(URL和物理\?例如Q?br>C:\xyz\test.txt 代表了test.txt文g的绝对\径?a href="http://www.sun.com/index.htm">http://www.sun.com/index.htm也代表了一?br>URLl对路径?/p>

  相对路径Q相对与某个基准目录的\径。包含Web的相对\径(HTML中的相对目录Q,例如Q在
Servlet中,"/"代表Web应用的跟目录。和物理路径的相对表C。例如:"./" 代表当前目录,
"../"代表上目录。这U类似的表示Q也是属于相对\径?/p>

另外关于URIQURL,URN{内容,请参考RFC相关文档标准?/p>

RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax,
(http://www.ietf.org/rfc/rfc2396.txt)


2.关于JSP/Servlet中的相对路径和绝对\径?/p>

2.1服务器端的地址

   服务器端的相对地址指的是相对于你的web应用的地址Q这个地址是在服务器端解析?br>Q不同于html和javascript中的相对地址Q他们是由客L览器解析的Q也是说这时?br>在jsp和servlet中的相对地址应该是相对于你的web应用Q即相对?a href="http://192.168.0.1/webapp/">http://192.168.0.1/webapp/的?

  其用到的地方有:
 forwardQservlet中的request.getRequestDispatcher(address);q个address?br>在服务器端解析的Q所以,你要forward到a.jsp应该q么写:
request.getRequestDispatcher(“/user/a.jsp”)q个/相对于当前的web应用webappQ?br>其绝对地址是Q?a href="http://192.168.0.1/webapp/user/a.jsp">http://192.168.0.1/webapp/user/a.jsp?
sendRedirectQ在jsp?lt;%response.sendRedirect("/rtccp/user/a.jsp");%>

2.22、客L的地址
 
       所有的html面中的相对地址都是相对于服务器根目?http://192.168.0.1/)的,
而不?跟目录下的该Web应用的目?http://192.168.0.1/webapp/的?
 Html中的form表单的action属性的地址应该是相对于服务器根目录(http://192.168.0.1/)的,
所以,如果提交到a.jsp为:actionQ?/webapp/user/a.jsp"或action="<%=request.getContextPath()%>"/user/a.jspQ?br>  提交到servlet为actiomQ?/webapp/handleservlet"  
   Javascript也是在客L解析的,所以其相对路径和form表单一栗?
 

  因此Q一般情况下Q在JSP/HTML面{引用的CSS,Javascript.Action{属性前面最好都加上
<%=request.getContextPath()%>,以确保所引用的文仉属于Web应用中的目录?br>另外Q应该尽量避免用类?.","./","../../"{类似的相对该文件位|的相对路径Q这?br>当文件移动时Q很Ҏ出问题?/p>


3. JSP/Servlet中获得当前应用的相对路径和绝对\?br>3.1 JSP中获得当前应用的相对路径和绝对\?br> 根目录所对应的绝对\?request.getRequestURI()
 文g的绝对\?nbsp;    :application.getRealPath(request.getRequestURI());
 当前web应用的绝对\?:application.getRealPath("/");
 取得h文g的上层目?new File(application.getRealPath(request.getRequestURI())).getParent()

3.2 Servlet中获得当前应用的相对路径和绝对\?br> 根目录所对应的绝对\?request.getServletPath();
 文g的绝对\?nbsp;   :request.getSession().getServletContext().getRealPath
(request.getRequestURI())   
 当前web应用的绝对\?:servletConfig.getServletContext().getRealPath("/");
     (ServletContext对象获得几种方式Q?br>       javax.servlet.http.HttpSession.getServletContext()
       javax.servlet.jsp.PageContext.getServletContext()
       javax.servlet.ServletConfig.getServletContext()
     )

4.java 的Class中获得相对\径,l对路径的方?br>4.1单独的JavacM获得l对路径
  Ҏjava.io.File的Doc文挡Q可?
 默认情况下new File("/")代表的目录ؓQSystem.getProperty("user.dir")?br> 一下程序获得执行类的当前\?br>package org.cheng.file;
import java.io.File;

public class FileTest {
    public static void main(String[] args) throws Exception {      

  System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));    

  System.out.println(FileTest.class.getClassLoader().getResource(""));       

  System.out.println(ClassLoader.getSystemResource(""));       
  System.out.println(FileTest.class.getResource(""));       
  System.out.println(FileTest.class.getResource("/")); //Class文g所在\?nbsp;
  System.out.println(new File("/").getAbsolutePath());       
  System.out.println(System.getProperty("user.dir"));   
 }
}

4.2服务器中的Javac获得当前\径(来自|络Q?br>(1).Weblogic

WebApplication的系l文件根目录是你的weblogic安装所在根目录?br>例如Q如果你的weblogic安装在c:\bea\weblogic700.....
那么Q你的文件根路径是c:\.
所以,有两U方式能够让你访问你的服务器端的文gQ?br>a.使用l对路径Q?br>比如你的参数文件放在c:\yourconfig\yourconf.propertiesQ?br>直接使用 new FileInputStream("yourconfig/yourconf.properties");
b.使用相对路径Q?br>相对路径的根目录是你的webapplication的根路径Q即WEB-INF的上一U目录,你的参数文件放

在yourwebapp\yourconfig\yourconf.propertiesQ?br>q样使用Q?br>new FileInputStream("./yourconfig/yourconf.properties");
q两U方式均可,自己选择?/p>

(2).Tomcat

在类中输出System.getProperty("user.dir");昄的是%Tomcat_Home%/bin

(3).Resin

不是你的JSP攄相对路径,是JSP引擎执行q个JSP~译成SERVLET
的\径ؓ?比如用新建文件法试File f = new File("a.htm");
q个a.htm在resin的安装目录下

(4).如何ȝ对\径哪Q?/p>

在Java文g中getResource或getResourceAsStream均可

例:getClass().getResourceAsStream(filePath);//filePath可以?/filename",q里?代表web

发布根\径下WEB-INF/classes

默认使用该方法的路径是:WEB-INF/classes。已l在Tomcat中测试?/p>

5.d文g时的相对路径Q避免硬~码和绝对\径的使用。(来自|络Q?br>5.1 采用Spring的DI机制获得文gQ避免硬~码?br>   参考下面的q接内容Q?br>   http://www.javajia.net/viewtopic.php?p=90213&
5.2 配置文g的读?br> 参考下面的q接内容Q?br> http://dev.csdn.net/develop/article/39/39681.shtm
5.3 通过虚拟路径或相对\径读取一个xml文gQ避免硬~码
 参考下面的q接内容Q?br> http://club.gamvan.com/club/clubPage.jsp?iPage=1&tID=10708&ccID=8
 
6.Java中文件的常用操作Q复ӞUdQ删除,创徏{)Q来自网l)
 常用 java File 操作c?
 http://www.easydone.cn/014/200604022353065155.htm
 
 Java文g操作大全QJSP中)
 http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html

 java文g操作详解QJava中文|)
 http://www.51cto.com/html/2005/1108/10947.htm

 JAVA 如何创徏\删除\修改\复制目录及文?br> http://www.gamvan.com/developer/java/2005/2/264.html

ȝQ?br> 通过上面内容的用,可以解决在Web应用服务器端Q移动文Ӟ查找文gQ复?br> 删除文g{操作,同时Ҏ务器的相对地址Q绝对地址概念更加清晰?br>参考URI,的RFC标准文挡。同时对Java.io.File. Java.net.URI.{内容了解透彻
对其他方面的理解可以更加深入和透彻?br>==================================================================================

参考资?
java/docs/

java.io.File
java.io.InputStream
java.io.OutputStream
java.io.FileInputStream
java.io.FileReader;
java.io.FileOutputStream
java.io.FileWriter;
java.net.URI
java.net.URL


l对路径与相对\径祥?br>http://www.webjx.com/htmldata/2005-02-26/1109430310.html

[『J道习l』]JSP和Servlet中的l对路径和相对\?br>http://w3china.org/blog/more.asp?name=pcthomas&id=9122&commentid=12376

JSP,Servlet,Class获得当前应用的相对\径和l对路径
http://cy.lzu.edu.cn/cy/club/clubPage.jsp?ccStyle=0&tID=886&ccID=77

如何获得当前文g路径
http://www.matrix.org.cn/resource/article/44/44113_java.html

通过Spring注入机制Q取得文?br>http://www.javajia.net/viewtopic.php?p=90213&

配置文g的读?
http://dev.csdn.net/develop/article/39/39681.shtm

d配置文g,通过虚拟路径或相对\径读取一个xml文gQ避免硬~码Q?
http://club.gamvan.com/club/clubPage.jsp?iPage=1&tID=10708&ccID=8

常用 java File 操作c?br>http://www.easydone.cn/014/200604022353065155.htm

Java文g操作大全
http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html

Java文g操作详解
http://www.51cto.com/html/2005/1108/10947.htm 



]]>
JSP语法的xml表达 http://www.aygfsteel.com/simie/archive/2007/07/29/133091.html和田?/dc:creator>和田?/author>Sun, 29 Jul 2007 02:39:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/29/133091.htmlhttp://www.aygfsteel.com/simie/comments/133091.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/29/133091.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/133091.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/133091.html大家L不喜Ƣ看?lt;%?>在jsp面上,其实我们可以使用比较优雅的xml方式来表?br>1Q隐含的注释
JSP语法Q?lt;%-- 内容 --%>
XML语法Q无
2Q变量或函数的声?/font>
JSP语法:<%! declaration;[declaration;]+... %>
例如Q?/font>
<%! 
   int i=0;int a,b,c;
   Color red=new Color(255,0,0);
   private static final String OK="ok";
   public String getAnswer(){
       return OK;
   }
%>
XML语法Q?/font>
<jsp:declaration>
    declartion;[declaration;]+...
</jsp:declaration>
例如Q?/font>
<jsp:declaration>
   int i=0;int a,b,c;
   Color red=new Color(255,0,0);
   private static final String OK="ok";
   public String getAnswer(){
       return OK;
   }
</jsp:declaration>
3Q表辑ּ
JSP语法Q?lt;%=expression%>
例如Q?/font>
<%=Math.round(Math.random*100)%>
XML语法Q?/font>
<jsp:expression>
   expression
</jsp:expression>
例如Q?/font>
<jsp:expression>
   Math.round(Math.random*100)
</jsp:expression>

4Q代码片?/font>
JSP语法Q?lt;% your java code %>
例如Q?/font>
<%
   String username=request.getParameter("username").trim();
   String password=request.getParameter("password").trim();
%>
XMl语法Q?/font>
<jsp:scriptlet>
   your java code
</jsp:scriptlet>
例如Q?/font>
<jsp:scriptlet>
   String username=request.getParameter("username").trim();
   String password=request.getParameter("password").trim();
</jsp:scriptlet>
5Q指令:include
JSP语法Q?lt;%@include file="relativeURL"%>
例如Q?lt;%@include file="static_head.html"%>
XML语法Q?lt;jsp:directive.include file="relativeURL"/>
例如Q?lt;jsp:directive.include file="static_head.html"/>
6Q指令:page
JSP语法Q?lt;%@page attribtes%>
例如Q?lt;%@page import="java.util.HashMap"%>
XML语法Q?lt;jsp:directive.page attribute/>
例如Q?lt;jsp:directive.page import="java.util.HashMap"/>
7,指oQtaglib
JSP语法Q?lt;%@taglib uri="URIForLibrary" prefix="tagPrefix"%>
XML语法Q无
对于jsp操作而言Q本来就是xml格式?/font>
下面使用xml表达方式书写一个jsp面

example.jsp

<jsp:directive.page contentType="text/html;charset=GBK" />
<jsp:directive.page import="java.util.*,java.text.*" />

<jsp:declartion>
    public String getCustomDate(Date,date,String pattern){
        SimpleDateFormat format=new SimpleDateFormat();
        format.applyPattern(pattern);
        return format.format(date);
    }
</jsp:declartion>
<jsp:scriptlet>
    Date date=(Date)request.getAttribute("date");
    String dateStr=getCustomDate(date,"yyyy-MM-dd,hh:mm:ss");
</jsp:scriptlet>
<div style="font-size:11pt"
  昄旉Q?lt;jsp:expression>dateStr</jsp:expression>
</div>


]]>
jsp自定义错误页 http://www.aygfsteel.com/simie/archive/2007/07/29/133086.html和田?/dc:creator>和田?/author>Sun, 29 Jul 2007 02:05:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/29/133086.htmlhttp://www.aygfsteel.com/simie/comments/133086.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/29/133086.html#Feedback1http://www.aygfsteel.com/simie/comments/commentRss/133086.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/133086.htmlZl浏览者一个友好的错误提示面Q我们可以象IIS一栯定义错误面Q?/p>

步骤如下Q?/p>

一、打开WEB-INF文g夹下web.xml文gQ?/p>

二、在里面新增Q?/p>

''404面不存在错?/p>

<error-page>

   <error-code>404</error-code>

   <location>/errorpage404.htm</location>

</error-page>

''505服务器内部错?/p>

<error-page>

   <error-code>505</error-code>

   <location>/errorpage505.htm</location>

</error-page>

''java.lang.NumberFormatException异常错误,依据q个标记你可以定义好多,you can any fire:)!@

<error-page>

   <exception-type>java.lang.NumberFormatException</exception-type>

   <location>/exception.htm</location>

</error-page>

三、保存web.xml文gQreload服务即ok!

Good Luck!!



]]>
开发一个调?JSP ?Eclipse 插ghttp://www.aygfsteel.com/simie/archive/2007/07/03/127887.html和田?/dc:creator>和田?/author>Tue, 03 Jul 2007 08:40:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/03/127887.htmlhttp://www.aygfsteel.com/simie/comments/127887.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/03/127887.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127887.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127887.html  阅读全文

]]>
JSP生成验证码源E序http://www.aygfsteel.com/simie/archive/2007/07/03/127839.html和田?/dc:creator>和田?/author>Tue, 03 Jul 2007 06:51:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/03/127839.htmlhttp://www.aygfsteel.com/simie/comments/127839.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/03/127839.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127839.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127839.html <%@ page contentType="image/jpeg" import="java.awt.*, 
java.awt.image.*,java.util.*,javax.imageio.*" %> 
<% 
// 在内存中创徏图象 
int width=60, height=20; 
BufferedImage image = new BufferedImage(width, height, 
BufferedImage.TYPE_INT_RGB); 

// 获取囑Ş上下?nbsp;
Graphics g = image.getGraphics(); 

// 讑֮背景?nbsp;
g.setColor(new Color(0xDCDCDC)); 
g.fillRect(0, 0, width, height); 

//画边?nbsp;
g.setColor(Color.black); 
g.drawRect(0,0,width-1,height-1); 

// 取随Z生的认证?4位数? 
String rand = request.getParameter("rand"); 
rand = rand.substring(0,rand.indexOf(".")); 
switch(rand.length()) 

case 1: rand = "000"+rand; break; 
case 2: rand = "00"+rand; break; 
case 3: rand = "0"+rand; break; 
default: rand = rand.substring(0,4); break; 


// 认证码存入SESSION 
session.setAttribute("rand",rand); 

// 认证码昄到图象中 
g.setColor(Color.black); 
Integer tempNumber = new Integer(rand); 
String numberStr = tempNumber.toString(); 

g.setFont(new Font("Atlantic Inline",Font.PLAIN,18)); 
String Str = numberStr.substring(0,1); 
g.drawString(Str,8,17); 

Str = numberStr.substring(1,2); 
g.drawString(Str,20,15); 
Str = numberStr.substring(2,3); 
g.drawString(Str,35,18); 

Str = numberStr.substring(3,4); 
g.drawString(Str,45,15); 

// 随机产生88个干扰点Q图象中的认证码不易被其它E序探测?nbsp;
Random random = new Random(); 
for (int i=0;i<20;i++) 

int x = random.nextInt(width); 
int y = random.nextInt(height); 
g.drawOval(x,y,0,0); 


// 图象生效 
g.dispose(); 

// 输出图象到页?nbsp;
ImageIO.write(image, "JPEG", response.getOutputStream()); 
%>

]]>
JSP/Servlet 中的汉字~码问题http://www.aygfsteel.com/simie/archive/2007/07/03/127838.html和田?/dc:creator>和田?/author>Tue, 03 Jul 2007 06:49:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/03/127838.htmlhttp://www.aygfsteel.com/simie/comments/127838.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/03/127838.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127838.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127838.html

JSP/Servlet 中的汉字~码问题

developerWorks
文档选项
此作为电子邮件发?src="http://www.ibm.com/i/v14/icons/em.gif"

此作为电子邮件发?/font>

未显C需?JavaScript 的文档选项



U别: 初

IBM,

2001 q?3 ?01 ?/p>

|上?JSP/Servlet ?DBCS字符~码问题有许多优U的文章和讨论Q本文对它们作一些整理,q结合IBM WebSphere Application Server3.5QWASQ的解决Ҏ作一些说明,希望它不是多余的?/em>

问题的v?/span>

每个国家Q或区域Q都规定了计机信息交换用的字符~码集,如美国的扩展 ASCII? 中国?GB2312-80Q日本的 JIS {,作ؓ该国?区域内信息处理的基础Q有着l一~码的重要作用。字W编码集按长度分?SBCSQ单字节字符集)QDBCSQ双字节字符集)两大cR早期的软gQ尤其是操作pȝQ,Z解决本地字符信息的计机处理Q出C各种本地化版本(L10NQ,Z区分Q引q了 LANG, Codepage {概c但是由于各个本地字W集代码范围重叠Q相互间信息交换困难QY件各个本地化版本独立l护成本较高。因此有必要本地化工作中的共性抽取出来,作一致处理,特别的本地化处理内定w低到最。这也就是所谓的国际化(I18NQ。各U语a信息被进一步规范ؓ Locale 信息。处理的底层字符集变成了几乎包含了所有字形的 Unicode?/p>

现在大部分具有国际化特征的Y件核心字W处理都是以 Unicode 为基的,在Y件运行时Ҏ当时?Locale/Lang/Codepage 讄定相应的本地字W编码设|,q依此处理本地字W。在处理q程中需要实?Unicode 和本地字W集的相互{换,甚或?Unicode Z间的两个不同本地字符集的怺转换。这U方式在|络环境下被q一步g伸,M|络两端的字W信息也需要根据字W集的设|{换成可接受的内容?/p>

Java 语言内部是用 Unicode 表示字符的,遵守 Unicode V2.0。Java E序无论是从/往文gpȝ以字W流?写文Ӟq是往 URL q接?HTML 信息Q或?URL q接d参数|都会有字W编码的转换。这样做虽然增加了编E的复杂度,Ҏ引vhQ但却是W合国际化的思想的?/p>

从理Z来说Q这些根据字W集讄而进行的字符转换不应该生太多问题。而事实是׃应用E序的实际运行环境不同,Unicode 和各个本地字W集的补充、完善,以及pȝ或应用程序实现的不规范,转码时出现的问题时时困扰着E序员和用户?





回页?/font>


GB2312-80QGBKQGB18030-2000 汉字字符集及 Encoding

其实解决 JAVA E序中的汉字~码问题的方法往往很简单,但理解其背后的原因,定位问题Q还需要了解现有的汉字~码和编码{换?/p>

GB2312-80 是在国内计算机汉字信息技术发展初始阶D制定的Q其中包含了大部分常用的一、二U汉字,?9 区的W号。该字符集是几乎所有的中文pȝ和国际化的Y仉支持的中文字W集Q这也是最基本的中文字W集。其~码范围是高?xa1Q?xfeQ低位也?0xa1-0xfeQ汉字从 0xb0a1 开始,l束?0xf7feQ?/p>

GBK ?GB2312-80 的扩展,是向上兼容的。它包含?20902 个汉字,其编码范围是 0x8140-0xfefeQ剔除高?0x80 的字位。其所有字W都可以一对一映射?Unicode 2.0Q也是?JAVA 实际上提供了 GBK 字符集的支持。这是现阶段 Windows 和其它一些中文操作系l的~省字符集,但ƈ不是所有的国际化Y仉支持该字W集Q感觉是他们q不完全知道 GBK 是怎么回事。值得注意的是它不是国家标准,而只是规范。随着 GB18030-2000国标的发布,它将在不久的来完成它的历史使命?/p>

GB18030-2000(GBK2K) ?GBK 的基上进一步扩展了汉字Q增加了藏、蒙{少数民族的字Ş。GBK2K 从根本上解决了字位不够,字Ş不的问题。它有几个特点,

  • 它ƈ没有定所有的字ŞQ只是规定了~码范围Q留待以后扩充?
  • ~码是变长的Q其二字节部分与 GBK 兼容Q四字节部分是扩充的字Ş、字位,其编码范围是首字?0x81-0xfe、二字节0x30-0x39、三字节 0x81-0xfe、四字节0x30-0x39?
  • 它的推广是分阶段的,首先要求实现的是能够完全映射?Unicode 3.0 标准的所有字形?
  • 它是国家标准Q是强制性的?

现在q没有Q何一个操作系l或软g实现?GBK2K 的支持,q是现阶D和来汉化的工作内宏V?/p>

Unicode 的介l?.....免了吧?/p>

JAVA 支持的encoding中与中文~程相关的有Q?有几个在JDK文档中未列出)

ASCII 7-bit, ?ascii7
ISO8859-1 8-bit, ?8859_1,ISO-8859-1,ISO_8859-1,latin1...
GB2312-80 同gb2312,gb2312-1980,EUC_CN,euccn,1381,Cp1381, 1383, Cp1383, ISO2022CN,ISO2022CN_GB......
GBK (注意大小?,同MS936
UTF8 UTF-8
GB18030 (现在只有IBM JDK1.3.?有支?, 同Cp1392,1392

JAVA 语言采用Unicode处理字符. 但从另一个角度来_在javaE序中也可以采用非Unicode的{码,重要的是保证E序入口和出口的汉字信息不失真。如完全采用ISO-8859-1来处理汉字也能达到正的l果。网l上行的许多解x法,都属于这U类型。ؓ了不致引h؜淆,本文不对q种Ҏ作讨论?





回页?/font>


中文转码??'、ؕ码的由来

两个方向转换都有可能得到错误的结果:

  • Unicode-->Byte, 如果目标代码集不存在对应的代码,则得到的l果?x3f.

    如:
    "\u00d6\u00ec\u00e9\u0046\u00bb\u00f9".getBytes("GBK") 的结果是 "?ìéF?ù", Hex 值是3fa8aca8a6463fa8b4.

    仔细看一下上面的l果Q你会发现\u00ec被{换ؓ0xa8ac, \u00e9被{换ؓ\xa8a6... 它的实际有效位变长了Q这是因为GB2312W号Z的一些符可映射C些公qW号~码Q由于这些符号出现在ISO-8859-1或其它一些SBCS字符集中Q故它们在Unicode中编码比较靠前,有一些其有效位只?位,和汉字的~码重叠(其实q种映射只是~码的映,在显C时仔细不是一L。Unicode 中的W号是单字节宽,汉字中的W号是双字节? . 在Unicode\u00a0--\u00ff 之间q样的符h20个。了解这个特征非帔R要!由此׃隄解ؓ什么JAVA~程中,汉字~码的错误结果中常常会出C些ؕ?其实是符号字W?, 而不全是'?'字符, 比如上面的例子?/p>

  • Byte-->Unicode, 如果Byte标识的字W在源代码集不存在,则得到的l果?xfffd.

    如:
    Byte ba[] = {(byte)0x81,(byte)0x40,(byte)0xb0,(byte)0xa1}; new String(ba,"gb2312");

    l果???, hex 值是"\ufffd\u554a". 0x8140 是GBK字符Q按GB2312转换表没有对应的|取\ufffd. (h意:在显CuniCodeӞ因ؓ没有对应的本地字W,所以也适用上一U情况,昄Z??".)

实际~程中,JSP/Servlet E序得到错误的汉字信息,往往是这两个q程的叠加,有时甚至是两个过E叠加后反复作用的结?





回页?/font>


JSP/Servlet 汉字~码问题及在 WAS 中的解决办法

4.1 常见?encoding 问题的现?/font>

|上常出现的 JSP/Servlet encoding 问题一般都表现?browser 或应用程序端Q如:

  • 览器中看到?Jsp/Servlet 面中的汉字怎么都成?’?’ ?
  • 览器中看到?Servlet 面中的汉字怎么都成了ؕ码?
  • JAVA 应用E序界面中的汉字怎么都成了方块?
  • Jsp/Servlet 面无法昄 GBK 汉字?
  • JSP 面中内嵌在<%...%>,<%=...%>{Tag包含?JAVA code 中的中文成了qQ但面的其它汉字是对的?
  • Jsp/Servlet 不能接收 form 提交的汉字?
  • JSP/Servlet 数据库读写无法获得正的内容?

隐藏在这些问题后面的是各U错误的字符转换和处理(除第3个外Q是因ؓ Java font 讄错误引v的)。解决类似的字符 encoding 问题Q需要了?Jsp/Servlet 的运行过E,查可能出现问题的各个炏V?/p>

4.2 JSP/Servlet web ~程时的 encoding 问题

q行于Java 应用服务器的 JSP/Servlet ?Browser 提供 HTML 内容Q其q程如下图所C:




其中有字W编码{换的地方?

  • JSP ~译。Java 应用服务器将Ҏ JVM ?file.encoding D?JSP 源文Ӟ~译生成 JAVA 源文Ӟ再根?file.encoding 值写回文件系l。如果当前系l语a支持 GBKQ那么这时候不会出?encoding 问题。如果是英文的系l,?LANG ?en_US ?Linux, AIX ?SolarisQ则要将 JVM ?file.encoding 值置?GBK 。系l语a如果?GB2312Q则Ҏ需要,定要不要设|?file.encodingQ将 file.encoding 设ؓ GBK 可以解决潜在?GBK 字符q问题

  • Java 需要被~译?.class 才能?JVM 中执行,q个q程存在与a.同样?file.encoding 问题。从q里开?servlet ?jsp 的运行就cM了,只不q?Servlet 的编译不是自动进行的。对于JSPE序, 对生的JAVA 中间文g的编译是自动q行?在程序中直接调用sun.tools.javac.Mainc?. 因此如果在这一步出现问题的? 也要查encoding和OS的语a环境Q或者将内嵌在JSP JAVA Code 中的静态汉字{?Unicode, 要么静态文本输Z要放?JAVA code 中。对于Servlet, javac ~译时手工指?encoding 参数可以了?/p>

  • Servlet 需要将 HTML 面内容转换?browser 可接受的 encoding 内容发送出厅R依赖于?JAVA App Server 的实现方式,有的查?Browser ?accept-charset ?accept-language 参数或以其它猜的方式定 encoding |有的则不。因此采用固定encoding 也许是最好的解决Ҏ。对于中文网,可在 JSP ?Servlet 中设|?contentType="text/html; charset=GB2312"Q如果页面中有GBK字符Q则讄为contentType="text/html; charset=GBK"Q由于IE ?Netscape对GBK的支持程度不一P作这U设|时需要测试一下。因?6?JAVA char在网l传送时?位会被丢弃,也ؓ了确保Servlet面中的汉字Q包括内嵌的和servletq行q程中得到的Q是期望的内码,可以?PrintWriter out=res.getWriter() 取代 ServletOutputStream out=res.getOutputStream(). PrinterWriter 根据contentType中指定的charset作{?(ContentType需在此之前指定Q?; 也可以用OutputStreamWriter装 ServletOutputStream cdƈ用write(String)输出汉字字符丌Ӏ对?JSPQJAVA Application Server 应当能够保在这个阶D将嵌入的汉字正传送出厅R?/p>

  • q是解释 URL 字符 encoding 问题。如果通过 get/post 方式?browser q回的参数g包含汉字信息Q?servlet 无法得到正的倹{SUN?J2SDK 中,HttpUtils.parseName 在解析参数时Ҏ没有考虑 browser 的语a讄Q而是得到的值按 byte 方式解析。这是网上讨论得最多的 encoding 问题。因是设计缺P只能?bin 方式重新解析得到的字W串Q或者以 hack HttpUtils cȝ方式解决。参考文?2 均有介绍Q不q最好将其中的中?encoding GB2312?CP1381 都改?GBKQ否则遇?GBK 汉字Ӟq是会有问题?Servlet API 2.3 提供一个新的函?HttpServeletRequest.setCharacterEncoding 用于在调?request.getParameter(“param_name”) 前指定应用程序希望的 encodingQ这有助于d解决q个问题?/p>

4.3 IBM Websphere Application Server 中的解决Ҏ

WebSphere Application Server Ҏ准的 Servlet API 2.x 作了扩展Q提供较好的多语a支持。运行在中文的操作系l中Q可以不作Q何设|就可以很好地处理汉字。下面的说明只是对WAS是运行在英文的系l中Q或者需要有GBK支持时有效?/p>

上述c,d情况QWAS 都要查询 Browser 的语a讄Q在~省状况下, zh, zh-cn {均被映ؓ JAVA encoding CP1381Q注意: CP1381 只是{同?GB2312 的一?codepageQ没?GBK 支持Q。这样做我想是因为无法确?Browser q行的操作系l是支持GB2312, q是 GBKQ所以取其小。但是实际的应用pȝq是要求面中出?GBK 汉字Q最著名的是朱ȝ名字中的“?F"(rong2 Q?xe946Q\u9555)Q所以有时还是需要将 Encoding/Charset 指定?GBK。当?WAS 中变更缺省的 encoding 没有上面说的那么ȝQ针?a,bQ参考文?5Q在 Application Server 的命令行参数中指?-Dfile.encoding=GBK 卛_Q?针对 dQ在 Application Server 的命令行参数中指?Ddefault.client.encoding=GBK。如果指定了-Ddefault.client.encoding=GBKQ那么c情况下可以不再指定charset?/p>

上面列出的问题中q有一个关于Tag<%...%>,<%=...%>中的 JAVA 代码里包含的静态文本未能正显C的问题Q在WAS中的解决Ҏ是除了设|正的file.encoding, q需要以相同Ҏ讄-Duser.language=zh -Duser.region=CN。这与JAVA locale的设|有兟?/p>

4.4 数据库读写时?encoding 问题

JSP/Servlet ~程中经常出?encoding 问题的另一个地Ҏd数据库中的数据?/p>

行的关pL据库pȝ都支持数据库 encodingQ也是说在创徏数据库时可以指定它自q字符集设|,数据库的数据以指定的~码形式存储。当应用E序讉K数据Ӟ在入口和出口处都会有 encoding 转换。对于中文数据,数据库字W编码的讄应当保证数据的完整? GB2312QGBKQUTF-8 {都是可选的数据?encodingQ也可以选择 ISO8859-1 (8-bit)Q那么应用程序在写数据之前须?16Bit 的一个汉字或 Unicode 拆分成两?8-bit 的字W,L据之后则需两个字节合qv来,同时q要判别其中?SBCS 字符。没有充分利用数据库 encoding 的作用,反而增加了~程的复杂度QISO8859-1不是推荐的数据库 encoding。JSP/Servlet~程Ӟ可以先用数据库管理系l提供的理功能查其中的中文数据是否正确?/p>

然后应当注意的是d来的数据?encodingQJAVA E序中一般得到的?Unicode。写数据时则相反?/p>

4.5 定位问题时常用的技?/font>

定位中文encoding问题通常采用最W的也是最有效的办法――在你认为有嫌疑的程序处理后打印字符串的内码。通过打印字符串的内码Q你可以发现什么时候中文字W被转换成UnicodeQ什么时候Unicode被{回中文内码,什么时候一个中文字成了两个 Unicode 字符Q什么时候中文字W串被{成了一串问P什么时候中文字W串的高位被截掉?#8230;…

取用合适的h字符串也有助于区分问题的cd。如Q?#8221;aa啊aa?@aa” {中q间、GB、GBK特征字符均有的字W串。一般来_英文字符无论怎么转换或处理,都不会失真(如果遇到了,可以试着增加q箋的英文字母长度)?/p>



回页?/font>


l束?/span>

其实 JSP/Servlet 的中文encoding q没有想像的那么复杂Q虽然定位和解决问题没有定规Q各U运行环境也各不然Q但后面的原理是一L。了解字W集的知识是解决字符问题的基。不q,随着中文字符集的变化Q不仅仅?java ~程Q中文信息处理中的问题还是会存在一D|间的?



参考资?



关于作?/span>

 

IBM has authored this article



]]>
数据库连接池+JavaBean+JSP+SQL Server+JDBC3.0的数据库分页技?/title><link>http://www.aygfsteel.com/simie/archive/2007/07/02/127656.html</link><dc:creator>和田?/dc:creator><author>和田?/author><pubDate>Mon, 02 Jul 2007 11:23:00 GMT</pubDate><guid>http://www.aygfsteel.com/simie/archive/2007/07/02/127656.html</guid><wfw:comment>http://www.aygfsteel.com/simie/comments/127656.html</wfw:comment><comments>http://www.aygfsteel.com/simie/archive/2007/07/02/127656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/simie/comments/commentRss/127656.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/simie/services/trackbacks/127656.html</trackback:ping><description><![CDATA[<pre>主要特色Q? 1.使用最新的JDBC3.0数据库驱动? 2.大幅度减化了JSP的反复调用JavaBean,可以直接写SQL,无须再用连接数据库q接池? 3.大量的工作交给JavaBean?JSP负责面控制? 4.最大特色是极其?E序~写也极其简?非常适合初学者? 5.使用的是tomcat数据库连接池,方便快速? h供E_mail,为大家分享,如有高手Q请指点不是? 本hE_mailQc841@163.com,望多提意见? ****************************************文g名《page.jsp?****************************************************************** 文g名《page.jsp? <%@ page language="java" import="java.sql.*, my.*" %> <%@ page contentType="text/html; charset=gb2312" %> <jsp:useBean id="pagi" scope="page" class="my.Pagi"/> <html> <body> <table align="center" border=1> <% String CountQuery="select count(*) from 商品资料"; String query = "select * from 商品资料"; ResultSet rs = pagi.querySql(CountQuery,query, request); String footer = pagi.PageFooter(); %> <tr> <td >商品~号</font></td> <td >商品名称</font></td> </tr> <% if (pagi.intPageCount>0) { int i=0; while (rs.next()) { i++; if (i>((pagi.intPage-1)*pagi.intPageSize) &&(i<=pagi.intPage*pagi.intPageSize)) { %> <tr> <td><%=rs.getString(1)%></td> <td><%=rs.getString(2)%></td> </tr> <% } } } out.println("<tr><td colspan=2>"+footer+"</td></tr>"); rs.close(); pagi.close_all(); %> </table> </body> </html> ****************************************文g名《pagi.java?******************************************************** 文g名《pagi.java? package my; import java.util.*; import java.sql.*; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import my.DB.*; public class Pagi { ResultSet CountTopicrs=null; //初始化总记录数Rs变量 ResultSet Pagirs=null; //初始化分|Rs变量 public int intCountTopic=0; //主题L public int intPageSize;//每页昄主题? public int intPageCount;//总页? public int intPage=1; //当前| public String nowPage; // int i; public String HttpFile;//初始化当前页intPage变量Q以准确便获取当前页?//当前的地址栏的文g DB db; //定义Linkdbcȝ一个对象? public Pagi()//定义构造器Q初始化每页昄的主题数和数据库的连接? { intPageSize=4; //每页昄的记录数? db = new DB(); } //Countsql:总记录的Query字符丌Ӏ[形式为select count(*) from tablename] //Pagisql :要分늚Query字符丌Ӏ[形式为select * from tablename where ...] //request :参数传递过E中的变量。[用来控制页时的pages变量] public ResultSet querySql(String Countsql,String Pagisql,HttpServletRequest request)throws Exception { HttpFile=request.getRequestURI(); //获取当前文g名? nowPage=request.getParameter("pages"); //获取当前,数D予intPage变量。[分页栏中必须要有pages参数] if (nowPage==null) { intPage=1; } else { intPage=Integer.parseInt(nowPage); if (intPage<1) intPage=1; } CountTopicrs=db.executeQuery(Countsql); //@@@@@@@@@@@@获取总记录数的结果集? if (CountTopicrs.next()) { intCountTopic=CountTopicrs.getInt(1); } intPageCount = (intCountTopic+intPageSize-1)/intPageSize; //获取总页数? if (intPage>intPageCount)//如果当前大于总页敎ͼ则当前页{于总页数? { intPage=intPageCount; } CountTopicrs.close(); //关闭M题数的数据集? db.close_all(); Pagirs=db.executeQuery(Pagisql); //@@@@@@@@@@@@@@@获取执行分页的结果集? return Pagirs; }//end querySql function. public int getCountTopic()//获取记录L? { return intCountTopic; } public int getPageCount() //获取总页数? { return intPageCount; } public int getIntPage() //获取当前|? { return intPage; } public String PageFooter() { String str = ""; int next, prev; prev=intPage-1; next=intPage+1; str += "查询?lt;font color=red>"+getCountTopic()+"</font>条记?+ " ?lt;font color=red>"+getPageCount()+"</font>?; str +=" W?lt;font color=red>"+getIntPage()+"</font>?"; if(intPage>1) str += " <A href=" + HttpFile + "?pages=1"+">首页</A> "; else str += " 首页 "; if(intPage>1) str += " <A href=" + HttpFile + "?pages=" + prev + ">上一?lt;/A> "; else str += " 上一?"; if(intPage<intPageCount) str += " <A href=" + HttpFile + "?pages=" + next + ">下一?lt;/A> "; else str += " 下一?"; if(intPageCount>1&&intPage!=intPageCount) str += " <A href=" + HttpFile + "?pages=" + intPageCount + ">N</A>"; else str += " N "; return str; } public void close_all() { db.close_all(); } } ************************************************文g名《DB.java?******************************************************* 文g名《DB.java? package my; import java.sql.*; import javax.naming.*; import javax.sql.DataSource; //一个用于查找数据源的工L? public class DB { private Connection con=null; private Statement stmt=null; ResultSet rs=null; public ResultSet executeQuery(String sql) throws Exception { rs=null; try { Context initCtx = new javax.naming.InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); DataSource ds = (DataSource)envCtx.lookup("jdbc/bn"); con=ds.getConnection(); stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); rs=stmt.executeQuery (sql); } catch(SQLException e){throw e;} catch(NamingException e){throw e;} return rs; } //执行Insert,Update语句 public void executeUpdate(String sql) throws Exception { stmt = null; rs=null; try { Context initCtx = new javax.naming.InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); DataSource ds = (DataSource)envCtx.lookup("jdbc/bn"); con=ds.getConnection(); stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); stmt.executeQuery(sql); stmt.close(); con.close(); } catch(SQLException ex) { System.err.println("执行SQL语句出错: " + ex.getMessage()); } } // 关闭stmt和关闭连? public void close_all() { try{ stmt.close(); con.close(); } catch(SQLException e){e.printStackTrace();} } } ***************************************《tomcat中的数据库连接池的设|?******************************************************************************* …… …… …… <Context path="/SQL" docBase="D:\SQL_JSP" debug="0" reloadable="true" crossContext="true"> <Resource name="jdbc/bn" auth="Container" type="javax.sql.DataSource"/> <ResourceParams name="jdbc/bn"> <parameter> <name>factory</name> <value>org.apache.commons.dbcp.BasicDataSourceFactory</value> </parameter> <parameter> <name>driverClassName</name> <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value> </parameter> <parameter> <name>url</name> <value>jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev</value> </parameter> <parameter> <name>username</name> <value>cyg</value> </parameter> <parameter> <name>password</name> <value>325345353</value> </parameter> <parameter> <name>maxActive</name> <value>20</value> </parameter> <parameter> <name>maxIdle</name> <value>20</value> </parameter> <parameter> <name>maxWait</name> <value>-1</value> </parameter> </ResourceParams> </Context> </Host> </Engine> </Service> </Server> </pre> <img src ="http://www.aygfsteel.com/simie/aggbug/127656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/simie/" target="_blank">和田?/a> 2007-07-02 19:23 <a href="http://www.aygfsteel.com/simie/archive/2007/07/02/127656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP/Servlet的重定向技术综q?/title><link>http://www.aygfsteel.com/simie/archive/2007/07/02/127536.html</link><dc:creator>和田?/dc:creator><author>和田?/author><pubDate>Mon, 02 Jul 2007 05:38:00 GMT</pubDate><guid>http://www.aygfsteel.com/simie/archive/2007/07/02/127536.html</guid><wfw:comment>http://www.aygfsteel.com/simie/comments/127536.html</wfw:comment><comments>http://www.aygfsteel.com/simie/archive/2007/07/02/127536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/simie/comments/commentRss/127536.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/simie/services/trackbacks/127536.html</trackback:ping><description><![CDATA[  <strong>1.RequestDispatcher.forward()</strong><br><br>  是在服务器端起作?当用forward()?Servlet engine传递HTTPh从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文g,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在b.jsp都可以获?参数自动传?<br><br>  但forward()无法重定向至有frame的jsp文g,可以重定向至有frame的html文g,同时forward()无法在后面带参数传?比如servlet?name=frank,q样不行,可以E序内通过response.setAttribute("name",name)来传至下一个页?<br><br>  重定向后览器地址栏URL不变.<br><br>  ?在servlet中进行重定向<br><br>  public void doPost(HttpServletRequest request,HttpServletResponse response)<br><br>  throws ServletException,IOException<br><br>  {<br><br>  response.setContentType("text/html; charset=gb2312");<br><br>  ServletContext sc = getServletContext();<br><br>  RequestDispatcher rd = null;<br><br>  rd = sc.getRequestDispatcher("/index.jsp");   //定向的页?br><br>  rd.forward(request, response);<br><br>  }<br><br>  通常在servlet中用,不在jsp中用?br><br>  <strong>2.response.sendRedirect()</strong><br><br>  是在用户的浏览器端工?sendRedirect()可以带参C?比如servlet?name=frank传至下个面,同时它可以重定向至不同的L?sendRedirect()可以重定向有frame.的jsp文g.<br><br>  重定向后在浏览器地址栏上会出现重定向面的URL<br><br>  ?在servlet中重定向<br><br>  public void doPost(HttpServletRequest request,HttpServletResponse response)<br><br>  throws ServletException,IOException<br><br>  {<br><br>  response.setContentType("text/html; charset=gb2312");<br><br>  response.sendRedirect("/index.jsp");<br><br>  }<br><br>  ׃response是jsp面中的隐含对象Q故在jsp面中可以用response.sendRedirect()直接实现重定位?br><br>  注意Q?br><br>  (1).使用response.sendRedirectӞ前面不能有HTML输出?br><br>  qƈ不是l对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制Q一般在8KQ我是说JSP SERVERQ,q就意味着Q除非你关闭了cacheQ或者你使用了out.flush()强制hQ那么在使用sendRedirect之前Q有量的HTML输出也是允许的?br><br>  (2).response.sendRedirect之后Q应该紧跟一句return;<br><br>  我们已经知道response.sendRedirect是通过览器来做{向的Q所以只有在面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出q有什么意义呢Q而且有可能会因ؓ后面的输出导致{向失败?br><br>  比较Q?br><br>  (1).Request Dispatcher.forward()是容器中控制权的转向Q在客户端浏览器地址栏中不会昄{向后的地址Q?br><br>  (2).response.sendRedirect()则是完全的蟩转,览器将会得到蟩转的地址Qƈ重新发送请求链接。这P从浏览器的地址栏中可以看到跌{后的链接地址?br><br>  前者更加高效,在前者可以满需要时Q尽量用RequestDispatcher.forward()Ҏ.<br><br>  注:在有些情况下Q比如,需要蟩转到一个其它服务器上的资源Q则必须使用HttpServletResponse.sendRequest()Ҏ?br><br>  <strong>3.<jsp:forward page="" /></strong><br><br>  它的底层部分是由RequestDispatcher来实现的Q因此它带有RequestDispatcher.forward()Ҏ的印记?br><br>  如果?lt;jsp:forward>之前有很多输?前面的输出已使缓冲区?自动输出到客户?那么该语句将不v作用,q一点应该特别注意?br><br>  另外要注意:它不能改变浏览器地址Q刷新的话会D重复提交<br><br>  <strong>4.修改HTTP header的Location属性来重定?/strong><br><br>  通过讄直接修改地址栏来实现面的重定向?br>jsp文g代码如下Q?br><br>  Q?<br><br>  response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);<br><br>  String newLocn = "/newpath/jsa.jsp";<br><br>  response.setHeader("Location",newLocn);<br><br>  %Q?br><br>  <strong>5.JSP中实现在某页面停留若q秒?自动重定向到另一面</strong><br><br>  在html文g中,下面的代码:<br><br>  <meta http-equiv="refresh" content="300; url=target.jsp"><br><br>  它的含义Q在5分钟之后正在览的页面将会自动变为target.htmlq一c代码中300为刷新的延迟旉Q以Uؓ单位。targer.htmlZ惌{向的目标?若ؓ本页则ؓ自动h本页?br><br>  ׃可知Q可以通过setHeader来实现某面停留若干U后,自动重定向到另一面?br><br>  关键代码Q?br><br>  String content=stayTime+";URL="+URL;<br><br>  response.setHeader("REFRESH",content);<br><br>  如果ȝ得不够全面,请各位发表自q意见或经验? <img src ="http://www.aygfsteel.com/simie/aggbug/127536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/simie/" target="_blank">和田?/a> 2007-07-02 13:38 <a href="http://www.aygfsteel.com/simie/archive/2007/07/02/127536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp中forword和sendRedirect的区?/title><link>http://www.aygfsteel.com/simie/archive/2007/07/02/127532.html</link><dc:creator>和田?/dc:creator><author>和田?/author><pubDate>Mon, 02 Jul 2007 05:31:00 GMT</pubDate><guid>http://www.aygfsteel.com/simie/archive/2007/07/02/127532.html</guid><wfw:comment>http://www.aygfsteel.com/simie/comments/127532.html</wfw:comment><comments>http://www.aygfsteel.com/simie/archive/2007/07/02/127532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/simie/comments/commentRss/127532.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/simie/services/trackbacks/127532.html</trackback:ping><description><![CDATA[<p>1.RequestDispatcher.forward()</p> <p>是在服务器端起作?当用forward()?Servlet engine传递HTTPh从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文g,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在 b.jsp都可以获?参数自动传?</p> <p>但forward ()无法重定向至有frame的jsp文g,可以重定向至有frame的html文g,同时forward()无法在后面带参数传?比如 servlet?name=frank,q样不行,可以E序内通过response.setAttribute("name",name)来传至下一个页?</p> <p>重定向后览器地址栏URL不变.</p> <p>?servlet文g中重定向<br>CODE</p> <p>public void doPost(HttpServletRequest request,HttpServletResponse response)</p> <p>       throws ServletException,IOException</p> <p>{</p> <p>       response.setContentType("text/html; charset=gb2312");</p> <p>       ServletContext sc = getServletContext();</p> <p>       RequestDispatcher rd = null;</p> <p>       rd = sc.getRequestDispatcher("/index.jsp");</p> <p>       rd.forward(request, response);<br>}</p> <p><br>2.response.sendRedirect()</p> <p>是在用户的浏览器端工?sendRedirect()可以带参C?比如servlet?name=frank传至下个面,同时它可以重定向至不同的L?且在览器地址栏上会出现重定向面的URL.</p> <p>sendRedirect()可以重定向有frame的jsp文g.</p> <p>?servlet文g中重定向<br>CODE</p> <p>public void doPost(HttpServletRequest request,HttpServletResponse response)</p> <p>       throws ServletException,IOException</p> <p>{</p> <p>       response.setContentType("text/html; charset=gb2312");</p> <p>       response.sendRedirect("/index.jsp");</p> <p>}</p> <img src ="http://www.aygfsteel.com/simie/aggbug/127532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/simie/" target="_blank">和田?/a> 2007-07-02 13:31 <a href="http://www.aygfsteel.com/simie/archive/2007/07/02/127532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA日期问题ȝhttp://www.aygfsteel.com/simie/archive/2007/07/02/127518.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 05:01:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127518.htmlhttp://www.aygfsteel.com/simie/comments/127518.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127518.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127518.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127518.html<%@ page import="java.util.Date"%>
<%
Date myDate = new Date();
%>
2、获取当前年、月、日Q?

<%@ page import="java.util.Date"%>

<%
Date myDate = new Date();
int thisYear = myDate.getYear() + 1900;//thisYear = 2003
int thisMonth = myDate.getMonth() + 1;//thisMonth = 5
int thisDate = myDate.getDate();//thisDate = 30
%>


3、按本地时区输出当前日期

<%@ page import="java.util.Date"%>
<%
Date myDate = new Date();
out.println(myDate.toLocaleString());
%>


输出l果为:
2003-5-30


4、获取数据库中字D名?publish_time"、类型ؓDatetime的?/p>


<%@ page import="java.util.Date"%>
<%
...q接数据?..
ResultSet rs = ...
Date sDate = rs.getDate("publish_time");
%>
[code]


5、按照指定格式打印日?/p>


[code]
<%@ page import="java.util.Date"%>
<%@ page import="java.text.DateFormat"%>
<%
Date dNow = new Date();

SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
out.println("It is " + formatter.format(dNow));
%>

 

输出的结果ؓQ?br>It is 星期?2003.05.30 at 11:30:46 上午 CST
(更ؓ详尽的格式符可参看SimpleDateFormatc?


6、将字符串{换ؓ日期

<%@ page import="java.util.Date"%>
<%@ page import="java.text.DateFormat"%>
<%
String input = "1222-11-11";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date t = null;

try{

  t = formatter.parse(input);

  out.println(t);

  }catch(ParseException e){

  out.println("unparseable using" + formatter);

  }

%>

输出l果为:
Fri Nov 11 00:00:00 CST 1222


7、计日期之间的间隔

 

<%@ page import="java.util.Date"%>
<%@ page import="java.text.DateFormat"%>
<%
String input = "2003-05-01";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date d1 = null;
trycatch(ParseException e)

Date d2 = new Date();

long diff = d2.getTime() - d1.getTime();
out.println("Difference is " + (diff/(1000*60*60*24)) + " days.");
%>


输出l果为:
Difference is 29 days.


8、日期的加减q算
ҎQ用Calendarcȝadd()Ҏ


<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%
Calendar now = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
out.println("It is now " + formatter.format(now.getTime()));
now.add(Calendar.DAY_OF_YEAR,-(365*2));
out.println("<br>");
out.println("Two years ago was " + formatter.format(now.getTime()));
%>

 

输出l果为:
It is now 星期?2003.05.30 at 01:45:32 下午 CST
Two years ago was 星期?2001.05.30 at 01:45:32 下午 CST


9、比较日?br>ҎQ用equals()、before()、after()Ҏ

 

<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%
DateFormat df = new SimpleDateFormat("yyy-MM-dd");
Date d1 = df.parse("2000-01-01");
Date d2 = df.parse("1999-12-31");

String relation = null;
if(d1.equals(d2))
relation = "the same date as";
else if(d1.before(d2))
relation = "before";
else
relation = "after";
out.println(d1 +" is " + relation + ' ' + d2);
%>


输出l果为:
Sat Jan 01 00:00:00 CST 2000 is after Fri Dec 31 00:00:00 CST 1999


10、记录一件事所p的时?br>ҎQ调用两ơSystem.getTimeMillis()ҎQ求差?/p>

 

<%@ page import="java.text.*"%>
<%
long t0,t1;
t0 = System.currentTimeMillis();
out.println("Cyc starts at " + t0);
int k = 0;
for(int i =0;i<100000;i++)
t1 = System.currentTimeMillis();
out.println("<br>");
out.println("Cyc ends at " + t1);
out.println("<br>");
out.println("This run took " + (t1-t0) + "ms.");
%>


输出l果为:
Cyc starts at 1054275312432
Cyc ends at 1054275312442
This run took 10ms.

其它Q如何格式化数

 

<%@ page import="java.text.*"%>
<%
DecimalFormat df = new DecimalFormat(",###.00");
double aNumber = 33665448856.6568975;
String result = df.format(aNumber);
out.println(result);
%>


输出l果为:
33,665,448,856.66



]]>
JSP ~程技巧集锦(转蝲Q?/title><link>http://www.aygfsteel.com/simie/archive/2007/07/02/127519.html</link><dc:creator>和田?/dc:creator><author>和田?/author><pubDate>Mon, 02 Jul 2007 05:01:00 GMT</pubDate><guid>http://www.aygfsteel.com/simie/archive/2007/07/02/127519.html</guid><wfw:comment>http://www.aygfsteel.com/simie/comments/127519.html</wfw:comment><comments>http://www.aygfsteel.com/simie/archive/2007/07/02/127519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/simie/comments/commentRss/127519.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/simie/services/trackbacks/127519.html</trackback:ping><description><![CDATA[<font size=4>1. 如何让选中的一行记录高亮显C?<br></font><a href="http://topic.csdn.net/t/20050105/09/3699823.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050105/09/3699823.html</u></font></a><br><font size=4>2. 如何在下拉列表框里选择一个值后跛_新窗?<br></font><a href="http://topic.csdn.net/t/20050107/15/3707444.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050107/15/3707444.html</u></font></a><br><font size=4>3. 如何在JSP中启动execl?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4909154" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4909154</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4685297" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4685297</u></font></a><br><font size=4>4. 两联动菜单<br></font><a href="http://topic.csdn.net/t/20040730/16/3227437.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20040730/16/3227437.html</u></font></a><br><font size=4>5. java中如何把一个目录下的文件移到另一个指定的目录Q?br></font><a href="http://topic.csdn.net/t/20050112/13/3719237.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050112/13/3719237.html</u></font></a><br><font size=4>6. 如何制作表格U?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5130862" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5130862</u></font></a><br><font size=4>7. jsp如判别一个字W在A到Z之间?<br></font><a href="http://topic.csdn.net/t/20050113/08/3721286.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050113/08/3721286.html</u></font></a><br><font size=4>8. 得到一点数小数点?位,如何写以函数截取Z?br></font><a href="http://topic.csdn.net/t/20050117/14/3731712.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050117/14/3731712.html</u></font></a><br><font size=4>9. 整型转字W?<br></font><a href="http://topic.csdn.net/t/20030526/22/1837632.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20030526/22/1837632.html</u></font></a><br><font size=4>10. 昄数据库的记录Q点d个标题栏Q就按照哪个标题排序<br></font><a href="http://topic.csdn.net/t/20041226/15/3677011.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20041226/15/3677011.html</u></font></a><br><font size=4>11. 制作两个按钮<br>Q?<br>12. 用什么sql语句数据库中的一条记?复制Z?<br></font><a href="http://topic.csdn.net/t/20050120/17/3741746.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050120/17/3741746.html</u></font></a><br><font size=4>13. 有兩個按鈕A,B,其中A按下?A׃可以再按,另外B按下?A可以再按..請問如何用javascript控制.?<br></font><a href="http://topic.csdn.net/t/20050120/17/3741568.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050120/17/3741568.html</u></font></a><br><font size=4>14. 请问jsp中的数据库的q接方式<br></font><a href="http://topic.csdn.net/t/20030107/11/1334377.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20030107/11/1334377.html</u></font></a><br><font size=4>15. 在jsp?怎么实现按回车就可提交表?<br></font><a href="http://topic.csdn.net/t/20050121/11/3743133.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050121/11/3743133.html</u></font></a><br><font size=4>16. 在JSP中如何传递数l?<br></font><a href="http://topic.csdn.net/t/20030624/17/1952227.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20030624/17/1952227.html</u></font></a><br><font size=4>17. 如何按地址取图片?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4894525" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4894525</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4990451" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4990451</u></font></a><br><font size=4>18. JSP中如何上传图片到数据库字D?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4923127" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4923127</u></font></a><br><font size=4>19. 面自动hQ?br></font><a href="http://topic.csdn.net/t/20040430/16/3025697.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20040430/16/3025697.html</u></font></a><br><font size=4>20. 表单自动提交Q?br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4681334" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4681334</u></font></a><br><font size=4>21. 如何从JSP传数据的到JAVABEAN?<br>q个不就是参C递么Q?<br>22. weblogic 数据池连? 数据?JNDI名字 mysource<br></font><a href="http://topic.csdn.net/t/20040915/22/3376617.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20040915/22/3376617.html</u></font></a><br><font size=4>23. 三联动菜单?<br></font><a href="http://blog.csdn.net/overmind/archive/2005/10/27/517856.aspx" target=_blank><font color=#0000ff size=4><u>http://blog.csdn.net/overmind/archive/2005/10/27/517856.aspx</u></font></a><br><font size=4>24. 在JSP中如何调用浏览器中的"另存?功能?<br></font><a href="http://topic.csdn.net/t/20050509/09/3990931.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050509/09/3990931.html</u></font></a><br><font size=4>25. |页全屏昄<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5057245" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5057245</u></font></a><br><font size=4>26. 求两个日期相隔了多少?输入旉格式?yyyy-mm-dd)<br></font><a href="http://topic.csdn.net/t/20050516/10/4009546.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050516/10/4009546.html</u></font></a><br><font size=4>27. 上传文g对话?br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4961980" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4961980</u></font></a><br><font size=4>28. 分页试<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4925123" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4925123</u></font></a><br><font size=4>29. 下蝲文g<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5019146" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5019146</u></font></a><br><font size=4>30. 单汉字判?br></font><a href="http://blog.csdn.net/duanxd/archive/2005/05/19/376481.aspx" target=_blank><font color=#0000ff size=4><u>http://blog.csdn.net/duanxd/archive/2005/05/19/376481.aspx</u></font></a><br><font size=4>31. 可否JSP的变量或者bean传递给JAVASCRIPT使用Q?br></font><a href="http://topic.csdn.net/t/20050520/14/4022667.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050520/14/4022667.html</u></font></a><br><font size=4>32. 怎么把一U格式(如yyyy-mm-ddQ的日期变量转换成另外一U格式(如dd-mm-yyyyQ的日期变量Q?br></font><a href="http://topic.csdn.net/t/20050602/21/4055209.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20050602/21/4055209.html</u></font></a><br><font size=4>33. 如何实现在页面上d一行输入对话框<br>??<br>34. 如何制作验证码图?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4857455" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4857455</u></font></a><font size=4> <br>35. 囄~小攑֤功能<br></font><a href="http://topic.csdn.net/t/20041227/09/3678138.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20041227/09/3678138.html</u></font></a><br><font size=4>36. 如何点击输入框弹出日期选择Q?br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5020494" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5020494</u></font></a><br><a href="http://www.dynarch.com/projects/calendar/" target=_blank><font color=#0000ff size=4><u>http://www.dynarch.com/projects/calendar/</u></font></a><br><font size=4>37. 如何在图片上传前查看自己要上传的囄?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4825282" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4825282</u></font></a><br><font size=4>38. 如何在图片排列的面上选中一个图?然后把它删掉?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5162107" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5162107</u></font></a><br><font size=4>39. 昄某目录下的所有文?br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5056503" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5056503</u></font></a><br><font size=4>40. 如何把复选框中选中的值直接显C在输入文本框中Q?br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5004830" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5004830</u></font></a><br><font size=4>41. 如何选择路径下的文g直接昄文g内容?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5194181" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5194181</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5121413" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5121413</u></font></a><br><font size=4>42. 如何制作q度?<br></font><a href="http://topic.csdn.net/t/20051120/03/4405364.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20051120/03/4405364.html</u></font></a><br><font size=4>43. 如何对较长字W省略显C?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5124078" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5124078</u></font></a><br><font size=4>44. 如何制作日历?<br>q个太多?br>45. 点击文本弹出一个选择框,选中值后q回q显C?br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4979197" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4979197</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4988006" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4988006</u></font></a><br><font size=4>46. 如何关闭框架面回到没框架的面?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4970057" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4970057</u></font></a><br><font size=4>47. 如何选中多条记录一ơ性删?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4762839" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4762839</u></font></a><br><font size=4>48. 如何自动获取面文g名?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4945500" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4945500</u></font></a><br><font size=4>49. 如何在JSP中调用ActiveX控g?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4919689" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4919689</u></font></a><br><font size=4>50. 如何使用SmartUpload实现文g上传?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4911791" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4911791</u></font></a><br><font size=4>51. 如何使用iReport和Jasperreport开发报?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5038328" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5038328</u></font></a><br><font size=4>52. 如何使用iText生成PDFQ?br></font><a href="http://www.lowagie.com/iText/tutorial/ch07.html" target=_blank><font color=#0000ff size=4><u>http://www.lowagie.com/iText/tutorial/ch07.html</u></font></a><font size=4>#htmlparsing<br></font><a href="http://java.ccidnet.com/art/3565/20050309/480327_1.html" target=_blank><font color=#0000ff size=4><u>http://java.ccidnet.com/art/3565/20050309/480327_1.html</u></font></a><br><font size=4>53. 如何制作囄水印Q?br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5212770" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5212770</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4885889" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4885889</u></font></a><br><font size=4>54. 如何在页面中屏蔽键盘功能键?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4356360" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4356360</u></font></a><br><font size=4>55. 如何止用户复制|页内容Q?br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4356360" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4356360</u></font></a><br><font size=4>56. 如何实现不在地址拦中昄当前URLQ?br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4678351" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4678351</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4863808" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4863808</u></font></a><br><font size=4>57. 如何获取用户的真实IP地址Q?br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4718686" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4718686</u></font></a><br><font size=4>58. 如何获取用户览器信息?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4987045" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4987045</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4898974" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4898974</u></font></a><br><font size=4>59. 如何获取当前l对路径Q?br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5157921" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5157921</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5178848" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5178848</u></font></a><br><font size=4>60. 如何HTML文g转换成XML文g?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4542984" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4542984</u></font></a><br><font size=4>61. 如何l合XML和XSL输出HTML面Q?br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4355891" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4355891</u></font></a><br><font size=4>62. 如何制作动态树型菜单制作?<br></font><a href="http://www.aygfsteel.com/rickhunter/articles/59742.html" target=_blank><font color=#0000ff size=4><u>http://www.aygfsteel.com/rickhunter/articles/59742.html</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4966014" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4966014</u></font></a><br><font size=4>63. 如何制作cMQQ的短消息提示Q?br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4702037" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4702037</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5087584" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5087584</u></font></a><br><font size=4>64. 如何用jfreechat制作拄、饼、曲U图?<br></font><a href="http://www.inspiresky.com/Article/ShowArticle.asp?ArticleID=731" target=_blank><font color=#0000ff size=4><u>http://www.inspiresky.com/Article/ShowArticle.asp?ArticleID=731</u></font></a><br><font size=4>65. 文本框怎么只容许输入数?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4927727" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4927727</u></font></a><br><font size=4>66. 如何打开Word和Execl文g?<br></font><a href="http://community.csdn.net/Expert/TopicView1.asp?id=5194181" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=5194181</u></font></a><br><a href="http://community.csdn.net/Expert/TopicView1.asp?id=4685297" target=_blank><font color=#0000ff size=4><u>http://community.csdn.net/Expert/TopicView1.asp?id=4685297</u></font></a><br><font size=4>67. 如何生成Word ?Excel文档Q?br></font><a href="http://sourceforge.net/project/showfiles.php?group_id=15255" target=_blank><font color=#0000ff size=4><u>http://sourceforge.net/project/showfiles.php?group_id=15255</u></font></a><font size=4>&release_id=167948<br>68. JSP如何dWord内容?<br></font><a href="http://topic.csdn.net/t/20030217/13/1435281.html" target=_blank><font color=#0000ff size=4><u>http://topic.csdn.net/t/20030217/13/1435281.html</u></font></a><font size=4> </font><br> <img src ="http://www.aygfsteel.com/simie/aggbug/127519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/simie/" target="_blank">和田?/a> 2007-07-02 13:01 <a href="http://www.aygfsteel.com/simie/archive/2007/07/02/127519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp生成汉字验证?(彩色)http://www.aygfsteel.com/simie/archive/2007/07/02/127515.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 04:57:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127515.htmlhttp://www.aygfsteel.com/simie/comments/127515.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127515.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127515.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127515.html一些网站采用了字母和数字的验证码,数字和字母加h一?0多个Q如果有心,q是能够通过Ҏ识别出来?/font> O8<@d3  
我在|上看到一文?jsp彩色验证?Q我q行了加强,生成的验证码内容为汉字,可以方便应用在面向汉语网民的|站认证上?/font> oxcd:, Vc  
iXV6:&\9"r  
当然Q我q看到别虑的几U方法:
{i867@H_e  
1.生成计算题,比如20+34*(23-12)=?Q用户必输入正的{案才能通过验证Q这个想法挺好,但是用户必须打开计算器进行计,增加了用L隑ֺ
dza^8ynu  
2.问一些常见的问题Q比?#8220;?#8221;q个字由几笔l成。这也是不错的想法,关键是必L上万条的题库Q而且题库的答案必L明确的,单易比较的,q个隑ֺ也较大?/font> |||o<  
ejas+  
下面是彩色汉字验证码的代码?/font> ,"-07[X  
]j&J&.:&,  
dVTACb`  
<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
YwpC}G;   
<%!
(.&vEwK  
//create by smallnest
z(S Lcx  
//email:
smallnest@gmail.com <p-Y a_&u  
//website:
www.kuaff.com hpC%no /s  
Du:x%[~]  
99Ztr4E  
Jk)|S2  
: pZ<K"Z-&  
//生成随机颜色
s*# ]mm.MD  
Color getRandColor(Random random,int fc,int bc)
M-C|5ahf8B  
{
!DF}` d  
if(fc>255) fc=255;
{+9C59]sA  
if(bc>255) bc=255;
^k41]4 RD  
int r=fc+random.nextInt(bc-fc);
')/u5Y{fp  
int g=fc+random.nextInt(bc-fc);
F\(TcR(  
int b=fc+random.nextInt(bc-fc);
qQ5> k=3  
return new Color(r,g,b);
2Es&*Kr+"  
}
 '0 )!e!=  
%>
=H NQZD`e  
<%
q=X0lJ<V  
//讄面不缓?
Qsd{m_y#  
response.setHeader("Pragma","No-cache");
p[brf>x  
response.setHeader("Cache-Control","no-cache");
h-r<TW  
response.setDateHeader("Expires", 0);
hB~(UCtd  
{m@moH 3N  
">^0|,(e  
// 讄囄的长?
G"KO  
int width=176, height=30;
rl> 1bV?8  
//讄备选汉字,剔除一些不雅的汉字
>22XQgGh  
String base = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6";
=-/!18  
//备选汉字的长度
k63GRbd?  
int length = base.length();
n\+47N*ze  
,"jx!  
2b8~3d[L  
//创徏内存囑փ
e/6VUo@>%  
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
X/$V%6)  
// 获取囑Ş上下?
"g&Xk0  
Graphics g = image.getGraphics();
NEE4{?Q?  
k >@l  
Q{AR6CRAt  
//创徏随机cȝ实例
ch6) "2  
Random random = new Random();
>>#>"<CMT  
K#]~p^Z}  
aF@:;!cVu  
// 讑֮囑փ背景?因ؓ是做背景Q所以偏?
NAL2w3  
g.setColor(getRandColor(random,200,250));
{<=!bYh  
g.fillRect(0, 0, width, height);
7@mFmb] -#  
+.S``"'  
Eg^${%,d  
//备选字?
RE]p3t|O  
String[] fontTypes = {"\u5b8b\u4f53","\u65b0\u5b8b\u4f53","\u9ed1\u4f53","\u6977\u4f53","\u96b6\u4e66"};
b<psU?/% _  
int fontTypesLength = fontTypes.length;
YZ?KfO=r  
6< 1B;  
<;G d~(  
//在图片背景上增加噪点
Q`6 A{@5Y  
g.setColor(getRandColor(random,160,200));
8M`w  
g.setFont(new Font("Times New Roman",Font.PLAIN,14));
S h (%oy<+  
for (int i=0;i<6;i++)
[NFmqEEanb  
{
_R6 Lr9q  
g.drawString("*********************************************",0,5*(i+2));
goQ2Va+  
}
}):f;M*  
9L+)0)(  
+4vsFa6*  
Fj%N4$?(m  
+Sv2qb  
//取随Z生的认证?6个汉?
%[B|3.e  
=e?R(E^Y"  
XSp~5|I  
//保存生成的汉字字W串
p^ >Q(g  
String sRand="";
/0A5(P&q/  
for (int i=0;i<6;i++)
ypeul27H8  
{
h570L^  
int start = random.nextInt(length);
L[4Aolk:M  
String rand=base.substring(start,start+1);
&hA0:^  
sRand+=rand;
D/ ^Kl  
$N^odf(2   
//讄字体的颜?
2A<BW~3FPt  
g.setColor(getRandColor(random,10,150));
C hhWE@!  
//讄字体
6<\w'-  
g.setFont(new Font(fontTypes[random.nextInt(fontTypesLength)],Font.BOLD,18 + random.nextInt(6)));
ftVk!3e  
//此汉字d囄?
dMjL#H}  
g.drawString(rand,24*i+ 10 + random.nextInt(8),24);
I_i 7 %  
}
! [ $qI1  
X8H6Fki  
eP{42 C0=  
//认证码存入session
kCl -?N{og  
session.setAttribute("rand",sRand);
<uT}CUy  
lfKXsvP  
+M'E6E%w  
g.dispose();
*$4SR?  
OIFYpaBXb  
<~[q5tC+  
//输出图象到页?
/z <4A^+  
ImageIO.write(image, "JPEG", response.getOutputStream());
L$ "5TP<  
%>
&+ Q :0Y  
~ oNku2,  
 |D6AG!J  
4f$X#:  
===========================
qozOA`,l  
/j|Au)P  
?此方法没有在本站JSP虚拟L试q?不知道性能如何,如果要用验证L:
~J|X4>.Vm  


]]>
jsp表达式语a(EL)Q{载)http://www.aygfsteel.com/simie/archive/2007/07/02/127514.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 04:54:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127514.htmlhttp://www.aygfsteel.com/simie/comments/127514.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127514.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127514.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127514.htmlSun Microsystems ?1997 q下半年推出?Servlet APIQ将它定位ؓ CGI 开发h员用的一U功能强大的工具Q这些开发h员正在寻找比 CGIQ通用|关接口Q编E更高效和轻便的优秀解决Ҏ。但是,开发h员很快就发现 Servlet API 有其自n的缺点,从代码的可维护性和可扩展性方面来看,该解x案难以实施。在某种E度上,q种~点促团队开发一U允许在 HTML 中嵌?Java 代码的解x??JavaServer Pages (JSP) 因此而出现?/p>

不久以后Q开发h员意识到表达与商务逻辑混合在一L复杂 JSP 不易于理解和维护。不能编?scriplet 的页面制作h员所面的另一个问题是׃标准标记集而带来的 JSP 限制。这些限制得难点变成利?JSP 实施自定义标记的机制来创?JSP 自定义标记?

JSP 标准标记?(JSTL) 是自定义标记库的集合Q它许?JSP 应用E序通用的核心功能封装ؓ单的标记。它不再需要?JSP scriptlet
和表辑ּQ而用表辑ּ的更高语法。它q实C通用目的的功能,如P代和条g化、数据管理格式化、XML 操作、数据库讉K、国际化和对本地化信息敏感的格式化标C?SQL 标记。JSTL 1.0 推出?EL 的概念,但只限于 JSTL 标记。在 JSP 2.0 中,您可以用带模板文本?ELQ甚臛_以通过 javax.servlet.jsp.el 获得~程方式的访问?br>
在我们了?JSTL 如何适应环境以及?JSTL 表达式语a相关的限制以后,我们来看 JSP 2.0 的重要优点之一 ?JSP 表达式语a (EL)。我们将特别涉及C下内容:

JSP 表达式语a定义
在无脚本?JSP 面中支?EL 的机?/u>
表达式语a语法
JSP EL 中有效的表达?/u>
使用 EL 表达?/u>

表达式语a的灵感来自于 ECMAScript ?XPath 表达式语aQ它提供了在 JSP 中简化表辑ּ的方法。它是一U简单的语言Q基于可用的命名I间QPageContext 属性)、嵌套属性和寚w合、操作符Q算术型、关pd和逻辑型)的访问符、映到 Java cM静态方法的可扩展函C及一l隐式对象?br>
EL 提供了在 JSP 脚本~制元素范围外用运行时表达式的功能。脚本编制元素是指页面中能够用于?JSP 文g中嵌?Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计。JSP 2.0 ?EL 表达式添加ؓ一U脚本编制元素?br>
脚本~制元素h三个从属形式Q?

  • 声明
  • Scriptlet
  • 表达式?br>
    让我们来看代码中的这三种从属形式Q?

     

     

    table.getColumn( )

    在将 EL d?JSP 工具包以后,可以使用更简单的语法来编写以上的代码Q而获得与以上 JSP 元素相同的结果。EL 表达式的另一个优势是Q可以在不允怋用上qCQ何脚本编制元素从属Ş式的无脚本的 JSP 中使用它。但是必L意,可以不用三U脚本编制元素从属Ş式中的Q一U来~写 JSP ,而对 JSP |否应该ؓ无脚本Ş式的选择则完全基于应用程序的需求。如果您希望明确分开表达与商务逻辑Q则q可以选择页面强制ؓ无脚本Ş式。通过强制成ؓ无脚本页面,必须通过其他元素Q如 JavaBean、EL 表达式、自定义操作和标准标记库Q提?JSP 늚动态行为?

  • 有两U机制可以确保页面不包含M脚本~制元素。每U机制还提供在无脚本?JSP 中支持 EL 的方法?

    • 使用面指示Q?/h4> 在用页面指C时Q您可以通过?isELEnabled 指示的值相应地设ؓ“true”?#8220;false”Q指定是否支?ELQ如下所C:


    • 使用部v描述W的元素Q?/h4> 当用部|描q符的元素时Q您可以通过?标记间包含布?#8220;true”?#8220;false”Q指定是否支?ELQ如下所C:
      ...


      *.jsp
      true
      true


      ....

    JSP 表达式语a允许面制作人员使用单语法访问组Ӟ如:

       
    ${expr}

    在以上的语法中,expr 代表有效的表辑ּ。必L意,该表辑ּ可以与静态文本؜合,q可以与其他表达式结合成更大的表辑ּ?

    有效表达式可以包含文字、操作符、变量(对象引用Q和函数调用。我们将分别了解q些有效表达式中的每一U:

    文字

    JSP 表达式语a定义可在表达式中使用的以下文字:

     

    文字 文字的?/th>

    Boolean

    true ?false

    Integer

    ?Java cM。可以包含Q何正数或负数Q例?24?45?67

    Floating Point

    ?Java cM。可以包含Q何正的或负的点敎ͼ例如 -1.8E-45?.567

    String

    M由单引号或双引号限定的字W串。对于单引号、双引号和反斜杠Q用反斜杠字符作ؓ转义序列。必L意,如果在字W串两端使用双引P则单引号不需要{义?/p>

    Null null

    让我们来看一些用文字作为有效表辑ּ的示例:

    ${false} 
    ${3*8)

    操作W?/h3>

    JSP 表达式语a提供以下操作W,其中大部分是 Java 中常用的操作W:

     

    术语 定义

    术?/p>

    +?Q二元)??、div?、mod?Q一元)

    逻辑?/p>

    and?amp;&、or、||?、not

    关系?/p>

    ==、eq?=、ne?lt>、gt?lt;=、le?gt;=、ge。可以与其他D行比较,或与布尔型、字W串型、整型或点型文字进行比较?/p>

    I?/p>

    I操作符是前~操作Q可用于定值是否ؓI?/p>

    条g?/td> A ?B :C。根?A 赋值的l果来赋?B ?C?

    让我们来看一些用操作符作ؓ有效表达式的CZQ?

    ${ (6 * 5) + 5 } 
    ${empty name}

    隐式对象

    JSP 表达式语a定义了一l隐式对象,其中许多对象?JSP scriplet 和表辑ּ中可用:

    术语 定义

    pageContext

    JSP 늚上下文。它可以用于讉K JSP 隐式对象Q如h、响应、会话、输出、servletContext {。例如,${pageContext.response} 为页面的响应对象赋倹{?/p>

    此外Q还提供几个隐式对象Q允许对以下对象q行易访问:

     

    术语 定义

    param

    ?h参数名称映射到单个字W串参数|通过调用 ServletRequest.getParameter (String name) 获得Q。getParameter (String) Ҏq回带有特定名称的参数。表辑ּ $(param.name) 相当?request.getParameter (name)?/p>

    paramValues

    ?h参数名称映射C个数值数l(通过调用 ServletRequest.getParameter (String name) 获得Q。它?param 隐式对象非常cMQ但它检索一个字W串数组而不是单个倹{表辑ּ ${paramvalues.name) 相当?request.getParamterValues(name)?/p>

    header

    请求头名称映射到单个字W串头|通过调用 ServletRequest.getHeader(String name) 获得Q。表辑ּ ${header.name} 相当?request.getHeader(name)?/p>

    headerValues

    ?h头名U映到一个数值数l(通过调用 ServletRequest.getHeaders(String) 获得Q。它与头隐式对象非常cM。表辑ּ ${headerValues.name} 相当?request.getHeaderValues(name)?/p>

    cookie ?cookie 名称映射到单?cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表辑ּ ${cookie.name.value} q回带有特定名称的第一?cookie 倹{如果请求包含多个同名的 cookieQ则应该使用 ${headerValues.name} 表达式?/td>
    initParam 上下文初始化参数名U映到单个|通过调用 ServletContext.getInitparameter(String name) 获得Q?

    除了上述两种cd的隐式对象之外,q有些对象允许访问多U范围的变量Q如 Web 上下文、会话、请求、页面:

     

    术语 定义

    pageScope

    页面范围的变量名称映射到其倹{例如,EL 表达式可以?${pageScope.objectName} 讉K一?JSP 中页面范围的对象Q还可以使用 ${pageScope.objectName.attributeName} 讉K对象的属性?/p>

    requestScope

    ?h范围的变量名U映到其倹{该对象允许讉Kh对象的属性。例如,EL 表达式可以?${requestScope.objectName} 讉K一?JSP h范围的对象,q可以?${requestScope.objectName.attributeName} 讉K对象的属性?/p>

    sessionScope

    会话范围的变量名称映射到其倹{该对象允许讉K会话对象的属性。例如:


    $sessionScope.name}

    applicationScope

    应用程序范围的变量名称映射到其倹{该隐式对象允许讉K应用E序范围的对象?/p>

    必须注意Q当表达式根据名U引用这些对象之一Ӟq回的是相应的对象而不是相应的属性。例如:即现有?pageContext 属性包含某些其他|${pageContext} 也返?PageContext 对象?

     

    EL 表达式可用于两种情况Q?/p>

    • 作ؓ标准操作和自定义操作中的属性?br>
    • ?JSP 文g的模板文本中Q如 HTML 或非 JSP 元素 ?在这U情况下Q模板文本中的表辑ּ被赋值ƈ插入到当前的输出中。但是,必须注意Q如果标记的M被声明ؓ与标记相养I则不会对表达式赋倹{?



    ]]>
    Servlets和JSP开发原则(转蝲Q?/title><link>http://www.aygfsteel.com/simie/archive/2007/07/02/127513.html</link><dc:creator>和田?/dc:creator><author>和田?/author><pubDate>Mon, 02 Jul 2007 04:51:00 GMT</pubDate><guid>http://www.aygfsteel.com/simie/archive/2007/07/02/127513.html</guid><wfw:comment>http://www.aygfsteel.com/simie/comments/127513.html</wfw:comment><comments>http://www.aygfsteel.com/simie/archive/2007/07/02/127513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/simie/comments/commentRss/127513.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/simie/services/trackbacks/127513.html</trackback:ping><description><![CDATA[<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术是?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>开发服务器端应用的主要技术,是开发商务应用表C端的标准?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>开发者喜Ƣ用它有多U原因,其一是对于已l熟?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>语言的开发者来说这个技术容易学习;其二?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>?#8220;一ơ编写,到处q行”的理念带入到Web应用中,实现?#8220;一ơ编写,到处实现”。而且更ؓ重要的是Q如果遵循一些良好的设计原则的话Q就可以把表C和内容相分,创造出高质量的、可以复用的、易于维护和修改的应用程序。比方说Q在HTML文档中如果嵌入过多的<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码QscriptletQ,׃D开发出来的应用非常复杂、难以阅诅R不Ҏ复用Q而且对以后的l护和修改也会造成困难。事实上Q在CSDN?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a><a class=channel_keylink href="http://bbs.bc-cn.net/"><u><font color=#0000ff>论坛</font></u></a>中,l常可以看到一些提问,代码很长Q可以逻辑却不是很清晰Q大量的HTML?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码h在一P让h看得一头雾水。这是随意开发的弊端?br><br>  如果你已l基本了?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>的各Ҏ术(最好也开发过一些Web应用Q,那么我们可以一h讨一下如何开?#8220;?#8221;的应用的一些指导原则。我们首先对<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术做一个浏览?br><br> <span style="FONT-WEIGHT: bold"> </span><a class=channel_keylink style="FONT-WEIGHT: bold" href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a><span style="FONT-WEIGHT: bold">?/span><a class=channel_keylink style="FONT-WEIGHT: bold" href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a><span style="FONT-WEIGHT: bold">概览</span><br><br>  早期的动态网主要采用CGIQCommon Gateway InterfaceQ公q?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=%BD%D3%BF%DA"><u><font color=#0000ff>接口</font></u></a>Q技术,你可以用不同的语言~写CGIE序Q如<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/vb/Index.html"><u><font color=#0000ff>VB</font></u></a>、C/<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/cjj/Index.html"><u><font color=#0000ff>C++</font></u></a>?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/delphi/Index.html"><u><font color=#0000ff>Delphi</font></u></a>{。虽然CGI技术发展成熟且功能强大Q但׃~程困难、效率低下、修改复杂等~点Q所以有逐渐被取代的势。在所有的新技术中Q?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>具备更高效、更Ҏ~程、功能更强、更安全和具有良好的可移植性,因而被许多为是未来最有发展前途的动态网站技术?br><br>  与CGI怼Q?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>支持h/响应模型。当一个客户向服务器递交一个请求时Q服务器把请求送给<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>Q?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>负责处理hq生成响应,然后送给服务器,再由服务器发送给客户。与CGI不同的是Q?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>没有生成新的q程Q而是与HTTP Server处于同一q程中。它通过使用U程技术,减小了服务器的开销?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>处理h的过E是q样的:当收到来自客L的请求后Q调用serviceҎQ该Ҏ?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>先判断到来的h是什么类型的QGET/POST/HEAD…Q,然后调用相应的处理方法(doGet/doPost/doHead…Qƈ生成响应?br><br>  别看q么复杂Q其实简单说?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>是一?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>cR与一般类的不同之处是Q这个类q行在一?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>容器内,可以提供<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=session&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>session</font></u></a>理和对象生命周期管理。因而当你?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>的时候,你可以得?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>q_的所有好处,包括安全性管理、用JDBC讉K<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据?/font></u></a>以及跨^台的能力。而且Q?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>使用U程Q因而可以开发出效率更高的Web应用?br><br>  <a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Server Pages (<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>)<br><br>  <a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术是J2EE的一个关键技术,它在更高一U的层次上抽?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>。它可以让常规静态HTML与动态生的内容相结合,看v来像一个HTML|页Q却作ؓ<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>来运行。现在有许多商业应用服务器支?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术,比如BEA WebLogic、IBM WebSphere?JRun{等。?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>比用<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>更简单。如果你有一个支?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>的Web服务器,q且有一?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>文gQ你可以把它攑րQ何静态HTML文g可以攄的位|,不用~译Q不用打包,也不用进行ClassPath的设|,可以像讉K普通网那栯问它Q服务器会自动帮你做好其他的工作?br><br>  <a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>工作原理<br><br>  <a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a> 文g看v来就像一个普通静态HTML文gQ只不过里面包含了一?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码。它使用.jsp的后~Q用来告诉服务器q个文g需要特D的处理。当我们讉K一?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面的时候,q个文g首先会被<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>引擎译Z?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>源文Ӟ其实是一?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>Qƈq行~译Q然后像其他<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>一P?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>引擎来处理?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>引擎装蝲q个c,处理来自客户的请求,q把l果q回l客P如下图所C: <br><br><img onerror="this.src='/Article/UploadFDL02/200602/20060217130122992.jpg';" hspace=3 src="http://www.360doc.com/DownloadImg/15540/389120_1.jpg" align=middle vspace=1 border=1><br>?Q?调用<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面的流E?br><br>  以后再有客户讉Kq个面的时候,只要该文件没有发生过更改Q?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>引擎q接调用已l装载的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>。如果已l做q修改的话,那就会再ơ执行以上过E,译、编译ƈ装蝲。其实这是所谓的“W一人惩|?#8221;。因为首ơ访问的时候要执行一pd以上的过E,所以会耗费一些时_以后的访问就不会q样了?<br><strong><br>开发原?/strong><br><br>  q一部分我们列出一些开发原则,重点?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面。关于如何分表现和内容的MVC因ؓ要涉及到<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>的整合,我们E候再谈?<br><br>  不要?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面中嵌入过量的<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码Q对于非常简单或是测试性的代码Q把所有的<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a> 代码直接攑օ<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面内是没有问题的。但是这U方法不应该被过度用,否则׃产生一大堆HTML?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>混合h的代码,让h难以阅读和理解。解x法是写一个单独的c,用来执行相关的计。一旦这个类试通过Q就可以把它攑֜M执行同样计算的场合中。这样可以促q代码的复用?<br><br>  选择合适的包含QincludeQ机? 如果一个应用中每个面有一L抬头和底部,或者还有导航条Q那么就应该把它们放C个单独的文g中,然后在每一个页面中使用包含机制把它们加入到q个面中:<br><br>Include 指oQ?Q?@ include file="filename" %Q或{效xml语法<br>Qjsp:directive.includefile=”filename” /Q?<br><br>Include 动作Q?Qjsp:include page="page.jsp" flush="true" /Q?<br><br>  Include指o是当<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面译?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>的时候包含另外一个文ӞInclude 动作是当h时包含另外一个文件的输出。如果被包含的文件不是经常改动的时候,我徏议用Include 指oQ这样速度更快。如果被包含的文仉要不时改动或者知道请求时才能军_需要包含的内容Ӟ那么应该使用Include 动作?br><br>  如果你?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>标准标记库(<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Server pages Standard Tag Library即JSTLQ的话,那么q有W三中包含机Ӟc:importQ,可以用来包含本地或者远E的资源。例如: <br><br>Qc:import url="./copyright.html"/Q?br>Qc:import url="http://www.somewhere.com/hello.xml"/Q?br><br>  不要把业务逻辑和表C؜合在一P 复杂的应用涉及大量的代码Q因而把业务逻辑和前端的表示相分d昑־格外重要Q这U分d以让M一方的变化不会影响到另外一斏V所以,所有的<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>代码都应该限制在表示层,可是如果q样的话Q你如何实现你的业务逻辑呢?q就?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean所做的事情?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean技术是一个独立于q_的组件模型,它让开发者编写、测试通过一个组件后Q可以随处用,提高了复用性。在<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术中Q?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean实现了业务逻辑部分Q它把数据返回给<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面Q由<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面负责格式化数据ƈ输出到客L的浏览器。在<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面中?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Beanlg的好处是Q?<br><br>  产生了可以复用的lgQQ何应用都可以使用q些lg <br><br>  可以把业务逻辑和表C相分离Q你可以修改数据的显C方式而不用考虑业务逻辑。这样做的结果也可以明确工作中开发h员的分工Q网开发h员可以把_֊攑ֈ如何昄数据上,<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>开发者则更ؓx业务逻辑的实现?<br><br>  对于<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean你不用提供源代码Q这样你的代码就不会被浏览器|页的hL获得Q可以保护你的劳动成果?<br><br>  如果你的应用中用了EJBlgQ那么业务逻辑应该放|在EJB中,因ؓEJB模型提供了生命周期管理、事务管理以及多客户讉K域对象(Entity BeansQ。你可以仔细看一下Enterprise BluePrints中的例子Q它是q么做的?<br><br>  使用定制的标讎ͼ 上面我们已经讨论q,把所?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码嵌入?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面内ƈ不合适,因ؓ|页开发h员ƈ不一定懂?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>语言Q更难以理解<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>语法?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean可以装很多<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码Q不q在<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面内?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean仍然要求面开发h员了解一?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>语法?br><br>  <a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术中包含了定制标记库的功能?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>开发h员可以生成自q标记库,q样|页设计人员可以用类似HTML的语法来使用q些标记。编写和使用自己定制的标记库可以在更大程度上促进业务逻辑和表C的分离。用定制标记库主要有以下好处: <br><br>  <strong>可以消除?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面中用scriptlet</strong> 标记使用的Q何参数都可以通过<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=%CA%F4%D0%D4"><u><font color=#0000ff>属?/font></u></a>传入Q从而不需要?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码可以达到希望的目的?<br><br>  <strong>可以化?/strong> |页设计人员不需要学会?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>语法Q他们可以用cMHTML语法可以用标记?<br>不懂<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>的网设计h员可以用标记库来完成单独用HTML不能完成的Q务?<br><br>  <strong>提高了复用?/strong> 标记库完全可以复用,q可以节省开发和试的时间。Scriptlet代码只能?#8220;拯_脓”U别上进?#8220;复用”?<br><br>  单说来,你可以像用HTML构徏表示层一样用标记库完成非常复杂的Q务。下面是表页标记库的一些注意事: <br><br>  1. 保持z性:如果一个标记需要好几个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=%CA%F4%D0%D4"><u><font color=#0000ff>属?/font></u></a>的话Q那么尽可能把它分ؓ几个标记?<br><br>  2. 保持复用性:同标记的使用人员Q网设计h员)多多交流Q尽量开发出可以高度复用的标记库?<br><br>  3. 不要一切都从头开始:现在已经有一些可以免费用的标记库,比如Jakarta Taglibs。如果你要用C个标讎ͼ先看看是不是已经有现成的可以使用?<br><br>  不要“重新发明轮子”Q不要一切从头开始: 通过定制lg可以提高复用性,不过定制lg仍然需要编写、测试和调试E序。问题是q个事情别h可能已经实现了,而且你的实现方式q不一定比人家做得更好。这是<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>标准标记库(<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Server Pages Standard Tag Library, JSTLQ要做的事情QJSTL请参考JSTL官方|站Q。JSTL提供了@环、读<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=%CA%F4%D0%D4"><u><font color=#0000ff>属?/font></u></a>、遍历各U?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/sjjg/Index.html"><u><font color=#0000ff>数据l构</font></u></a>、条件表辑ּ求值等各种标记。它也提供了一些复杂的标记Q甚臛_解析<a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>文档的标记它都有。所以如果你要用C个标记的话,最好先看看有没有别人已l实现的可以使用Q而不要次ơ从头开始,自己搞一套?<br><br>  使用JSTL表达使语aQJSTL Expression LanguageQ: 传递给<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面的数据一般通过<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>作用?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=%CA%F4%D0%D4"><u><font color=#0000ff>属?/font></u></a>或者请求参数来q行。专门ؓ|页开发者设计的表达式语aQExpression Language, ELQ把使用作用?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=%CA%F4%D0%D4"><u><font color=#0000ff>属?/font></u></a>传递信息作Z业务逻辑?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面传递信息的标准方式。这里要注意的是QEL只是<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术中关键的一个方面,q不是一U通用的程序设计语a。相反,它只是一U数据访问语aQ它可以化应用程序的数据的访问,不用Scriptlet和请求时表达式求值就可以讉K数据?br><br>  ?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>中,|页设计师要使用表达式语法<%= name %Q或<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Beanlg来取得某些变量或<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=%CA%F4%D0%D4"><u><font color=#0000ff>属?/font></u></a>的|例如Q?<br><br>QtagLib:tag attribute="Q?=<br><br>pageContext.getAttribute("name") %Q?Q?br><br>  ?<br><br>Q?= aCustomerBean.getAddress().getCountry() %Q?br><br>  表达使语a让网设计师可以使用化的语法来访问信息。如果你只是要访问一个简单的变量Q你可以使用q样的语法:<br><br>QtagLib:tag attribute="${name}"Q?br><br>  如果你要讉K一个嵌?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=%CA%F4%D0%D4"><u><font color=#0000ff>属?/font></u></a>Q你可以q样Q?br><br>QtagLib:tag attribute ="${<br><br>aCustomerBean.address.country}"Q?br><br>  表达式语aQELQ借用?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Script 的语法,所以如果你?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Script 很熟悉的话,你就会觉得巨爽?br><br>  使用qo器(filterQ: qo器是一个对象,可以传输h或修改响应。它可以在请求到?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>之前对其q行预处理,而且能够在响应离开<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>之后对其q行后处理。所以如果你有几?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>需要执行同L数据转换或页面处理的话,你就可以写一个过滤器c,然后在部|描q文Ӟweb.xmlQ中把该qo器与对应?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>联系h?br><br>  创徏qo器其实很ҎQ你只须实现javax.servlet.Filter<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=%BD%D3%BF%DA"><u><font color=#0000ff>接口</font></u></a>及它的三个方法:<br><br>public void init(FilterConfig config)<br><br>public void doFilter(<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>Request req, <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>Response rep, <br><br>FilterChain chain)<br><br>public void destroy()<br><br>  q样Q你可以完成你的过滤器?br><br>使用可移植的安全模型Q大部分的应用服务器都提供了安全模型Q不q一般它们都是针Ҏ一个服务器或某一个厂商专有的。如果你的应用需要移植的话,那么你的应用最好用可以移植的安全模型。如果你的应用有一些预先定义的固定用户的话Q那么你可以使用FROM验证和BASIC验证。可是如果你要动态生成客L话(一般都是这U情况)Q你可能需要用服务器特定的API来创建和理用户。这样当你的应用UL到另外一个服务器Ӟ你可能就会碰到API不兼容的问题。这U情况下Q最好的解决Ҏ是用适配器(AdapterQ模式(如果你对设计模式不熟悉的话,请参看GoF的《设计模式》一书)?<br><br>  ?a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据?/font></u></a>来保存持久性数据: <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>中可以用HttpSession对象也就是会话对象来保存用户的时数据。不q如果你想保存持久性数据的时候,你应该?a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据?/font></u></a>Q数据保存数据会更安全,而且对客h用的览器没有什么要求。这样即使你的应用服务器׃某种原因崩溃了,你的数据依然良好?<br><br>  高速缓存页面: 应用E序中L一些东西是相对固定的,而另外一些东西是l常变化的。你应该使用静态的HTML文档来存储那些相对固定的内容Q这样客L可以进行高速缓存,客户每次讉K你的应用Ӟ只需讉K已经改动的部分。这样可以加快客L讉K速度?<br><br>  使用q接池: 如果你要自己?a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据?/font></u></a>讉K代码的话Q我觉得使用你应该学会如何?a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据?/font></u></a>q接池技术。每一个服务器都有针对<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据?/font></u></a>q接池的配置文档Q你要学习一下如何用?a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据?/font></u></a>q接池可以加速你的应用的数据讉K的速度Q而且׃服务器替你管理了<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据?/font></u></a>q接Q这可以节省你的很多工作?<br><br>  ~存<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据?/font></u></a>的访问结果: 如果你的应用要对<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据?/font></u></a>q行频繁讉K的话Q你可以使用一个对象来~存你的数据Q这样你可以节省大量访?a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据?/font></u></a>的开销。在《J2EE核心模式》和《实用J2EE设计模式~程指南》两本书中都有关于值对象模式(Value Object PatternQ的详细探讨Q你可以参考这两本书来获得相应的知识?<br><br>  使用数据讉K对象模式Q如果你的应用需要访问多?a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据?/font></u></a>pȝ或者可能会UL到其它的存储pȝ中,那么你针对特定厂商的优化代码可能会失效。用通用的代码存在执行效率的问题Q而用优化代码又存在UL的问题。所以就产生了数据访问对象模式(Data Access Object Pattern, DAOQ,该模式既提供了各<a class=channel_keylink href="http://www.bc-cn.net/Article/sjk/Index.html"><u><font color=#0000ff>数据?/font></u></a>厂商的适应性,又能利用C们提供的独特的好处。按?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=%C3%E6%CF%F2%B6%D4%CF%F3"><u><font color=#0000ff>面向对象</font></u></a>的分MQ务的原则Q该模式与企业信息pȝQEnterprise Information System, EISQ通讯需要的逻辑隔离到它自己的类中。这P事物对象Q如<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>/<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>lg?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean可以利用数据访问对象(DAOQ处理所有与EIS有关的事务?<br><br>  最好采?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>?a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>语法Q?<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术中l常存在着两种完成同一个Q务的语法Q一U是常规?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>语法Q一U是对应?a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>语法。虽然两U语法作用相同,你最好还是?a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>语法。存在两U语法的原因是,<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>语法可以与以前的代码兼容Q而J2EE使用<a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>作ؓ其交换数据的核心Q所以同时提供了<a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>语法。随着J2EE的发展,<a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>的作用会来大Q所以我你?a class=channel_keylink href="http://www.bc-cn.net/Article/web/xml/Index.html"><u><font color=#0000ff>XML</font></u></a>语法?<br><br>  研究Sun提供的J2EE BluePrints: Sun的Enterprise BluePrints 提供了大量指导原则、设计模式和很好的例子(宠物店,Pet StoreQ。你可以好好研究一下这些内容,q样可以提高你的设计和开发水q?<br><br>  <strong>整合<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a></strong><br><br>  <a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术规范种l出了两U?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>开发Web应用的方式,q两U方式可以归Uؓ模型一和模型二Q这两种模型的主要差别在于它们处理业务的程不同。模型一Q如下图所C,UC?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>+<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Beans模型。在q一模型中,<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面独自响应hq将处理l果q回l客P所有的数据通过<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Bean来处理,<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>实现面的表现?br><br><img onerror="this.src='/Article/UploadFDL02/200602/20060217130123372.jpg';" hspace=3 src="http://www.360doc.com/DownloadImg/15540/389120_2.jpg" align=middle vspace=1 border=1><br>?Q?<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>模型一 <br><br>  从上囑֏以看出,模型一也实C面表现和业务逻辑相分R然而用这U方式就要在<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面使用大量?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>代码Q当需要处理的业务逻辑很复杂时Q这U情况会变得非常p糕。大量嵌入式代码使整个页面程序变得异常复杂。对于前端界面设计的|页开发h员来_q简直是一场噩梦。所以,模型一不能满大型应用的需要,但是对于型应用Q因模型单,不用涉及诸多要素Q从而可以很好地满型应用的需要,所以在单应用中Q可以考虑模型一?br><br>  模型二,如下图所C,UC?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>+<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>+<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Beans模型。这一模型l合?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>技术,充分利用?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>两种技术原有的优势。这个模型?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>技术来表现面Q?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>技术完成大量的事务处理Q用Bean来存储数据?a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&ClassID=&keyword=Servlet&Submit=+%CB%D1%CB%F7+"><u><font color=#0000ff>Servlet</font></u></a>用来处理h的事务,充当一个控制者的角色Qƈ负责向客户发送请求。它创徏<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>需要的Bean和对象,然后Ҏ用户h的行为,军_哪?a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>面发送给客户?br><br><img onerror="this.src='/Article/UploadFDL02/200602/20060217130123452.jpg';" hspace=3 src="http://www.360doc.com/DownloadImg/15540/389120_3.jpg" align=middle vspace=1 border=1><br>?Q?<a class=channel_keylink href="http://www.bc-cn.net/Article/web/jsp/Index.html"><u><font color=#0000ff>JSP</font></u></a>模型?br><br>  从开发的观点看,模型二具有更清晰的页面表玎ͼ清楚的开发角色的划分Q可以充分利用开发团队中的网设计h员和<a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>开发h员。这些优势在大型目中表现得ؓH出Q网设计h员可以充分发挥自q术和设计才能来充分表现面Q程序编写h员可以充分发挥自q业务逻辑处理思维Q实现项目中的业务处理?br><br>  另外Q从设计l构来看Q这U模型充分体C模型视图控制器(MVCQ的设计架构。事实上Q现存的很多开发框枉是基于这U模型的Q充分实CMVC Q例如Apache Struts框架?a class=channel_keylink href="http://www.bc-cn.net/Article/kfyy/java/Index.html"><u><font color=#0000ff>Java</font></u></a>Server Faces框架 <br> <img src ="http://www.aygfsteel.com/simie/aggbug/127513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/simie/" target="_blank">和田?/a> 2007-07-02 12:51 <a href="http://www.aygfsteel.com/simie/archive/2007/07/02/127513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP 2.0的新Ҏ?/title><link>http://www.aygfsteel.com/simie/archive/2007/07/02/127505.html</link><dc:creator>和田?/dc:creator><author>和田?/author><pubDate>Mon, 02 Jul 2007 04:32:00 GMT</pubDate><guid>http://www.aygfsteel.com/simie/archive/2007/07/02/127505.html</guid><wfw:comment>http://www.aygfsteel.com/simie/comments/127505.html</wfw:comment><comments>http://www.aygfsteel.com/simie/archive/2007/07/02/127505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/simie/comments/commentRss/127505.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/simie/services/trackbacks/127505.html</trackback:ping><description><![CDATA[SUN 的新版J2EE1.4提供了在J2EE中开发Web Service的基Q对开发工具做了一些重要的增强Q在应用E序部v和服务器理斚w也提供了新的标准Q在集成性和安全性方面有所增强Q提升了J2EE开发Web应用E序的能力;在编E模型方面的重要变化包括JSP表达式语a、简化的标记库等QEJB 2.1中提供了新的timer服务Q查询语aQQLQ也有所增强QJdbc3.0 API把通常的Jdbc API与扩充APIl合hQJ2EE Connectors规范和独立于消息cd的EJB提供了对双向通信的支持。下面给大家重点介绍J2EE1.4中包含的JSP2.0、Servlet2.4、Jdbc3.0以及EJB2.1斚w的新Ҏ? <p>    JSP 2.0属于J2EE 1.4q_Q它在JSP 1.2基础之上增加了新的功能。它保证了向下兼容,原先使用的JSP技术在JSP 2.0中都可以支持。JSP 2.0的新功能主要包括下面几部分:</p> <h5>一Q运行环境变?/h5> <p><strong>1、web.xml格式变化</strong></p> <p>我们知道JSP 1.2可以在Java 2标准?.3版本q行Q而JSP 2.0要求使用Java 2标准?.4或更新版本,JSP 2.0使用由Servlet 2.4规定的WebE序部v描述格式?/p> <p>在WebE序描述文gweb.xml中需要用xml schema打头的格式。在web.xml中主要的变化是所有有关JSP的设|信息要攑֜<jsp-config>标记中。下面程序例1昄了一个web.xml大致的样子?/p> <p>  <strong>  ?Q?/strong></p> <p>    <font color=#0066ff><?xml version="1.0" encoding="IS0-8859-1"?></font></p> <p><font color=#0066ff>    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"</font></p> <p><font color=#0066ff>    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</font></p> <p><font color=#0066ff>    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"</font></p> <p><font color=#0066ff>    version="2.4"></font></p> <p><font color=#0066ff>    .......</font></p> <p><font color=#0066ff>    <jsp-config></font></p> <p><font color=#0066ff>    <taglib>    </font></p> <p><font color=#0066ff>    <taglib-uri></font></p> <p><font color=#0066ff>    http://www.icconcept.com/ics/sample-taglib</font></p> <p><font color=#0066ff>    </taglib-uri></font></p> <p><font color=#0066ff>    <taglib-location></font></p> <p><font color=#0066ff>    /WEB-INF/jsp/sample-taglib.tld</font></p> <p><font color=#0066ff>    </taglib-location></font></p> <p><font color=#0066ff>    </taglib></font></p> <p><font color=#0066ff>    ........</font></p> <p><font color=#0066ff>    <jsp-property-group></font></p> <p><font color=#0066ff>    <description></font></p> <p><font color=#0066ff>    For config the ICW sample application</font></p> <p><font color=#0066ff>    </description></font></p> <p><font color=#0066ff>    <display-name>JSPConfiguration</display-name></font></p> <p><font color=#0066ff>    <url-pattern>/jsp/datareset.jsp</url-pattern></font></p> <p><font color=#0066ff>    <el-ignored>true<Qel-ignored></font></p> <p><font color=#0066ff>    <page-encoding>ISO-8859-1</page-encoding></font></p> <p><font color=#0066ff>    <scripting-invalid>true</scripting-invalid></font></p> <p><font color=#0066ff>    <include-prelude>/jsp/prelude.jspf</include-prelude></font></p> <p><font color=#0066ff>    <include-coda>/jsp/coda.jspf</include-coda></font></p> <p><font color=#0066ff>    </jsp-property-group></font></p> <p><font color=#0066ff>    </jsp-config></font></p> <p><font color=#0066ff>    </web-app></font></p> <div>2、JSP讄</div> <div>   ?lt;jsp-config>标记提供了WebE序中JSPE序的设|信息?lt;jsp-config>包括<taglib>?lt;jsp-property-group>两类元素?lt;taglib>定义了WebE序使用的custom tagQ它的用法和以前JSP 1.2中的用法相同?lt;jsp-property-group>定义了一lJSP的特性。这些特性实际上对应JSP的page directive定义的特性。通过<jsp-property-group>只不q可以方便地对多个具有相同属性的JSPl一定义?/div> <div>    <jsp-property-group>定义一个或多个URL样式Q在<jsp-property-group>中定义的属性会适用于匹配这些URL样式的所有JSP文g。在<jsp-property-group>中的属性可以定义以下设|:</div> <div>    (1)允许或禁止用表辑ּ语言(EL)</div> <div>    ?lt;jsp-property-group>中可以设定是否允许对?lt;url-pattern>的JSP使用JSTL表达式语a(EL)。如?lt;el-ignored>属性标记被讑֮为falseQJSP中的EL表达式会被处理;如果是trueQWeb容器会在转换JSP时忽略EL表达式?/div> <div>    (2)允许或禁止用scripting</div> <div>    <scripting-invalid>属性可以允许或止使用JSP的脚本语a(scripting)。如果这个属性标记对应ؓtrueQ即scripting元素被禁止,则JSP中不能用scriptletQscripting表达式和declarationQ否则会有{换错误。当q个属性标CؓfalseӞJSP可以像在1.2版本之前那样使用脚本语言?/div> <div>    (3)声明JSP~码</div> <div>    通过<page-encoding>标记可以讄对应<url-pattern>的JSP|页的编码。这个属性对应每个JSP中的pageEncoding属性,Web容器根据这个属性对JSP内容q行~码?/div> <div>    (4)对应隐含包括(Implicit Includes)</div> <div>    ?lt;jsp-property-group>中可以在对应JSP中加入抬?preludes)和结?coda)Q?lt;include-prelude>?lt;include-coda>属性可以设定在JSP|页中包括的preludes和coda的jspf文g。这些文件的位置相对于当前WebE序的context。当有超q一个preludes或coda元素?lt;jsp-property-group>中时QJSP会按照其序加入到内容中?br></div> <h5>二)引入表达式语a(EL)</h5> <p>JSP 2.0的一个主要特Ҏ它支持表达语a(expression language)。JSTL表达式语a可以使用标记格式方便地访问JSP的隐含对象和JavaBeanslgQJSTL的核心标记提供了程和@环控制功能。自制标C有自定义函数的功能,因此基本上所有seriptlet能实现的功能都可以由JSP替代。在JSP 2.0中,量使用EL而JSP的格式更一致?/p> <p>在web.xml?lt;jsp-property-group>中可以控制一lJSP是否使用ELQ在每个JSP中也可以指定是否该JSP使用EL。在page directive中的isELIgnored属性用来指定是否忽略。格式ؓQ?/p> <p>  <%@ page isELIgnoredQ?true|false"%></p> <p>如果讑֮为真Q那么JSP中的表达式被当成字符串处理。比如下面这个表辑ּ<p>${2000 % 20}</p>在isELIgnoredQ?true"时输Zؓ${2000 % 20}Q而isELIgnoredQ?false"时输Zؓ100。Web容器默认isELIgnoredQ?false"?/p> <div> 虽然JSP 2.0可以使JSP中完全用表达语a而避免scriptletQ在实际~程中,应该ҎE序的功能要求和~程人员的自w条仉择合适的方式。用表达语a的JSP比较方便规整Q但是由于需要将标记q行转换Q在W一ơ被调用时会比较慢;有些~程人员׃对Java比较了解Q因而更习惯JSP 1.2之前的编E方式,因此Q在使用中应因地制宜地选择适用的编E方法?nbsp;   </div> <div> </div> <h5>三)SimpleTag</h5> <p>JSP 2.0中加入了新的创徏自制标记的APIQjavax.servlet.jsp.tagext.SimpleTag定义了用来实现简单标记的接口。和JSP 1.2中的已有接口不同的是QSimpleTag接口不用doStartTag()和doEndTag()ҎQ而提供了一个简单的doTag()Ҏ。这个方法在调用该标记时只被使用一ơ。而需要在一个自制标C实现的所有逻辑q程、@环和ҎC的评估等都在q个Ҏ中实现。从q个斚w来讲QSimpleTag和IterationTag可以辑ֈ同等的作用。但SimpleTag的方法和处理周期要简单得多。在SimpleTag中还有用来设|JSP内容的seUspBody()和getJspBody()Ҏ。Web容器会用setJspBody()Ҏ定义一个代表JSP内容的JspFragment对象。实现SimpleTag标记的程序可以在doTagҎ中根据需要多ơ调用getJspBody().invoke()Ҏ以处理JSP内容?/p> <p> 例如Q程序例2 SimpleTagҎ指定的次?times)q行循环q输出当前序?sequence)。程序的l构比较单,所有逻辑都在doTagҎ中实现?/p> <p><strong>?Q?/strong></p> <p>  <font color=#0066ff>packageICW.taglib;</font></p> <p><font color=#0066ff>  importjavax.servlet.jsp.JspException;</font></p> <p><font color=#0066ff>  importjavax.servlet.jsp.tagext.SimpleTagSupport;</font></p> <p><font color=#0066ff>  importjava.util.HashMap;</font></p> <p><font color=#0066ff>  importjava.io.IOException;</font></p> <p><font color=#0066ff>  public class IterationSimpleTag extends SimpleTagSupport{</font></p> <p><font color=#0066ff>  privateint times;</font></p> <p><font color=#0066ff>public void setTimes(int_times){</font></p> <p><font color=#0066ff>    this.times=_times;</font></p> <p><font color=#0066ff>        }</font></p> <p><font color=#0066ff>    public void doTag() throws JspException,IOException{</font></p> <p><font color=#0066ff>    HashMapparams=new HashMap();</font></p> <p><font color=#0066ff>    for(inti=0; i<times;i++){</font></p> <p><font color=#0066ff>    params.put("sequence",String.valueOf(i+1));</font></p> <p><font color=#0066ff>    getJspBody().invoke(null,params);</font></p> <p><font color=#0066ff>      }</font></p> <p><font color=#0066ff>     }</font></p> <div><font color=#0066ff>    }</font> <div> </div> <div>q个标记的TLD文g内容如下Q它使用了XML schcma定义标记的用方法?/div> <p>    E序?如下Q?/p> <p>    <font color=#0066ff><?xml version="1.0" encoding="UTF-8" ?></font></p> <p><font color=#0066ff>    <taglibxmlns="http://java.sun.com/xml/ns/i2ee"</font></p> <p><font color=#0066ff>    xmlns:xsi="http://WWW.w3.org/2001/XMLSchema-instance"</font></p> <p><font color=#0066ff>    xsl:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglihrary_2_0.xsd"</font></p> <p><font color=#0066ff>    version="2.0"></font></p> <p><font color=#0066ff>  <taglib></font></p> <p><font color=#0066ff>    <tiib-version>1.0</tlib-version></font></p> <p><font color=#0066ff>    <short-name>Jwad book simple tag</short-name></font></p> <p><font color=#0066ff>    <uri>/JwadSimpleTag</uri></font></p> <p><font color=#0066ff>    <description>Simple Tag Handler</description></font></p> <p><font color=#0066ff>    <tag></font></p> <p><font color=#0066ff>    <name>iteration</name></font></p> <p><font color=#0066ff>    <tag-class>ICW.taglib.<strong>IterationSimpleTag</strong></tag-class></font></p> <p><font color=#0066ff>    <body-content>scriptless</body-content></font></p> <p><font color=#0066ff>    <description>Iteration Tag</description></font></p> <p><font color=#0066ff>    <variable></font></p> <p><font color=#0066ff>    <description>Current iterationnumber</description></font></p> <p><font color=#0066ff>    <name-given>sequence</name—given></font></p> <p><font color=#0066ff>    </variable></font></p> <p><font color=#0066ff>    <attribute></font></p> <p><font color=#0066ff>    <name>times</name></font></p> <p><font color=#0066ff>    <required>true</required></font></p> <p><font color=#0066ff>    <rtexprvalue>true</rtexprvalue></font></p> <p><font color=#0066ff>    </attribute></font></p> <p><font color=#0066ff>    </tag></font></p> <div><font color=#0066ff>   </taglib></font> <div> </div> <p>E序?中的JSP使用上面?中定义的IterationSimpleTagQ它ҎWebh参数中给定的“times”的D行一定次数的循环。在每次循环中将输出"sequence"的倹{?/p> <p>    <strong>?Q?/strong></p> <p>    <font color=#0066ff><%@ taglib prefix="ictag" uri="/WEB-INF/ics-jsp2.tld" %></font></p> <p><font color=#0066ff>    <HTML><HEAD><TITLE>Simple Tag Sample</TITLE></HEAD></font></p> <p><font color=#0066ff>    <BODY></font></p> <p><font color=#0066ff>    <CENTER></font></p> <p><font color=#0066ff>    <FONT COLOR='#009999' SIZE='4' face='Arial'></font></p> <p><font color=#0066ff>    <STRONG>Interation Simple Tag</STRONG></font></p> <p><font color=#0066ff>    </FONT></font></p> <p><font color=#0066ff>    </CENTER></font></p> <p><font color=#0066ff>    <HR></font></p> <p><font color=#0066ff>    <c:setvar="time" value="$"/></font></p> <p><font color=#0066ff>    <p><B>Reminder:</B></p><br></font></p> <p><font color=#0066ff>    <ictag:iteration times="$"></font></p> <p><font color=#0066ff>    This is the $ Of $ times of reminder<br></font></p> <p><font color=#0066ff>    </ictag:iteration></font></p> <p><font color=#0066ff>    </body></font></p> <div><font color=#0066ff>    </html></font> <div> </div> <h5>四)使用JSP fragment</h5> <p> JSP 2.0中的一个主要功能是JSP fragmentQ它的基本特Ҏ可以使处理JSP的容器推q评估JSP标记属性。我们知道一般JSP是首先评估JSP标记的属性,然后在处理JSP标记时用这些属性,而JSP fragment提供了动态的属性。也是_q些属性在JSP处理其标C时是可以被改变的。JSP需要将q样的属性定义ؓjavax.servlet.jsp.tagext.JspFragmentcd。当JSP标记讄成这UŞ式时Q这U标记属性实际上的处理方法类g标记体。在实现标记的程序中Q标记属性可以被反复评估多次。这U用法称为JSP fragment。JSP fragmentq可以定义在一个SimpleTag处理E序中用的自制标记动作。像前面例子说明的,getJspBodyq回一个JspFragment对象q可以在doTagҎ中多ơ用。需要注意的是,使用JSP fragment的JSP只能有一般的文本和JSP actionQ不能有scriptlet和scriptlet表达式?/p> <p>  我们可以单地认ؓJSP fragment是一D可以重复用的JSP。一DJSP fragment可以被传递到另一个JSP中ƈ被用。与JSP include概念不同的是QJSP fragment一般功能比较短简单而且重复使用率高?/p> <p>  JSP fragment一般在<jsp:attribute>标记体内?lt;jspcbody>标记体内定义。每ơ当含有JSP fragment的标记被使用ӞWeb容器生成一个JspFragment对象Q这个对象和当前JSP的page scope联系h。同Ӟq个JspFragment对象和包含它的父标记建立联系。JspFragment对象可以有两U调用方式:使用Java~写的标记处理程序,或者用标记文?tag file)。标记文件可以?lt;jsp:invoke>Q或?lt;jsp:doBody>动作使用JSP fragment?nbsp; JSP标记文g可以和JSP fragment共同工作。CustomTag都是以编E方式实现的。JSP标记文g是用文本文g格式(JSP语法)实现自制标记Q这也是JSP 2.0的一个主要新功能。一个标记文件可以对应一个标讎ͼ可以不需tld文g定义该标记的Ҏ。这P即ɾ~程人员不熟悉JavaQ也可以使用JSP语法定义自己的标记。标记文件一般?tag为后~q放在WebE序?WEB-INF目录下?/p> <div>  E序?中的taskstatus.jsp使用了两个JSP fragment。这个JSP的功能是昄一lTask的名U和完成日期Q它通过<jsp:attribute nameQ?...">定义了两DJSPfragment(名称为onSehedule和delayed)。在<jsp:attribute>标记内的JSP是JSPfragmentQ?lt;jsp:attribute>标记被一?lt;ietag:listTasks>包围。这个标记是一个通过标记文g定义的自制标讎ͼ它的定义文g?WEB-INF/tags目录下。标记文件的名称和标记名UC致ؓ“listTasks.tag"。这个标C使用到前面定义的两个JSP fragment?/div> <div> </div> <div><strong> ?:</strong></div> <p>  <font color=#0066ff><%@ taglib prefix="ictag" tagdir="/WEB-INF/tags" %></font></p> <p><font color=#0066ff>  <HTML><HEAD><TITLE>JSP Fragment Sample</TITLE></HEAD></font></p> <p><font color=#0066ff>  <BODY></font></p> <p><font color=#0066ff>    <CENTER></font></p> <p><font color=#0066ff>    <FONT COLOR='#009999' SIZE='4' face='Arial'></font></p> <p><font color=#0066ff>    <STRONG>JSP Fragment Sample Using Tag Files</STRONG></font></p> <p><font color=#0066ff>    </FONT></font></p> <p><font color=#0066ff>    </CENTER></font></p> <p><font color=#0066ff>    <HR></font></p> <p><font color=#0066ff>    <h2>Tasks</h2></font></p> <p><font color=#0066ff>    <strong><ietag:listTasks></strong></font></p> <p><font color=#0066ff>    <strong><jsp:attribute name="onSchedule"></strong></font></p> <p><font color=#0066ff>    <td></font></p> <p><font color=#0066ff>    Name:$<br/></font></p> <p><font color=#0066ff>    </td><td></font></p> <p><font color=#0066ff>    Date:$</font></p> <p><font color=#0066ff>    </td></font></p> <p><font color=#0066ff>    </jsp:attribute></font></p> <p><font color=#0066ff>    <strong><jsp:attribute name="delayed"></strong></font></p> <p><font color=#0066ff>    <td></font></p> <p><font color=#0066ff>    Name:$<br/></font></p> <p><font color=#0066ff>    </td><td></font></p> <p><font color=#0066ff>    <font color="red">Plan:<strike> $</strike></font><br/></font></p> <p><font color=#0066ff>    <b>Actural:$</b></font></p> <p><font color=#0066ff>    </td></font></p> <p><font color=#0066ff>    </jsp:attribute></font></p> <p><font color=#0066ff>    </ictag:listTasks></font></p> <p><font color=#0066ff>    </BODY></font></p> <div><font color=#0066ff>    </HTML></font> <div> </div> <div> <h5>五)其他Ҏ?/h5> <p> JSP2.0q有一些其他特性变化,比如严格修正了I18N的语法规则,改进JSP对应XML语法从而允怋用namespaces{。这些ƈ不是核心功能Q大家可以参照java.sun.com的有兌料了解功能的l节Q这里就不再阐述?/p> </div> </div> </div> </div> </div> <img src ="http://www.aygfsteel.com/simie/aggbug/127505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/simie/" target="_blank">和田?/a> 2007-07-02 12:32 <a href="http://www.aygfsteel.com/simie/archive/2007/07/02/127505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP/Servlet/JSF:标签库的深入研究http://www.aygfsteel.com/simie/archive/2007/07/02/127504.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 04:29:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127504.htmlhttp://www.aygfsteel.com/simie/comments/127504.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127504.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127504.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127504.html标签库Taglib

    标签被定义和分布在一个称为标{ֺ的结构中Q一个标{ֺ是由元信息和cȝ成的集合Q?/p>

    1.标签处理器:实现定制标签功能的JavacR?/p>

    2.标签附加信息QTEIQ:向JSP容器提供边辑以确认标{ֱ性和创徏变量的类?/p>

    3.标签库描q器QTLDQ:描述单个标签和整个标{ֺ属性的XML文档?/p>

    标签处理器和标签附加信息需要定位在JSP容器c蝲入器可以扑ֈ的地斏V标{ֺ描述器可在URL指定的符意位|。JSP1.1规范要求JSP容器接受一个打包成因定l构的JAR文g的标{ֺ。TLD必须?META-INF目录中名为taglib.tld的文ӞJAR文g则复制到/WEB-INF/lib目录下?/p>

    一、标{֮?/p>

    1.开发步?/p>

    a.定义标签的名字、属性、声明的变量和标{体的内宏V?/p>

    b.~写标签库描q器TLD?/p>

    c.~写标签处理器?/p>

    d.在JSP面中用标{?/p>

    2.JSP面在JSP容器中的转换步骤Q?/p>

    JSP面存在三种形式Qjsp文g、java文g和class文g?/p>

    a.指o元素<%@page%>?%@include%>?%@taglib%>向JSP容器提供转换时信息?/p>

    b.HTML行在_jspService()Ҏ中依序转换到out.print()语名中?/p>

    c.脚本元素的声明被原封不动地复制到_jspService()Ҏ外的源码中?/p>

    d.脚本元素的表辑ּ在_jspService()Ҏ中依序转换到out.print()语名中?/p>

    e.脚本元素的Scriptlet被原不动地复制到_jspService()Ҏ中?/p>

    f.行ؓ元素被{换ؓ执行其功能的q行旉辑代码?/p>

    g.定制标签被扩展到调用其相应标{֤理器中方法的Java语句中?/p>

    3.标签在JSP容器中的转换步骤Q?/p>

    a.JSP容器使用taglib指o元素定位标签库描q器Q将面中用到的定制标签和TLD相匹配?/p>

    b.d标签库描q器的标{ֈ表和每一标签相关的类名字?/p>

    c.在页面中遇到一个标{时Q查找与h指定名字的标{։~相关的一个标{ֺ?/p>

    d.容器使用在TLD中找到的标签l构信息生成一pd完成标签功能的Java语句?/p>

    二、标{ֺ描述器(TLDQ?/p>

    标签库描q器是一个描q整个标{ֺ标记信息和库中每个标{֤理器及其属性的XML文档?/p>

    标签库描q器的DTD׃个简单的元素l成Q此元素包含下列一些子元素?/p>

    整个标签库标C?/p>

    tlibversion标签库版本号。是一个点式十q制敎ͼ最多ؓ4l小数点分隔的数字组成?/p>

    jspversion标签库所需的JSP规范最低版本。例如JSP1.1

    shortname标签库的~写名。JSP可以使用该名字作为库中标{~省前缀?/p>

    uri标签库唯一URI的元素。典型URL位置来自可下载taglib的位|?/p>

    info标签库描qC息?/p>

    每个标签处理器及其属?/p>

    tag在TLD中加入标{,描述l成库的每个标签?/p>

    name与标{ֺ的名字前~一起用的标签的名字,是JSP容器唯一的标{标识?/p>

    tagclass实现标签的标{֤理器cȝ全名?/p>

    teiclass标签附加信息QTEIQ类的全名。TEIcȝ出关于标{֤理器创徏变量及对标签司性执行的L有效性验证的信息?/p>

    bodycontent描述标签处理器如何用标{体的内宏V有三种取|

    emptyQ表C标{体必须为空Q?/p>

    JSP:表示脚本元素和模板及其它标签一栯评估?/p>

    tagdependentQ体内容被原不动写入BodyContentQ其它脚本元素以源码形式出现Q而不被JSP容器解释?/p>

    info标签的h工可Lq性信息?/p>

    attribute使用标签时被~码的属性信息。用于定义标{属性?/p>

    属性名Q属性的名字?/p>

    true|falseQ属性在标签用到的位|是否要被编码?/p>

    true|falseQ属性D否用表达式指定?/p>

    三、标{֤理器

    标签处理器是通过实现JSP容器调用的一pd预定义方法执行定制标{行为的一个JavacR?/p>

    标签处理器实C标签的行为,标签处理器是JavacR?/p>

    1.标签处理器的工作方式

    a.导入javax.servlet.jsp和javax.servlet.jsp.tagext包?/p>

    b.实现javax.servlet.jsp.tagext包中的Tag接口或BodyTag接口。BodyTag是Tag的子接口?/p>

    c.l承TagSupportcLBodyTagSuppoertcR它们是上述接口的缺省实现?/p>

    d.重蝲publicintdoStartTag()throwsJspExceptionҎ?/p>

    2.标签处理器的接口与实?/p>

    javax.servlet.jsp.tagext.Tag是实现标{最基本的接口?/p>

    javax.servlet.jsp.tagext.TagSupport是实现Tag接口的具体类?/p>

    通常情况下承tagSupportc而不直接实现Tag接口通常是有益的。除了对所有必需Ҏ提供了缺省实现外、还保存了pageContext对象及对嵌套标签的支持?/p>

    Tag接口包含4个常量,表示doStartTag()和doEndTag()Ҏ可能的返回码?/p>

    EVAL_BODY_INCLUDE当doStartTag()q回Ӟ指明servlet应对标签体进行评估?/p>

    SKIP_BODY当doStartTag()q回Ӟ指明servlet应忽视标{体?/p>

    EVAL_PAGE当doEndTag()q回Ӟ指明面其余部分应被评估?/p>

    SKIP_PAGE当doEndTag()q回Ӟ指明面其余部分p跌?/p>

    Tag接口的方?/p>

    publicvoidsetPageContext(PageContextctx)生成的servlet在请求处理器执行其它d前首先调用此ҎQ实现类应保存上下文对象以便它可以在标签生命期中使用。从面上下文中标签处理器可以访问所有JSP隐含对象?/p>

    publicvoidsetParent(Tagp)使用一个标{可以找到操作栈中它上面的标{。在setPageContext后立卌用?/p>

    publicTaggetParent()q回父标{?/p>

    publicintdoStartTag()throwsJsp在设|了面上下文、父标签和开始标C~码的属性后调用。返回码表明JSP实现servlet是否p估标{体?/p>

    publicintdoEndTag()throwsJspException当遇到结否标记时调用。返回码表明JSP是否qU页面的其余部䆾?/p>

    publicvoidrelease()保在页面退出前被调用。释放资源ƈ重置标签处理器状态?/p>

    TagSupportcȝҎ

    publicstaticTagfinAncestorWithClass(TagthisTag,Classcls)为所需的父标签处理器查找运行时标签栈。一个标{֤理器可以提供其范围内子标{调用的Ҏ?/p>

    publicvoidsetId(Stringid)保存和检索在id属性中指定的名字?/p>

    publicvoidsetValue(Stringname,Objecto)在本地哈希表中设|指定名字的倹{?/p>

    publicObjectgetValue(Stringname)从本地哈希表中获取指定名U的倹{?/p>

    publicvoidremoveValue(Stringname)从本地哈希表中删除指定名U的倹{?/p>

    publicEnumerationgetValues()q回哈希表中关键字的一个枚举?/p>

    3.标签处理器的生命?/p>

    a.生成servlet需要创建标{֤理器cȝ一个实例。实现方式通常是调用JSP容器的工厂类的一个方法,工厂cd含一个标{֤理器实例池以使其可重用不再处于激zȝ态的对象?/p>

    b.初始化标{֤理器QservletL其存在性。servlet通过调用标签处理器的两个Ҏ实现此过E:setPageContext(PageContextctx)和setParent(Tagparent)?/p>

    c.如果标签h属性,属性的取值通过处理器提供setterҎ传入到对象。属性setterҎ是一个标{支持属性所需的唯一Ҏ?/p>

    d.面的上下文和父标签已被调置Qƈ已具备属性。此时调用标{֤理器的doStartTag()ҎQ该Ҏ可以dq些变量q执行实现标{功能所需的计和操作。doStartTag()Ҏ必须q回一个整型数。返回EVAL_BODY_INCLUDE则正常处理标{体Q返回SKIP_BODY则从初始JSP面中直到此标签l束标记处的内容均被忽略?/p>

    e.标签体被评估或忽视后调用标签处理器的doEndTag()ҎQ返回EVAL_PAGE则页面的其余部分被评伎ͼq回SKIP_PAGE则servlet代码立即从_jspService()中返回?/p>

    4.体标{֤理器的接口与实现

    javax.servlet.jsp.tagext.BodyTag是Tag的子接口?/p>

    javax.servlet.jsp.tagext.BodyTagSupport是实现BodyTagcR?/p>

    BodyContent是javax.servlet.jsp.JspWriter的子c,但与其父cL所区别?/p>

    BodyContent对象的内容不自动写了入servlet的输出流Q而是U篏在一字符串缓存中。当标签体完成后其对象仍可在doEndTag()Ҏ中可以应用,由getString()或getReader()Ҏ操作。ƈ在必要时修改及写入恢复的JspWriter输出?/p>

    BodyContentcȝҎ

    publicvoidflush()throwsIOException复写JspWrite.flush()Ҏ以便它L产生溢出。刷新写入已失效Q因为它没有q接到将被写入的实际输出中?/p>

    publicvoidclearBody()重置BodyContent~存为空?/p>

    publicReadergetReader()q回Readerd体内宏V?/p>

    publicStringgetString()q回包含体内容的一个字W串?/p>

    publicvoidwriteOut(Writew)体内容写入指定输出?/p>

    publicJspWritegetEnclosingWrite()q回栈中下一个更高的写入者对象(可能是另一个BodyContent对象Q?/div>

    BodyTag接口定义了一个新的整型常?/p>

    EVAL_BODY_TAG当doStartTag()q回Ӟ使得新的BodyContent对象被创建ƈ与此标签处理器相兌。当doAfterBody()q回Ӟ使得JSPservlet在修改完此标{控制的L变量后再ơ评C?/p>

    BodyTag接口的方?/p>

    publicvoidsetBodyContern(BodyContentout)在当前JspWriter已被写入Q一个新的BodyContent在被创徏后由Jspservlet调用Q它发生在doStartTag()之后?/p>

    publicvoiddoInitBody()throwsJspExceptionsetBodyContent()之后Q体被评估前调用的生命期Ҏ。如果多ơ评CQ此Ҏ只调用一ơ?/p>

    publicinitdoAfterBody()throwsJspException体被评估后,BodyContent写入者仍处于Ȁzȝ态时调用的生命期Ҏ。此Ҏ必须q回EVAL_BODY_TAG或SKIP_BODYQ若q回EVAL_BODY_TAG时体再次被评估?/p>

    BodyTagSupportcȝҎ

    publicintdoStartTag()throwsJspException复写TagSupport中的doStartTag()Ҏ?/p>

    publicintdoEndTag()throwsJspException调用TagSupport中的doEndTag()ҎQ返回结果?/p>

    publicvoidsetBodyContent(BodyContentout)在一保护成员变量bodyContent中保存新的体内容对象Q子cd直接讉K此对象?/p>

    publicvoiddoInitBody()throwsJspException~省什么都不做。被需要执行初始化的子cL复写?/p>

    publicintdoAfterBody()throwsJspException每次体被评估后由JSPservlet调用Q体同容对象仍处于激zȝ态。返回SKEP_BODY或EVAL_BODY_TAG则体再次被评?/p>

    publicvoidrelease()讄bodyContent对象为nullQ然后调用super.release()?/p>

    publicBodyContentgetBodyContent()q回bodyContent变量。子cdl可以访问保护变量,但此Ҏ允许无关的标{֤理类Ҏ体内容发送输出?/p>

    publicJspWritergetPreviousOut()在bodyContent变量上调用getEnclosingWriter()q返回结果的便方法?/p>

    5.体标{֤理器的生命期

    a.生成servlet需要创建标{֤理器cȝ一个实例。实现方式通常是调用JSP容器的工厂类的一个方法,工厂cd含一个标{֤理器实例池以使其可重用不再处于激zȝ态的对象?/p>

    b.初始化标{֤理器QservletL其存在性。servlet通过调用标签处理器的两个Ҏ实现此过E:setPageContext(PageContextctx)和setParent(Tagparent)?/p>

    c.如果标签h属性,属性的取值通过处理器提供setterҎ传入到对象。属性setterҎ是一个标{支持属性所需的唯一Ҏ?/p>

    d.面的上下文和父标签已被调置Qƈ已具备属性。调用标{֤理器的doStartTag()ҎQ该Ҏ可以dq些变量q执行实现标{功能所需的计和操作?/p>

    doStartTag()Ҏ必须q回一个整型数?/p>

    q回EVAL_BODY_TAG则正常处理标{体Q蟩到eQ;

    q回SKIP_BODY则从初始JSP面中直到此标签l束标记处的内容均被忽略。(跛_fQ?/p>

    e.如果q回EVAL_BODY_TAGӞ则正常处理标{体?/p>

    e1.在栈中保存当前的JspWriter对象Q创建新的BodyContent对象Qƈ其|ؓJSP面的out对象保存在上下文范围内名为name的属性中。ƈ调用它的setBodyContent()Ҏ?/p>

    e2.调用doInitBody()Ҏq行初始化?/p>

    e3.处理标签体。将输出写入BodyContent对象中,此过E依赖于TLD的标{օ?

            Q有三种可能取倹{?/p>

            e4.调用doAfterBody()ҎQ将体内体内容写入JspWriterQ可如下实现Q?/p>

            JspWriterout=bodyContent.getEnclosingWriter();

            out.println(bodyContent.getString());//bodyContent.writeOut(out);

            bodyContent.clear();

            e5.doAfterBody()Ҏq回两种可能Q?/p>

            q回EVAL_BODY_TAGӞ再对标签体进行评伎ͼq是数组和枚举被循环处理的典型情c?/p>

            q回SKIP_PAGEӞl箋面的其余部份?/p>

            e6.体内容完成,因此创徏它的q程被反向:

            调用pageContent.popBody()Ҏ索前面的JspWriter对象?/p>

            写入者设|回out隐含对象?/p>

            f.标签体被评估或忽视后调用doEndTag()ҎQ允许标{֤理器像输出流发回内容?/p>

            q回EVAL_PAGE则页面的其余部分被评伎ͼ

            q回SKIP_PAGE则servlet代码立即从_jspService()中返回?/p>

            g.此时体的内容在受保护的bodyContent对象中仍然可用?/p>

            可以它写入servlet输出中Q?/p>

            JspWriterout=pageContext.getOut();

            out.println(bodyContent.getString());

            或?/p>

            bodyContent.WriteOut(pageContext.getOut());

            6.标签附加信息c?/p>

            四、标{指?/p>

            taglib指o元素的目的是指定TLD的位|,讄在页面上与标{֌分开来的一个短别名?/p>

            语法Q?%@taglibprefix=”tagprefix”uri=”tagliburi”%>

            属性:prefixQ用于标识标{ֺ的唯一标识。uriQ标{ֺ本n的URI?/p>

            uri不必指向一个实际文Ӟ它是JSP容器可以在web.xml中查扑֮际文件位|的唯一标识W?/p>



            ]]>JSP中web配置:web.xml http://www.aygfsteel.com/simie/archive/2007/07/02/127501.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 04:22:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127501.htmlhttp://www.aygfsteel.com/simie/comments/127501.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127501.html#Feedback1http://www.aygfsteel.com/simie/comments/commentRss/127501.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127501.htmlhttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
            XML声明Q定义XML的版本、编码格式。还有最重要的schema的来?/font>
            <?xml version="1.0" encoding="UTF-8"?>
            <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
              .......
            </web-app>
             
            <description>
            当servlet的URL定义为其他文件类型的扩展?该文件类型将不能讉K,而访问了servlet
            <?xml version="1.0" encoding="UTF-8"?>
            <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
              <display-name>myweb</display-name><!--站点名称-->
              <description>q里是站Ҏq?lt;/description>
              <icon>
                <small-icon>/images/small.gif</small-icon><!--图标的路径16*16,必须为gif jpge格式-->
                <large-icon>/images/large.gif</large-icon><!--大图标的路径32*32,必须为gif jpge格式-->
              </icon>
              <!--如果存在<distributable/>则代表该站点能在多个JSP Container之间分散执行(分布?-->
              <distributable/>




              <context-param><!--环境参数,讄帔R,取得帔R  this.getInitParameter("context");-->
                <param-name>context</param-name>
                <param-value>10000</param-value>
              </context-param>
              <filter><!--声明filter-->

                <filter-name>filterName</filter-name>
                <filter-class>filter.filterName</filter-class>
                <init-param>
                  <param-name>encoding</param-name>
                  <param-value>UTF-8</param-value>
                </init-param>
              </filter>
              <filter-mapping><!--定义filter所对应的URL-->
              <filter-name>filterName</filter-name>
              <url-pattern>/filterName</url-pattern>
              <dispatcher>REQUEST|INCLUDE|FORWARD|ERROR</dispatcher><!--filter对应的请求方??U方?默认REQUEST-->
              </filter-mapping>
              <listener><!--讑֮Listener接口-->
                <listener-class>listener.ListenerClassName</listener-class>
              </listener>
              <servlet><!--声明servlet的数?->
              <servlet-name>servletName</servlet-name>
              <servlet-class>servlet.servletName</servlet-class>
              <init-param><!--初始化参?可以在init()中用ServletConfig().getInitParamenter("name")取得-->
                <param-name>name</param-name>
                <param-value>123</param-value>
              </init-param>
              <load-on-startup>n</load-on-startup><!--站点启动?此servlet会被自动加蝲执行,1表示最?2,3...-->

              </servlet>
              <servlet-mapping><!--定义servlet所对应的URL-->

                <servlet-name>name</servlet-name>
                <url-pattern>/name</url-pattern>
              </servlet-mapping>
              <session-config><!--讄session时旉Q?0分钟Q默认按服务器配|?->
                <session-timeout>20</session-timeout>
              </session-config>
              <mime-mapping><!--定义某个扩展名和某个MIME Type做映?->
                <extension>doc</extension>
                <mime-type>application/vnd.ms-word</mime-type>
              </mime-mapping>
              <welcome-file-list><!--讄首页列表-->
              <welcome-file>index.jsp</welcome-file>
              </welcome-file-list>
              <error-page><!--错误代码对应到WEB站点的资源\?->
              <error-code>错误代码</error-code>Exception
              <location>/路径/</location>

              </error-page>
              <error-page><!--异常的U类对应到WEB站点的资源\?->
              <exception-type>Exception</exception-type>
              <location>/路径/</location>

              </error-page>

              <jsp-config><!--JSP的相关配|?->
                <taglib><!--JSP所用到的Tag Library-->
                  <taglib-uri>URI</taglib-uri>
                  <taglib-location>/WEB-INF/lib/xxx.tld</taglib-location>
                </taglib>
                <jsp-property-group>
                  <description>此设定的说明</description>
                  <display-name>Name</display-name>
                  <url-pattern>URL</url-pattern><!--此设定媄响的范围-->
                  <el-ignored>true|false</el-ignored><!--true表示不支持EL语法-->
                  <scripting-invalid>encoding</scripting-invalid><!--jsp的编?->
                  <include-coda>...jspf</include-coda><!--JSP的结?扩展?jspf-->
                </jsp-property-group>
              </jsp-config>
              <resource-ref><!--利用JNDI取得站点可利用的资源-->
                <description>资源说明</description>
                <res-ref-name>资源名称</res-ref-name>
                <res-type>资源U类</res-type>
                <res-auth>Application|Container</res-auth><!--资源l由什么许?->
                <res-sharing-scope>Shareable|Unshareable</res-sharing-scope><!--资源是否可以׃n,默认为Shareable-->
              </resource-ref>
            </web-app>


            ]]>
            servlet2.5/jsp2.1的新特征http://www.aygfsteel.com/simie/archive/2007/07/02/127500.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 04:20:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127500.htmlhttp://www.aygfsteel.com/simie/comments/127500.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127500.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127500.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127500.html2005q??6日,Sun公司和JSR154的专家组发布Servlet API的一个新的版本。在一般情况下Q一个JSR的新版本仅仅包括对以前少数有名无实的规范q行去除更新。但q次Q新版本中增加新的特征和变化Q他们对Servlets的生重要媄响,使得Servlet的版本升C 2.5?br>在这文章里Q我主要谈谈Servlet2.5版本中的新特征。描q每一个变化,阐述那些必要变化产生的背景,q展C如何在ZServlet的项目中利用q些变化。 
            事实上,q是我ؓJavaWorld提供的第六篇关于Servlet API更新资料的文章。这文章意在两个目的:从眼前来看,向你介绍 Servlet的新特征。从长远来看Q是展现Servlet变化的历史概要,q样当你Z老的Servlet API版本q行~码的时候,你可以正地军_哪些特征和功能你可以使用Q而哪些特征和功能你不应该使用。你可以参考我先前写的关于Servlet的文章?br>注意Q当你想实践q些Servlet的新特征和功能时Q你要知道的是:q不是所有的Servlet容器和Java企业U应用服务器都能立即适用于最新版的Servlet APIQ写q篇文章Ӟ2006q??日)QJetty 6 server和Sun公司的GlassFish server是公认最好的支持Servlet2.5的容器,而Apache Tomcat5.5和Jboss 4.0目前只支持Servlet2.4?br>Servlet2.5一些变化的介绍Q?br>1Q?nbsp;   Z最新的J2SE 5.0开发的?br>2Q?nbsp;   支持注释?br>3Q?nbsp;   web.xml中的几处配置更加方便?br>4Q?nbsp;   去除了少数的限制?br>5Q?nbsp;   优化了一些实?br>J2SE 5.0的物:
            从一开始,Servlet 2.5 规范列出J2SE 5.0 (JDK 1.5) 作ؓ它最的q_要求。它使得Servlet2.5只能适用ZJ2SE 5.0开发的q_Q这个变动意味着所有J2SE5.0的新Ҏ可以保证对Servlet2.5E序员有用?br>传统意义上,Servlet和JEE版本一直与JDK的版本保持同步发展,但是q次QServlet的版本蟩q?.4版本。专家组认ؓ版本的加速增长是正当的,因ؓJ2SE5.0提出一个引人注目的QServlet和JEE规范都要利用的特??注释?br>注释Q?/strong>
            注释是作为JSR175的一部分提出的(一UؓJava语言设计提供便利的MetadataQ一U新的语a特色。它是利用Metadata为Java ~码l构Q类Q方法,域等{)装饰的一U机制。它不能像代码那h行,但是可以用于标记代码Q这个过E是ZMetadata信息的代码处理机Q通过更新他们的事件行为来实现的?br>
            我们可以凭借不同的技巧来注释cdҎQ例如连l地标记接口或者是@deprecated Javadoc评论。这U新式的Metadata可以便利地提供了一U标准的机制来实现注释功能,以及通过库来创徏用户自己的注释类型的变量?br>下面是一个简单的Web service 注释例子Q?br>import javax.jws.WebService;
            import javax.jws.WebMethod;
            @WebService
            public class HelloWorldService {
              @WebMethod
              public String helloWorld() {
                return "Hello World!";
              }
            }
            @WebService和@WebMethodq两个注释类型,在JSR181QؓJavaq_提供的Web ServicesMetadataQ有详细说明Q可以像cML引用Q标记这个类作ؓ一个Web serviceq且标记它的helloWorldQ)Ҏ做ؓ一个Web serviceҎ。对于他们本w来_注释只是写在那里q没有什么作用,好像在岗位上做记录一P但是Q一个容器一旦加载这个类q对那些注释q行二进制编码,可以把q个c连到Web service上?br>注释可以接受属?D些参数。它保存着参数的信息ƈ且可以利用这些参数来更改被请求的事g行ؓ。例如下面更高的注释例子:
            @WebService(
             name = "PingService",
              targetNamespace=http://acme.com/ping
            )
            @SOAPBinding(
              style=SOAPBinding.Style.RPC,
              use=SOAPBinding.Use.LITERAL
            )
            public class Ping {
              @WebMethod(operationName = "Foo")
              public void foo() { }
            }
            一旦加载了q个c,一个正配|的容器׃识别出注释及其参敎ͼq将q个做ؓ一个PingService通过利用remote-procedure- call/literal的编码方式与一个Foo operation相连。实际上Q注释便指明了类和类的容器之间的联系?br>
            Java本n的规范(JSR175Q仅仅有量的注释类型变量。而这些有的注释cd变量主要来自于其他的JSRsQ?br>"JSR 250: Javaq_的公共注?br>"JSR 220: 企业UJavaBeans 3.0 
            "JSR 224: ZXML的Java API Web Services (JAX-WS) 2.0 
            "JSR 181: Javaq_的Web Services Metadata 
            Servlet2.5中的注释Q?br>回到Servlet2.5上来Q一U新的规范描qC几种注释在Servlet环境中是如何工作的。功能弱的Servlet容器忽略了这些规范,然而JEE容器中的Servlet却严格遵守这些规范?br>
            有的注释提供了在XML注册的可选择性,否则p注册在配|文件web.xml中。有的作为容器的h来执行其dQ否则就由Servlet亲自来执行。还有的注释两者都具备?br>
            注释准确的定义不是完全固定的Q因为Servlet本nq没有定义注释。它仅仅解释了它们如何媄响Servlet环境Q下面是注释的一个简要的概述Q你可以看到在JEE5中它们的用途:

            "@Resource and @ResourcesQ@Resource位于cL变量中以对Servlet容器q行“资源注入”。当容器识别个注释时Q它会在获得服务C之前Q用适当的值实现带注释的变量的重新注入。通过使用q种注释Q你不必利用JNDI来查扑֑令和在配|文件web.xml中手动声明资源。服务器通过Servlet的自我调整来执行它的d。变量的名称和类型由映像机制自动定Q尽你可以利用注释的参数来越q一限制。一个注入的资源可以是数据源QJava信息服务目的文g或者是环境讄的标量。下面是一个例子:
            @Resource javax.sql.DataSource catalog;
            public getData() {
              Connection con = catalog.getConnection();
            }
            现在Q在q段Servlet代码变成服务之前Q容器会定位JNDI变量Qƈ对于目录变量q行手动分配?br>Z效率Q仅仅某些类支持资源注入Q这些类有:ServletsQServletqo器,Servlet事g监听器,JSP标签操作器,JSP库事件监听器Q用于处理beans的JSFQ以及一些与Serlvets无关的类?br>"@Resources注释与@Resource怼Q但是它用于一l@Resource注释。它们都来自JSR250Q是Javaq_的公共注释?br>"@PostConstruct and @PreDestroyQ可以Ҏ成ؓ带有生命周期的方法。@PostConstructҎ用于资源注入初始化之后。@PreDestroyҎ用于Servletq服务q放注入的资源的时候。回收的Ҏ必须是事实的ҎQ返回voidq且不可以抛ZQ何异常。这些注释本质上使得MҎ都成为init()和destroy()的子ҎQ这些特征也来自与JSR250?br>"@EJBQ类g@ResourceQ设计用于注入企业的JavaBeans。比起@ResourceQ它略有不同Q在于@EJB的参数特定设计用来定位EJB的参数。这个注释来自EJB3.0的规范?br>"@WebServiceRefQ与@Resource ?nbsp;@EJB怼Q设计用于注入Web service参数。来自于JAX-WS2.0规范?br>"@PersistenceContext, @PersistenceContexts, @PersistenceUnit, and @PersistenceUnitsQ这些注释来自EJB3.0规范来支持Java对象的持久化?br>"@DeclareRoles: 定义应用E序中安全角色的使用。当定义一个ServletcLQ在配置文gweb.xml?lt;security-role>标签中对它进行设|,来自JSR250?br>" @RunAsQ用于声明哪个类应该执行。当定义一个ServletcLQ在配置文gweb.xml?lt;run-as>标签中对它进行设|。来自于JSR250?

            注释的执行:
            不论你用注释与??其在你不用时??它对于理解服务器上程序的执行有着重要意义。ؓ了让服务器识别类中的注释Q它必须加蝲q些c,q就意味着服务器必L启动着的,服务器通过WEB-INF/classes目录下和WEBQINF/lib目录下的所有类文g来查找注释。(每个规范下,服务器不必查找这两个目录以外的目录。)你可以通过下面的方法指?lt;web-app>根的属性而不必用如何进行注释:
            <web-app xmlns="http://java.sun.com/xml/ns/javaee"
                         version="2.5" full="true">
            </web-app>
            web.xml的便利:
            Servlet2.5对于web.xml引入几个的变动Q得它更加方便?br>Servlet名称的通配W化Q?br>首先Q当你写<filter-mapping>,你现在可以在<Servlet-name>标签中?h代表所有的Servlets。而以前,你必Mơ把一个Servletl定到过滤器上,像这P

            <filter-mapping>
              <filter-name>Image Filter</filter-name>
              <Servlet-name>ImageServlet</Servlet-name>
            </filter-mapping> 

            现在Q你可以一ơ绑定所有的ServletsQ?br>
            <filter-mapping>
              <filter-name>Image Filter</filter-name>
              <Servlet-name>*</Servlet-name>  <!?新特?nbsp;-->
            </filter-mapping>

            q有着很大用途,例如Q?br>
            <filter-mapping>
              <filter-name>Dispatch Filter</filter-name>
              <Servlet-name>*</Servlet-name>
              <dispatcher>FORWARD</dispatcher>
            </filter-mapping>

            映射的复合模式:
            其次Q当我们?lt;Servlet-mapping> 或?nbsp;<filter-mapping>Ӟ你现在可以在同一的标{中采用复合匚w的标准。以前一?lt;Servlet-mapping>只支持一?lt;url-pattern>元素Q现在它不只支持一个,例如Q?br><Servlet-mapping>
              <Servlet-name>color</Servlet-name>
              <url-pattern>/color/*</url-pattern>
              <url-pattern>/colour/*</url-pattern>
            </Servlet-mapping>

            同样圎ͼ以前<filter-mapping>也是只支持一?lt;url-pattern> 或者一?nbsp;<Servlet-name>。现在它对于每个元素都可以支持Q意多个:

            <filter-mapping>
              <filter-name>Multipe Mappings Filter</filter-name>
              <url-pattern>/foo/*</url-pattern>
              <Servlet-name>Servlet1</Servlet-name>
              <Servlet-name>Servlet2</Servlet-name>
              <url-pattern>/bar/*</url-pattern>
            </filter-mapping>

            HTTPҎ名:

            最q,你可以将合法的HTTP/1.1Ҏ名放q?lt;http-method>元素中。当你用这些方法时Q?lt;http- method>指?lt;security-constraint>标记里的Ҏ应该被应用。从以前来看Q它仅限于HTTP/1.1? 个标准方法:GETQPOSTQPUTQDELETEQHEADQOPTIONS和TRACE。但是,HTTP/1.1允许Ҏ法进行扩展,WebDAV 是用于这U扩展的普遍技术。在Servlet2.5中,你可以安全地U束M可能的HTTPҎ名,标准及扩展,包括WebDAVҎQ例如:LOCKQ?UNLOCKQCOPY及MOVE?br>如果你写一个WebDAV的ServletQ你不必使用doLock()和doCopy()Ҏ。你必须写自qservice()Ҏ及分zrequest.getMethod()Ҏ。正׃q种变化Q你不必理pȝ的安全性?br>去除限制Q?br>
            Servlet2.5去除了关于错误处理和回话跟踪的一些限制。对于错误处理,Servlet2.5之前Q配|在<error- page>中的错误处理面不能通过调用setStatus()Ҏ来修改触发他们的错误代码Q而Servlet2.5减弱了这一规范。这L规范的生于q样的观点,是错误面的工作是指出每个错误而不是修攚w误。但是,实际使用中,错误面不只是用于指出错误,而是q能做更多的事情Q或许可以代替在U帮助来帮助用户解决问题。这个规范将不再限制错误面所产生的反馈信息?br>
            对于会话跟踪QServlet2.5之前Q调用RequestDispatcher.include()的Servlet不能讄响应的标题头Q?Servlet2.5减弱了这一规范。原规范的目的是使内部的Servlets限制在自q面I间中,不可以媄响外部的面。现在这个规范已l减弱,允许在内部的Servlet中用request.getSession()命oQ这个命令可以悄悄地创徏一个会话跟tcookie的标题头。逻辑上要求限制内部的资源Q但逻辑上也要求q些限制不应该取消其启动session的这一功能。这个变动对于Portlet规范来说昑־其重要。作用是Q如果响应已l有效,则getSession()命o׃抛出一个IllegalStateException(异常)Q而在此之前,没有这个功能?br>
            优化Q?/strong>
            最q,新的规范优化了一些实例,使得Servlets更加方便而且保证了更好地按要求工作?br>
            l止响应Q?/strong>
            W一处优化细又深奥Q但做ؓ规范中的一个例子还有蛮有趣的。Servlet2.4规范规定响应在这几种情况下应该是有效的,包括Q在响应?setContentLengthҎ中内容已l明说明,以及内容已经写进了响应中。这U情况只有你的代码像下面q样才可以响应重新定向Q?br>
            response.setHeader("Host", "localhost")Q?br>response.setHeader("Pragma", "no-cache")Q?br>response.setHeader("Content-Length", "0")Q?br>response.setHeader("Location", "http://www.apache.org")Q?br>
            Servlet技术忽略特定区域的标题_因ؓ内容满0字节长度Q响应就会立即生效。而在它开始之前,响应已失效了!Servlet容器通常拒绝执行q种行ؓQ而Servlet2.5版本增加?#8220;长度必须大于0”q个原则?br>实例~码Q?br>
            Servlet2.4规范规定必须在调用request.getReader()Ҏ之前调用 request.setCharacterEncoding()Ҏ。但是,如果你忽略这个原则而在其之后去调用 request.setCharacterEncoding()ҎQ那么会产生什么后果,q个问题规范里ƈ没有说。ؓ了简便,现在消除q种情况Q?br>Cross-context sessions(不同上下文目录间的会?Q?br>最q,关于Cross-context会话处理的规则已l明说明。当Servlets指派从一个上下文到其他上下文的请求时Q这个规则就发挥了作??在目标调用过E中Q包括哪些会话。这个版本的出现使得一个上下文目录的主里的portlets可以通过几种内部的命令来对别的上下文目录里的 portlets起作用。Servlet2.5明确指出一个上下文目录里的资源可以讉K其他上下文目录的session(会话)Q而不用考虑q个h从哪里开始的。这意味着portlets可以q主页的范围而在自己的范围里q行Q而且q个规范q会应用在不兼容的Serlvet容器中?br>期待Q?br>
            ׃Servlet2.5版本要保持一些旧的性质Q几个大的概念不得不延后C一个阶Dc它们包括:
            "新的输入/输出(NIO)支持QNIO通道更有利于Servletsq行客户端通信成ؓ可能?br>"qo器wrap-under或wrap-over语义Q有时用qo器包装请求,?或者响应对象去修改Ҏ行ؓ或者启用新的方法。当把这U包装和服务器对h和响应的包装l合hӞ又应该怎么包装在一P
            "用于Ƣ迎的Servlets文gQ做为烦引应该充当欢q作用的文g吗?在此之前Q这个回{是肯定的。但是规范没有明说明如何用这个功能,其在没有烦引的情况下?br>"用于Ƣ迎的文件的分派规则Q如何分z欢q文Ӟq个l节q没有完全说明,而是遗留了一些开攄~口来应对不兼容问题?br>"登陆后选择默认面Q如果用户通过他们的书{访问Servlet的登陆页面,那么在成功登陆后面应该转向哪里呢?q个问题至今未明确说明?br>"用户的主题日志:在通过|站正确地注册之后,不通过传统地登陆方式没有办法Servlet信Q用户?br>l束语:
            如果抛开注释来看Servlet2.5的变化,可见在配|文件web.xml中去除了一些限Ӟ是有利的Q同时又优化了实例行Z其更适合更便于开发Webpȝ(|页)?br>Servlet2.5中注释的作用更加戏剧化。Servlets本n不能声明注释cd的变量,甚至性能qServlet容器都不支持注释。然而在 JEE5环境下的Servlets~写者可以看刎ͼ通过公共的注释及EJB3.0和JAX-WS2.0规范而引入的注释cd会对代码产生很大变化Qƈ且这也将对Servlet如何理外部资源Q对象的持久化及EJB的构成生重大媄?/p>

            J2EE的两U重要的表现层技术JSP和JSF发布了新技术规范的预览版本Q其中最重要的一Ҏ两者将表达式语aQExpression LanguageQELQ部分合二ؓ一。在不久的将来,q两U技术有可能更进一步地彼此融合Q成ZU统一的表现层技术。然而在J2EEC的普遍观点中Q如果单单作ZU视图技术,JSPq不是最佳的选择QVelocity和XSLT{基于模板的视图技术通常比JSP更方便;而基于组件的JSF也面临广泛的信Q危机。两者的l合是否能得C界的认可Q还需要时间的验?/p>

            jsp 2.1


                我们很高兴向大家宣告QJavaServer Pages、JSR-245下开发的Faces.JavaServer PagesQJSPQ?.1和JSR-252下开发的JavaServer FacesQFacesQ?.2的新版规范的Early Draft Review发布?/p>

                JSP 2.1把Expression LanguageQELQ输出到它自己各自分ȝ文档中,在技术上Q这些文档是JSP规范的子文档。这些统一的EL规范定义了一个更高层的java 包,javax.el。这个包与用它的技术之间完全独立,q且允许此技术将自n插入EL处理q程。更改的JSP规范遵从使用标准化EL的规范?/p>

                对于前面提到的JSR-252Q这个规范ƈ没什么新Ҏ。Faces 1.2支持新的标准化ELQ还包含一些bug修复的相兌范?/p>

                Faces和JSP在JSRs下的l盟带来了一些新功能Q也为将来的发展打下了坚实的基础。例如,在同时用Faces和JSP的web应用中,|页仅用JSPQ不包含Mfaces内容Q来讉KManaged Beans成ؓ可能。在JSP规范的附录E中和Faces规范的前a中都可以看到更改内容的细节?/p>



            ]]>
            վ֩ģ壺 | ľ| | | ͨ| | | | | ڽ| | | ˮ| | ˿| ຣʡ| | | | ƽ| | | | | | | | Ƥ| | | Ҷ| | | ԣ| | ƽ| ̩| ˫| ǿ| Ͻ| |