<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>zhangguoli1997</title>
    <description></description>
    <link>http://zhangguoli1997.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Tomcat之Session和Cookie大揭密4</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/214012" style="color:red;">http://zhangguoli1997.javaeye.com/blog/214012</a>&nbsp;
          发表时间: 2008年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转载自 <br />http://tech.it168.com/j/2007-09-29/200709291005796.shtml <br />作者：IT168 极地圣火 2007-09-29 <br /><br /><br /><br /><br /><strong>四、随心所欲使用Session</strong><br /><br /><strong>(1) 使用url传递session id</strong><br /><br />    在上面讲过，在默认情况下session是依靠客户端的cookie来实现的。但如果客户端浏览器不支持cookie或将cookie功能关闭，那就就意味着无法通过cookie来实现session了。在这种情况下，我们还可以有另一种选择，就是通过url来传递session id。<br /><br />    对于Tomcat来说，需要使用jsessionid作为key来传递session id。但具体如何传呢？可能有很多人认为会是如下的格式：<br /><br />http://localhost:8080/test/MyJSP.jsp?jsessionid= D5A5C79F3C8E8653BC8B4F0860BFDBCD<br /><br />    但实验上面的url并不好使。其实最直接的方法我们可以看一下Tomcat的源程序是如何写的，首先下载tomcat的源程序，然后找到CoyoteAdapter.java文件，并打开。在其中找到parseSessionId方法，这个方法是用来从url中提取Session id的。我们可以不必了解这个方法的全部代码，只看一下开头就可以。代码片段如下：<br /><br />    <pre name="code" class="java"> ByteChunk uriBC = req.requestURI().getByteChunk();
     int semicolon = uriBC.indexOf(match, 0, match.length(), 0);
     if (semicolon > 0) {...}</pre><br /><br />    上面代码中的uriBC就是请求的url，第二行在这个url中查找match字符串，再在CoyoteAdapter.java中查找一个match字符串，match变量的初值如下：<br /><br />    <pre name="code" class="java">private static final String match = ";" + Globals.SESSION_PARAMETER_NAME + "=";</pre><br /><br />    从上面代码可以看出，match开头是一个";"字符，而SESSION_PARAMETER_NAME是一个常量，值就是"jsessionid"，因此可以断定，MyJSP.jsp后跟的是";"，并不是"?"，因此，正确的url如下：<br /> <br />http://localhost:8080/test/MyJSP.jsp;jsessionid= D5A5C79F3C8E8653BC8B4F0860BFDBCD<br /><br />    通过使用上述方法甚至可以在不同的机器上获得同一个session对象。<br /><br />    在CoyoteAdapter.java文件中还有一个parseSessionCookiesId方法，这个方法将从HTTP请求头中提取session id。我们中postParseRequest方法中可以看到将调用的parseSessionId方法，在最后调用了parseSessionCookiesId方法，因此，我们可以断定，tomcat将考虑url中的session id，然后再读取Cookie字段中的session id。还有就是在postParseRequest方法的最后部分有一个response.sendRedirect(redirectPath);，在调完它后，就直接return了。而没有执行到parseSessionCookiesId，因此，使用重定向并不能通过HTTP头的cookie字段共享session。只能通过url来传递session id。<br /><br /><strong>(2) 将tomcat的cookie支持关闭</strong><br /><br />如果我们只想使用url来支持session，可以直接将tomcat的cookie功能关闭。我们可<br />以修改conf中的context.xml文件，加入一个cookies="false"即可，内容如下：<br /><br /><pre name="code" class="java">&lt;!-- The contents of this file will be loaded for each web application -->
&lt;Context cookies = "false">
... ...
... ...
&lt;/Context></pre><br /><br />    重启tomcat后，就算客户端支持cookie，tomcat也不会考虑HTTP请求头的cookie字段。<br /><br /><strong>(3) 在IE中控制Cookie</strong><br /><br />    在IE中也可以将Cookie关闭，启动IE，在工具->Internet选项->稳私->高级中选中"覆盖自动cookie处理"选项。并按图1选择：<br /><br /><br /><img src="http://www.javaeye.com/upload/attachment/30797/cecb0536-a3fa-3eeb-bdaf-8a2ec0884053.jpg" /><br /><br /><br /><br /> 对于下面的选项"总是允许会话cookie"，如果不选，在本机将允许会话cookie，也就是通过localhost访问，在远程将不允许会话cookie。我们也可以通过在工具->Internet选项->稳私->站点来对某个网站来允许和拒绝cookie。
          <br/><br/>
          <span style="color:red;">
            <a href="http://zhangguoli1997.javaeye.com/blog/214012#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Jul 2008 17:19:56 +0800</pubDate>
        <link>http://zhangguoli1997.javaeye.com/blog/214012</link>
        <guid>http://zhangguoli1997.javaeye.com/blog/214012</guid>
      </item>
      <item>
        <title>Tomcat之Session和Cookie大揭密3</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/214011" style="color:red;">http://zhangguoli1997.javaeye.com/blog/214011</a>&nbsp;
          发表时间: 2008年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>转载自 <br />http://tech.it168.com/j/2007-09-29/200709291005796.shtml <br />作者：IT168 极地圣火 2007-09-29 </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>三、Tomcat中的JSP和Session <br /></strong><br />从本质上讲，JSP在运行时已经被编译成相应的Servlet了，因此，在JSP和Servlet中Session的使用方法应该差不多。但还是有一些细小的差别。 <br /><br />如果我们使用过JSP就会发现，在JSP中很多对象是不需要创建的，如out、session等。它们可以直接使用。如下面的JSP代码所示 <br />&lt;!-- MyJSP.jsp --&gt;</p>
<pre name="code" class="java">&lt;%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta http-equiv="Content-Type" content="text/html; charset=GB18030"&gt;
        &lt;title&gt;Insert title here&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;%
out.println(session.getId());
%&gt;
    &lt;/body&gt;
&lt;/html&gt;

