﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-礼必风-随笔分类-JSP&amp;Servlet技术</title><link>http://www.blogjava.net/bily/category/17263.html</link><description>IT!=it</description><language>zh-cn</language><lastBuildDate>Fri, 21 Dec 2007 14:42:24 GMT</lastBuildDate><pubDate>Fri, 21 Dec 2007 14:42:24 GMT</pubDate><ttl>60</ttl><item><title>JSP中如何防止页面重复提交数据</title><link>http://www.blogjava.net/bily/archive/2007/12/18/168395.html</link><dc:creator>礼必风</dc:creator><author>礼必风</author><pubDate>Tue, 18 Dec 2007 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/bily/archive/2007/12/18/168395.html</guid><wfw:comment>http://www.blogjava.net/bily/comments/168395.html</wfw:comment><comments>http://www.blogjava.net/bily/archive/2007/12/18/168395.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bily/comments/commentRss/168395.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bily/services/trackbacks/168395.html</trackback:ping><description><![CDATA[<span id="Label4">方法一：在提交后，用response.sendRedirect &nbsp; 转向，在一定程度上可以搞定这个问题。&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
方法二：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在PAGE &nbsp; 加一个 &nbsp; &lt;input &nbsp; type="hidden" &nbsp; value="false" &nbsp; runat="server"/&gt; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如果已经POST &nbsp; OK &nbsp; 过, &nbsp; 就改变 &nbsp; value="true" &nbsp; ; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 再次POST &nbsp; 时候,可以用 &nbsp; JS &nbsp; 在客户端判断 &nbsp; hidden &nbsp; , &nbsp; 也可以在SERVER &nbsp; 检查.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; <br />
方法三：简单的JavaScript解决方案 &nbsp; &nbsp; <br />
&nbsp; var &nbsp; nanShanMilk &nbsp; = &nbsp; false; &nbsp; <br />
&nbsp; &nbsp; &nbsp; function &nbsp; checkCFSubmit() &nbsp; <br />
&nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if &nbsp; (nanShanMilk) &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return &nbsp; false; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; else &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nanShanMilk &nbsp; = &nbsp; true; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return &nbsp; true; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp; 然后在&lt;form&gt;中添加onsubmit="javascript:return &nbsp; checkCFSubmit();"&nbsp;&nbsp;</span>
<img src ="http://www.blogjava.net/bily/aggbug/168395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bily/" target="_blank">礼必风</a> 2007-12-18 09:34 <a href="http://www.blogjava.net/bily/archive/2007/12/18/168395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP、Struts避免Form重复提交的几种方案</title><link>http://www.blogjava.net/bily/archive/2007/12/18/168394.html</link><dc:creator>礼必风</dc:creator><author>礼必风</author><pubDate>Tue, 18 Dec 2007 01:33:00 GMT</pubDate><guid>http://www.blogjava.net/bily/archive/2007/12/18/168394.html</guid><wfw:comment>http://www.blogjava.net/bily/comments/168394.html</wfw:comment><comments>http://www.blogjava.net/bily/archive/2007/12/18/168394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bily/comments/commentRss/168394.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bily/services/trackbacks/168394.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 如果用户回退到刚才的提交页面并再次提交的话，客户端传过来的令牌就和服务器端的令牌不一致，从而有效地防止了重复提交的发生。//验证事务控制令牌,会自动根据session中标识生成一个隐含input代表令牌，防止两次提交。&nbsp;&nbsp;<a href='http://www.blogjava.net/bily/archive/2007/12/18/168394.html'>阅读全文</a><img src ="http://www.blogjava.net/bily/aggbug/168394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bily/" target="_blank">礼必风</a> 2007-12-18 09:33 <a href="http://www.blogjava.net/bily/archive/2007/12/18/168394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSF中如何防止页面刷新重复提交</title><link>http://www.blogjava.net/bily/archive/2007/12/18/168392.html</link><dc:creator>礼必风</dc:creator><author>礼必风</author><pubDate>Tue, 18 Dec 2007 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/bily/archive/2007/12/18/168392.html</guid><wfw:comment>http://www.blogjava.net/bily/comments/168392.html</wfw:comment><comments>http://www.blogjava.net/bily/archive/2007/12/18/168392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bily/comments/commentRss/168392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bily/services/trackbacks/168392.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:       在WEB开发中都会碰见这样的情况，就是用户在进行了一项操作后按F5刷新页面会重复提交页面的问题。<br>　　因为按F5是完全模拟上次的请求再请求一次，可以说发送的数据和上次请求的是一样的，就想到可以在客户端和服务器端各保存一个标识状态，然后在请求中比较2个表示状态就好了。&nbsp;&nbsp;<a href='http://www.blogjava.net/bily/archive/2007/12/18/168392.html'>阅读全文</a><img src ="http://www.blogjava.net/bily/aggbug/168392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bily/" target="_blank">礼必风</a> 2007-12-18 09:31 <a href="http://www.blogjava.net/bily/archive/2007/12/18/168392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>去jsp页面中文本框有NULL值的代码</title><link>http://www.blogjava.net/bily/archive/2006/11/15/81377.html</link><dc:creator>礼必风</dc:creator><author>礼必风</author><pubDate>Wed, 15 Nov 2006 13:25:00 GMT</pubDate><guid>http://www.blogjava.net/bily/archive/2006/11/15/81377.html</guid><description><![CDATA[
		<p>////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />//FilterBean.java<br />public class FilterBean{<br /> <br /> public FilterBean(){}   <br /> <br /> public /*static*/ String filter(String input)/////////////////////////进行HTML过滤   <br /> {     <br />  if(!hasSpecialChars(input)){        <br />   return input;     <br />  }     <br />  StringBuffer filtered =new StringBuffer(input.length());     <br />  char c;     <br />  for(int i=0; i&lt;=input.length()-1; i++){        <br />   c=input.charAt(i);        <br />   switch(c)        <br />   {            <br />   case '&lt;':filtered.append("&amp;lt;"); break;            <br />   case '&gt;':filtered.append("&amp;gt;"); break;            <br />   //case '"':filtered.append("&amp;uot;"); break;            <br />   //case '&amp;':filtered.append("&amp;amp;"); break;            <br />   case ' ':filtered.append("&amp;nbsp;"); break;            <br />   case '\n':filtered.append("&lt;br&gt;"); break;            <br />   default: filtered.append(c); <br />   }      <br />  }       <br />  return (filtered.toString());    <br /> }   <br /> <br /> public static boolean hasSpecialChars(String input){     <br />  boolean flag=false;</p>
		<p>  if((input!=null)&amp;&amp;(input.length()&gt;0)){       <br />   char c;       <br />   for(int i=0; i&lt;=input.length()-1; i++){         <br />    c=input.charAt(i);         <br />    switch(c)         <br />    {           <br />    case '&gt;': flag=true; break;           <br />    case '&lt;': flag=true; break;           <br />    //case '"': flag=true; break;           <br />    //case '&amp;': flag=true; break;           <br />    case ' ': flag=true; break;           <br />    case '\n': flag=true; break;         <br />    }<br />   }     <br />  }     <br />  return flag;   <br /> }   <br /> <br /> public String trans(String chi)//统一字符   <br /> {       <br />  String result = null;       <br />  byte temp [];       <br />  try{            <br />   temp=chi.getBytes("gb2312");            <br />   result = new String(temp);        <br />  }        <br />  catch(java.io.UnsupportedEncodingException e){             <br />   System.out.println (e.toString());        <br />  }        <br />  return result;   <br /> }   <br /> <br /> public String trans(Object chi)   <br /> {       <br />  return trans(chi.toString());    <br /> }  <br />}<br /><br />////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />//NullSolve.java<br />public class NullSolve {  //数据写入数据库之前，将未填写的字段由字符串null改为空("")<br /> public String trim(String s){<br />  if(s==null||s.equalsIgnoreCase("null"))<br />   return null;<br />  else<br />   return s.trim();<br /> }<br />}<br /></p>
<img src ="http://www.blogjava.net/bily/aggbug/81377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bily/" target="_blank">礼必风</a> 2006-11-15 21:25 <a href="http://www.blogjava.net/bily/archive/2006/11/15/81377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用JAVA实现一个jsp分页</title><link>http://www.blogjava.net/bily/archive/2006/11/15/81370.html</link><dc:creator>礼必风</dc:creator><author>礼必风</author><pubDate>Wed, 15 Nov 2006 13:15:00 GMT</pubDate><guid>http://www.blogjava.net/bily/archive/2006/11/15/81370.html</guid><wfw:comment>http://www.blogjava.net/bily/comments/81370.html</wfw:comment><comments>http://www.blogjava.net/bily/archive/2006/11/15/81370.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/bily/comments/commentRss/81370.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bily/services/trackbacks/81370.html</trackback:ping><description><![CDATA[
		<p>这里我以从一个用户表中查询用户信息为例演示其用法：<br /><br />1.将PageResultSet.java文件编译成class文件，并放入你的Web<br />应用程序的WEB-INF/classes/com/youngor/util目录下，可以对包名做相应修改。<br /><br />2.在你的Action类中:<br />先从业务处理逻辑类中取出数据(ArrayList或Vector格式)<br />UserBO userBO=new UserBO();<br />Collection data=userBO.findUsers();//示例方法<br />再得到当前页curPage和每页记录数pageSize<br />int curPage = Integer.parseInt(request.getParameter(“cur_page“));<br />int pageSize=15;<br />然后生成PageResultSet对象<br />PageResultSet dataList = new PageResultSet(data, curPage, pageSize);<br />request.setAttribute("usersList", usersList);<br /><br />3.在你的JSP页面中:<br />   &lt;%<br />          PageResultSet pageResultSet=(PageResultSet)request.getAttribute("usersList");<br />   ArrayList usersList=(ArrayList)pageResultSet.getData();<br />   for(int i=0;i&lt;usersList.size();i++)<br />   {<br />            UserEO userEO=(UserEO)usersList.get(i);%&gt;<br />      &lt;tr&gt;<br />        &lt;td&gt;&lt;a href="view_user.do?id=&lt;%=userEO.getId()%&gt;"&gt;&lt;%=userEO.getUsername()%&gt;&lt;/a&gt;&lt;/td&gt;<br />        &lt;td&gt;&lt;%=userEO.getName()%&gt;&lt;/td&gt;<br />        &lt;td&gt;&lt;%=userEO.getPhoneNumber()%&gt;&lt;/td&gt;<br />        &lt;td&gt;&lt;%=userEO.getEmailBox()%&gt;&lt;/td&gt;<br />        &lt;td&gt;&lt;%=userEO.getAddress()%&gt;&lt;/td&gt;<br />        &lt;td&gt;&lt;%=userEO.getPostcode()%&gt;&lt;/td&gt;<br />        &lt;/tr&gt;<br />    &lt;%}%&gt;<br />    &lt;/table&gt;&lt;/td&gt;<br />  &lt;/tr&gt;<br />&lt;/table&gt;<br /><br />&lt;!-- 显示分页工具栏 --&gt;</p>
		<br />
		<p>&lt;%=pageResultSet.getToolBar("list_users.do")%&gt;<br /><br /><br />注意：<br />1、如果你觉得分页工具栏不能满足你的要求，可以用PageResultSet类中的公共方法<br />first()、previous()、next()、last()定制自己的工具栏，并且，你还可以在PageResultSet中定义多个样式的工具栏；<br />2、getToolBar(String url)方法接受带查询字符串的参数，比如“list_users.do?class_id=1“。<br /><br /><br /><br />//PageResultSet.java<br />package com.youngor.util;</p>
		<br />
		<p>import java.util.*;</p>
		<br />
		<p>/**<br /> * &lt;p&gt;Title: PageResultSet&lt;/p&gt;<br /> *<br /> * &lt;p&gt;Description:分页类 &lt;/p&gt;<br /> *<br /> * &lt;p&gt;Copyright: Copyright (c) 2004&lt;/p&gt;<br /> *<br /> * &lt;p&gt;Company:youngor-studio(<a href="http://www.54youngor.com/"><font color="#002c99">http://www.54youngor.com</font></a>) &lt;/p&gt;<br /> * @author:伍维波<br /> * @version 1.0<br /> */<br />public class PageResultSet {<br />    /**<br />     * 分页数据<br />     */<br />    private Collection data = null;<br />    /**<br />     * 当前页<br />     */<br />    private int curPage;<br />    /**<br />     * 每页显示的记录数<br />     */<br />    private int pageSize;<br />    /**<br />     * 记录行数<br />     */<br />    private int rowsCount;<br />    /**<br />     * 页数<br />     */<br />    private int pageCount;</p>
		<br />
		<p>    public PageResultSet(Collection data) {<br />        this.data = data;<br />        this.curPage = 1;<br />        this.pageSize = 10;<br />        this.rowsCount = data.size();<br />        this.pageCount = (int) Math.ceil((double) rowsCount / pageSize);<br />    }</p>
		<br />
		<p>    public PageResultSet(Collection data, int curPage) {<br />        this.data = data;<br />        this.curPage = curPage;<br />        this.pageSize = 10;<br />        this.rowsCount = data.size();<br />        this.pageCount = (int) Math.ceil((double) rowsCount / pageSize);<br />    }</p>
		<br />
		<p>    public PageResultSet(Collection data, int curPage, int pageSize) {<br />        this.data = data;<br />        this.curPage = curPage;<br />        this.pageSize = pageSize;<br />        this.rowsCount = data.size();<br />        this.pageCount = (int) Math.ceil((double) rowsCount / pageSize);<br />    }</p>
		<br />
		<p>    /**<br />     * getCurPage:返回当前的页数<br />     *<br />     * @return int<br />     */<br />    public int getCurPage() {<br />        return curPage;<br />    }</p>
		<br />
		<p>    /**<br />     * getPageSize：返回分页大小<br />     *<br />     * @return int<br />     */<br />    public int getPageSize() {<br />        return pageSize;<br />    }</p>
		<br />
		<p>    /**<br />     * getRowsCount：返回总记录行数<br />     *<br />     * @return int<br />     */<br />    public int getRowsCount() {<br />        return rowsCount;<br />    }</p>
		<br />
		<p>    /**<br />     * getPageCount：返回总页数<br />     *<br />     * @return int<br />     */<br />    public int getPageCount() {<br />        return pageCount;<br />    }<br />    /**<br />     * 第一页<br />     * @return int<br />     */<br />    public int first() {<br />        return 1;<br />    }<br />    /**<br />     * 最后一页<br />     * @return int<br />     */<br />    public int last() {<br />        return pageCount;<br />    }<br />    /**<br />     * 上一页<br />     * @return int<br />     */<br />    public int previous() {<br />        return (curPage - 1 &lt; 1) ? 1 : curPage - 1;<br />    }<br />    /**<br />     * 下一页<br />     * @return int<br />     */<br />    public int next() {<br />        return (curPage + 1 &gt; pageCount) ? pageCount : curPage + 1;<br />    }</p>
		<br />
		<p>    /**<br />     * 第一页<br />     * @return boolean<br />     */<br />    public boolean isFirst() {<br />        return (curPage==1)?true:false;<br />    }</p>
		<br />
		<p>    /**<br />     * 第一页<br />     * @return boolean<br />     */<br />    public boolean isLast() {<br />        return (curPage==pageCount)?true:false;<br />    }<br />    /**<br />     * 获取当前页数据<br />     * @return Collection<br />     */<br />    public Collection getData() {<br />        Collection curData = null;<br />        if (data != null) {<br />            int start = (curPage - 1) * pageSize;<br />            int end = 0;<br />            if (start + pageSize &gt; rowsCount)<br />                end = rowsCount;<br />            else<br />                end = start + pageSize;<br />            ArrayList arrayCurData = new ArrayList();<br />            ArrayList arrayData = null;<br />            Vector vectorCurData = new Vector();<br />            Vector vectorData = null;<br />            boolean isArray = true;<br />            if (data instanceof ArrayList) {<br />                arrayData = (ArrayList) data;<br />                isArray = true;<br />            } else if (data instanceof Vector) {<br />                vectorData = (Vector) data;<br />                isArray = false;<br />            }<br />            for (int i = start; i &lt; end; i++) {<br />                if (isArray) {<br />                    arrayCurData.add(arrayData.get(i));<br />                } else {<br />                    vectorData.add(vectorData.elementAt(i));<br />                }<br />            }<br />            if (isArray) {<br />                curData = (Collection) arrayCurData;<br />            } else {<br />                curData = (Collection) vectorCurData;<br />            }<br />        }<br />        return curData;<br />    }<br />    /**<br />     * 获取工具条<br />     * @return String<br />     */<br />    public String getToolBar(String fileName){<br />        String temp="";<br />        if(fileName.indexOf("?")==-1)<br />        {<br />            temp="?";<br />        }<br />        else<br />        {<br />            temp="&amp;";<br />        }<br />        String str="&lt;form method='post' name='frmPage' action='"+fileName+"'&gt;";<br />        str+="&lt;p align='center'&gt;";<br />        if(isFirst())<br />            str+="首页 上一页&amp;nbsp;";<br />        else<br />        {<br />            str+="&lt;a href='"+fileName+temp+"cur_page=1'&gt;首页&lt;/a&gt;&amp;nbsp;";<br />            str+="&lt;a href='"+fileName+temp+"cur_page="+(curPage-1)+"'&gt;上一页&lt;/a&gt;&amp;nbsp;";<br />        }<br />        if(isLast())<br />            str+="下一页 尾页&amp;nbsp;";<br />        else<br />        {<br />            str+="&lt;a href='"+fileName+temp+"cur_page="+(curPage+1)+"'&gt;下一页&lt;/a&gt;&amp;nbsp;";<br />            str+="&lt;a href='"+fileName+temp+"cur_page="+pageCount+"'&gt;尾页&lt;/a&gt;&amp;nbsp;";<br />        }<br />        str+="&amp;nbsp;共&lt;b&gt;"+rowsCount+"&lt;/b&gt;条记录&amp;nbsp;";<br />        str+="&amp;nbsp;转到&lt;select name='page' onChange=\"location='"+fileName+temp+"cur_page='+this.options[this.selectedIndex].value\"&gt;";<br />        for(int i=1;i&lt;=pageCount;i++)<br />        {<br />            if(i==curPage)<br />                str+="&lt;option value='"+i+"' selected&gt;第"+i+"页&lt;/option&gt;";<br />            else<br />                str+="&lt;option value='"+i+"'&gt;第"+i+"页&lt;/option&gt;";<br />        }<br />        str+="&lt;/select&gt;&lt;/p&gt;&lt;/form&gt;";<br />        return str;<br />    }<br />}</p>
<img src ="http://www.blogjava.net/bily/aggbug/81370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bily/" target="_blank">礼必风</a> 2006-11-15 21:15 <a href="http://www.blogjava.net/bily/archive/2006/11/15/81370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP与Java Servlet</title><link>http://www.blogjava.net/bily/archive/2006/11/15/81359.html</link><dc:creator>礼必风</dc:creator><author>礼必风</author><pubDate>Wed, 15 Nov 2006 12:12:00 GMT</pubDate><guid>http://www.blogjava.net/bily/archive/2006/11/15/81359.html</guid><wfw:comment>http://www.blogjava.net/bily/comments/81359.html</wfw:comment><comments>http://www.blogjava.net/bily/archive/2006/11/15/81359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bily/comments/commentRss/81359.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bily/services/trackbacks/81359.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1 Java Servlet简介																																  Java Servlet是J S P技术的基础，而且大型的We b应用程序的开发需要Java Servlet和J S P配合才能完成，这里简单介绍S e r v l e t的相关知识，S e r v l e t的开发将在其它章节讲述。						  S e...&nbsp;&nbsp;<a href='http://www.blogjava.net/bily/archive/2006/11/15/81359.html'>阅读全文</a><img src ="http://www.blogjava.net/bily/aggbug/81359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bily/" target="_blank">礼必风</a> 2006-11-15 20:12 <a href="http://www.blogjava.net/bily/archive/2006/11/15/81359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP内建对象</title><link>http://www.blogjava.net/bily/archive/2006/11/15/81358.html</link><dc:creator>礼必风</dc:creator><author>礼必风</author><pubDate>Wed, 15 Nov 2006 12:01:00 GMT</pubDate><guid>http://www.blogjava.net/bily/archive/2006/11/15/81358.html</guid><wfw:comment>http://www.blogjava.net/bily/comments/81358.html</wfw:comment><comments>http://www.blogjava.net/bily/archive/2006/11/15/81358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bily/comments/commentRss/81358.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bily/services/trackbacks/81358.html</trackback:ping><description><![CDATA[
		<p>&lt;一&gt;out - javax.servlet.jsp.jspWriter<br />out对象用于把结果输出到网页上。</p>
		<p>方法：<br />1. void clear() ;<br />清除输出缓冲区的内容，但是不输出到客户端。</p>
		<p>2. void clearBuffer() ;<br />清除输出缓冲区的内容，并输出到客户端。</p>
		<p>3. void close() ;<br />关闭输出流，清除所有内容。</p>
		<p>4. void flush() ;<br />输出缓冲区里面的数据。</p>
		<p>5. int getBufferSize() ;<br />获取以kb为单位的目前缓冲区大小。</p>
		<p>6. int getRemaining() ;<br />获取以kb为单位的缓冲区中未被占用的空间大小。</p>
		<p>7. boolean isAutoFlush() ;<br />是否自动刷新缓冲区。</p>
		<p>8. void newLine() ;<br />输出一个换行字符。</p>
		<p>9. void print( boolean b ) ;<br />void print( char c ) ;<br />void print( char[] s ) ;<br />void print( double d ) ;<br />void print( float f ) ;<br />void print( int i ) ;<br />void print( long l ) ;<br />void print( Object obj ) ;<br />void print( String s ) ;<br />将指定类型的数据输出到Http流，不换行。</p>
		<p>10. void println( boolean b ) ;<br />void println( char c ) ;<br />void println( char[] s ) ;<br />void println( double d ) ;<br />void println( float f ) ;<br />void println( int i ) ;<br />void println( long l ) ;<br />void println( Object obj ) ;<br />void println( String s ) ;<br />将指定类型的数据输出到Http流，并输出一个换行符。</p>
		<p>11. Appendable append( char c ) ;<br />Appendable append( CharSequence cxq, int start, int end ) ;<br />Appendable append( CharSequence cxq ) ;<br />将一个字符或者实现了CharSequence接口的对象添加到输出流的后面。</p>
		<p>成员：<br />int DEFAULT_BUFFER = 0 - 缺省缓冲区大小<br />int NO_BUFFER = -1 - writer是否处于缓冲输出状态<br />int UNBOUNDED_BUFFER = -2 - 是否限制缓冲区大小</p>
		<p>&lt;二&gt;request - javax.servlet.http.HttpServletRequest<br />request对象包含所有请求的信息，如请求的来源、标头、cookies和请求相关的参数值等。</p>
		<p>方法：<br />1. Object getAttribute( String name ) ;<br />返回由name指定的属性值，该属性不存在时返回null。</p>
		<p>2. Enumeration getAttributeNames() ;<br />返回request对象的所有属性名称的集合。</p>
		<p>3. String getAuthType() ;<br />返回用来保护servlet的认证方法的名称，未受保护时返回null。</p>
		<p>4. String getCharacterEncoding() ;<br />返回请求中的字符编码方法，可以在response对象中设置。</p>
		<p>5. int getContentLength() ;<br />返回请求的BODY的长度，不能确定长度时返回-1。可以在response中设置。</p>
		<p>6. String getContentType() ;<br />返回在response中定义的内容类型。</p>
		<p>7. String getContentPath() ;<br />返回请求的路径。</p>
		<p>8. Cookie[] getCookies() ;<br />返回客户端所有的Cookie的数组。</p>
		<p>9. Enumeration getHeaderNames() ;<br />返回所有HTTP头的名称的集合。</p>
		<p>10. Enumeration getHeaders( String name ) ;<br />返回指定HTTP头的所有值的集合。</p>
		<p>11. String getHeader( String name ) ;<br />返回指定名称的HTTP头的信息。</p>
		<p>12. long getDateHeader( String name ) ;<br />返回指定名称的Data类型的HTTP头的信息。</p>
		<p>13. int getIntHeader( String name ) ;<br />返回指定名称的Int类型的HTTP头的信息。</p>
		<p>14. ServletInputStream getInputStream() ;<br />返回请求的输入流。</p>
		<p>15. Locale getLocale() ;<br />返回当前页的Locale对象，可以在response中设定。</p>
		<p>16. Enumeration getLocales() ;<br />返回请求中所有的Locale对象的集合。</p>
		<p>17. String getLocalName() ;<br />获取响应请求的服务器端主机名。</p>
		<p>18. String getLocalAddr() ;<br />获取响应请求的服务器端地址。</p>
		<p>19. int getLocalPort() ;<br />获取响应请求的服务器端端口</p>
		<p>20. String getMethod() ;<br />获取客户端向服务器端发送请求的方法(GET、POST)。</p>
		<p>21. String getParameter( String name ) ;<br />获取客户端发送给服务器端的参数值。</p>
		<p>22. Map getParameterMap() ;<br />该方法返回包含请求中所有参数的一个Map对象。</p>
		<p>23. Enumeration getParameterNames() ;<br />返回请求中所有参数的集合。</p>
		<p>24. String[] getParameterValues( String name ) ;<br />获得请求中指定参数的所有值。</p>
		<p>25. String getQueryString() ;<br />返回get方法传递的参数字符串，该方法不分解出单独的参数。</p>
		<p>26. String getPathInfo() ;<br />取出请求中处于ServletPath和QueryString之间的额外信息。</p>
		<p>27. String getPathTranslated() ;<br />返回用getPathInfo()方法取得的路径信息的实际路径。</p>
		<p>28. String getProtocol() ;<br />返回请求使用的协议。可以是HTTP1.1或者HTTP1.0。</p>
		<p>29. BufferedReader getReader() ;<br />返回请求的输入流对应的Reader对象，该方法和getInputStream()方法在一个页面中只能调用一个。</p>
		<p>30. String getRemoteAddr() ;<br />获取发出请求的客户端IP地址。</p>
		<p>31. String getRemoteHost() ;<br />获取发出请求的客户端主机名</p>
		<p>32. String getRemoteUser() ;<br />返回经过客户端验证的用户名，未经验证返回null。</p>
		<p>33. int getRemotePort() ;<br />返回发出请求的客户端主机端口。</p>
		<p>34. String getRealPath( String path ) ;<br />返回给定虚拟路径的物理路径。</p>
		<p>35. RequestDispatcher getRequestDispatcher( String path ) ;<br />按给定的路径生成资源转向处理适配器对象。</p>
		<p>36. String getRequestedSessionId() ;<br />返回请求的session的标识。</p>
		<p>37. String RequestURI() ;<br />返回发出请求的客户端地址，但是不包括请求的参数字符串。</p>
		<p>38. StringBuffer getRequestURI() ;<br />返回响应请求的服务器端地址</p>
		<p>39. String getScheme() ;<br />获取协议名称，缺省值为HTTP协议。</p>
		<p>40. String getServerName() ;<br />返回响应请求的服务器名称。</p>
		<p>41. String getServletPath() ;<br />获取客户端所请求的脚本文件的文件路径。</p>
		<p>42. int getServerPort() ;<br />获取响应请求的服务器端主机端口号。</p>
		<p>43. void removeAttribute( String name ) ;<br />在属性列表中删除指定名称的属性。</p>
		<p>44. void setAttribute( String name, Object value ) ;<br />在属性列表中添加/删除指定的属性。</p>
		<p>45. void setCharacterEncoding( String name ) ;<br />设置请求的字符编码格式。</p>
		<p>46. HttpSession getSession() ;<br />HttpSession getSession( boolean create ) ;<br />获取session，如果create为true，在无session的情况下创建一个。</p>
		<p>47. boolean isRequestedSessionIdFromCookie() ;<br />检查请求的会话ID是否为通过Cookie传入。</p>
		<p>48. boolean isRequestedSessionIdFromURL() ;<br />检查请求的会话ID是否为通过URL传入。</p>
		<p>49. boolean isRequestedSessionIdValid() ;<br />检查请求的会话ID是否仍然有效。</p>
		<p>50. boolean isSecure() ;<br />检查请求是否使用安全链接，如果HTTPS等。</p>
		<p>51. boolean isUserInRole( String role ) ;<br />检查已经通过验证的用户是否在是role所指定的角色。</p>
		<p>52. Principal getUserPrincipal() ;<br />返回包含用户登陆名的一个java.security.Principal对象。</p>
		<p>成员：<br />String BASIC_AUTH = "BASIC" - <br />String CLIENT_CERT_AUTH = "CLIENT_CERT" - <br />String DIGEST_AUTH = "DIGEST" - <br />String FORM_AUTH = "FORM" - </p>
		<p>&lt;三&gt;response - javax.servlet.http.HttpServletResponse<br />response对象主要将JSP容器处理后的结果传回到客户端。</p>
		<p>方法：<br />1. void addCookie( Cookie cookie ) ;<br />添加一个Cookie对象，保存客户端信息。</p>
		<p>2. void addDateHeader( String name, long value ) ;<br />添加一个日期类型的HTTP头信息，覆盖同名的HTTP头信息。</p>
		<p>3. void addHeader( String name, String value ) ;<br />添加一个HTTP头，覆盖同名的旧HTTP头。</p>
		<p>4. void addIntHeader( String name, int value ) ;<br />添加一个整型的HTTP头，覆盖同名的旧HTTP头。</p>
		<p>5. boolean containsHeader( String name ) ;<br />判断指定的HTTP头是否存在。</p>
		<p>6. String encodeRedirectURL( String url ) ;<br />对sendRedirect()方法使用的URL进行编码。</p>
		<p>7. String encodeURL( String url ) ;<br />将URL予以编码，回传包含session ID的URL。</p>
		<p>8. void flushBuffer() ;<br />强制把当前缓冲区的内容发送到客户端。</p>
		<p>9. int getBufferSize() ;<br />取得以kb为单位的缓冲区大小。</p>
		<p>10. String getCharacterEncoding() ;<br />获取响应的字符编码格式。</p>
		<p>11. String getContentType() ;<br />获取响应的类型。</p>
		<p>12. Locale getLocale() ;<br />获取响应的Locale对象。</p>
		<p>13. ServletOutputStream getOutputStream() ;<br />返回客户端的输出流对象。</p>
		<p>14. PrintWriter getWriter() ;<br />获取输出流对应的writer对象。</p>
		<p>15. boolean isCommitted() ;<br />判断服务器端是否已经将数据输出到客户端。</p>
		<p>16. void reset() ;<br />清空buffer中的所有内容。</p>
		<p>17. void resetBuffer() ;<br />情况buffer中所有的内容，但是保留HTTP头和状态信息。</p>
		<p>18. void sendError( int xc, String msg ) ;<br />void sendError( int xc ) ;<br />发送错误，包括状态码和错误信息。</p>
		<p>19. void sendRedirect( String locationg ) ;<br />把响应发送到另外一个位置进行处理。</p>
		<p>20. void setBufferSize( int size ) ;<br />设置以kb为单位的缓冲区大小。</p>
		<p>21. void setCharacterEncoding( String charset ) ;<br />设置响应使用的字符编码格式。</p>
		<p>22. void setContentLength( int length ) ;<br />设置响应的BODY长度。</p>
		<p>23. void setContentType( String type ) ;<br />设置响应的类型。</p>
		<p>24. void setDateHeader( String name, long value ) ;<br />设置指定名称的Data类型的HTTP头的值。</p>
		<p>25. void setHeader( String name, String value ) ;<br />设置指定名称的HTTP头的值。</p>
		<p>26. void setIntHeader( String name, int value ) ;<br />设置指定名称的int类型的HTTP头的值。</p>
		<p>27. void setStatus( int xc ) ;<br />设置响应状态码，新值会覆盖当前值。</p>
		<p>成员(HTTP状态码)：<br />int SC_CONTINUE = 100 int SC_SWITCHING_PROTOCOLS = 101<br />int SC_OK = 200 int SC_NON_AUTHORITATIVE_INFORMATION = 203<br />int SC_ACCEPTED = 202 int SC_CREATED = 201<br />int SC_NO_CONTENT = 204 int SC_RESET_CONTENT = 205<br />int SC_PARTIAL_CONTENT = 206 int SC_MULTIPLE_CHOICES = 300<br />int SC_MOVED_PERMANENTLY = 301 int SC_MOVED_TEMPORARILY = 302<br />int SC_FOUND = 302 int SC_SEE_OTHER = 303<br />int SC_NOT_MODIFIED = 304 int SC_USE_PROXY = 305<br />int SC_TEMPORARY_REDIRECT = 307 int SC_BAD_REQUEST = 400<br />int SC_UNAUTHORIZED = 401 int SC_PAYMENT_REQUIRED = 402<br />int SC_FORBIDDEN = 403 int SC_NOT_FOUND = 404<br />int SC_METHOD_NOT_ALLOWED = 405 int SC_NOT_ACCEPTABLE = 406<br />int SC_PROXY_AUTHENTICATION_REQUIRED = 407 int SC_REQUEST_TIMEOUT = 408<br />int SC_CONFLICT = 409 int SC_GONE = 410<br />int SC_LENGTH_REQUIRED = 411 int SC_PRECONDITION_FAILED = 412<br />int SC_REQUEST_ENTITY_TOO_LARGE = 413 int SC_REQUEST_URI_TOO_LONG = 414<br />int SC_UNSUPPORTED_MEDIA_TYPE = 415 int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416<br />int SC_EXPECTATION_FAILED = 417 int SC_INTERNAL_SERVER_ERROR = 500<br />int SC_NOT_IMPLEMENTED = 501 int SC_BAD_GATEWAY = 502<br />int SC_SERVICE_UNAVAILABLE = 503 int SC_GATEWAY_TIMEOUT = 504<br />int SC_HTTP_VERSION_NOT_SUPPORTED = 505</p>
		<p>&lt;四&gt;session - javax.servlet.http.HttpSession<br />session对象表示目前个别用户的会话状态，用来识别每个用户。</p>
		<p>方法：<br />1. Object getAttribute( String name ) ;<br />获取与指定名字相关联的session属性值。</p>
		<p>2. Enumeration getAttributeNames() ;<br />取得session内所有属性的集合。</p>
		<p>3. long getCreationTime() ;<br />返回session的创建时间，最小单位千分之一秒。</p>
		<p>4. String getId() ;<br />取得session标识。</p>
		<p>5. long getLastAccessedTime() ;<br />返回与当前session相关的客户端最后一次访问的时间，由1970-01-01算起，单位毫秒。</p>
		<p>6. int getMaxInactiveInterval( int interval ) ;<br />返回总时间，以秒为单位，表示session的有效时间(session不活动时间)。-1为永不过期。</p>
		<p>7. ServletContext getServletContext() ;<br />返回一个该JSP页面对应的ServletContext对象实例。</p>
		<p>8. HttpSessionContext getSessionContext() ;</p>
		<p>
				<br />9. Object getValue( String name ) ;<br />取得指定名称的session变量值，不推荐使用。</p>
		<p>10. String[] getValueNames() ;<br />取得所有session变量的名称的集合，不推荐使用。</p>
		<p>11. void invalidate() ;<br />销毁这个session对象。</p>
		<p>12. boolean isNew() ;<br />判断一个session是否由服务器产生，但是客户端并没有使用。</p>
		<p>13. void pubValue( String name, Object value ) ;<br />添加一个session变量，不推荐使用。</p>
		<p>14. void removeValue( String name ) ;<br />移除一个session变量的值，不推荐使用。</p>
		<p>15. void setAttribute( String name, String value ) ;<br />设置指定名称的session属性值。</p>
		<p>16. void setMaxInactiveInterval( int interval ) ;<br />设置session的有效期。</p>
		<p>17. void removeAttribute( String name ) ;<br />移除指定名称的session属性。</p>
		<p>&lt;五&gt;pageContext - javax.servlet.jsp.PageContext<br />pageContext对象存储本JSP页面相关信息，如属性、内建对象等。</p>
		<p>方法：<br />1. void setAttribute( String name, Object value, int scope ) ;<br />void setAttribute( String name, Object value ) ;<br />在指定的共享范围内设置属性。</p>
		<p>2. Object getAttribute( String name, int scope ) ;<br />Object getAttribute( String name ) ;<br />取得指定共享范围内以name为名字的属性值。</p>
		<p>3. Object findAttribute( String name ) ;<br />按页面、请求、会话和应用程序共享范围搜索已命名的属性。</p>
		<p>4. void removeAttribute( String name, int scope ) ;<br />void removeAttribute( String name ) ;<br />移除指定名称和共享范围的属性。</p>
		<p>5. void forward( String url ) ;<br />将页面导航到指定的URL。</p>
		<p>6. Enumeration getAttributeNamesScope( int scope ) ;<br />取得指定共享范围内的所有属性名称的集合。</p>
		<p>7. int getAttributeScope( String name ) ;<br />取得指定属性的共享范围。</p>
		<p>8. ErrorData getErrorDate() ;<br />取得页面的errorData对象。</p>
		<p>9. Exception getException() ;<br />取得页面的exception对象。</p>
		<p>10. ExpressionEvaluator getExpressionEvaluator() ;<br />取得页面的expressionEvaluator对象。</p>
		<p>11. JspWriter getOut() ;<br />取得页面的out对象。</p>
		<p>12. Object getPage() ;<br />取得页面的page对象。</p>
		<p>13. ServletRequest getRequest() ;<br />取得页面的request对象。</p>
		<p>14. ServletResponse getResponse() ;<br />取得页面的response对象。</p>
		<p>15. ServletConfig getConfig() ;<br />取得页面的config对象。</p>
		<p>16. ServletContext getServletContext() ;<br />取得页面的servletContext对象。</p>
		<p>17. HttpSession getSession() ;<br />取得页面的session对象。</p>
		<p>18. VariableResolver getVariableResolver() ;<br />取得页面的variableResolver对象。</p>
		<p>19. void include( String url, boolean flush ) ;<br />void include( String url ) ;<br />包含其他的资源，并指定是否自动刷新。</p>
		<p>20. void release() ;<br />重置pageContext内部状态，释放所有内部引用。</p>
		<p>21. void initialize( Servlet servlet, ServletRequest request, ServletResponse response,<br />String errorPageURL, boolean needSession, int bufferSize, boolean autoFlush ) ;<br />初始化未经初始化的pageContext对象。</p>
		<p>22. BodyContext pushBody() ;<br />BodyContext pushBody( Writer writer ) ;<br />保存当前的out对象，并更新pageContext中page范围内的out对象。</p>
		<p>23. JspWrite popBody() ;<br />取出由pushBody()方法保存的out对象。</p>
		<p>24. void handlePageException( Exception e ) ;<br />void handlePageException( Thrwoable t ) ;<br /><br />成员：<br />int PAGE_SCOPE = 1 - 页面共享范围<br />int REQUEST_SCOPE = 2 - 请求共享范围<br />int SESSION_SCOPE = 3 - 会话共享范围<br />int APPLICATION_SCOPE = 4 - 应用程序共享范围<br />String PAGE = "javax.servlet.jsp.jspPage"<br />String PAGECONTEXT = "javax.servlet.jsp.jspPageContext"<br />String REQUEST = "javax.servlet.jsp.jspRequest"<br />String RESPONSE = "javax.servlet.jsp.jspResponse"<br />String CONFIG = "javax.servlet.jsp.jspConfig"<br />String SESSION = "javax.servlet.jsp.jspSession"<br />String OUT = "javax.servlet.jsp.jspOut"<br />String APPLICATION = "javax.servlet.jsp.jspApplication"<br />String EXCEPTION = "javax.servlet.jsp.jspException"</p>
		<p>&lt;六&gt;application - javax.servlet.ServletContext<br />application主要功用在于取得或更改Servlet的设定。</p>
		<p>方法：<br />1. Object getAttribute( String name ) ;<br />返回由name指定的application属性。</p>
		<p>2. Enumeration getAttributes() ;<br />返回所有的application属性。</p>
		<p>3. ServletContext getContext( String uripath ) ;<br />取得当前应用的ServletContext对象。</p>
		<p>4. String getInitParameter( String name ) ;<br />返回由name指定的application属性的初始值。</p>
		<p>5. Enumeration getInitParameters() ;<br />返回所有的application属性的初始值的集合。</p>
		<p>6. int getMajorVersion() ;<br />返回servlet容器支持的Servlet API的版本号。</p>
		<p>7. String getMimeType( String file ) ;<br />返回指定文件的类型，未知类型返回null。一般为"text/html"和"image/gif"。</p>
		<p>8. int getMinorVersion() ;<br />返回servlet容器支持的Servlet API的副版本号。</p>
		<p>9. String getRealPath( String path ) ;<br />返回给定虚拟路径所对应物理路径。</p>
		<p>10. RequestDispatcher getNamedDispatcher( String name ) ;<br />为指定名字的Servlet对象返回一个RequestDispatcher对象的实例。</p>
		<p>11. RequestDispatcher getRequestDispatcher( String path ) ;<br />返回一个RequestDispatcher对象的实例。</p>
		<p>12. URL getResource( String path ) ;<br />返回指定的资源路径对应的一个URL对象实例，参数要以"/"开头。</p>
		<p>13. InputStream getResourceAsStream( String path ) ;<br />返回一个由path指定位置的资源的InputStream对象实例。</p>
		<p>14. Set getResourcePaths( String path ) ;<br />返回存储在web-app中所有资源路径的集合。</p>
		<p>15. String getServerInfo() ;<br />取得应用服务器版本信息。</p>
		<p>16. Servlet getServlet( String name ) ;<br />在ServletContext中检索指定名称的servlet。</p>
		<p>17. Enumeration getServlets() ;<br />返回ServletContext中所有servlet的集合。</p>
		<p>18. String getServletContextName() ;<br />返回本web应用的名称。</p>
		<p>19. Enumeration getServletContextNames() ;<br />返回ServletContext中所有servlet的名称集合。</p>
		<p>20. void log( Exception ex, String msg ) ;<br />void log( String msg, Throwable t ) ;<br />void log( String msg ) ;<br />把指定的信息写入servlet log文件。</p>
		<p>21. void removeAttribute( String name ) ;<br />移除指定名称的application属性。</p>
		<p>22. void setAttribute( String name, Object value ) ;<br />设定指定的application属性的值。</p>
		<p>&lt;七&gt;config - javax.servlet.ServletConfig<br />config对象用来存放Servlet初始的数据结构。</p>
		<p>方法：<br />1. String getInitParameter( String name ) ;<br />返回名称为name的促使参数的值。</p>
		<p>2. Enumeration getInitParameters() ;<br />返回这个JSP所有的促使参数的名称集合。</p>
		<p>3. ServletContext getContext() ;<br />返回执行者的servlet上下文。</p>
		<p>4. String getServletName() ;<br />返回servlet的名称。</p>
		<p>&lt;八&gt;exception - java.lang.Throwable<br />错误对象，只有在JSP页面的page指令中指定isErrorPage="true"后，才可以在本页面使用exception对象。</p>
		<p>方法：<br />1. Throwable fillInStackTrace() ;<br />将当前stack信息记录到exception对象中。</p>
		<p>2. String getLocalizedMessage() ;<br />取得本地语系的错误提示信息。</p>
		<p>3. String getMessage()<br />取得错误提示信息。</p>
		<p>4. StackTrackElement[] getStackTrace() ;<br />返回对象中记录的call stack track信息。</p>
		<p>5. Throwable initCause( Throwable cause ) ;<br />将另外一个异常对象嵌套进当前异常对象中。</p>
		<p>6. Throwable getCause() ;<br />取出嵌套在当前异常对象中的异常。</p>
		<p>7. void printStackTrace() ;<br />void printStackTrace( printStream s ) ;<br />void printStackTrace( printWriter s ) ;<br />打印出Throwable及其call stack trace信息。</p>
		<p>8. void setStackTrace( StackTraceElement[] stackTrace )<br />设置对象的call stack trace信息。</p>
		<p>&lt;九&gt; page - javax.servlet.jsp.HttpJspPage<br />page对象代表JSP对象本身，或者说代表编译后的servlet对象，<br />可以用( (javax.servlet.jsp.HttpJspPage)page )来取用它的方法和属性。</p>
<img src ="http://www.blogjava.net/bily/aggbug/81358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bily/" target="_blank">礼必风</a> 2006-11-15 20:01 <a href="http://www.blogjava.net/bily/archive/2006/11/15/81358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>session 时时监控例子</title><link>http://www.blogjava.net/bily/archive/2006/11/15/81325.html</link><dc:creator>礼必风</dc:creator><author>礼必风</author><pubDate>Wed, 15 Nov 2006 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/bily/archive/2006/11/15/81325.html</guid><wfw:comment>http://www.blogjava.net/bily/comments/81325.html</wfw:comment><comments>http://www.blogjava.net/bily/archive/2006/11/15/81325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bily/comments/commentRss/81325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bily/services/trackbacks/81325.html</trackback:ping><description><![CDATA[
		<p>/**<br />这是管理user信息的类<br />文件名为onLineUser.java<br />*/</p>
		<p>import javax.servlet.http.*; <br />import javax.servlet.*; <br />import java.util.*; </p>
		<p>public class onLineUser implements HttpSessionBindingListener { <br />     public onLineUser(){<br />   } </p>
		<p>   private Vector users=new Vector();<br />   public int getCount(){<br />       users.trimToSize();<br />       return users.capacity();<br />   }<br />   public boolean existUser(String userName){<br />       users.trimToSize();<br />       boolean existUser=false;<br />       for (int i=0;i&lt;users.capacity();i++ )<br />       {<br />           if (userName.equals((String)users.get(i)))<br />           {<br />               existUser=true;<br />               break;<br />           }<br />       }<br />       return existUser;<br />   }</p>
		<p>   public boolean deleteUser(String userName) {<br />       users.trimToSize();<br />       if(existUser(userName)){<br />           int currUserIndex=-1;<br />           for(int i=0;i&lt;users.capacity();i++){<br />               if(userName.equals((String)users.get(i))){<br />                   currUserIndex=i;<br />                   break;<br />               }<br />           }<br />           if (currUserIndex!=-1){<br />               users.remove(currUserIndex);<br />               users.trimToSize();<br />               return true;<br />           }<br />       }<br />       return false;<br />   }</p>
		<p>   public Vector getOnLineUser()<br />   {<br />       return users;<br />   }<br />     public void valueBound(HttpSessionBindingEvent e) { <br />       users.trimToSize();<br />       if(!existUser(e.getName())){<br />           users.add(e.getName());<br />           System.out.print(e.getName()+"\t   登入到系统\t"+(new Date()));<br />           System.out.println("      在线用户数为："+getCount());<br />       }else<br />           System.out.println(e.getName()+"已经存在");<br />     } </p>
		<p>     public void valueUnbound(HttpSessionBindingEvent e) { <br />       users.trimToSize();<br />       String userName=e.getName();<br />       deleteUser(userName);<br />       System.out.print(userName+"\t   退出系统\t"+(new Date()));<br />       System.out.println("      在线用户数为："+getCount());<br />     } <br />} </p>
		<p>/////////////////////////////////////////////////////////////////////////////<br />&lt;%<br />/**这是显示在线用户的jsp文件<br />文件名为onLineUser.jsp<br />*/<br />%&gt;<br />&lt;%@ page contentType="text/html;charset=gb2312" %&gt; <br />&lt;%@ page import="onLineUser,java.util.*" %&gt; <br />&lt;jsp:useBean id="onlineuser" class="onLineUser" scope="application"/&gt;<br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;搞定JSP在线人数&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt; <br />&lt;center&gt; <br />  &lt;p&gt;&lt;h1&gt;登陆成功，欢迎您访问!&lt;/h1&gt;&lt;/p&gt;<br />&lt;/center&gt;<br />&lt;%   session = request.getSession(false); %&gt; <br />&lt;% <br />   String username=request.getParameter("username");<br />   if (onlineuser.existUser(username)){<br />       out.println("用户&lt;font color=red&gt;"+username+"&lt;/font&gt;已经登陆！");<br />   }else{<br />       session.setMaxInactiveInterval(50); <a href="file://Sesion/"><font color="#003399">file://Sesion</font></a>有效时长，以秒为单位<br />       session.setAttribute(username,onlineuser); <br />       out.println("欢迎新用户:&lt;font color=red&gt;"+username+"&lt;/font&gt;登陆到系统！");<br />   }<br />   out.println("&lt;br&gt;当前在线用户人数:&lt;font color=red&gt;"+onlineuser.getCount()+"&lt;/font&gt;&lt;br&gt;");<br />   Vector vt=onlineuser.getOnLineUser();<br />   Enumeration e = vt.elements();<br />   out.println("在线用户列表");<br />   out.println("&lt;table border=1&gt;");<br />   out.println("&lt;tr&gt;&lt;td&gt;用户名&lt;/td&gt;&lt;/tr&gt;");<br />     while(e.hasMoreElements()){<br />       out.println("&lt;tr&gt;&lt;td&gt;");<br />       out.println((String)e.nextElement()+"&lt;br&gt;");<br />       out.println("&lt;/td&gt;&lt;/tr&gt;");<br />   }<br />   out.println("&lt;/table&gt;");<br />     <br />%&gt; <br />&lt;center&gt; <br />  &lt;p&gt;elapsed制作&lt;/p&gt;<br />  &lt;p&gt; &lt;/p&gt;<br />&lt;%<br />   out.println("&lt;p&gt;&lt;a href='logout.jsp?username="+username+"'&gt;退出系统&lt;/a&gt;&lt;/p&gt;");<br />%&gt;<br />&lt;/center&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </p>
		<p>////////////////////////////////////////////////////////////////////////////////////<br />&lt;%<br />/**<br />这是用户退出的jsp文件<br />文件名为logout.jsp<br />*/<br />%&gt;<br />&lt;%@ page contentType="text/html;charset=gb2312" %&gt; <br />&lt;%@ page import="onLineUser,java.util.*" %&gt; <br />&lt;jsp:useBean id="onlineuser" class="onLineUser" scope="application"/&gt;<br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;搞定JSP在线人数&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt; <br />&lt;center&gt; <br />  &lt;p&gt;&lt;h1&gt;登陆成功，欢迎您访问!&lt;/h1&gt;&lt;/p&gt;<br />&lt;/center&gt;<br />&lt;% <br />   String username=request.getParameter("username");<br />   if(onlineuser.deleteUser(username))<br />       out.println(username+"已经退出系统!");<br />   else<br />       out.println(username+"没有登陆到系统！");<br />%&gt; <br />&lt;center&gt; <br />  &lt;p&gt;elapsed制作&lt;/p&gt;<br />  &lt;p&gt; &lt;/p&gt;<br />  &lt;p&gt;&lt;a href="logout.jsp"&gt;退出系统&lt;/a&gt;&lt;/p&gt;<br />&lt;/center&gt; <br />&lt;/body&gt; <br />&lt;/html&gt;</p>
<img src ="http://www.blogjava.net/bily/aggbug/81325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bily/" target="_blank">礼必风</a> 2006-11-15 17:11 <a href="http://www.blogjava.net/bily/archive/2006/11/15/81325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何解决jsp的数据存放到数据库时乱码的问题</title><link>http://www.blogjava.net/bily/archive/2006/11/15/81323.html</link><dc:creator>礼必风</dc:creator><author>礼必风</author><pubDate>Wed, 15 Nov 2006 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/bily/archive/2006/11/15/81323.html</guid><wfw:comment>http://www.blogjava.net/bily/comments/81323.html</wfw:comment><comments>http://www.blogjava.net/bily/archive/2006/11/15/81323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bily/comments/commentRss/81323.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bily/services/trackbacks/81323.html</trackback:ping><description><![CDATA[import javax.servlet.Filter;<br />import javax.servlet.FilterChain;<br />import javax.servlet.ServletRequest;<br />import javax.servlet.ServletResponse;<br />import java.io.IOException;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.ServletException;<br />import javax.servlet.FilterConfig;<br /><br />public class EncodingFilter implements Filter {<br />    <br />     protected FilterConfig filterConfig;<br />     private String targetEncoding = "gb2312";<br />        <br />        public void init(FilterConfig config) throws ServletException {<br />            this.filterConfig = config;<br />            this.targetEncoding = config.getInitParameter("encoding");<br />        }<br />        <br />         public  void doFilter(ServletRequest srequest, ServletResponse  sresponse, FilterChain chain)<br />            throws IOException, ServletException {<br />            //System.out.println("使用以下方法对请求进行编码：encoding="+targetEncoding);<br />                <br />            HttpServletRequest request = (HttpServletRequest)srequest;<br />            request.setCharacterEncoding(targetEncoding);<br />            chain.doFilter(srequest,sresponse);  <br />        }   <br /><br />        public void setFilterConfig(final FilterConfig filterConfig)<br />        {<br />            this.filterConfig=filterConfig;<br />        }<br /><br />        public void destroy()<br />        {<br />            this.filterConfig=null;<br />        }<br />}<br /><br />在WEB-INF/web.xml下面配置<br />   &lt;filter&gt;<br />    &lt;filter-name&gt;EncodingFilter&lt;/filter-name&gt;<br />    &lt;filter-class&gt;com.david.common.sys.EncodingFilter&lt;/filter-class&gt;<br />    &lt;init-param&gt;<br />      &lt;param-name&gt;encoding&lt;/param-name&gt;<br />      &lt;param-value&gt;gb2312&lt;/param-value&gt;<br />    &lt;/init-param&gt;<br />  &lt;/filter&gt;<br />  &lt;filter-mapping&gt;<br />    &lt;filter-name&gt;EncodingFilter&lt;/filter-name&gt;<br />    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />  &lt;/filter-mapping&gt;<img src ="http://www.blogjava.net/bily/aggbug/81323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bily/" target="_blank">礼必风</a> 2006-11-15 17:10 <a href="http://www.blogjava.net/bily/archive/2006/11/15/81323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP效验码图片生成方法</title><link>http://www.blogjava.net/bily/archive/2006/11/15/81324.html</link><dc:creator>礼必风</dc:creator><author>礼必风</author><pubDate>Wed, 15 Nov 2006 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/bily/archive/2006/11/15/81324.html</guid><wfw:comment>http://www.blogjava.net/bily/comments/81324.html</wfw:comment><comments>http://www.blogjava.net/bily/archive/2006/11/15/81324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bily/comments/commentRss/81324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bily/services/trackbacks/81324.html</trackback:ping><description><![CDATA[
		<p>
				<strong>生成方法（一）</strong>
				<br />// 在内存中创建图象 <br />int width=55, height=20; <br />BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); </p>
		<p>// 获取图形上下文 <br />Graphics g = image.getGraphics(); </p>
		<p>// 设定背景色 <br />g.setColor(new Color(0xECECEC)); <br />g.fillRect(0, 0, width, height); </p>
		<p>//画边框 <br />g.setColor(Color.black); <br />g.drawRect(0,0,width-1,height-1); <br />Random random = new Random(); <br />// 取随机产生的认证码(4位数字) <br />String rand = "";<br />rand += random.nextInt(9);<br />rand += random.nextInt(9);<br />rand += random.nextInt(9);<br />rand += random.nextInt(9);</p>
		<p>// 将认证码存入SESSION <br />session.setAttribute("rand",rand); </p>
		<p>//将认证码显示到图象中,并在12到18象素之间随机设定字体的大小<br />g.setColor(Color.black); <br />random.setSeed(new Date().getTime());<br />g.setFont(new Font("Atlantic Inline",Font.PLAIN,(12 + random.nextInt(6)))); <br />String Str = rand.substring(0,1); <br />g.drawString(Str,8,17); </p>
		<p>g.setFont(new Font("Atlantic Inline",Font.PLAIN,(12 + random.nextInt(6)))); <br />Str = rand.substring(1,2); <br />g.drawString(Str,20,15); </p>
		<p>g.setFont(new Font("Atlantic Inline",Font.PLAIN,(12 + random.nextInt(6)))); <br />Str = rand.substring(2,3); <br />g.drawString(Str,35,18); </p>
		<p>g.setFont(new Font("Atlantic Inline",Font.PLAIN,(12 + random.nextInt(6)))); <br />Str = rand.substring(3,4); <br />g.drawString(Str,45,15); </p>
		<p>// 随机产生88个干扰点，使图象中的认证码不易被其它程序探测到 <br />for (int i=0;i&lt;30;i++) <br />{ <br />    int x = random.nextInt(width); <br />    int y = random.nextInt(height); <br />    g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));<br />    g.drawOval(x,y,0,1); <br />} </p>
		<p>// 图象生效 <br />g.dispose(); </p>
		<p>// 输出图象到页面 <br />ImageIO.write(image, "JPEG", response.getOutputStream()); <br /><br /><strong>生成方法（二）</strong><br />&lt;%@ page contentType="image/jpeg" import="java.awt.*,<br />java.awt.image.*,java.util.*,javax.imageio.*" %&gt;<br />&lt;%!<br />Color getRandColor(int fc,int bc){//给定范围获得随机颜色<br />Random random = new Random();<br />if(fc&gt;255) fc=255;<br />if(bc&gt;255) bc=255;<br />int r=fc+random.nextInt(bc-fc);<br />int g=fc+random.nextInt(bc-fc);<br />int b=fc+random.nextInt(bc-fc);<br />return new Color(r,g,b);<br />}<br />%&gt;<br />&lt;%</p>
		<p>int randomLen=4;<br />try{<br />randomLen=Integer.parseInt(request.getParameter("param"));<br />}<br />catch(Exception e){<br />  e.printStackTrace();<br />}</p>
		<p>//设置页面不缓存<br />response.setHeader("Pragma","No-cache");<br />response.setHeader("Cache-Control","no-cache");<br />response.setDateHeader("Expires", 0);</p>
		<p>// 在内存中创建图象<br />int width=13*randomLen+8, height=20;<br />BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);</p>
		<p>// 获取图形上下文<br />Graphics g = image.getGraphics();</p>
		<p>//生成随机类<br />Random random = new Random();</p>
		<p>// 设定背景色<br />g.setColor(getRandColor(200,250));<br />g.fillRect(0, 0, width, height);</p>
		<p>//设定字体<br />g.setFont(new Font("Times New Roman",Font.PLAIN,18));</p>
		<p>//画边框<br />//g.setColor(new Color());<br />//g.drawRect(0,0,width-1,height-1);</p>
		<p>// 随机产生155条干扰线，使图象中的认证码不易被其它程序探测到<br />g.setColor(getRandColor(160,200));<br />for (int i=0;i&lt;30*randomLen;i++)<br />{<br />int x = random.nextInt(width);<br />int y = random.nextInt(height);<br />int xl = random.nextInt(12);<br />int yl = random.nextInt(12);<br />g.drawLine(x,y,x+xl,y+yl);<br />}</p>
		<p>// 取随机产生的认证码(4位数字)<br />String sRand="";<br />for (int i=0;i&lt;randomLen;i++){<br />String rand=String.valueOf(random.nextInt(10));<br />sRand+=rand;<br />// 将认证码显示到图象中<br />g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));<br />//调用函数出来的颜色相同，可能是因为种子太接近，所以只能直接生成<br />g.drawString(rand,13*i+6,16);<br />}</p>
		<p>// 将认证码存入SESSION<br />session.setAttribute("validcode",sRand);</p>
		<p>// 图象生效<br />g.dispose();</p>
		<p>// 输出图象到页面<br />ImageIO.write(image, "JPEG", response.getOutputStream());<br />%&gt;</p>
<img src ="http://www.blogjava.net/bily/aggbug/81324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bily/" target="_blank">礼必风</a> 2006-11-15 17:10 <a href="http://www.blogjava.net/bily/archive/2006/11/15/81324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 的JDBC 数据库连接池实现方法</title><link>http://www.blogjava.net/bily/archive/2006/11/15/81322.html</link><dc:creator>礼必风</dc:creator><author>礼必风</author><pubDate>Wed, 15 Nov 2006 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/bily/archive/2006/11/15/81322.html</guid><wfw:comment>http://www.blogjava.net/bily/comments/81322.html</wfw:comment><comments>http://www.blogjava.net/bily/archive/2006/11/15/81322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bily/comments/commentRss/81322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bily/services/trackbacks/81322.html</trackback:ping><description><![CDATA[关键字: Java, JDBC, Connection Pool, Database, 数据库连接池, sourcecode
<p>        虽然 J2EE 程序员一般都有现成的应用服务器所带的JDBC 数据库连接池，不过对于开发一般的 Java Application 、 Applet 或者 JSP、velocity 时，我们可用的JDBC 数据库连接池并不多，并且一般性能都不好。<br />        Java 程序员都很羡慕 Windows ADO ，只需要 new Connection 就可以直接从数据库连接池中返回 Connection。并且 ADO Connection 是线程安全的，多个线程可以共用一个 Connection， 所以 ASP 程序一般都把 getConnection 放在 Global.asa 文件中，在 IIS 启动时建立数据库连接。ADO 的 Connection 和 Result 都有很好的缓冲，并且很容易使用。</p><p>        其实我们可以自己写一个JDBC 数据库连接池。写 JDBC connection pool 的注意事项有：</p><p>1. 有一个简单的函数从连接池中得到一个 Connection。 <br />2. close 函数必须将 connection 放回 数据库连接池。 <br />3. 当数据库连接池中没有空闲的 connection， 数据库连接池必须能够自动增加 connection 个数。 <br />4. 当数据库连接池中的 connection 个数在某一个特别的时间变得很大，但是以后很长时间只用其中一小部分，应该可以自动将多余的 connection 关闭掉。 <br />5. 如果可能，应该提供debug 信息报告没有关闭的 new Connection 。 </p><p>        如果要 new Connection 就可以直接从数据库连接池中返回 Connection， 可以这样写( Mediator pattern ) (以下代码中使用了中文全角空格)：</p><p>public class EasyConnection implements java.sql.Connection{<br />private Connection m_delegate = null;<br />public EasyConnection(){<br />m_delegate = getConnectionFromPool();<br />}<br />public void close(){<br />putConnectionBackToPool(m_delegate);<br />}<br />public PreparedStatement prepareStatement(String sql) throws SQLException{<br />m_delegate.prepareStatement(sql);<br />}<br />//...... other method<br />}</p><p>        看来并不难。不过不建议这种写法，因为应该尽量避免使用 Java Interface, 关于 Java Interface 的缺点我另外再写文章讨论。大家关注的是 Connection Pool 的实现方法。下面给出一种实现方法。 </p><p>package connectionpool;</p><p>import java.sql.*;<br />import java.lang.reflect.*;<br />import java.util.*;<br />import java.io.*;</p><p>public class SimpleConnetionPool {<br /> private static LinkedList&lt;Object&gt; m_notUsedConnection = new LinkedList&lt;Object&gt;();<br /> private static HashSet&lt;Object&gt; m_usedUsedConnection = new HashSet&lt;Object&gt;();<br /> private static String m_url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=campusblog";<br /> private static String m_user = "sa";<br /> private static String m_password = "sa";<br /> static final boolean DEBUG = true;<br /> static private long m_lastClearClosedConnection = System.currentTimeMillis();<br /> public static long CHECK_CLOSED_CONNECTION_TIME = 4 * 60 * 60 * 1000; //4 hours</p><p> static {<br />  initDriver();<br />  }</p><p> private SimpleConnetionPool() { <br /> }</p><p> private static void initDriver() {<br />  Driver driver = null;<br />  //load mysql driver<br />  try {<br />   driver = (Driver) Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();<br />   installDriver(driver);<br />  } <br />  catch (Exception e) {}<br />  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////选择使用<br />  //load postgresql driver<br />  //try {<br />   //driver = (Driver) Class.forName("org.postgresql.Driver").newInstance();<br />   //installDriver(driver);<br />  //} <br />  //catch (Exception e){}<br />////////////////////////////////////////////////////////////////////////////////////////////////////////////////选择使用<br /><br /> }</p><p> public static void installDriver(Driver driver) {<br />  try {<br />   DriverManager.registerDriver(driver);<br />  }<br />  catch (Exception e) {<br />   e.printStackTrace();<br />  }<br /> }</p><p><br /> public static synchronized Connection getConnection() {<br />  clearClosedConnection();<br />  while (m_notUsedConnection.size() &gt; 0) {<br />   try{<br />    ConnectionWrapper wrapper = (ConnectionWrapper) m_notUsedConnection.removeFirst();<br />    if (wrapper.connection.isClosed()) {<br />     continue;<br />    }<br />    m_usedUsedConnection.add(wrapper);<br />    if(DEBUG){<br />     wrapper.debugInfo = new Throwable("Connection initial statement");<br />    }<br />   return wrapper.connection;<br />   }catch (Exception e){}<br />  }<br />  int newCount = getIncreasingConnectionCount();<br />  LinkedList&lt;Object&gt; list = new LinkedList&lt;Object&gt;();<br />  ConnectionWrapper wrapper = null;<br />  for (int i = 0; i &lt; newCount; i++) {<br />   wrapper = getNewConnection();<br />   if (wrapper != null) {<br />    list.add(wrapper);<br />   }<br />  }<br />  if (list.size() == 0) {<br />   return null;<br />  }<br />  wrapper = (ConnectionWrapper) list.removeFirst();<br />  m_usedUsedConnection.add(wrapper);<br />  m_notUsedConnection.addAll(list);<br />  list.clear();<br />  return wrapper.connection;<br /> }<br /> <br /> private static ConnectionWrapper getNewConnection() {<br />  try{<br />   Connection con = DriverManager.getConnection(m_url, m_user, m_password);<br />   ConnectionWrapper wrapper = new ConnectionWrapper(con);<br />   return wrapper;<br />  } <br />  catch (Exception e) {<br />   e.printStackTrace();<br />  }<br />  return null;<br /> }<br /> <br /> static synchronized void pushConnectionBackToPool(ConnectionWrapper con) {<br />  boolean exist = m_usedUsedConnection.remove(con);<br />  if (exist) {<br />   m_notUsedConnection.addLast(con);<br />  }<br /> }<br /> <br /> public static int close() {<br />  int count = 0;<br />  Iterator iterator = m_notUsedConnection.iterator();<br />  while (iterator.hasNext()) {<br />   try{<br />    ((ConnectionWrapper) iterator.next()).close();<br />    count++;<br />   } <br />   catch (Exception e) {}<br />  }<br />  m_notUsedConnection.clear();<br />  iterator = m_usedUsedConnection.iterator();<br />  while (iterator.hasNext()) {<br />   try{<br />    ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next();<br />    wrapper.close();<br />    if (DEBUG) {<br />     wrapper.debugInfo.printStackTrace();<br />    }<br />    count++;<br />   }catch (Exception e){}<br />  }<br />  m_usedUsedConnection.clear();<br />  return count;<br /> }<br /> <br /> private static void clearClosedConnection() {<br />  long time = System.currentTimeMillis();<br />  //sometimes user change system time,just return<br />  if (time &lt; m_lastClearClosedConnection) {<br />   time = m_lastClearClosedConnection;<br />   return;<br />  }<br />  //no need check very often<br />  if (time - m_lastClearClosedConnection &lt; CHECK_CLOSED_CONNECTION_TIME) {<br />   return;<br />   }<br />  m_lastClearClosedConnection = time;<br />  //begin check<br />  Iterator iterator = m_notUsedConnection.iterator();<br />  while (iterator.hasNext()) {<br />   ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next();<br />   try {<br />    if (wrapper.connection.isClosed()) {<br />     iterator.remove();<br />    }<br />    } catch (Exception e) {<br />     iterator.remove();<br />     if (DEBUG) {<br />      System.out.println("connection is closed, this connection initial StackTrace");<br />      wrapper.debugInfo.printStackTrace();<br />     }<br />    }<br />   }<br />  //make connection pool size smaller if too big<br />  int decrease = getDecreasingConnectionCount();<br />  if (m_notUsedConnection.size() &lt; decrease) {<br />   return;<br />   }<br />  while (decrease-- &gt; 0) {<br />   ConnectionWrapper wrapper = (ConnectionWrapper) m_notUsedConnection.removeFirst();<br />   try {<br />    wrapper.connection.close();<br />    } catch (Exception e){}<br />   }<br />  }<br /> <br /> /**<br />  * * get increasing connection count, not just add 1 connection<br />  * * @return count<br />  * */<br /> public static int getIncreasingConnectionCount(){<br />  int count = 1;<br />  int current = getConnectionCount();<br />  count = current / 4;<br />  if (count &lt; 1) {<br />   count = 1;<br />   }<br />  return count;<br /> }<br /> <br /> /**<br />  * * get decreasing connection count, not just remove 1 connection<br />  * * @return count<br />  * */<br /> public static int getDecreasingConnectionCount(){<br />  //int count = 0;<br />  int current = getConnectionCount();<br />  if (current &lt; 10){<br />   return 0;<br />  }<br />  return current / 3;<br /> }<br /> <br /> public synchronized static void printDebugMsg(){<br />  printDebugMsg(System.out);<br /> }<br /> <br /> public synchronized static void printDebugMsg(PrintStream out){<br />  if (DEBUG == false) {<br />   return;<br />  }<br />  StringBuffer msg = new StringBuffer();<br />  msg.append("debug message in " + SimpleConnetionPool.class.getName());<br />  msg.append("\r\n");<br />  msg.append("total count is connection pool: " + getConnectionCount());<br />  msg.append("\r\n");<br />  msg.append("not used connection count: " + getNotUsedConnectionCount());<br />  msg.append("\r\n");<br />  msg.append("used connection, count: " + getUsedConnectionCount());<br />  out.println(msg);<br />  Iterator iterator = m_usedUsedConnection.iterator();<br />  while (iterator.hasNext()){<br />   ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next();<br />   wrapper.debugInfo.printStackTrace(out);<br />  }<br />  out.println();<br /> }<br /> <br /> public static synchronized int getNotUsedConnectionCount(){<br />  return m_notUsedConnection.size();<br /> }<br /> <br /> public static synchronized int getUsedConnectionCount(){<br />  return m_usedUsedConnection.size();<br /> }<br /> <br /> public static synchronized int getConnectionCount(){<br />  return m_notUsedConnection.size() + m_usedUsedConnection.size();<br /> }<br />}</p><p>class ConnectionWrapper implements InvocationHandler{<br /> private final static String CLOSE_METHOD_NAME = "close";<br /> public Connection connection = null;<br /> private Connection m_originConnection = null;<br /> public long lastAccessTime = System.currentTimeMillis();<br /> Throwable debugInfo = new Throwable("Connection initial statement");<br /> <br /> ConnectionWrapper(Connection con){<br />  Class[] interfaces = {java.sql.Connection.class};<br />  this.connection = (Connection) Proxy.newProxyInstance(con.getClass().getClassLoader(),interfaces, this);<br />  m_originConnection = con;<br /> }<br /> <br /> void close() throws SQLException {<br />  m_originConnection.close();<br /> }<br /> <br /> public Object invoke(Object proxy, Method m, Object[] args) throws Throwable{<br />  Object obj = null;<br />  if (CLOSE_METHOD_NAME.equals(m.getName())) {<br />   SimpleConnetionPool.pushConnectionBackToPool(this);<br />  }<br />  else {<br />   obj = m.invoke(m_originConnection, args);<br />  }<br />  lastAccessTime = System.currentTimeMillis();<br />  return obj;<br /> }<br />}</p><p>        使用方法</p><p>public class TestConnectionPool{<br />　　public static void main(String[] args) {<br />　　　　SimpleConnetionPool.setUrl(DBTools.getDatabaseUrl());<br />　　　　SimpleConnetionPool.setUser(DBTools.getDatabaseUserName());<br />　　　　SimpleConnetionPool.setPassword(DBTools.getDatabasePassword());</p><p>　　　　Connection con = SimpleConnetionPool.getConnection();<br />　　　　Connection con1 = SimpleConnetionPool.getConnection();<br />　　　　Connection con2 = SimpleConnetionPool.getConnection();</p><p>　　　　//do something with con ...</p><p>　　　　try {<br />　　　　　　con.close();<br />　　　　} catch (Exception e) {}</p><p>　　　　try {<br />　　　　　　con1.close();<br />　　　　} catch (Exception e) {}</p><p>　　　　try {<br />　　　　　　con2.close();<br />　　　　} catch (Exception e) {}</p><p>　　　　con = SimpleConnetionPool.getConnection();<br />　　　　con1 = SimpleConnetionPool.getConnection();<br />　　　　try {<br />　　　　　　con1.close();<br />　　　　} catch (Exception e) {}</p><p>　　　　con2 = SimpleConnetionPool.getConnection();<br />　　　　SimpleConnetionPool.printDebugMsg();</p><p>　　}<br />}</p><img src ="http://www.blogjava.net/bily/aggbug/81322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bily/" target="_blank">礼必风</a> 2006-11-15 17:09 <a href="http://www.blogjava.net/bily/archive/2006/11/15/81322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP基础知识70问</title><link>http://www.blogjava.net/bily/archive/2006/11/15/81320.html</link><dc:creator>礼必风</dc:creator><author>礼必风</author><pubDate>Wed, 15 Nov 2006 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/bily/archive/2006/11/15/81320.html</guid><wfw:comment>http://www.blogjava.net/bily/comments/81320.html</wfw:comment><comments>http://www.blogjava.net/bily/archive/2006/11/15/81320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bily/comments/commentRss/81320.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bily/services/trackbacks/81320.html</trackback:ping><description><![CDATA[
		<p>1. 问：在JAVA与JSP中要调用一个LINUX上的脚本程序,或WINDOWS上的脚本程序,该怎么写？<br />答：System.getRuntime().exec("bash &lt; aaa.sh");</p>
		<p>2. 问：java中用什么表示双引号<br />答："""</p>
		<p>3. 问：如何在JSP程序里另起一个线程？<br />答：JSP本身就是独立线程运行而不象CGI都是独立进程.<br />一般:Thread t = new Thread("你的对象");t.start();就可以了.<br />要求你这个对象要实现runnable接口或继承thread.</p>
		<p>4. 问：jsp如何获得客户端的IP地址？<br />答：request.getRemoteAddr()<br />看看各个webserver的API文档说明，一般都有自带的，resin和tomcat都有</p>
		<p>5. 问：程序终止与输出终止<br />答：程序中止:return;<br />输出中止out.close();这一句相当于ASP的response.end</p>
		<p>6. 问：jsp中如何得到上页的URL？<br />答：request.getHeader("referer");</p>
		<p>7. 问：提交网页的网页过期功能是怎么做的？<br />答：response.setHader("Expires","0");</p>
		<p>8. 问：在JSP网页中如何知道自已打开的页面的名称<br />答：request.getRequestURI() ;//文件名<br />request.getRequestURL() ;//全部ＵＲＬ</p>
		<p>9. 问：提交表单后验证没有通过，返回提交页面，如何使原提交页面中的数据保留？<br />答：javascript的go(-1)可以把上页的表单内容重新显示出来,但password域没有</p>
		<p>10. 问：如何取得http的头信息？<br />答：request.getHader(headerName);</p>
		<p>11. 问：&amp;&amp;和&amp;的区别？<br />答：&amp;&amp;是短路的与操作，也就是当地一个条件是false的时候，第二个条件不用执行<br />&amp;相反，两个条件总是执行。</p>
		<p>12. 问：将*以正弦曲线的一个周期显示出来<br />答：<br />public void paint(Graphics g)<br />{<br />for(int i=0;i&lt;200;i++)<br />g.drawString("*",i,(int)(Math.sin(i)*20)+50);<br />}<br />}</p>
		<p>13. 问：浮点数相乘后结果不精确如100.0 * 0.6 结果等于 60.0004<br />答：这不叫错误,float和double是这样实现的.如果要精确计算，java提供了一个strictfp,它的计算遵循IEEE 754标准.而普通的float和double是由地平台浮点格式或硬件提供的额外精度或表示范围。</p>
		<p>14. 问：如何获得当前用的cursors的位置？<br />答：int row = rs.getRow()就是当前指针行数,还有isFrist();isBeforeFist();isLast();isAfterLast();可以测试是不是在方法名所说的位置</p>
		<p>15. 问：表单成功提交了，点后退显示网页过期<br />答：在&lt;head&gt;&lt;/head&gt;里面加以下代码<br />&lt;META HTTP-EQUIV="Pragma" CONTENT="no-cache"&gt; <br />&lt;META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"&gt; <br />&lt;META HTTP-EQUIV="Expires" CONTENT="0"&gt; <br />或者在表单页中加上<br />&lt;% <br />response.setHeader("Pragma","no-cache"); <br />response.setHeader("Cache-Control","no-cache"); <br />response.setDateHeader("Expires",0); <br />%&gt;</p>
		<p>16. 问：接口的简单理解<br />答：接口为了规范,比如我在接口中定义了一个方法:getData()<br />这是用来从不同的数据库中取数据的,就是JDBC的实现对于用户,我不要知道每种数据库是如何做的,但我知道如何它们要实现这个接口就一定有这个方法可以供我调用.这样SUN就把这个接口给各个数据库开发商,让他们自己实现. 但为什么不用继承而用接口哩,因为继承只能从一个你类继承,而接口可以实现多个,就是说我实现的子类有多个规定好的接口中的功能. 这只是简单的理解,等你深入理解抽象的时候就知道抽象到抽象时为什么还要再抽象到接口.</p>
		<p>17. 问：怎样编写一个取消按钮（怎样返回上一个页面，象工具栏的后退按钮）？<br />答：javascript把每次浏览过的location都压到了一个栈中,这个栈就是history,然后你如果要回到第几个页面它就做几次POP操作,把最后POP出来的那个LOCATION给你. 这就是JAVASCRIPT在实现history.go(-x)的原理.</p>
		<p>18. 问：什么是回调？<br />答：简单说,回调用不是让你去监听谁做完了什么事,而是谁做完了什么事就报告给你. 这就是回调用的思想.例子太多了,AWT的事件,SWING事件模型都是这样有. 还有多线程中,如果要控制线程数,不能总是查询每个线程是否结束,要在每个线程结束时让线程自己告诉主线程我结束了,你可以开新的线程了.</p>
		<p>19. 问：简要介绍一下compareTo方法<br />答：compareTo方法是Comparable 接口必需实现的方法,只要实现Comparable 就可以用Arrays.srot()排序就象实现Runnable接口的run就能Thread()一样.</p>
		<p>20. 问：如何可以从别的Web服务器检索页, 然后把检索到的网页的HTML代码储存在一个变量中返回过来<br />答：这是一个简单的WEB ROBOT实现,用URL类实现从网页中抓内容,然后自己写一个分析程序从中找出新的URL,不断递归下去就行了.</p>
		<p>21. 问：applet中如何获得键盘的输入<br />答：application的System.in是当前系统的标准输入,applet因为安全的原因不可能读取当前系统(客户端)的标准输入,只能从它的ROOT组件的事件中,比如键盘事件中取得键值.</p>
		<p>22. 问：怎样计算代码执行所花费的时间？<br />答：代码开始取时间，结束后取时间，相减<br />long t1 = System.currentTimeMillis();<br />///////////////// your code<br />long t2 = System.currentTimeMillis() ;<br />long time = t2-t1;</p>
		<p>23. 问：如何获在程序中获得一个文件的ContentType？<br />答：<br />URL u = new URL("<a href="file:///aaa.txt"><font color="#1d58d1">file:///aaa.txt</font></a>");<br />URLConnection uc = u.openConnection();<br />String s = uc.getContentType();</p>
		<p>24. 问：连接池的使用是建立很多连接池，还是一个连接池里用多个连接？<br />答：只有在对象源不同的情况下才会发生多个池化,如果你只连一结一个数据源,永远不要用多个连结池. 所以连结池的初始化一定要做成静态的,而且应该在构造对象之前,也就是只有在类LOAD的时候,别的时候不应该有任何生成新的连结池的时候。</p>
		<p>25. 问：JavaMail要怎么安装？<br />答：下载两个包，一个是javamail包，另一个是jaf包。下载完直接把这两个包不解压加到CLASSPATH。</p>
		<p>26. 问：怎样把地址栏里的地址锁定？<br />答：把你的服务器的可访问目录索引选项关闭就行了,任何服务器都有一个conf文件,里面都有这个选项。</p>
		<p>27. 问：在JAVA中怎么取得环境变量啊。比如： TEMP = C：TEMP ？<br />答：String sss = System.getProperty(key)</p>
		<p>28. 问：怎样实现四舍五入，保留小数点后两位小数？<br />答：<br />import java.text.*;<br />...<br />NumberFormat nf=NumberFormat.getNumberInstance();<br />nf.setMaximumFractionDigits(2);<br />nf.setMinimumFractionDigits(2);<br />nf.format(numb);</p>
		<p>29. 问：Applet和form如何通信？<br />答：取得的参数传到param里面<br />&lt;% <br />String xxx = request.getParameter("xxx"); <br />%&gt; <br />&lt;applet&gt; <br />&lt;param value="&lt;%=xxx%&gt;"&gt; <br />&lt;/applet&gt;<br /><br />30. 问：java-plug-in是什么？<br />答：Java Runtime Environment的插件。用来运行java程序。不需要什么特别的设置。等于你的机器里面有了jvm。</p>
		<p>31. 问：WEB上面怎么样连接上一个EXCEL表格？<br />答：定义页面得contentType="application/vnd.ms-excel"，让页面以excel得形式打开。同样也可以以word得形式打开：application/msword。</p>
		<p>32. 问：怎样才能避免textarea字数限制？<br />答：是使用了FORM的默认方法的缘故,如果什么也不写默认是GET改用Post即可，在Form中定义mothod="post"。</p>
		<p>33. 问：为什么加了&lt;<a href="mailto:%@page"><font color="#1d58d1">%@page</font></a> contentType="text/html;charset=gb2312" %&gt;插入数据库的中文，依然是乱码？<br />答：这要从环境看,能显示说明你的JSP引擎没有问题,但写入数据库时你的JDBC能不能处理中文,同一公司不同版本的JDBC都有支持中文和不支持中文的情况,RESIN自带的MYSQL JDBC就不支持,MM的就支持,还有你的数据库类型是否支持中文?CHAR的一般支持,但是否用binary存储双字节码<br /><br />34. 问：对于JFrame，hide()，show()与setVisibel()有什么区别吗？<br />答：setVisible()从Component继承过来，而hide(),show()从Window里面继承过来。<br />Makes the Window visible. If the Window and/or its owner are not yet displa yable, both are made displayable. The Window will be validated prior to being made visible. If t he Window is already visible, this will bring the Window to the front. 区别在这。<br /><br />36. 问：sendRedirect为什么不可以转到mms协议的地址的？response.sendRedirect("mms://missiah.adsldns.org:9394");<br />答：java平台目前实现的protocol中并没有mms,你可以取系统属性java.protocol.handler.pkgs看看它的值中有没有mms,所以如果要想重定向到mms://host这样和URL,只有生成客户端的JAVASCRIPT让它来重定向</p>
		<p>37. 问：JTable中怎样定义各个Columns和Width和怎样设置表格的内容靠做靠右或居中？<br />答：<br />TableColumn tc = table.getColumn("Name");//取得列名为"Name"的列Handle<br />int currentWidth = tc.getPreferredWidth(); //取得该列当前的宽度<br />tc.setPreferredWidth(200); //设置当前列宽<br />tc.setMaxWidth(200); //设置该列最大宽度<br />tc.setMinWidth(50); //设置该列最小宽度</p>
		<p>38. 问：批操作是否可用于select语句？<br />答：批操作其实是指成批理更新的操作,绝对不可能用于select操作。</p>
		<p>39. 问：为什么jsp路径太深文件名太长就无法读取文件？<br />答：path不能超过255长度,不然就找不到了.这是作业系统的事。</p>
		<p>40. 问：如何让页面不保留缓存？<br />答：<br />&lt;% <br />response.setHeader("Pragma","No-cache"); <br />response.setHeader("Cache-Control","no-cache"); <br />response.setDateHeader("Expires", 0); <br />%&gt;</p>
		<p>41. 问：我的applet code 中用到jbutton 时就出错是否由于ie不支持swing package 请问应怎么办？<br />答：JBUTTON是SWING基本包啊,只要把jdk/jre/lib/rt.jar放在classpath就行了.不要加载任何别的库。</p>
		<p>42. 问：不知道java是否支持midi格式，如果支持，应该怎么把wave格式转换成midi格式？<br />答：目前还不行,可以看一下JMF三个版中对MIDI的格式支持是read only,而WAVE是read/write,MIDI只能播放,不能生成。</p>
		<p>43. 问：在jsp里面防止用户直接输入url进去页面，应该怎么做呢？<br />答：一是从web服务器控制,对某一目录的所有访问要通过验证.<br />二是在要访问的页面中加入控制.这个一般用session,也可以用请求状态码实现</p>
		<p>44. 问：例如后台有一计算应用程序（此程序运算起来很慢，可持续几分钟到几小时，这不管，主要是能激活它），客户机讲任务提交后，服务器对任务进行检测无误后将向服务器后台程序发送信息，并将其激活。要求如下：<br />1）首先将后台程序激活，让它执行此任务（比如，前台将计算的C代码提交上后，后台程序程序能马上调用，并将其运行）<br />2）要在前台JSP页面中显示运行过程信息（由于运行时间长，希望让客户看到运行过程中产生的信息）如何完成？<br />答：活是可以的,运行一个shell让它去运行后台就行,但不可能取出运行信息,因为HTTP的超时限制不可能永远等你后台运行的,而且信息如果要动态实时推出来就得用SERVER PUSH技术。</p>
		<p>45. 问：数据库是datetime 型 ，插入当前时间到数据库？<br />答：<br />java.sql.Date sqlDate = new java.sql.Date();<br />PreparedStatement pstmt = conn.prepareStatement("insert into foo(time) values(?)");<br />pstmt.setDate(1,sqlDate);<br />pstmt.executeUpdate();</p>
		<p>46. 问：怎样去掉字符串前后的空格。<br />答：String.trim()</p>
		<p>47. 问：session怎样存取int类型的变量？<br />答：session.setAttribute("int", i+"");<br />int i = Integer.parseInt(session.getAttribute("int"));</p>
		<p>48. 问：在javascript中如何使输出的float类型的数据保留两位小数。<br />答：Math.round(aaaaa*100)/100。</p>
		<p>49. 问：在bean种如何调用session<br />答：你可把session对象作为一个参数传给bean<br />在BEAN中定义HttpServletRequest request;HttpSession session;<br />然后session = request.getSession(false);<br />false为如果session为空,不建立新的session<br />将session作为参数传入.其实只要将request传入就可以</p>
		<p>50. 问：如何把txt或word文件按原格式显示在jsp页面或servlet上？<br />答：其实一个非常简单的解决方法就是在服务器的MIME中指点定TEXT和WORD的解释方式,然后用JSP或SERVLET生成它就行了,客户端就会自动调用相应程序打开你的文档。<br />如果是希望按原格式的显示在页面上，而不是调用其他程序打开那么你可以试试用WEBDEV协议,可以说这是MS的一个亮点.它是在WEB方式下打开文档,和共享一样.完全符合的要求。</p>
		<p>51. 问：object的clone方法为什么不能直接调用？<br />答：这个方法在object中是protected<br />为什么要把这个方法定义为protected,这是一个折中,它的目的是想知道你这个方法在Object里只是一个标记,而不是一个实现,比如<br />public class Object<br />{<br />.............<br />protected Object clone()<br />{}<br />}</p>
		<p>所以直接继承的clone()方法并不能做任何时,你要使用这个方法就要重载这个方法并放宽访问权限为public,或实现cloneable接口. 但它没法这样告诉你它没有真的实现,只好用protected 方法加以警示<br /><br />52. 问：一个页面中如何刷新另外一个页面？<br />答：要求是这些面页必须有关联,一是它们都有一个共同的顶层帧,也就是说是一个帧内的分级页面,当然可以是任意级,帧内再分帧也可以,另一个可能是当前窗口弹出的窗口,如果没有联系,那就不可能用一个页面刷新另一个页面. 帧内只要一级一级引用就行了. 比如在左帧中一个页面中写top.right.location.reload();那么名为right的右帧中的页面就会刷新. 弹出的一样,用open时的名称刷新子窗口,子窗口用opener刷新主窗口</p>
		<p>53. 问：如何在jsp中怎么样向客户端写cookies？<br />答：<br />Cookie coo = new Cookie(name, value);<br />HttpServletResponse.addCookie(name);</p>
		<p>54. 问：为什么jTextField1.setText("aaabbb");jTextField2.setText("AAABBB"); 得到的字体宽度不一样？<br />答：就是说如果不是指定为等宽字体,每个字体的宽度都是不一样的.因此JAVA中用FontMetrics 类来取字符宽度。</p>
		<p>55. 问：String kk=application/octet-stream; name="G:/SMBCrack.exe";如何得到SMBCrack.exe？<br />答：这应该是解析上传时候的二进制流得到的这一行里面格式是固定的，取到name="后面的字符串，然后把";去掉。然后取最后一个/后面的所有字符组成一个新字符串就行了。</p>
		<p>56. 问：如何传值并不刷新页面？<br />答：弹出一个页面进行值的选择或者输入，ok后使用将值传给原窗口，使用javascript关闭打开的窗口即可：window.close();opener.focus();</p>
		<p>57. 问：有一个字符串："EF0C114EA4"，如何变为a[0] = 0xEF a[1] = 0x0C a[2] = 0x11 a[3] = 0x4E a[4] = 0xA4？<br />答：<br />String str="EF0C114EA4F";<br />out.print(str+"&lt;br&gt;");<br />int l=str.length()/2+str.length()%2,j=0,k=0;<br />String[] a=new String[l];<br />for(int i=0;i&lt;l;i++){<br />if(str.length()-j==1)<br />k=str.length();<br />else<br />k=j+2;<br />a="0x"+str.substring(j,k);<br />out.print("a["+Integer.toString(i)+"]="+a+"&lt;br&gt;");<br />j+=2;<br />}</p>
		<p>58. 问：怎样将一个int转换成一个四字节的byte数组？<br />答：<br />int x = 1234567;<br />byte[] b = new byte[4];<br />for(int i=0;i&lt;b.length;i++)<br />{<br />b = (x &gt;&gt;( i*8)) &amp; 0xFF;<br />}</p>
		<p>59. 问：indexOf()的使用需要注意什么？<br />答：参数是指从第几位（1，2，3，...）开始搜索，而返回值是指搜索到的位置（0，1，2，3.......）注意是从零算起的。</p>
		<p>60. 问：在Java应用程序中如何动态的添加一个按钮？<br />答：这里涉及一个组件重绘的问题,组件要先于panel被显示之处存在,如果一panel已经显示了,那么加在上面你能看到吗?但如果在同一个panel上, 先有button A,假如按下它加了butt on B,这时你如果使整个panel重给,那么A本身要重绘,它的事件监听就没有了,当然也就加不成B了,所以如果要先有另一个panel,当按A时把B加在这个panel上并重绘这个paenl,其实更好的方法是先把B加在panel中,同一个也行.把它setVisiable(flase),按A时设为 true。</p>
		<p>61. 问：book mybook=new book(bookid);book是servlet,出错。<br />答：book是servlet,能book mybook=new book(bookid);<br />说明自己实现了servlet容器?不然,servlet能让你自己去调用? servlet如果调用其实和EJB连1%的区别都没有,它们都是自己继承或实现一些接口,在这些父类或接口中实现了如果和容器"打交道"的方法,然后容器调用这些方法来管理它,让它生成实例,池化,钝化,销毁,再生等.所以这样写是错误的。</p>
		<p>62. 问：给定一个字符串5*(5+9)/7怎样计算出结果？<br />答：可有两种方法<br />1。用堆栈完成<br />2。最简单的方法，不用编程，如果有任何一个数据库的化，用select (5*(5+9)/7) from oneTable</p>
		<p>63. 问：如何实现递交表单内容的加密解密？<br />答：如果你用IE目前只能用SSL协议,这一层不要你考虑,否则只你用你自己的工具加密传输,接收后再解密友,至于如何加解,如果要和公认的系统结合,就用通用的MD5,RAS等公开算法,如果你只是自己传自己解,你随便按你的想法把数据加上一些东西,取回来按规则减掉这些东西,我敢保证除你自己没有任何人能知道解密方法.</p>
		<p>64. 问：为什么Integer.parseInt("+1");会抛出NumberFormatException的异常？<br />答：因为"+"运行算在JAVA中被重载.系统无法确定你用的是算术加还是字符+。<br />这一点可以在JAVASCRIPT中更好地理解:<br />&lt;form name="t"&gt;&lt;input name=s value=1234&gt;&lt;/form&gt;<br />var a = document.t.s.value+1;<br />这时a = 12345,因为document.t.s.value作为字符串.但var a = document.t.s.value-1;<br />a 就是1233,因为系统知道-运算肯定是算术运行.所以把document.t.s.value转换成数字.</p>
		<p>
				<br />65. 问：hashCode() 有什么用为什么有时候需要覆盖Object里的hashcode()方法？<br />答：这就是这个对象的身份证啊,要不如何区分哪个对象。</p>
		<p>66. 问：怎样在tomcat中实现一个定时执行的东东？<br />答：在应用程序启动时自动运行。servlet2.3中定义了ServletListener,监听Servlet Con text的启动或则关闭（可在配置文件中配置），启动时触发一个守护程序的运行(可以实现java.util.Timer或则 javax.swing.Timer).</p>
		<p>67. 问：程序可以输出自己吗？<br />答：孔德悖论这个非常有名的法则.就是说任何程序都不可能输出自己.</p>
		<p>68. 问：能够把字符转化成ASCII码？比如将 A 转化成 65？<br />答：<br />int a='A';<br />out.println(a);</p>
		<p>69. 问：如何区分输入的文字中的全角与半角？<br />答：由于不能分辨出全角和半角字符的值有什么规律,只好把全角符号牧举出来了.</p>
		<p>70. 问：用户注册后的自动发信程序该怎么做？<br />答：这种发信程序不考虑性能,因为不可能1秒就有一个人注册,我们说的考虑性能的发信程序是指上百万封信在队列里要不停发送的那种,象你这个随便怎么写一个程序都行,没有必要用JAVAMAIL.只要指定一个发信的服务器然后用cocket连它的25口就行了.自己用SOCKET连SMTP的25口发一封信就好象两个邻居之间送一样东西,直接递过去得了,用JAVAMAIL,消息机制就是你把这个东西从邮局寄给你的邻居了. </p>
<img src ="http://www.blogjava.net/bily/aggbug/81320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bily/" target="_blank">礼必风</a> 2006-11-15 17:08 <a href="http://www.blogjava.net/bily/archive/2006/11/15/81320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP取当前时间并以各种形式显示的代码</title><link>http://www.blogjava.net/bily/archive/2006/11/15/81321.html</link><dc:creator>礼必风</dc:creator><author>礼必风</author><pubDate>Wed, 15 Nov 2006 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/bily/archive/2006/11/15/81321.html</guid><wfw:comment>http://www.blogjava.net/bily/comments/81321.html</wfw:comment><comments>http://www.blogjava.net/bily/archive/2006/11/15/81321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bily/comments/commentRss/81321.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bily/services/trackbacks/81321.html</trackback:ping><description><![CDATA[一、先看看如何取当前时间并显示的代码： <br />------------------------------------------------ <br />&lt;% <br />java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); <br /><br />java.util.Date currentTime = new java.util.Date();//得到当前系统时间 <br /><br />String str_date1 = formatter.format(currentTime); //将日期时间格式化 <br />String str_date2 = currentTime.toString(); //将Date型日期时间转换成字符串形式 <br />%&gt; <br />格式化成"yyyy-MM-dd HH:mm:ss"格式的日期时间：&lt;%=str_date1%&gt; <br />未经格式化的String格式的日期时间：&lt;%=str_date2%&gt; <br />未经格式化的Date格式的日期时间：&lt;%=currentTime%&gt; <br />------------------------------------------------- <br />页面的输出内容： <br />格式化成"yyyy-MM-dd HH:mm:ss"格式的日期时间：2005-03-17 09:55:40 <br />未经格式化的String格式的日期时间：Thu Mar 17 09:55:40 CST 2005 <br />未经格式化的Date格式的日期时间：Thu Mar 17 09:55:40 CST 2005 <br /><br />通常我们需要的是这种格式化后的时间：2005-03-17 09:55:40。现在有这样一个问题：“2005-03-17 09:55:40”是一个字符串，有些时候我们需要在这个字符串里提取出年、月、日等的相关信息，怎么办呢？看下面的代码： <br />----------------------规则的字符串---------------------------------------------- <br />规则的字符串（年4位，月2位，日2位，中间用字符“-”分隔）： <br />&lt;br&gt;原字符串为： <br />&lt;% <br />String date="1989-12-30"; <br />out.println(date+"&lt;br&gt;"); <br />String year=date.substring(0,4);//取第0+1位至第4位 <br />String month=date.substring(5,7);//取第5+1位至第7位 <br />String day=date.substring(8,10);//取第8+1位至第10位 <br />out.println("year="+year+",month="+month+",day="+day); <br />%&gt; <br />---------------------------------------------------------------------------------- <br />从上面的代码我们可以看出来：这只能针对规则的字符串（年4位，月2位，日2位），要是不规则的呢？年可能2位也可能4位，月和日可能1位也可能2位，怎么办？通过对上面的代码修改，可以得到下面的通用的代码（这个“通用”有一个前提——年月日之间必须以“-”分隔）： <br />----------------------不规则的字符串---------------------------------------------- <br />不规则的字符串（年、月、日长度不一定，中间用字符“-”分隔）： <br />&lt;br&gt;原字符串为： <br />&lt;% <br />String date="04-05-6"; <br />out.println(date+"&lt;br&gt;"); <br />int a=date.indexOf("-");//求第一个“-”的位数 <br />int b=date.lastIndexOf("-");//求最后一个“-”的位数 <br />int len=date.length();//求字符串的长度 <br />year=date.substring(0,a);//取第一个“-”前的字符串 <br />month=date.substring(a+1,b);//取两个“-”之间的字符串 <br />day=date.substring(b+1,len);//取最后一个“-”以后的字符串 <br />out.println("year="+year+",month="+month+",day="+day); <br />%&gt; <br />---------------------------------------------------------------------------------- <br />现在这个问题解决了。可是我们会想到：每次需要对一个表示年月日的字符串进行分割的时候都需要在.jsp页面里写上这么一段代码，不但麻烦而且使页面显得混乱，能不能以一种看起来更清晰的方法解决这个问题呢？当然可以了，用javabean就行了。<img src ="http://www.blogjava.net/bily/aggbug/81321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bily/" target="_blank">礼必风</a> 2006-11-15 17:08 <a href="http://www.blogjava.net/bily/archive/2006/11/15/81321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>