﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-The NoteBook of EricKong-随笔分类-JSP</title><link>http://www.blogjava.net/jjshcc/category/48750.html</link><description>桑巴葡语翻译工作室是广州市最专业葡萄牙语翻译机构-www.puyufanyi.com-欢迎寻找Java,As400,Mainframe的猎头eric_cc#qq.ccom(把#换成@)</description><language>zh-cn</language><lastBuildDate>Tue, 07 Jan 2014 03:58:43 GMT</lastBuildDate><pubDate>Tue, 07 Jan 2014 03:58:43 GMT</pubDate><ttl>60</ttl><item><title>Servlet线程安全的解决方法</title><link>http://www.blogjava.net/jjshcc/archive/2014/01/07/408616.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 07 Jan 2014 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2014/01/07/408616.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/408616.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2014/01/07/408616.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/408616.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/408616.html</trackback:ping><description><![CDATA[<div><div>Servlet体系结构是建立在Java多线程机制之上的，它的生命周期是由Web容器负责的。</div><div></div><div>当客户端第一次请求某个Servlet时，Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时，一般不会再实例化该Servlet类，也就是有多个线程在使用这个实例。</div><div></div><div>这样的话，当两个或多个线程同时访问同一个Servlet时，可能会发生多个线程同时访问同一资源的情况，数据可能会变得不一致，所以就很容易造成一系列的一些安全性问题。</div><div></div><div>解决此类的方法也有多</div><div></div><div>1、实现 SingleThreadModel 接口</div><div></div><div>该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定，那么在这个Servlet中的service方法将不会有两个线程被同时执行，当然也就不存在线程安全的问题。这种方法只要继承这个接口就行了</div><div></div><div>public class XXXXX extends HttpServlet implements SingleThreadModel { &nbsp;</div><div>&#8230;&#8230;&#8230;&#8230; &nbsp;</div><div>}&nbsp;</div><div>2、同步对共享数据的操作</div><div></div><div>使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段，在本论文中可以通过同步块操作来保证Servlet的线程安全。同步后的代码如下：</div><div></div><div>Public class XXXXXX extends HttpServlet { &nbsp;</div><div>&nbsp;&nbsp; &nbsp;&#8230;&#8230;&#8230;&#8230; &nbsp;</div><div>synchronized (this){XXXX} &nbsp;</div><div>&nbsp;</div><div>}&nbsp;</div><div>3、避免使用实例变量</div><div></div><div>线程安全问题还有些是由实例变量造成的，只要在Servlet里面的任何方法里面都不使用实例变量，那么该Servlet就是线程安全的。</div><div></div><div>对上面的三种方法进行测试，可以表明用它们都能设计出线程安全的Servlet程序。但是，如果一个Servlet实现了SingleThreadModel接口，Servlet引擎将为每个新的请求创建一个单独的Servlet实例，这将引起大量的系统开销。SingleThreadModel在Servlet2.4中已不再提倡使用；同样如果在程序中使用同步来保护要使用的共享的数据，也会使系统的性能大大下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它，使得其同时处理客户请求的吞吐量降低，而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性，要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化Servlet 中的同步代码；在Serlet中避免使用实例变量是保证Servlet线程安全的最佳选择。从Java 内存模型也可以知道，方法中的临时变量是在栈上分配空间，而且每个线程都有自己私有的栈空间，所以它们不会影响线程的安全。</div><div></div><div>小结</div><div></div><div>Servlet的线程安全问题只有在大量的并发访问时才会显现出来，并且很难发现，因此在编写Servlet程序时要特别注意。线程安全问题主要是由实例变量造成的，因此在Servlet中应避免使用实例变量。如果应用程序设计无法避免使用实例变量，那么使用同步来保护要使用的实例变量，但为保证系统的最佳性能，应该同步可用性最小的代码路径。</div></div><img src ="http://www.blogjava.net/jjshcc/aggbug/408616.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2014-01-07 11:13 <a href="http://www.blogjava.net/jjshcc/archive/2014/01/07/408616.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>servlet中的service()方法重写与不重写</title><link>http://www.blogjava.net/jjshcc/archive/2014/01/06/408572.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Mon, 06 Jan 2014 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2014/01/06/408572.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/408572.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2014/01/06/408572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/408572.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/408572.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在servlet中默认情况下，无论你是get还是post 提交过来 都会经过service（）方法来处理，然后转向到doGet或是doPost方法，可以看HttpServlet 类的service方法：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原代码：&nbsp;&nbsp;[c-sharp]&nbsp;view plaincopyprote...&nbsp;&nbsp;<a href='http://www.blogjava.net/jjshcc/archive/2014/01/06/408572.html'>阅读全文</a><img src ="http://www.blogjava.net/jjshcc/aggbug/408572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2014-01-06 14:54 <a href="http://www.blogjava.net/jjshcc/archive/2014/01/06/408572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp:directive.page</title><link>http://www.blogjava.net/jjshcc/archive/2014/01/02/408396.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Thu, 02 Jan 2014 08:18:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2014/01/02/408396.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/408396.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2014/01/02/408396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/408396.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/408396.html</trackback:ping><description><![CDATA[<div><div>&lt;jsp:directive.page import="zero.space.ch03.BookBean"/&gt; &nbsp;</div><div>等效于</div><div>&lt;%@ page import="zero.space.ch03.BookBean" %&gt; &nbsp;</div><div></div><div>但是有一点不同，如果你把所有类包的引入放在一个JSP中，在其他jsp中通include引入那个jsp。这时引入类就必须采用</div><div>&lt;%@ page import="zero.space.ch03.BookBean" %&gt; &nbsp;</div><div>这样的写法。</div><div></div><div>&lt;jsp:directive.page import="zero.space.ch03.BookBean"/&gt;</div><div>这种写法只能在同一个jsp页面中使用，不能跨页调用</div></div><img src ="http://www.blogjava.net/jjshcc/aggbug/408396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2014-01-02 16:18 <a href="http://www.blogjava.net/jjshcc/archive/2014/01/02/408396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>检查cookie是否可用 </title><link>http://www.blogjava.net/jjshcc/archive/2013/12/25/408029.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Wed, 25 Dec 2013 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2013/12/25/408029.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/408029.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2013/12/25/408029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/408029.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/408029.html</trackback:ping><description><![CDATA[<div style="display: inline-block; "><div><span class="Apple-style-span" style="font-family: Arial; line-height: 26px; color: #333333; "><p xmlns:fo="http://www.w3.org/1999/XSL/Format">尽管我所知道的浏览器都支持cookie的设置，不过用户可以有意识的将它关闭，或者无意识的将它关闭。当你在你的servlets/JSP页面中使用cookie时，你不能保证用户的浏览器是否可以接受cookie－－你需要先检查一下。这儿有一个检查用户的浏览器的cookie是否有效的小技巧。</p><p xmlns:fo="http://www.w3.org/1999/XSL/Format">这个技巧很简单。你从servlet或JSP向用户的浏览器发出一个HTTP回应，强行使浏览器在第二次返回。在第一次的响应中，你发出一个cookie。当浏览器第二次返回的时候，检查上一次发出的cookie。如果cookie存在，说明浏览器的cookie功能可用。否则说明用户的浏览器太老，不支持cookie，或者浏览器的cookie功能被关闭。</p><p xmlns:fo="http://www.w3.org/1999/XSL/Format">JSP页面用下面这段代码检查cookie是否有效。如果有效，那么页面的返回字符串为&#8220;Cookie is on&#8221;.若无效则为&#8220;Cookie is off&#8221;:</p><table bgcolor="#ffffaa"><tbody><tr><td><font color="#0000cc"><pre style="white-space: pre-wrap; word-wrap: break-word; ">&lt;%
  if (request.getParameter("flag")==null) {
    // the first request
    Cookie cookie = new Cookie("cookieSetting", 
"on");
    response.addCookie(cookie);
    String nextUrl = request.getRequestURI() + 
"?flag=1";
    // force the browser to refresh
    out.println("&lt;META HTTP-EQUIV=Refresh 
CONTENT=0;URL=" + nextUrl +"&gt;");
  }
  else {
    // the second request
    Cookie[] cookies = request.getCookies();
    boolean cookieFound = false;
    if (cookies!=null) {
      int length = cookies.length;
      for (int i=0; i&lt;length; i++) {
        Cookie cookie = cookies[i];
        if 
(cookie.getName().equals("cookieSetting") &amp;&amp;
          cookie.getValue().equals("on")) {
          cookieFound = true;
          break;
        }
      }
    }
    if (cookieFound) {
      out.println("Cookie is on.");
    }
    else {
      out.println("Cookie is off.");
    }
  }
%&gt;</pre></font></td></tr></tbody></table></span></div></div><img src ="http://www.blogjava.net/jjshcc/aggbug/408029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2013-12-25 16:39 <a href="http://www.blogjava.net/jjshcc/archive/2013/12/25/408029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>response.sendRedirect("")和request.getRequestDispatcher("").forward(req,resp);</title><link>http://www.blogjava.net/jjshcc/archive/2013/11/28/406941.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Thu, 28 Nov 2013 06:36:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2013/11/28/406941.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/406941.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2013/11/28/406941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/406941.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/406941.html</trackback:ping><description><![CDATA[<div><div>1：request.getRequestDispatcher("转发路径").forward(req,resp)该语句是实现请求转发的，当请求进入到该servlet中执行到该语句时，服务器不会直接响应而是转发到转发路径得servlet继续处理，由于将req和resp带过去了，所以这期间是没有重新创建request和response对象，所以在接下来的servlet中同样可以获得当前servlet的request中的参数。<br /></div><div>2：response.sendRedirect("")当运行到servlet的该条语句时，服务器会响应浏览器一个小心头告诉浏览器重新请求方法中的路径对应的servlet，因为是浏览器从新请求所以会创建新的request和response对象，因此上一次请求的request中的参数无法得到。</div><div>很好的理解这两者的原理和区别有助于熟练操作请求的转发和重定向。熟练的控制参数获取。&nbsp;</div></div><img src ="http://www.blogjava.net/jjshcc/aggbug/406941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2013-11-28 14:36 <a href="http://www.blogjava.net/jjshcc/archive/2013/11/28/406941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>filter-mapping的执行顺序和字符集设置的优先级</title><link>http://www.blogjava.net/jjshcc/archive/2011/12/29/367501.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Thu, 29 Dec 2011 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2011/12/29/367501.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/367501.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2011/12/29/367501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/367501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/367501.html</trackback:ping><description><![CDATA[<p>问题起因：<br />&nbsp; &nbsp;今天遇到一个乱码问题，以前已经配置好了的呀。而且是普遍现象，看来是公共的变更引起的问题。<br />&nbsp; &nbsp;<br />分析过程：</p>
<p>&nbsp;&nbsp;&nbsp; 于是开始进行调试，因为是公共问题，所以就对web.xml最近的变更进行增删调试，发现如果使用SecurityFilter就报错，去掉久正常了。<br />&nbsp;&nbsp;仔细检查，发现如下现象：<br />&nbsp;&nbsp; 1、在设置字符集之前, 提前调用了request.getParameter()方法，就会出现问题。即使后来再设置字符集，随后的action接收的数据也会乱码。<br />&nbsp;&nbsp;&nbsp; 2、对于同一个url，如：*.do，filter-mapping 是有顺序的，按照web.xml中的配置顺序。</p>
<p>&nbsp;&nbsp;&nbsp; 从网上查到的结论：<br />&nbsp;&nbsp; 根据servlet2.3规范filter执行是按照web.xml配置的filter-mapping先后顺序进行执行，所以上面的配置会导致遇见*.do的url请求，先进行SecurityFilter的过滤器处理，这时候没有做编码处理，已经是乱码，到下面的filter处理时已经时乱码，再做编码处理已经没有用处。</p>
<p>解决办法：&nbsp;&nbsp;&nbsp; <br />&nbsp;错误的顺序：<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;SecurityFilter&lt;/filter-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;CharacterEncoding&lt;/filter-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;CharacterEncoding&lt;/filter-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;<br />&nbsp;<br />&nbsp;正确的顺序：<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;CharacterEncoding&lt;/filter-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;CharacterEncoding&lt;/filter-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;SecurityFilter&lt;/filter-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt; <br /></p><img src ="http://www.blogjava.net/jjshcc/aggbug/367501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2011-12-29 16:42 <a href="http://www.blogjava.net/jjshcc/archive/2011/12/29/367501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP自定义标签学习</title><link>http://www.blogjava.net/jjshcc/archive/2011/05/30/351326.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Mon, 30 May 2011 05:04:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2011/05/30/351326.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/351326.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2011/05/30/351326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/351326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/351326.html</trackback:ping><description><![CDATA[<div>自定义标签的最大的特点:<br /><br />利用  自定义标签，软件开发人员和页面设计人员可以独立地自由工作.页面设计人员可以把精力集中在使用标签(HTML,XML或者JSP)创建网站上,而软件开 发人员则可以将精力集中在实现底层功能上面,若国际化等等,这样,页面设计人员可以使用自定义标签的形式来实现具体的功能.<br /><br />下面我们来指定一个简单的标签，步骤如下<br /> <ol><li>扩张TagSupport </li><li>写自定义Tag的tld文件 </li><li>web.xml中指定你的tld文件 </li><li>在JSP页面使用自定义标签 </li></ol> <br /> <ul><li>扩张TagSupport </li></ul> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 说明:<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;  一般不会去实现Tag接口，而是通过TagSupport类是实现了Tag的接口继承过来的字段，这些字段用做public int &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doStartTag()，public int doEndTag()返回值<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; Tag.EVAL_BODY_INCLUDE 包含主体内容<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; Tag.SKIP_BODY&nbsp;&nbsp;&nbsp;&nbsp; 不包含主体内容<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; Tag.EVAL_PAGE&nbsp;&nbsp;&nbsp; &nbsp; 包含后面的页面内容 <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; Tag.SKIP_PAGE&nbsp;&nbsp;&nbsp;&nbsp; 不包含主体的内容&nbsp;&nbsp;&nbsp;&nbsp; <br />实现一个简单实现代码：<br /> <div>java 代码</div> <div> <div>&nbsp;</div> <ol><li><span>package&nbsp;com.mercyblitz;&nbsp;&nbsp;</span> </li><li><span>import&nbsp;java.io.IOException;&nbsp;&nbsp;</span> </li><li><span>import&nbsp;javax.servlet.jsp.JspException;&nbsp;&nbsp;</span> </li><li><span>import&nbsp;javax.servlet.jsp.JspWriter;&nbsp;&nbsp;</span> </li><li><span>import&nbsp;javax.servlet.jsp.tagext.TagSupport;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp; </li><li><span>public&nbsp;class&nbsp;MyTags&nbsp;extends&nbsp;TagSupport&nbsp;{&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;int&nbsp;doStartTag()throws&nbsp;JspException&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JspWriter&nbsp;out=pageContext.getOut();&nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>try&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(<span>"Hello,World");&nbsp;//页面中显示的内容&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span>catch(IOException&nbsp;e)&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>throw&nbsp;new&nbsp;JspException(e);&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;SKIP_BODY;&nbsp;//不包含主体内容&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; </li><li>}&nbsp;&nbsp; </li></ol> </div> <br /> <ul><li>写自定义Tag的tld文件 </li></ul> <div>xml 代码</div> <div> <div>&nbsp;</div> <ol><li><span>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;&nbsp;&nbsp;</span> </li><li>&lt;!DOCTYPE&nbsp;taglib&nbsp;PUBLIC&nbsp;"-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;JSP&nbsp;Tag&nbsp;Library&nbsp;1.2//EN"&nbsp;"web-jsptaglibrary_1_2.dtd"&nbsp;<span>&gt;&nbsp;&nbsp;</span> </li><li><span>&lt;taglib&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;<span>&lt;tlibversion&gt;tlibversion&lt;/tlibversion&gt;&nbsp;&nbsp;&lt;!--&nbsp;你自定义标签的版本数&nbsp;--&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;<span>&lt;jsp-version&gt;1.2&lt;/jsp-version&gt;&nbsp;&nbsp;&lt;!--&nbsp;指定你的JSP版本，扩张标签是在JSP1.2之后兼容的&nbsp;--?&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;<span>&lt;shortname&gt;shortname&lt;/shortname&gt;&nbsp;&lt;!--&nbsp;标签的简写&nbsp;--&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;<span>&lt;tag&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;name&gt;tags&lt;/name&gt;&nbsp;&nbsp;&lt;!--&nbsp;标签名字&nbsp;--&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;tagclass&gt;com.mercyblitz.mytags&lt;/tagclass&gt;&nbsp;&nbsp;&lt;!--&nbsp;指定你的标签的类&nbsp;--&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;<span>&lt;/tag&gt;&nbsp;&nbsp;</span> </li><li><span>&lt;/taglib&gt;&nbsp;&nbsp;</span> </li></ol> </div> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标签库元素&lt;taglib&gt;属性:表格如下<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <table summary="" align="center" border="1" cellpadding="1" cellspacing="1" width="70%">     <caption>属性表格</caption>     <tbody>         <tr>             <td align="center">属性</td>             <td align="center">描述</td>         </tr>         <tr>             <td align="center">tlib-version</td>             <td align="center">本标签库实现版本</td>         </tr>         <tr>             <td align="center">jsp-version</td>             <td align="center">标签库依赖的JSP版本</td>         </tr>         <tr>             <td align="center">short-name</td>             <td align="center">被JSP创作工具使用的一个短的默认名词</td>         </tr>         <tr>             <td align="center">uri</td>             <td align="center">指定这个标签库的uri信息</td>         </tr>         <tr>             <td align="center">display-name</td>             <td align="center">被工具使用的显示用的名字</td>         </tr>         <tr>             <td align="center">small-icon</td>             <td align="center">被工具使用的小图标</td>         </tr>         <tr>             <td align="center">large-icon</td>             <td align="center">被工具使用的大图标</td>         </tr>         <tr>             <td align="center">description</td>             <td align="center">本标签的描述</td>         </tr>         <tr>             <td align="center">validator</td>             <td align="center">TLD验证信息</td>         </tr>         <tr>             <td align="center">listener</td>             <td align="center">实践监听器规范</td>         </tr>     </tbody> </table> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tag标签相关属性：<br /> <table summary="" align="center" border="1" cellpadding="1" cellspacing="1" width="70%">     <caption>tag标签相关属性表</caption>     <tbody>         <tr>             <td align="center">属性</td>             <td align="center">描述</td>         </tr>         <tr>             <td align="center">name</td>             <td align="center">tag标签唯一的名称</td>         </tr>         <tr>             <td align="center">tag-class</td>             <td align="center">tag标签的处理类</td>         </tr>         <tr>             <td align="center">tei-class</td>             <td align="center">tag标签的TagExtraInfo类</td>         </tr>         <tr>             <td align="center">body-content</td>             <td align="center">标签主体的内容</td>         </tr>         <tr>             <td align="center">display-name</td>             <td align="center">显示的名称</td>         </tr>         <tr>             <td align="center">small-icon</td>             <td align="center">被工具使用的小图标</td>         </tr>         <tr>             <td align="center">large-icon</td>             <td align="center">被工具使用的大图标</td>         </tr>         <tr>             <td align="center">description</td>             <td align="center">本标签的描述</td>         </tr>         <tr>             <td align="center">variable</td>             <td align="center">脚本变量的信息</td>         </tr>         <tr>             <td align="center">attribute</td>             <td align="center">标签属性的信息</td>         </tr>     </tbody> </table> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这些呢，是为以后高级内容说要提到的！<br /> <ul><li>web.xml中指定你的tld文件     <div>xml 代码</div>     <div>     <div>&nbsp;</div>     <ol><li><span>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;&nbsp;&nbsp;</span> </li><li><span>&lt;web-app&nbsp;version="2.4"&nbsp;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>xmlns="http://java.sun.com/xml/ns/j2ee"&nbsp;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&nbsp;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee&nbsp;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"<span>&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;welcome-file-list&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;welcome-file&gt;/WEB-INF/mytag.jsp&lt;/welcome-file&gt;&nbsp;&lt;!--&nbsp;设置欢迎页面&nbsp;--&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;/welcome-file-list&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;jsp-config&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;taglib&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;taglib-uri&gt;http://mercyblitz.blog.ccidnet.com/taglibs.tld&lt;/taglib-uri&gt;&nbsp;&lt;!--&nbsp;设置自定义标签的uri（不一定存在，但是一定要唯一）,为页面的部署做好准备&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;taglib-location&gt;/WEB-INF/taglibs.tld&lt;/taglib-location&gt;&nbsp;&nbsp;&lt;!--定位你的tld文件的相对路径&nbsp;--&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;/taglib&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;/jsp-config&gt;&nbsp;&nbsp;</span> </li><li><span>&lt;/web-app&gt;&nbsp; <br /></span></li></ol>     </div>     </li></ul> <ul><li>页面部署：mytag.jsp     <div>html 代码</div>     <div>     <div>&nbsp;</div>     <ol><li><span>&lt;%@&nbsp;page&nbsp;language="java"&nbsp;import="java.util.*"&nbsp;pageEncoding="GBK"%&gt;&nbsp;&nbsp;</span> </li><li><span>&lt;%@&nbsp;taglib&nbsp;uri="http://mercyblitz.blog.ccidnet.com/taglibs.tld"&nbsp;prefix="out"&nbsp;%&gt;&nbsp;&nbsp;</span> </li><li><span>&lt;html&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;<span>&lt;head&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;title&gt;mytag.jsp&lt;/title&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;<span>&lt;/head&gt;&nbsp;&nbsp;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;<span>&lt;body&gt;&nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;out:tags/&gt;&nbsp; &lt;!-- 页面执行的结构，就是:&nbsp; Hello,World --&gt;<br /></span></li><li>&nbsp;&nbsp;<span>&lt;/body&gt;&nbsp;&nbsp;</span> </li><li><span>&lt;/html&gt;&nbsp;&nbsp;</span> </li></ol>     </div>     </li></ul></div> <img src ="http://www.blogjava.net/jjshcc/aggbug/351326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2011-05-30 13:04 <a href="http://www.blogjava.net/jjshcc/archive/2011/05/30/351326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>