</pre>
<p><br />在上面的JSP代码中直接使用了out和session。而并不象Servlet里一样用get方法来获得相应的对象实例。那么这是为什么呢？ <br /><br />由于JSP在第一次运行时是被编译成Servlet的，我们自然就会想到有可能是在编译JSP时自动创建了session和out对象。下面我们就来验证这一点。首先需要查看一下JSP被编译成Servlet后的源代码。这非常简单，如果我们使用的是Tomcat，只需要在Tomcat的安装目录中的work中找相应的源程序即可。如一个名为MyJSP.jsp的文件首先被编译成MyJSP_jsp.java（这就是由JSP生成的Servlet源程序文件），然后再由java将MyJSP_jsp.java编译成MyJSP_jsp.class，最后Tomcat运行的就是MyJSP_jsp.class。如上面的JSP程序被编译成Servlet的部分源代码如下：</p>
<pre name="code" class="java">package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class MyJSP_jsp extends org.apache.jasper.runtime.HttpJspBase
{
... ...
... ...
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
response.setContentType("text/html; charset=GB18030");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("&lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"&gt;\r\n");
out.write("&lt;html&gt;\r\n");
out.write("\t&lt;head&gt;\r\n");
out.write("\t\t&lt;meta http-equiv=\"Content-Type\" content=\"text/html; charset=GB18030\"&gt;\r\n");
out.write("\t\t&lt;title&gt;Insert title here&lt;/title&gt;\r\n");
out.write("\t&lt;/head&gt;\r\n");
out.write("\t&lt;body&gt;\r\n");
out.write("\t\t");
out.println(session.getId());
out.write("\r\n");
out.write("\r\n");
out.write("\t&lt;/body&gt;\r\n");
out.write("&lt;/html&gt;");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null &amp;&amp; out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
</pre>
<p><br />我们可以看到上面的代码中的_jspService方法类似于HttpServlet中的service方法，在方法的开始部分首先建立了session、application、out等对象实例。然后将MyJSP.jsp中的HTML通过out输出到客户端。我们要注意上面的黑体字的语句：out.println(session.getId());，JSP编译器自动将JSP中的&lt;% ... %&gt;中包含的Java代码原封不动地插入到_jspService中。由于是在创建对象实例后插入，因此，就可以直接使用session、out等对象了。 <br /><br />如果我们想做进一步的实验，可以直接使用javac来编译MyJSP_jsp.java，为了方便其间，首先建立一个c.cmd文件，它的内容如下： <br /><br />javac -classpath <br />D:\tools\apache-tomcat-6.0.13\lib\servlet-api.jar;D:\tools\apache-tomcat-6.0.13\lib\jsp-api.jar;D:\tools\apache-tomcat-6.0.13\lib\annotations-api.jar;D:\tools\apache-tomcat-6.0.13\lib\catalina.jar;D:\tools\apache-tomcat-6.0.13\lib\jasper.jar;D:\tools\apache-tomcat-6.0.13\lib\el-api.jar %1 <br /><br />其中D:\tools\apache-tomcat-6.0.13是tomcat的安装目录，读者可以将其设为自己的机器上的tomcat安装目录 <br /><br />在编译时可直接使用c MyJSP_jsp.java进行编译，这时tomcat就直接运行我们编译生成的MyJSP_jsp.class了。 <br /><br />从上面的代码我们还可以了解一点，在JSP无论使用还是不使用session，都会使用getSession方法创建一个Session对象，而Servlet必须显式地调用才会建立Session对象。 <br /><br /><span style="color: #ff0000;">注：通过直接编译java文件运行jsp，需要清除一下tomcat的缓存，一般需要重启一下tomcat。</span></p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zhangguoli1997.javaeye.com/blog/214011#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Jul 2008 17:18:27 +0800</pubDate>
        <link>http://zhangguoli1997.javaeye.com/blog/214011</link>
        <guid>http://zhangguoli1997.javaeye.com/blog/214011</guid>
      </item>
      <item>
        <title>Tomcat之Session和Cookie大揭密(二)</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/214007" style="color:red;">http://zhangguoli1997.javaeye.com/blog/214007</a>&nbsp;
          发表时间: 2008年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转载自 <br />http://tech.it168.com/j/2007-09-29/200709291005796.shtml <br />作者：IT168 极地圣火 2007-09-29 <br /><br /><br /><strong>二、Tomcat中的Servlet和Session</strong><br /><br />    由于Cookie数存在保存在客户端，这样对于一些敏感数据会带来一些风险。而且Cookie一般只能保存字符串等简单数据。并且大小限制在4KB。如果要保存比较复杂的数据，Cookie可能显得有些不合适。基于这些原因，我们自然会想到在服务端采用这种类似Cookie的机制来存储数据。这就是我们这节要讲的会话(Session)。而在一个客户端和服务端的会话中所有的页面可以共享为这个会话所建立的Session。<br /><br />    那么什么是会话呢？有很多人认为会话就是在一台机器上客户端浏览器访问某个域名所指向的服务端程序，就建立了一个客户端到服务端的会话。然后关闭客户端浏览器，会话就结束。其实这并不准确。<br /><br />    首先让我们先来看看Session的原理。Session和Cookie类似。所不同的是它是建立在服务端的对象。每一个Session对象一个会话。也许很多读者看到这会有一个疑问。Session是如何同客户端联系在一起的呢？很多人在使用Session时并没有感觉到这一点。其实这一切都是Web服务器，如Tomcat一手包办的。那么Web服务器又是如何识别通过HTTP协议进行连接的客户端的呢？这就要用到第一节中所讲的Cookie。在一般情况下，Session使用了临时Cookie来识别某一个Session是否属于某一个会话。在本文中以Tomcat为例来说明Session是如何工作的。<br /><br />    让我们先假设某一个客户端第一次访问一个Servlet，在这个Servlet中使用了getSession来得到一个Session对象，也就是建立了一个会话，这个Servlet的代码如下：<br /><br /><pre name="code" class="java">
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class First extends HttpServlet
{
  public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
  {
     response.setContentType("text/html");
     HttpSession session = request.getSession();
     session.setAttribute("key", "mySessionValue");
     PrintWriter out = response.getWriter();
     out.println("The session has been generated!");
     out.flush();
     out.close();
  }
}

</pre><br />对于服务端的First来说，getSession方法主要做了两件事：<br />    1. 从客户端的HTTP请求头的Cookie字段中获得一个寻找一个JSESSIONID的key，这个key的值是一个唯一字符串，类似于D5A5C79F3C8E8653BC8B4F0860BFDBCD 。<br />    <br />2. 如果Cookie中包含这个JSESSIONID，将key的值取出，在Tomcat的Session Map（用于保存Tomcat自启动以来的所有创建的Session）中查找，如果找到，将这个Session取出，如果未找到，创建一个HttpSession对象，并保存在Session Map中，以便下一次使用这个Key来获得这个Session。<br /> <br />在服务器向客户端发送响应信息时，如果是新创建的HttpSession对象，在响应HTTP<br />头中加了一个Set-Cookie字段，并将JSESSIONID和相应的值反回给客户端。如下面的HTTP响应头：<br /><pre name="code" class="java">
HTTP/1.1 200 OK
...
Set-Cookie: JSESSIONID=D5A5C79F3C8E8653BC8B4F0860BFDBCD
...
</pre><br /><br />    对于客户端浏览器来说，并不认识哪个Cookie是用于Session的，它只是将相应的临时Cookie和永久Cookie原封不动地放到请求HTTP头的Cookie字段中，发送给服务器。如果在IE中首次访问服务端的First，这时在当前IE窗口并没有临时Cookie，因此，在请求HTTP头中就没有Cookie字段，所以First在调用getSession方法时就未找到JSESSIONID，因此，就会新建一个HttpSession对象。并在Set-Cookie中将这个JSESSIONID返回。接下来我们使用另外一个Servlet：Second来获得在First中所设置的Session数据。Second的代码如下：<br /><pre name="code" class="java">
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class Second extends HttpServlet
{
    public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
    {
        response.setContentType("text/html");
        HttpSession session = request.getSession();
        PrintWriter out = response.getWriter();
        out.println(session.getAttribute("key"));
        out.flush();
        out.close();
    }
}
</pre><br /><br />     如果在同一个窗口来调用Second。这时客户端已经有了一个临时Cookie，就是JSESSIONID，因此，会将这个Cookie放到HTTP头的Cookie字段中发送给服务端。服务端在收到这个HTTP请求时就可以从Cookie中得到JSESSIONID的值，并从Session Map中找到这个Session对象，也就是getSession方法的返回值。因此，从技术层面上来说，所有拥有同一个Session ID的页面都应该属于同一个会话。<br /><br />    如果我们在一个新的IE窗口调用Second，并不会得到mySessionValue。因为这时Second和First拥有了不同的Session ID，因此，它们并不属于同一个会话。讲到这，也许很多读者眼前一亮。既然拥有同一个Session ID，就可以共享Session对象，那么我们可不可以使用永久Cookie将这个Session ID保存在Cookie文件中，这样就算在新的IE窗口，也可以共享Session对象了。答案是肯定的。下面是新的First代码：<br /><br /><pre name="code" class="java">
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class First extends HttpServlet
{
    public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
    {
        response.setContentType("text/html");
        HttpSession session = request.getSession();
        session.setMaxInactiveInterval(3600);
        Cookie cookie = new Cookie("JSESSIONID", session.getId());
        cookie.setMaxAge(3600);
        response.addCookie(cookie);
        session.setAttribute("key", "mySessionValue");
        PrintWriter out = response.getWriter();
        out.println("The session has been generated!");
        out.flush();
        out.close();
     }
}
</pre><br />    在上面的代码中使用了Cookie对象将JSESSIONID写入了Cookie文件，并使用setMaxAge方法将Cookie超时时间设为3600秒（1小时）。这样只要访问过First，从访问时间算起，在1小时之内，在本机的任何IE窗口调用Second都会得到"mySessionValue"字符串。
          <br/><br/>
          <span style="color:red;">
            <a href="http://zhangguoli1997.javaeye.com/blog/214007#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Jul 2008 17:11:16 +0800</pubDate>
        <link>http://zhangguoli1997.javaeye.com/blog/214007</link>
        <guid>http://zhangguoli1997.javaeye.com/blog/214007</guid>
      </item>
      <item>
        <title>Tomcat之Session和Cookie大揭密(一)</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/214002" style="color:red;">http://zhangguoli1997.javaeye.com/blog/214002</a>&nbsp;
          发表时间: 2008年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转载自<br />http://tech.it168.com/j/2007-09-29/200709291005796.shtml<br />作者：IT168 极地圣火  2007-09-29<br /><br /><br /><strong>一、JSP和Servlet中的Cookie </strong><br /><br />    由于HTTP协议是无状态协议（虽然Socket连接是有状态的，但每次用HTTP协议进行数据传输后就关闭的Socket连接，因此，HTTP协议并不会保存上一次的状态），因此，如果要保存某些HTTP请求过程中所产生的数据，就必须要有一种类似全局变量的机制保证数据在不同的HTTP请求之间共享。这就是下面要讲的Session和Cookie。<br /><br />    Cookie是通过将数据保存在客户端的硬盘（永久Cookie）或内存（临时Cookie）中来实现数据共享的一种机制。在Windows下，保存在这些Cookie数据的目录一般是C:\Documents and Settings\Administrator\Cookies。每一个Cookie有一个超时时间，如果超过了这个时间，Cookie将自动失效。可按如下方法来设置Cookie的超时时间：<br /><pre name="code" class="java">
Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(3600);  // Cookie的超时间为3600秒，也就是1小时
response.addCookie(cookie);
</pre><br />如果不使用setMaxAge方法，Cookie的超时时间为-1，在这种情况下，Cookie就是临时Cookie，也就是说这种Cookie实际上并不保存在客户端硬盘上，而是保存在客户端内存中的。读者可以在JSP中运行如下代码，看看是否会在上面提到的保存cookie的目录中生成cookie文件：<br /><pre name="code" class="java">
 Cookie cookie = new Cookie("key","value");
response.addCookie(cookie);
</pre><br /><br />实际上使用setMaxAge将超时时间设为任意的负数都会被客户端浏览器认为是临时<br />Cookie，如下面的代码将在客户端内存中保存一个临时Cookie：<br /><br /><pre name="code" class="java">
Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(-100);  // 将cookie设为临时Cookie
response.addCookie(cookie);
</pre><br /><br />如果第一次将Cookie写入客户端（不管是硬盘还是内存），在同一台机器上第二次访问<br />该网站的jsp页面时，会自动将客户端的cookie作为HTTP请求头的Cookie字段值传给服务端，如果有多个Cookie，中间用";"隔开。如下面的HTTP请求头所示：<br /><pre name="code" class="java">
GET /test/First.jsp HTTP/1.1
HOST:localhost
...
Cookie:key1=value1;key2=value2
...
...
</pre><br />我们可以在JSP中使用如下的Java代码来输出Cookie字段的值：<br /><pre name="code" class="java">
     out.println(request.getHeader("Cookie"));
</pre><br />如果在Servlet中输出，必须得使用如下语句得到out，才能向客户端浏览器输出数据：<br /><pre name="code" class="java">
       PrintWriter out = response.getWriter();
</pre><br />    虽然永久Cookie和临时Cookie在第二次向服务端发出HTTP请求时生成Cookie字段，但它们还是有一定的区别的。永久Cookie在任意新开启的IE窗口都可以生成Cookie。而临时Cookie由于只保存在当前IE窗口，因此，在新开启的IE窗口，是不能生成Cookie字段的，也就是说，新窗口和旧窗口是不能共享临时Cookie的。使用重定向机制弹出的新窗口也无法和旧窗口共享临时Cookie。但在同一个窗口可以。如在一个IE窗口输入http://localhost:8080/test/first.jsp，向内存写入一个临时Cookie后，在同一个IE窗口输入http://localhost:8080/test/second.jsp，浏览器在向服务端发送HTTP请求时，自动将当前浏览器的临时Cookie(也就是first.jsp所创建的Cookie)和永久Cookie作为HTTP请求头的Cookie字段值发送给服务端。但是如果新启一个IE窗口，由于新IE窗口没有这个临时Cookie，因此，second.jsp只发送了保存在硬盘上的永久Cookie。
          <br/><br/>
          <span style="color:red;">
            <a href="http://zhangguoli1997.javaeye.com/blog/214002#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Jul 2008 17:06:36 +0800</pubDate>
        <link>http://zhangguoli1997.javaeye.com/blog/214002</link>
        <guid>http://zhangguoli1997.javaeye.com/blog/214002</guid>
      </item>
      <item>
        <title>javascript常用字符串处理函数</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/213086" style="color:red;">http://zhangguoli1997.javaeye.com/blog/213086</a>&nbsp;
          发表时间: 2008年07月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本文转载自http://alonglee.net/tech/News_details.asp?news_ID=632&user_ID=10<br /><br />谢谢作者分享。<br /><br />javascript 字符串处理<br /><span style="color: red">一、声明字符串:</span><br />var normal_monkey = "I am a monkey!&lt;br>";<br />document.writeln("Normal monkey " + normal_monkey);<br /><br />var bold_monkey = normal_monkey.bold();<br />document.writeln("Bold monkey " + bold_monkey);<br /><br />这里的声明： var bold_monkey = normal_monkey.bold();<br />和下面对声明是等同的： <br />var bold_monkey = "&lt;b>" + normal_monkey + "&lt;/b>";<br /><br />第1个版本的声明看起来要简明得多。这里用到了字符串对象中<br />的bold对象，其他的字符串对象还有indexOf, charAt, <br />substring, 以及split, 这些方法可以深入字符串的组成结构。<br />首先我们研究一下indexOf。<br /><br /><span style="color: red">2、indexOf</span><br />indexOf用于发现一系列的字符在一个字符串中等位置并告诉你子字符串的起始位置。如<br /><br />果一个字符串中部包含该子字符串则indexOf返回returns "-1."<br />例子：<br />var the_word = "monkey"; <br /> //让我们从单词 "monkey"开始。 <br />var location_of_m = the_word.indexOf("m"); <br /> //location_of_m(字母m的位置)将为0，因为字母m位于该字符串的起始位置。<br />var location_of_o = the_word.indexOf("o"); <br /> //location_of_o(字母o的位置)将为1。<br />var location_of_key = the_word.indexOf("key"); <br /> //location_of_key(key的位置)将为3因为子字符串“key”以字母k开始，而k<br /><br />在单词monkey中的位置是3。<br />var location_of_y = the_word.indexOf("y"); <br /> //location_of_y)字母y的位置)是5。 <br />var cheeky = the_word.indexOf("q"); <br /> //cheeky值是-1，因为在单词“monkey”中没有字母q。<br /><br />indexOf更实用之处:<br />var the_email = prompt("What’s your email address?", "");<br />var the_at_is_at = the_email.indexOf("@");<br />if (the_at_is_at == -1)<br />{<br />    alert("You loser, email addresses must <br />    have @ signs in them.");<br />}<br /><br />这段代码询问用户的电子邮件地址，如果用户输入的电子邮件地址中不包含字符 则 提<br /><br />示用户＂＠你输入的电子邮件地址无效，电子邮件的地址必须包含字符@。＂<br /><br /><span style="color: red">3、charAt </span><br />chatAt方法用于发现一个字符串中某个特定位置的字符。<br />这里是一个例子：<br />var the_word = "monkey";<br />var the_first_letter = the_word.charAt(0);<br />var the_second_letter = the_word.charAt(1);<br />var the_last_letter = the_word.charAt(the_word.length-1);<br /><br />the_first_letter(第1个字符)是"m"<br />the_second_letter(第2个字符)是"o"<br />the_last_letter(最后一个字符)是 "y"<br /><br />注意利用字符串的length(长度)属性你可以发现在包含多少个字符。在本例中，<br /><br />the_word是"monkey"，所以the_word.length是6。不要忘记在一个字符串中第1个字符的<br /><br />位置是0，所以最后一个字符的位置就是length-1。所以在最后一行中用了<br /><br />the_word.length-1。>><br /><br /><span style="color: red">4、子字符串（substring）</span><br />子字符串（substring）和charAt有些象，不同之处在于它能够从一个单词中抓取整个的<br /><br />子字符串，而不只是字母，这里是其格式：<br /><br />var the_substring = the_string.substring(from, to);<br /><br />"From"指的是子字符串中第１个字母的位置，"to"有点奇特，它是该子字符串中比最后<br /><br />一个位置大１的位置．使用这种神奇的方法你可以标记子字符串的起始和结束位置，用<br /><br />"to"的位置减去"from"的位置就会得出该子字符串的长度：<br /><br />var the_string = "monkey";<br />var clergy = the_string.substring(0,4);<br />var tool = the_string.substring(3,6);<br /><br />运行该段代码后变量clergy的值为"monk"; 变量tool的值为"key"。<br /><br />子字符串常和indexOf一起使用，将字符串分成若干块．例如，<br />你可以从一个给定的URL中抽取出其域名：<br /><br />var the_url = prompt("What’s the URL?","");<br />var lead_slashes = the_url.indexOf("//");<br />var domain_start = lead_slashes + 2;<br />var without_resource = the_url.substring(domain_start, the_url.length);<br />var next_slash = without_resource.indexOf("/");<br />var domain = without_resource.substring(0, next_slash);<br /><br />这段代码的意思是：如果你输入<br />"javascript/index.html">http://www.webmonkey.com/javascript/index.html";，则域名就是<br /><br />"www.webmonkey.com" ．如果这个方法对你来说有些麻烦，我将向你介绍如何使用split<br /><br />方法简化其执行过程．但是首先我们作一些分析．<br /><br />基本的技巧是将第１个斜杠和第２个斜杠之间的内容分离出来：<br />var the_url = prompt("What’s the URL?",""); <br />//这行代码向用户询问一个URL．假设用户输入了<br />"javascript/index.html.">http://www.webmonkey.com/javascript/index.html."; <br />var lead_slashes = the_url.indexOf("//"); <br />这行代码确定第一个双斜杠的位置．在本例中lead_slashes的值是５，因为双斜杠的位<br /><br />置从５开始．<br /><br />你可能会想，通常的URL都是以http://开始，所以双斜杠的位置肯定是在５开始，为什<br /><br />么还要加入indexOf这一段多余的代码呢？但是问题的关键在于你不知道用户在填入URL<br /><br />时是否一定填入http:，他们也许会不小心多键入了一个空格，也许他们所键入的URL在<br /><br />一个加密服务器上，其URL是"https://www.whatever.com/"; ．在编程你必须预料到种种<br /><br />可能发生的问题．所以我们必须用indexOf方法确定双斜杠的确切的起始位置．<br /><br />var domain_start = lead_slashes + 2; <br /><br />这行代码用于计算该域名的第１个字母的起始位置．由于这里有一个双斜杠，所以域名<br /><br />第１个字母的起始位置应该在双斜杠所在位置加２的位置．<br /><br />var without_resource = the_url.substring(domain_start, the_string.length); <br /><br />这段代码将域名起始位置往后的所有字符都提取出来．所以执行完这行代码后<br /><br />without_resource是"www.webmonkey.com/javascript/index.html." <br /><br />var next_slash = without_resource.indexOf("/"); <br /><br />这行代码计算出该字符串中下一个斜杠的位置，而从该字符串起始位置到这个斜杠之间<br /><br />的内容就是域名．在本例中下一个斜杠的位置是17。<br /><br />var domain = without_resource.substring(0, next_slash); <br /><br />最后一步是提取出该字符串起始位置到下一个斜杠之间的所有内容．在本例中使得域名<br /><br />等同于"www.webmonkey.com"。<br /><br />这样做确实很麻烦，利用split方法则可以使该过程容易很多．>><br /><br /><span style="color: red">5、分割方法(splitting method) </span>你可以使用split方法用限位器来分割一系列的名称，然后将其<br />放在一个数组中．例如：<br /><br />var my_friends ="trixie,moxie,sven,guido,hermes";<br /><br />var friend_array =my_friends.split(",");<br /><br />for (loop=0; loop &lt; friend_array.length;loop++)<br />{    document.writeln(friend_array[loop] + " is myfriend.&lt;br>");}<br /><br />这段代码将字符串my_friends分割成包含５个元素的数组．JavaScript可以为你自动建<br /><br />立一个数组，所以你无需使用new Array()．<br /><br />将字符串分割成数组之后，我们使用了循环语句写出每一个名称．我们可以利用split方<br /><br />法简化前面所讲到的域名提取：<br /><br />var the_url = prompt("What’s the URL?","");<br />var first_split = the_url.split("//");<br />var without_resource = first_split[1];<br />var second_split = without_resource.split("/");<br />var domain = second_split[0];<br /><br />这段代码简化了很多而且也更容易理解．我们来分析一些这段代码：<br /><br />var the_url = prompt("What’s the URL?",""); <br /><br />提示用户输入一个URL，假设用户输入<br />"javascript/index.html">http://www.webmonkey.com/javascript/index.html"; ．<br />var first_split = the_url.split("//"); <br />将用户输入的字符串分割成两块：first_split[0]是"http:"，first_split[1]是<br /><br />"www.webmonkey.com/javascript/index.html." <br />var without_resource = first_split[1]; <br />//提取出数组中的第２个元素，所以现在without_resource是<br /><br />"www.webmonkey.com/javascript/index.html." <br />var second_split = without_resource.split("/"); <br />将without_resource分割成３块：www.webmonkey.com,javascript, 和index.html．现<br /><br />在你可以看到split的用途了吧？<br /><br />var domain = second_split[0]; <br /><br />现在我们提取出新数组中的第１个元素就可得出域名．
          <br/><br/>
          <span style="color:red;">
            <a href="http://zhangguoli1997.javaeye.com/blog/213086#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Jul 2008 14:12:08 +0800</pubDate>
        <link>http://zhangguoli1997.javaeye.com/blog/213086</link>
        <guid>http://zhangguoli1997.javaeye.com/blog/213086</guid>
      </item>
      <item>
        <title>javascript动态改变元素css</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/213085" style="color:red;">http://zhangguoli1997.javaeye.com/blog/213085</a>&nbsp;
          发表时间: 2008年07月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          object.style.cssText<br />通过对象的这个属性可以得到这个对象上使用的css的文本内容。包括通过class=‘name’<br />方式指定的css。这样就可以动态添加/删除对象上的css属性。
          <br/><br/>
          <span style="color:red;">
            <a href="http://zhangguoli1997.javaeye.com/blog/213085#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Jul 2008 14:09:38 +0800</pubDate>
        <link>http://zhangguoli1997.javaeye.com/blog/213085</link>
        <guid>http://zhangguoli1997.javaeye.com/blog/213085</guid>
      </item>
      <item>
        <title>什么是SQL执行计划</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/183498" style="color:red;">http://zhangguoli1997.javaeye.com/blog/183498</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一个SQL语句表示你所想要得到的但是并没有告诉Server如何去做. 例如, 利用一个SQL语句, 你可能要Server取出所有住在Prague的客户. 当Server收到的这条SQL的时候, 第一件事情并不是解析它. 如果这条SQL没有语法错误, Server才会继续工作. Server会决定最好的计算方式. Server会选择, 是读整个客户表好呢, 还是利用索引会比较快些. Server会比较所有可能方法所耗费的资源. 最终SQL语句被物理性执行的方法被称做执行计划或者是查询计划.<br /><br />      一个执行计划右若干基本操作组成. 例如, 遍历整张表, 利用索引, 执行一个嵌套循环或Hash连接等等. 我们将在这一系列的文章里详细讨论. 所有的基本操作都有一个输出: 结果集. 有些, 象嵌套循环, 有一个输入. 其他的, 象Hash连接, 有两个输入. 每个输入应与其它基本操作的的输出想连接. 这也就是为什么一个执行可以被看做是一个数的原因: 信息从树叶流向树根. 在文章的下面部分有很多诸如此类的例子.<br /><br />       负责处理或计算最优的执行计划的DB Server组件叫优化器. 优化器是建立在其所在的DB资源的基础上而进行工作的.<br /><br /><span style="color: red">说白了就是数据库服务器在执行sql语句之前会制定几套执行计划！看那个机会消耗的系统资源少，就是用那套计划！被数据库服务器执行的那天执行计划就叫做sql语句的执行计划！</span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zhangguoli1997.javaeye.com/blog/183498#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Apr 2008 18:50:51 +0800</pubDate>
        <link>http://zhangguoli1997.javaeye.com/blog/183498</link>
        <guid>http://zhangguoli1997.javaeye.com/blog/183498</guid>
      </item>
      <item>
        <title>线程中的current thread not owner异常错误</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/183484" style="color:red;">http://zhangguoli1997.javaeye.com/blog/183484</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          多线程常用的一些方法: wait(),wait(long),notify(),notifyAll()等<br /><br />这些方法是当前类的实例方法,<br /><br />wait()      是使持有对象锁的线程释放锁;<br />wait(long)是使持有对象锁的线程释放锁时间为long(毫秒)后,再次获得锁,wait()和wait(0)等价;<br />notify()    是唤醒一个正在等待该对象锁的线程,如果等待的线程不止一个,那么被唤醒的线程由jvm确定;<br />notifyAll  是唤醒所有正在等待该对象锁的线程.<br /><br />并且应该优先使用notifyAll()方法,因为唤醒所有线程比唤醒一个线程更容易让jvm找到最适合被唤醒的线程.<br /><span style="color: red"><br />对于上述方法,只有在当前线程中才能使用,否则报运行时错误java.lang.IllegalMonitorStateException: current thread not owner.</span><br /><br />从实现角度来分析：<br />在线程调用wait()方法时，需要把它放到一个同步段里，即应该在调用前使用<br /><pre name="code" class="java">
synchroed(this){
  thread.wait();
}
</pre><br />否则将会出现"java.lang.IllegalMonitorStateException: current thread not owner"的异常。<br />本文转自 http://www.blogjava.net/crazycy/archive/2006/10/08/73896.html<br />再次谢谢崔毅先生
          <br/><br/>
          <span style="color:red;">
            <a href="http://zhangguoli1997.javaeye.com/blog/183484#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Apr 2008 18:04:21 +0800</pubDate>
        <link>http://zhangguoli1997.javaeye.com/blog/183484</link>
        <guid>http://zhangguoli1997.javaeye.com/blog/183484</guid>
      </item>
      <item>
        <title> 银行按揭——之《等本与等息》</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/175163" style="color:red;">http://zhangguoli1997.javaeye.com/blog/175163</a>&nbsp;
          发表时间: 2008年03月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近和买了楼的几个朋友谈过这个问题才惊觉这个陷阱果然套了许多人进去。<br /><br />后来打电话给工行贷款部的MM，她说其实工行早有这个还贷方式，如果细心了解就会明白，但售楼和做按揭缴款时，银行和发展商是不会主动提醒你的权利和选择，令想不怕麻烦的业主交多更多的利息。 <br /><br />以下是自己以前找的一些资料：<br /><br />没有办理按揭的业主请注意：购房贷款的还款有本金还款法和本息还款法两种，但利息差别太大！大家自己算算！ <br /><br /><br />例：<br />个人住房商业贷款20万元，10年还清；多数贷款买房人在银行工作人员的推荐下选择本息还款法。虽然是同样的贷款，使用本息还款法却比本金还款法多支付1.2万元。<br />A　起因：今年5月份，一客户向银行贷款20万元购买住房。贷款签字时，合同上有两种还贷方式，一是月等额本息还款法，即贷款期每月以相等的额度平均偿还贷款本息；二是月等额本金还款法，又称利随本清法、等本不等息还款法，即每月等额偿还贷款本金，贷款利息随本金逐月递减（具体计算公式见资料链接）。当时，银行工作人员没有征求他的意见，就在贷款合同上选择了本息还款方式。细心的客户当即问银行工作人员两种还贷方式的差异。 对此，工作人员回答说，本息还款法简单，每月固定还给银行一定数额就行，本金还款法则比较麻烦，要每月计算，不过，本金还款法比本息还款法要少支付几千块钱利息，但数额不会太大。工作人员还告诉他，为了省事，到目前为止贷款人员基本选择的都是本息还款法。 客户当时心有疑问，便暂缓签字，等他回家后按银行提供的两种还款公式算了一下，不由大吃一惊，20万元贷款，10年还清，使用本息还款法竟比本金还款法要多支付1.2万元！李先生认为，住房贷款是一项大额消费，银行应尽可能地说明各种还贷方式的差异、特点，让消费者明明白白地消费。<br /><br />B　比较：细算两种还贷差异。以贷款20万元，期限10年，月利率4.2‰来计算，根据银行提供的还款公式，以等额本息还款法来还款，正如银行工作人员所说，很容易算出来每个月的还款额，约为2125元/月，10年还清，共计还款约25.5万元。 而以等额本金还款法来还款，一下子要算清所有还款额确实很麻烦，但按公式每月计算并不麻烦。公式分为两部分，前一部分为固定额，即（贷款本金）÷（还款期数）；每月固定为1667元，10年算下来为20万元，等同于贷款额度；后一部分是利息，每月变化，逐月减少。记者算出，第一个月还款约为2507元，第二个月为2497元；第三个月为2487元，逐月减少，10年总计约24.3万元，比本息还款法少还约1.2万元。而且，若考虑到每个月只计算一次，且只算利息部分，那么，根本不像银行工作人员说的那样麻烦。 <br /><br />C　调查：没人选本金还款法？结果发现银行记录包括俺很多人都选择了本息还款法，调查结果令人吃惊。 某客户2002年贷款30万元购买了一套住房，当时银行工作人员推荐他按本息还款法还贷，说这样虽比等额本金还款法要多付几千元利息，但省事，每月还款数额固定，且20年平均一摊，多付的几千元利息只是个小数目，他于是便选择了简便的本息还款法。之后，他从没算过两种还款方式的数额差别，现在仔细计算要多付2万多元的利息。 实际上，多数贷款人员都是像这客户这样选择本息还款法的。很多人都对两种还款有如此之大的差别感到吃惊，银行为什么要采取还款数额差这么大的两种还款方式呢？<br /><br />D　暗访：所有的推荐都一样 ？<br />在工商银行个人信贷中心，一位工作人员介绍说，借款人与开发商签订商品房买卖契约后，需申请住房商业贷款的借款人，经银行审批同意，借款人与银行签订贷款合同。在合同中写有两种还款方式———等额本息还款法和等额本金还款法（利随本清），借款人可随意选择任意一种还款方式。问：“哪一种还款方式更方便？”工作人员答：“当然是本息还款更方便，因为本息还款方式每月还款金额都是一样，借款人每月按同样数额往银行存钱就可以。”又问：“那么，本息还款法和本金还款法哪一种方式更省钱？”工作人员答：“本息还款法相对多一些，不过为了方便借款人和银行，一般情况下，银行人员都建议借款人采用本息还款法。” 随后，又问了工商、农业、建设等几家银行的柜台工作人员，得到的答复基本一致。在签合同方面，银行工作人员只是让顾客自己浏览，有疑问时才做出相应的回答，而对于两种贷款方式最终还款额的差别，往往说差不多，只是本息还款法还款多些，但本息还款简便，推荐贷款者按本息还款法还贷来签合同。 之后，又分别电话采访了工商、农业、招商等能办理住房贷款的负责人，得到的回答与柜台工作人员说法基本一致，就是本息还款法每月还款额固定不变，对老百姓来说方便，不像本金还款法，每月都得计算，麻烦。而对于两种还款法最终还款差额，也都说有差别，但未具体算过，应该不会差很远。 <br /><br />E　律师：银行不能含糊概念 <br />律师认为：当银行与顾客发生借贷关系后，银行应对顾客有告之借款所产生的一切问题的义务，哪些条款应该说明，哪些条款又必须履行等，如果银行不明确告诉顾客某些条款内容，含糊概念或诱导顾客，这是明显地侵占顾客的知情权。反之，作为顾客，在借贷合同中有不清楚或不了解的款项，应及时提出疑义，这样不仅保证了自己的权利不受侵犯，也保证自己的利益不受损失。 <br />特别请南京大学数学系的王同学换算出本金还款法还贷总额的简便计算公式；同时，请在银行工作的朋友列出了以1万元为贷款额、期限在1至30年的个人住房等额本息、本金利息总额对照表(附后)，哪种方式更省钱，对照一看便知。 　<br />　<br />A　本息还款法VS本金还款法 　　友情提醒：本金还款法和本息还款法还款总额的差别，与还贷时间、借贷数额密切相关，想贷款买房的市民可根据相应公式计算后，自行选择还贷方式。 　　<br />B　提前还贷：还是“本金法”省钱 　　有些朋友在买房后，可能会提前还贷，那么，在这种情况下，哪种还款法省钱呢？具体情况，市民依旧可套用相应公式计算。在此，我们仍以贷款30万元、期限20年、月利率4.2‰来计算，可算出，依旧是本金还款法利息少。假如5年后，市民提前一次性还清贷款，根据本息还款法计算，5年中，已还本金49457元，已还利息69733元，需一次性付清所剩的本金250543元；根据本金还款法计算，5年中，已还本金75000元，已还利息66308元，再一次还款225000元就行了。两种还款方法比较之下，本金还款法所支付利息比本息还款法少3425元。<br />　　<br />C　银行：合同不能更改 既然等额本金还款法比等额本息还款法在还款总额方面有那么大差距，那本息还款法能否更改为本金还款法呢？<br />个人商业住房贷款额度最大的工商银行。 在工商银行业务经营部的MM介绍，自 1995年工商行从事个人住房按揭贷款以来，本息还款法能否改成本金还款法，到目前为止，银行还没有碰到这种事情；就是碰到了，因为购房者和银行之间已签订了贷款合同，而且合同已生效执行，肯定是无法更改的。其他一些银行的说法基本和工商银行鼓楼支行一致，即合同已生效，不能更改。 　<br /><br />　D　律师：银行有告知义务 　　同时，许多朋友询问，他们的房贷是由房产公司代办的，他们只签了个字，根本不知道还款有两种方式，在这种情况下，房产公司应负什么样的责任？对此，律师认为：购房者向开发商购买商品房需进行商业贷款时，通过开发商向银行贷款，开发商在购房者与银行借贷关系中，起到桥梁作用。作为开发商，虽不是贷款主体，对贷款合同不承担相应责任和义务，但在与购房者和银行沟通时，知晓商业还贷中两种还款方式，开发商应向购房者明示。 　　<br /><br />银行在与购房者签订的贷款合同中，明确规定两种还款法的利弊关系应有告知购房者的义务。在实际借贷关系中，银行违反这种告知义务，但目前我们国家有关法律中对违反这种义务还没有明文规定银行该承担什么责任，购房者该如何维护自己的合法利益，除非购房者在合同条款中写有相关约定内容。同时，在购房贷款合同中，如果出现重大误解或明显不公平的情况下，购房者可依据《合同法》要求银行撤消或变更相关条款，即变更还款方法。
          <br/><br/>
          <span style="color:red;">
            <a href="http://zhangguoli1997.javaeye.com/blog/175163#comments" style="color:red;">已有 <strong>10</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 23 Mar 2008 18:42:14 +0800</pubDate>
        <link>http://zhangguoli1997.javaeye.com/blog/175163</link>
        <guid>http://zhangguoli1997.javaeye.com/blog/175163</guid>
      </item>
      <item>
        <title>prototype笔记</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/166989" style="color:red;">http://zhangguoli1997.javaeye.com/blog/166989</a>&nbsp;
          发表时间: 2008年03月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          var t1 = $$('div#loginForm .fieldName');其中的父css与子css之间必须使用“ .”分隔，不能缺少空格。<br />===================================================================<br />var ele = event.srcElement; 得到是页面中那个表单（或元素）触发了这个函数。<br />function test(){<br />	var ele = event.srcElement;<br />&lt;input type="button" value=hide onclick="test()"/><br />ele就是这个button对象。<br />=====================================================================<br /><pre name="code" class="java">
var myAjax = new Ajax.Updater(
    'divResult',
    'script.html', 
    {
	method: 'get',
	evalScripts: true //执行返回的页面中的javascript。
    }
);
如果返回的页面中含有javascript函数，必须写成下边形式。
sayHi = function() {
	alert("Hello, " + $F('name') + "!");
}
不能写成
function sayHi()
{
     alert("Hello, " + $F('name') + "!");

}
不然函数会被省略掉。
不能加var，var声明的变量作用域为&lt;script>&lt;/script>
</pre><br />==========================================================<br />通过$() $F()获取数据时，被获取的表单一定要有id属性！<br />==============================================================<br />prototype提供的函数<br />Element.show('loading');//显示<br />Element.hide('loading');//隐藏<br /><br />var handle = {<br />   onCreate: function() {<br />      Element.show('loading');<br />   },<br />   onComplete: function() {<br />     if (Ajax.activeRequestCount == 0) {<br />         Element.hide('loading');<br />      }<br />   }<br />};<br />上边这个对象指定了ajax的create跟complete事件的处理函数，通过Responders注册后会自动绑定到ajax时间！发生ajax时间时会自动调用这两个函数。<br />Ajax.Responders.register(handle);//把handle注册到全局的Ajax.Responders，Ajax.Responders用来维护一个正在运行的Ajax对象列表
          <br/><br/>
          <span style="color:red;">
            <a href="http://zhangguoli1997.javaeye.com/blog/166989#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 03 Mar 2008 16:29:05 +0800</pubDate>
        <link>http://zhangguoli1997.javaeye.com/blog/166989</link>
        <guid>http://zhangguoli1997.javaeye.com/blog/166989</guid>
      </item>
      <item>
        <title>Acegi学习笔记</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/143079" style="color:red;">http://zhangguoli1997.javaeye.com/blog/143079</a>&nbsp;
          发表时间: 2007年11月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal"><strong style=""><span style="font-size: 14pt; font-family: 宋体;">常用对象</span></strong><strong style=""><span lang="EN-US" style="font-size: 14pt;"><o:p></o:p></span></strong></p>
<p class="MsoNormal"><strong style=""><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;">SecurityContextHolder<o:p></o:p></span></strong></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;"><span style="">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">提供对<span lang="EN-US">SecurityContext</span>的所有访问方式<span lang="EN-US">,</span>存储了当前应用的安全上下文（<span lang="EN-US">security context</span>），包括正在使用应用程序的<span lang="EN-US">principal</span>（用户信息）的详细信息。默认使用<span lang="EN-US">ThreadLocal</span>来存储这些详细信息。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;">SecurityContextHolder.getContext().getAuthentication().getPrincipal();<o:p></o:p></span></p>
<p class="MsoNormal"><strong style=""><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;">SecurityContext<o:p></o:p></span></strong></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-size: 12pt; font-family: 宋体;">存储<span lang="EN-US">Authentication</span>以及可能的请求相关的安全信息<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><strong style=""><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;">Authentication<o:p></o:p></span></strong></p>
<p class="MsoNormal"><strong style=""><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;"><span style="">&nbsp;&nbsp; </span></span></strong><span style="font-size: 12pt; font-family: 宋体;">认证<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;">getAuthorities</span><span style="font-size: 12pt; font-family: 宋体;">（）。这个方法返回一个<span lang="EN-US">GrantedAuthority</span>对象数组。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-size: 12pt; font-family: 宋体;">以<span lang="EN-US">Acegi Security</span>的方式表现<span lang="EN-US">principal<o:p></o:p></span></span></p>
<p class="MsoNormal"><strong style=""><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;">GrantedAuthority<o:p></o:p></span></strong></p>
<p class="MsoNormal"><strong style=""><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;"><span style="">&nbsp;&nbsp; </span></span></strong><span style="font-size: 12pt; font-family: 宋体;">授予<span lang="EN-US">principal</span>的权限。这些权限通常是<span lang="EN-US">&ldquo;</span>角色<span lang="EN-US">&rdquo;<o:p></o:p></span></span></p>
<p class="MsoNormal"><strong style=""><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;">Principal<o:p></o:p></span></strong></p>
<p class="MsoNormal"><strong style=""><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;"><span style="">&nbsp;&nbsp; </span></span></strong><span style="font-size: 12pt; font-family: 宋体;">用户信息<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><strong style=""><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;">UserDetails<o:p></o:p></span></strong></p>
<p class="MsoNormal"><strong style=""><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;"><span style="">&nbsp;&nbsp; </span></span></strong><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;">UserDetails</span><span style="font-size: 12pt; font-family: 宋体;">在<span lang="EN-US">Acegi Security</span>中是一个核心接口，它以一种扩展以及应用相关的方式来展现一个<span lang="EN-US">principal</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: 12pt; font-family: 宋体;">为从你的应用程序<span lang="EN-US">DAO</span>中获取必要的信息来构建一个<span lang="EN-US">Authentication </span>对象<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><strong style=""><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;">UserDetailsService</span></strong><strong style=""><span style="font-size: 12pt; font-family: 宋体;">接口<span lang="EN-US"><o:p></o:p></span></span></strong></p>
<p class="MsoNormal"><strong style=""><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;"><span style="">&nbsp;&nbsp; </span></span></strong><span style="font-size: 12pt; font-family: 宋体;">这个接口只有一个方法，接受一个<span lang="EN-US">Sring</span>类型的参数并返回一个<span lang="EN-US">UserDetails</span>。<span lang="EN-US">Acegi Security</span>提供的大多数认证提供器将部分认证过程委派给<span lang="EN-US">UserDetailsService</span>。<span lang="EN-US">UserDetailsService</span>用来构建保存在<span lang="EN-US">SecurityContextHolder</span>中的<span lang="EN-US">Authentication</span>对象。<span lang="EN-US">Acegi</span>已经提供了默认的内存、<span lang="EN-US">jdbc</span>实现。用户可以实现这个类<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><strong style=""><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;">HttpSessionContextIntegrationFilter<o:p></o:p></span></strong></p>
<strong style=""><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;"><span style="">&nbsp;&nbsp; </span></span></strong><span style="font-size: 12pt; font-family: 宋体;">在<span lang="EN-US">web</span>请求之间把<span lang="EN-US">SecurityContext</span>存储在<span lang="EN-US">HttpSession</span>中</span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zhangguoli1997.javaeye.com/blog/143079#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 23 Nov 2007 15:39:06 +0800</pubDate>
        <link>http://zhangguoli1997.javaeye.com/blog/143079</link>
        <guid>http://zhangguoli1997.javaeye.com/blog/143079</guid>
      </item>
      <item>
        <title>javascript this 绑定</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/141122" style="color:red;">http://zhangguoli1997.javaeye.com/blog/141122</a>&nbsp;
          发表时间: 2007年11月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="postbody">
<p style="border: 1px solid rgb(192, 192, 192);">在JavaScript中，this通常绑定到函数被调用的对象上，这种默认绑定在多数情况下是正常的，但是在某些情况下，this的这种绑定会丢失，比如，将函数作为参数传递给另外一个函数，这种默认的绑定就丢失了，例如：</p>
<p style="border: 1px solid rgb(192, 192, 192);"><font size="2" face="Courier New">var myObj = {<br />
&nbsp;&nbsp; name: 'A nice demo!',<br />
&nbsp;&nbsp; fx: function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(this.name);<br />
&nbsp;&nbsp; }<br />
};<br />
<br />
function runFx(fx) {<br />
&nbsp;&nbsp; fx();<br />
}<br />
<br />
<font color="#ff0000">window.name = 'I am a nice window';</font><br />
<br />
<font color="#ff0000">myObj.fx();&nbsp; // 在这里，将会提示 A nice demo!<br />
<br />
runFx(myObj.fx); // 在这里，得到的提示将会是 I am a nice window</font></font></p>
<p style="border: 1px solid rgb(192, 192, 192);">为 什么会出现这种情况呢？因为在第二次调用中，myObj.fx作为参数传递给了runFx，在函数runFx中执行时fx丢失了对myObj的默认绑定， 而绑定到了runFx的默认绑定window上，所以第二次调用时得到的提示为I am a nice window，而这个往往不是我们需要的结果。</p>
<p style="border: 1px solid rgb(192, 192, 192);">在Ajax横行的今天，要编写复杂的客户端组件，不可避免的要将函数名作为参数传递，Prototype注意到了这个问题，MS ASP.Net&nbsp;Ajax也注意到了这个问题，不知道你注意了没有？</p>
<p style="border: 1px solid rgb(192, 192, 192);">Prototype 提供的解决方案是bind方法，在Prototype的官方文档给出的描述是：Provides aguaranteed-binding equivalent of the original function, possibly with pre-filled arguments. 上面的例子如果使用Prototype的话，可以修改如下：</p>
<p style="border: 1px solid rgb(192, 192, 192);"><font size="2" face="Courier New">var myObj = {<br />
&nbsp;&nbsp; name: 'A nice demo!',<br />
&nbsp;&nbsp; fx: function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(this.name);<br />
&nbsp;&nbsp; }<br />
};<br />
<br />
function runFx(fx) {<br />
&nbsp;&nbsp; fx();<br />
}<br />
<br />
window.name = 'I am a nice window';<br />
<br />
myObj.fx();&nbsp; // 在这里，将会提示 A nice demo!<br />
<font color="#ff0000"><br />
var fx2 = myObj.fx.bind(myObj) // 先做一个绑定，</font><br />
runFx(fx2); // 在这里，得到的提示将会是 A nide demo !这个往往是我们需要的结果</font></p>
<p style="border: 1px solid rgb(192, 192, 192);">MS Ajax提供的解决方案是Function.createDelegate函数，createDelegate方法是个静态方法，可以直接调用。如果使用MS Ajax库的话，可以将上面的例子修改为：</p>
<p style="border: 1px solid rgb(192, 192, 192);"><font size="2" face="Courier New">var myObj = {<br />
&nbsp;&nbsp; name: 'A nice demo!',<br />
&nbsp;&nbsp; fx: function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(this.name);<br />
&nbsp;&nbsp; }<br />
};<br />
<br />
function runFx(fx) {<br />
&nbsp;&nbsp; fx();<br />
}<br />
<br />
window.name = 'I am a nice window';<br />
<br />
myObj.fx();&nbsp; // 在这里，将会提示 A nice demo!<br />
<br />
<font color="#ff0000">var fx2 =&nbsp;Function.createDelegate(myObj, myObj.fx) // 按照微软的说法，先做一个委托，<br />
runFx(fx2); // 在这里，得到的提示将会是 A nide demo !这个往往是我们需要的结果</font></font></p>
<p style="border: 1px solid rgb(192, 192, 192);">这 看起来只是一个小问题，但是如果不注意的话却会造成很大的问题。引用Prototype中的原话：As discussed on the general Function page,binding can be a pretty tricky thing sometimes.</p>
<p style="border: 1px solid rgb(192, 192, 192);">或者使用<font color="#ff0000">this.loginSuccessDelegate = this.loginSuccess.createDelegate(this);</font></p>
<p style="border: 1px solid rgb(192, 192, 192);">本文章来自于http://www.cnblogs.com/beginor/archive/2007/03/12/672511.html，谢谢作者共享，对我帮助很大<br />
</p>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zhangguoli1997.javaeye.com/blog/141122#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 Nov 2007 11:22:01 +0800</pubDate>
        <link>http://zhangguoli1997.javaeye.com/blog/141122</link>
        <guid>http://zhangguoli1997.javaeye.com/blog/141122</guid>
      </item>
      <item>
        <title>作报表需要的一些oracle sql</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/138552" style="color:red;">http://zhangguoli1997.javaeye.com/blog/138552</a>&nbsp;
          发表时间: 2007年11月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          天寒地冻，呆在家里又读完了《Mastering Oracle SQL》2nd，发现Oracle的功能还是很强悍，光函数就有两百个，那些面向对象的查询语言很难模拟，特别是SQL2003里针对OLAP的windows function等。<br />
&nbsp;&nbsp;&nbsp; 幸好Hibernate3.0也支持SQL了。&nbsp;
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>1.报表合计专用的Rollup函数<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 销售报表<br />
&nbsp; 广州&nbsp;&nbsp;&nbsp;&nbsp; 1月&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000元<br />
&nbsp; 广州&nbsp;&nbsp;&nbsp;&nbsp; 2月&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2500元<br />
&nbsp; 广州&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4500元<br />
&nbsp; 深圳&nbsp;&nbsp;&nbsp;&nbsp; 1月&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000元<br />
&nbsp; 深圳&nbsp;&nbsp;&nbsp;&nbsp; 2月&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000元<br />
&nbsp; 深圳&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000元<br />
&nbsp; 所有地区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7500元<br />
</div>
<div><br />
以往的查询SQL:<br />
Select&nbsp; area,month,sum(money) from SaleOrder group by area,month<br />
然后广州，深圳的合计和所有地区合计都需要在程序里自行累计</div>
<div><br />
1.其实可以使用如下SQL:
<pre>&nbsp;&nbsp; Select area,month,sum(total_sale) from SaleOrder group by <strong>rollup</strong>(area,month)</pre>
就能产生和报表一模一样的纪录</div>
<div>&nbsp;</div>
<div>2.如果year不想累加，可以写成
<pre>&nbsp;&nbsp; Select year,month,area,sum(total_sale) from SaleOrder group by <strong>year</strong>, <strong>rollup</strong>(month,area)</pre>
&nbsp;&nbsp;&nbsp;另外Oracle 9i还支持如下语法:
<pre>&nbsp;&nbsp; Select year,month,area,sum(total_sale) from SaleOrder group by rollup(<strong>(year,month),</strong>area)</pre>
</div>
<div>&nbsp;</div>
<div>3.如果使用Cube(area,month)而不是RollUp(area,month)，除了获得每个地区的合计之外，还将获得每个月份的合计，在报表最后显示。</div>
<div>&nbsp;</div>
<div>4.Grouping让合计列更好读<br />
&nbsp; RollUp在显示广州合计时，月份列为NULL，但更好的做法应该是显示为&quot;所有月份&quot;<br />
&nbsp; Grouping就是用来判断当前Column是否是一个合计列，1为yes，然后用Decode把它转为&quot;所有月份&quot;
<pre>&nbsp; Select&nbsp; <strong>Decode(Grouping(area),1,'所有地区',area)</strong> area,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Decode(Grouping(month),1,'所有月份',month),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum(money)<br />&nbsp;&nbsp;From SaleOrder&nbsp;<br />&nbsp;&nbsp;Group by RollUp(area,month);</pre>
</div>
<div>&nbsp;</div>
<div><strong>2.对多级层次查询的start with.....connect by</strong><br />
&nbsp;&nbsp; 比如人员组织,产品类别,Oracle提供了很经典的方法</div>
<div>
<pre> SELECT <strong>LEVE</strong>L, name, emp_id,manager_emp_id<br /> FROM employee<br /> <strong>START WITH </strong>manager_emp_id is null<br /> <strong>CONNECT BY PRIOR </strong>emp_id = manager_emp_id;</pre>
</div>
<div>上面的语句demo了全部的应用,start with指明从哪里开始遍历树,如果从根开始,那么它的manager应该是Null,如果从某个职员开始,可以写成emp_id='11'<br />
CONNECT BY 就是指明父子关系,注意PRIOR位置<br />
另外还有一个LEVEL列,显示节点的层次</div>
<div>&nbsp;</div>
<div><strong>3.更多报表/分析决策功能</strong><br />
3.1 分析功能的基本结构<br />
&nbsp;&nbsp;&nbsp;&nbsp; 分析功能() over( partion子句,order by子句,窗口子句)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;概念上很难讲清楚,还是用例子说话比较好.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div>&nbsp;</div>
<div>3.2 Row_Number 和 Rank, DENSE_Rank<br />
&nbsp;&nbsp;&nbsp; 用于选出Top 3 sales这样的报表<br />
&nbsp;&nbsp;&nbsp; 当两个业务员可能有相同业绩时,就要使用Rank和Dense_Rank<br />
&nbsp;&nbsp;&nbsp; 比如<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 金额&nbsp;&nbsp;&nbsp; RowNum&nbsp; Rank&nbsp; Dense_Rank<br />
&nbsp;&nbsp;&nbsp; 张三 4000元&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
&nbsp;&nbsp;&nbsp; 李四 3000元&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br />
&nbsp;&nbsp;&nbsp; 钱五 2000元&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3<br />
&nbsp;&nbsp;&nbsp; 孙六 2000元&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3<br />
&nbsp;&nbsp;&nbsp; 丁七 1000元&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4</div>
<div>&nbsp;&nbsp;&nbsp; 这时,应该把并列第三的钱五和孙六都选进去,所以用Ranking功能比RowNumber保险.至于Desnse还是Ranking就看具体情况了。</div>
<div>
<pre>&nbsp;&nbsp;&nbsp; SELECT salesperson_id, SUM(tot_sales) sp_sales,<br />&nbsp;&nbsp;&nbsp; <strong>RANK( ) OVER </strong>(ORDER BY SUM(tot_sales) DESC) sales_rank<br />&nbsp;&nbsp;&nbsp; FROM orders<br />&nbsp;&nbsp;&nbsp; GROUP BY salesperson_id</pre>
</div>
<div>3.3 NTILE 把纪录平分成甲乙丙丁四等 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如我想取得前25%的纪录,或者把25%的纪录当作同一个level平等对待,把另25%当作另一个Level平等对待</div>
<div>
<pre>&nbsp;&nbsp;&nbsp; SELECT cust_nbr, SUM(tot_sales) cust_sales,<br />&nbsp;&nbsp;&nbsp; <strong>NTILE(4) OVER </strong>(ORDER BY SUM(tot_sales) DESC) sales_quartile<br />&nbsp;&nbsp;&nbsp; FROM orders<br />&nbsp;&nbsp;&nbsp; GROUP BY cust_nbr<br />&nbsp;&nbsp;&nbsp; ORDER BY 3,2 DESC;</pre>
NTITLE(4)把纪录以 SUM(tot_sales)排序分成4份.</div>
<div>&nbsp;</div>
<div>3.4 辅助分析列和Windows Function<br />
&nbsp;&nbsp;&nbsp;&nbsp; 报表除了基本事实数据外,总希望旁边多些全年总销量,到目前为止的累计销量,前后三个月的平均销量这样的列来参考.<br />
&nbsp;&nbsp;&nbsp; 这种前后三个月的平均和到目前为止的累计销量就叫windows function,是SQL2003的针对OLAP的新函数, 见下例
<pre>&nbsp;&nbsp;&nbsp; SELECT month, SUM(tot_sales) monthly_sales,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM(SUM(tot_sales)) OVER (ORDER BY month<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW</strong>) max_preceeding<br />&nbsp;&nbsp;&nbsp; FROM orders<br />&nbsp;&nbsp;&nbsp; GROUP BY month<br />&nbsp;&nbsp;&nbsp; ORDER BY month;<br /><br /><br /></pre>
<pre><br />&nbsp;&nbsp;&nbsp; SELECT month, SUM(tot_sales) monthly_sales,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AVG(SUM(tot_sales)) OVER (ORDER BY month <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING</strong>) rolling_avg&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; FROM orders<br />&nbsp;&nbsp;&nbsp; GROUP BY month<br />&nbsp;&nbsp;&nbsp; ORDER BY month;</pre>
</div>
<div>&nbsp;&nbsp;&nbsp; Windows Function的关键就是Windows子句的几个取值<br />
&nbsp;&nbsp;&nbsp; 1 PRECEDING 之前的一条记录<br />
&nbsp;&nbsp;&nbsp; 1 FOLLOWING 之后的一条记录<br />
&nbsp;&nbsp;&nbsp; UNBOUNDED PRECEDING 之前的所有记录<br />
&nbsp;&nbsp;&nbsp; CURRENT ROW 当前纪录</div>
<div>&nbsp;</div>
<div><strong>4.SubQuery总结</strong><br />
&nbsp; SubQuery天天用了,理论上总结一下.SubQuery 分三种<br />
&nbsp; 1.Noncorrelated 子查询&nbsp;&nbsp; 最普通的样式.<br />
&nbsp; 2.Correlated Subqueries&nbsp; 把父查询的列拉到子查询里面去,头一回cyt教我的时候理解了半天.<br />
&nbsp; 3.Inline View&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也被当成最普通的样式用了.</div>
<div>&nbsp;</div>
<div>&nbsp; 然后Noncorrelated 子查询又有三种情况<br />
&nbsp; 1.返回一行一列&nbsp;&nbsp;&nbsp; where price &lt; (select max(price) from goods )<br />
&nbsp;&nbsp;2.返回多行一列&nbsp;&nbsp;&nbsp; where price&gt;= ALL (select price from goods where type=2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;or where NOT price&lt; ANY(select price from goods where type=2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最常用的IN其实就是=ANY()<br />
&nbsp; 3.返回多行多列&nbsp;&nbsp;&nbsp; 一次返回多列当然就节省了查询时间
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UPDATE monthly_orders&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SET (tot_orders, max_order_amt) =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;(SELECT COUNT(*), MAX(sale_price)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM cust_order)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />          DELETE FROM line_item<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE (order_nbr, part_nbr) IN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;      (SELECT order_nbr, part_nbr FROM cust_order c)</pre>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zhangguoli1997.javaeye.com/blog/138552#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 Nov 2007 16:28:42 +0800</pubDate>
        <link>http://zhangguoli1997.javaeye.com/blog/138552</link>
        <guid>http://zhangguoli1997.javaeye.com/blog/138552</guid>
      </item>
      <item>
        <title>ExtJS学习心得2</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/138299" style="color:red;">http://zhangguoli1997.javaeye.com/blog/138299</a>&nbsp;
          发表时间: 2007年11月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          其实Ext.Ajax的使用并不难，只是当初我一直不清楚如何获取其返回值，搞得郁闷了一阵子，以下是一个比较简单的例子<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>Ext.Ajax.request({&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;'Register.aspx',&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params:&nbsp;{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oper:&nbsp;'login',&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoginEmail:Ext.get('LoginEmail').dom.value,&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoginPwd:Ext.get('LoginPwd').dom.value&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;<span class="keyword">function</span><span>(response,&nbsp;options)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;responseArray&nbsp;=&nbsp;Ext.util.JSON.decode(response.responseText);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(responseArray.success=='</span><span class="keyword">true</span><span>'){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cookies.set('Allcard_userName',&nbsp;responseArray.user);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ext.Msg.alert('信息','您已成功登录！',IsLogin);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ext.Msg.alert('失败','登录失败，请确认您的帐号密码无误！');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;</span></li>
</ol>
</div>
代码说明：<br />
2行：URL参数是要提交到的页面<br />
3行：params是一个需要提交的参数集，使用逗号分隔<br />
8行：当回调成功返回后要执行的函数<br />
9行：获取服务器端的回调参数值<br />
10行：对回调值进行判断处理<br />
<br />
这里需要说明一下的是如何获取回调参数值，Extjs里是通过JSON的数据格式来获取参数的，因此在服务器端处理完事情后，回调的参数应该这样写：（以下是ASP.NET里的写法）<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: rgb(0, 0, 0);">result&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">{success:true,user:'winson'}</span><span style="color: rgb(0, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />Response.Write(result);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />Response.End();</span></div>
<br />
将数据以键值对的形式返回，接收时就可使用第一段代码里第9行的方法来接收，由于使用的是JSON格式，因此服务器端就可以非常方便地同时返回多个参数值了。<br />
<br />
Ext.Ajax基本使用就是这样，其实也挺简单的，只是如果要在提交时增加Loading效果，那就比较麻烦了，呵，这里我也没深入研究 <br />
<br />
接下来还有比较复杂的表单应用！<img src="http://www.cnblogs.com/CuteSoft_Client/CuteEditor/images/face6.gif" border="0" align="absmiddle" alt="" />
          <br/><br/>
          <span style="color:red;">
            <a href="http://zhangguoli1997.javaeye.com/blog/138299#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 Nov 2007 09:59:47 +0800</pubDate>
        <link>http://zhangguoli1997.javaeye.com/blog/138299</link>
        <guid>http://zhangguoli1997.javaeye.com/blog/138299</guid>
      </item>
      <item>
        <title>ExtJS 学习心得１</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/138297" style="color:red;">http://zhangguoli1997.javaeye.com/blog/138297</a>&nbsp;
          发表时间: 2007年11月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一个偶然的机会，我发现了ExtJS框架，第一次看到其创建出来的效果时，简直兴奋死我啦，呵呵，没想到还有这么漂亮的UI控制，但使用起来却感觉不太 爽，其一大缺点就是所带的类库太庞大啦，会比较影响速度，而且帮助文档全部是英文，英文的也还好啦，更重要的是其文档并没有相关的例子，只是列出来使用参 数，让人很难掌握，只好去他们的官方论坛到处问人，郁闷！<br />
<br />
不过还好，外国人一般都比较热情，基本上问的问题都有人会给我答复，呵呵<br />
<br />
在帮朋友做的一个网站里，我就开始了大量使用了EXTJS框架，虽然其类库文件是很大，不过感觉能做出这种效果的话，这点牺牲还是值得的<br />
<br />
为了不让自己很快又忘记，所以还是决定在这里写下一点东西，以后也比较方便查找，如果其中有写错的地方，请大家及时指正哦，谢啦！<img src="http://www.cnblogs.com/CuteSoft_Client/CuteEditor/images/emsmiled.gif" border="0" align="absmiddle" alt="" /><br />
<br />
先说说EXTJS的自定义函数吧，以下语句可创建一个函数：<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>Ext.Login=</span><span class="keyword">function</span><span>(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;IsLogin(){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;init:<span class="keyword">function</span><span>(){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IsLogin();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Login:<span class="keyword">function</span><span>(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.....&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
刚开始时让我比较郁闷的是这种JS里的函数调用机制，以上代码里，将创建一个名为Ext.Login()的对象，应该相当于一个类的意思吧，然后可在其里面写其他相关的方法<br />
<br />
在return里的为公有方法，这里面的方法可给外部程序调用（如在HTML文件里用），而在return以外的代码是其私有方法，只能在Ext.Login()这个对象里调用<br />
<br />
如需要在其他页面调用里面的Login()方法，可直接写<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span></span><span class="string">&quot;login&quot;</span><span>&nbsp;onclick=</span><span class="string">&quot;Ext.Login().Login()&quot;</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
如果需要在页面加载时就调用，一般只需直接用EXTJS里的方法即可实现：
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<ol class="dp-c" start="1">
    <li class="alt"><span><span>Ext.onReady(Ext.Login.init,&nbsp;Ext.Login);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
这里的函数名并不需要加括号，第一个参数是要调用的方法，第二个是作用域，一般写此对象名即可<br />
<br />
OK，关于基本的函数使用调用要注意的差不多就这些吧，之后再写写对AJAX的运用<img src="http://www.cnblogs.com/CuteSoft_Client/CuteEditor/images/emteeth.gif" border="0" align="absmiddle" alt="" />
          <br/><br/>
          <span style="color:red;">
            <a href="http://zhangguoli1997.javaeye.com/blog/138297#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 Nov 2007 09:58:00 +0800</pubDate>
        <link>http://zhangguoli1997.javaeye.com/blog/138297</link>
        <guid>http://zhangguoli1997.javaeye.com/blog/138297</guid>
      </item>
      <item>
        <title>EXT表单的应用３</title>
        <author>zhangguoli1997</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangguoli1997.javaeye.com">zhangguoli1997</a>&nbsp;
          链接：<a href="http://zhangguoli1997.javaeye.com/blog/138290" style="color:red;">http://zhangguoli1997.javaeye.com/blog/138290</a>&nbsp;
          发表时间: 2007年11月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          引自http://winsonet.cnblogs.com/<br />
<strong style="color: rgb(0, 0, 255);">一、美化表单：</strong><br />
ExtJS自带的CSS效果可以让表单非常漂亮，在使用前先将ext-all.css文件导入页面，然后加入以下代码<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">div </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">=&quot;x-box-ml&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">div </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">=&quot;x-box-mr&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">div </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">=&quot;x-box-mc&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">form </span><span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">=&quot;regform&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">fieldset </span><span style="color: rgb(255, 0, 0);">align</span><span style="color: rgb(0, 0, 255);">=&quot;middle&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">legend</span><span style="color: rgb(0, 0, 255);">&gt;&lt;</span><span style="color: rgb(128, 0, 0);">font </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">=&quot;btitle&quot;</span><span style="color: rgb(255, 0, 0);"> color</span><span style="color: rgb(0, 0, 255);">=&quot;#ff7300&quot;</span><span style="color: rgb(0, 0, 255);">&gt;&lt;</span><span style="color: rgb(128, 0, 0);">strong </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">=&quot;style7&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">帐号信息</span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">strong</span><span style="color: rgb(0, 0, 255);">&gt;<!--</span--><span style="color: rgb(128, 0, 0);">font</span><span style="color: rgb(0, 0, 255);">&gt;<!--</span--><span style="color: rgb(128, 0, 0);">legend</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">table </span><span style="color: rgb(255, 0, 0);">width</span><span style="color: rgb(0, 0, 255);">=&quot;100%&quot;</span><span style="color: rgb(255, 0, 0);"> align</span><span style="color: rgb(0, 0, 255);">=&quot;center&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">tr</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">td </span><span style="color: rgb(255, 0, 0);">style</span><span style="color: rgb(0, 0, 255);">=&quot;text-align: right&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                    会员Email：<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">td</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">td </span><span style="color: rgb(255, 0, 0);">style</span><span style="color: rgb(0, 0, 255);">=&quot;text-align: left&quot;</span><span style="color: rgb(255, 0, 0);"> width</span><span style="color: rgb(0, 0, 255);">=&quot;300&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">input </span><span style="color: rgb(255, 0, 0);">type</span><span style="color: rgb(0, 0, 255);">=&quot;text&quot;</span><span style="color: rgb(255, 0, 0);"> id</span><span style="color: rgb(0, 0, 255);">=&quot;UserEmail&quot;</span><span style="color: rgb(255, 0, 0);"> name</span><span style="color: rgb(0, 0, 255);">=&quot;UserEmail&quot;</span><span style="color: rgb(255, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">span </span><span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">=&quot;msg&quot;</span><span style="color: rgb(255, 0, 0);"> style</span><span style="color: rgb(0, 0, 255);">=&quot;display: none&quot;</span><span style="color: rgb(0, 0, 255);">&gt;<!--</span--><span style="color: rgb(128, 0, 0);">span</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">td</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                            </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">tr</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">tr</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">td </span><span style="color: rgb(255, 0, 0);">style</span><span style="color: rgb(0, 0, 255);">=&quot;text-align: right&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                    登录密码：<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">td</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">td </span><span style="color: rgb(255, 0, 0);">style</span><span style="color: rgb(0, 0, 255);">=&quot;text-align: left&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">input </span><span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">=&quot;UserPwd&quot;</span><span style="color: rgb(255, 0, 0);"> name</span><span style="color: rgb(0, 0, 255);">=&quot;UserPwd&quot;</span><span style="color: rgb(255, 0, 0);"> type</span><span style="color: rgb(0, 0, 255);">=&quot;password&quot;</span><span style="color: rgb(255, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">td</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                            </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">tr</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">tr</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">td </span><span style="color: rgb(255, 0, 0);">style</span><span style="color: rgb(0, 0, 255);">=&quot;text-align: right&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                    密码确认：<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">td</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">td </span><span style="color: rgb(255, 0, 0);">style</span><span style="color: rgb(0, 0, 255);">=&quot;text-align: left&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">input </span><span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">=&quot;UserPwd1&quot;</span><span style="color: rgb(255, 0, 0);"> name</span><span style="color: rgb(0, 0, 255);">=&quot;UserPwd1&quot;</span><span style="color: rgb(255, 0, 0);"> type</span><span style="color: rgb(0, 0, 255);">=&quot;password&quot;</span><span style="color: rgb(255, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                                </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">td</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                            </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">tr</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                        </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">table</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                    </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">fieldset</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">div </span><span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">=&quot;regbutton&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                    </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">div</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">form</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />            </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">div</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">div</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">div</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">div </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">=&quot;x-box-bl&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">div </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">=&quot;x-box-br&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">div </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">=&quot;x-box-bc&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />            </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">div</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">div</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </span><span style="color: rgb(0, 0, 255);"><!--</span--><span style="color: rgb(128, 0, 0);">div</span><span style="color: rgb(0, 0, 255);">&gt;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>
<br />
<span style="color: rgb(0, 0, 255);"><strong>二、绑定及验证表单：<br />
</strong></span>以上只是将表单显示出来了，如需对表单域操作，还需要在JS里写相关的代码进行绑定<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);"> fm2 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ext.form.BasicForm('regform');    <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />                </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">加入验证框</span><span style="color: rgb(0, 128, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_102_290_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_102_290_Open_Text.style.display='none'; Codehighlighter1_102_290_Closed_Image.style.display='inline'; Codehighlighter1_102_290_Closed_Text.style.display='inline';" alt="" /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_102_290_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_102_290_Closed_Text.style.display='none'; Codehighlighter1_102_290_Open_Image.style.display='inline'; Codehighlighter1_102_290_Open_Text.style.display='inline';" alt="" style="display: none;" /></span><span style="color: rgb(0, 0, 0);">                fm2.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ext.form.TextField(</span><span id="Codehighlighter1_102_290_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_102_290_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />                allowBlank: </span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">不能为空</span><span style="color: rgb(0, 128, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 0);">                blankText:'EMAIL不能为空，且请确保有效地址！',<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />                </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">regex:re,//正则验证</span><span style="color: rgb(0, 128, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 0);">                invalidText:'EMAIL格式不正确或此EMAIL已被注册！',<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />                validator:checkEmail</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">自定义验证函数</span><span style="color: rgb(0, 128, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 0);">                }</span></span><span style="color: rgb(0, 0, 0);">).applyTo(userEmail));  <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />              <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_360_428_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_360_428_Open_Text.style.display='none'; Codehighlighter1_360_428_Closed_Image.style.display='inline'; Codehighlighter1_360_428_Closed_Text.style.display='inline';" alt="" /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_360_428_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_360_428_Closed_Text.style.display='none'; Codehighlighter1_360_428_Open_Image.style.display='inline'; Codehighlighter1_360_428_Open_Text.style.display='inline';" alt="" style="display: none;" />                fm2.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ext.form.TextField(</span><span id="Codehighlighter1_360_428_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_360_428_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />                allowBlank: </span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">不能为空</span><span style="color: rgb(0, 128, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 0);">                blankText:'密码不能为空！'<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />                }</span></span><span style="color: rgb(0, 0, 0);">).applyTo(Ext.get('UserPwd')));<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />               <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_506_639_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_506_639_Open_Text.style.display='none'; Codehighlighter1_506_639_Closed_Image.style.display='inline'; Codehighlighter1_506_639_Closed_Text.style.display='inline';" alt="" /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_506_639_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_506_639_Closed_Text.style.display='none'; Codehighlighter1_506_639_Open_Image.style.display='inline'; Codehighlighter1_506_639_Open_Text.style.display='inline';" alt="" style="display: none;" />                fm2.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ext.form.TextField(</span><span id="Codehighlighter1_506_639_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_506_639_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />                allowBlank: </span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">不能为空</span><span style="color: rgb(0, 128, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 0);">                blankText:'密码不能为空！',<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />                invalidText:'2次密码不相同！',<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />                validator:vailda</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">自定义验证函数</span><span style="color: rgb(0, 128, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 0);">                }</span></span><span style="color: rgb(0, 0, 0);">).applyTo(Ext.get('UserPwd1')));  <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />             <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_716_786_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_716_786_Open_Text.style.display='none'; Codehighlighter1_716_786_Closed_Image.style.display='inline'; Codehighlighter1_716_786_Closed_Text.style.display='inline';" alt="" /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_716_786_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_716_786_Closed_Text.style.display='none'; Codehighlighter1_716_786_Open_Image.style.display='inline'; Codehighlighter1_716_786_Open_Text.style.display='inline';" alt="" style="display: none;" />              fm2.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ext.form.TextField(</span><span id="Codehighlighter1_716_786_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_716_786_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />                allowBlank: </span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">不能为空</span><span style="color: rgb(0, 128, 0);"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 0);">                blankText:'会员名称不能为空！'<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />                }</span></span><span style="color: rgb(0, 0, 0);">).applyTo('