??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产美女在线观看,亚洲黄色在线观看视频,亚洲好看的理论片电影http://www.tkk7.com/bily/archive/2006/11/15/81377.htmlC必?/dc:creator>C必?/author>Wed, 15 Nov 2006 13:25:00 GMThttp://www.tkk7.com/bily/archive/2006/11/15/81377.html////////////////////////////////////////////////////////////////////////////////////////////////////////////
//FilterBean.java
public class FilterBean{
 (tng)
 (tng)public FilterBean(){} (tng) (tng)
 (tng)
 (tng)public /*static*/ String filter(String input)/////////////////////////q行HTMLqo(h) (tng) (tng)
 (tng){ (tng) (tng) (tng) (tng)
 (tng) (tng)if(!hasSpecialChars(input)){ (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng)return input; (tng) (tng) (tng) (tng)
 (tng) (tng)} (tng) (tng) (tng) (tng)
 (tng) (tng)StringBuffer filtered =new StringBuffer(input.length()); (tng) (tng) (tng) (tng)
 (tng) (tng)char c; (tng) (tng) (tng) (tng)
 (tng) (tng)for(int i=0; i<=input.length()-1; i++){ (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng)c=input.charAt(i); (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng)switch(c) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng){ (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng)case '<':filtered.append("&lt;"); break; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng)case '>':filtered.append("&gt;"); break; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng)//case '"':filtered.append("&uot;"); break; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng)//case '&':filtered.append("&amp;"); break; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng)case ' ':filtered.append("&nbsp;"); break; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng)case '\n':filtered.append("<br>"); break; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng)default: filtered.append(c);
 (tng) (tng) (tng)} (tng) (tng) (tng) (tng) (tng)
 (tng) (tng)} (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng)return (filtered.toString()); (tng) (tng) (tng)
 (tng)} (tng) (tng)
 (tng)
 (tng)public static boolean hasSpecialChars(String input){ (tng) (tng) (tng) (tng)
 (tng) (tng)boolean flag=false;

 (tng) (tng)if((input!=null)&&(input.length()>0)){ (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng)char c; (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng)for(int i=0; i<=input.length()-1; i++){ (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)c=input.charAt(i); (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)switch(c) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng){ (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)case '>': flag=true; break; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)case '<': flag=true; break; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)//case '"': flag=true; break; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)//case '&': flag=true; break; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)case ' ': flag=true; break; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)case '\n': flag=true; break; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)}
 (tng) (tng) (tng)} (tng) (tng) (tng) (tng)
 (tng) (tng)} (tng) (tng) (tng) (tng)
 (tng) (tng)return flag; (tng) (tng)
 (tng)} (tng) (tng)
 (tng)
 (tng)public String trans(String chi)//l一字符 (tng) (tng)
 (tng){ (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng)String result = null; (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng)byte temp []; (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng)try{ (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng)temp=chi.getBytes("gb2312"); (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng)result = new String(temp); (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng)} (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng)catch(java.io.UnsupportedEncodingException e){ (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng)System.out.println (e.toString()); (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng)} (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng)return result; (tng) (tng)
 (tng)} (tng) (tng)
 (tng)
 (tng)public String trans(Object chi) (tng) (tng)
 (tng){ (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng)return trans(chi.toString()); (tng) (tng) (tng)
 (tng)} (tng)
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////
//NullSolve.java
public class NullSolve { (tng) //数据写入数据库之前,未填写的字D는字符串null改ؓ(f)I?"")
 (tng)public String trim(String s){
 (tng) (tng)if(s==null||s.equalsIgnoreCase("null"))
 (tng) (tng) (tng)return null;
 (tng) (tng)else
 (tng) (tng) (tng)return s.trim();
 (tng)}
}



]]>
用JAVA实现一个jsp分页http://www.tkk7.com/bily/archive/2006/11/15/81370.htmlC必?/dc:creator>C必?/author>Wed, 15 Nov 2006 13:15:00 GMThttp://www.tkk7.com/bily/archive/2006/11/15/81370.htmlhttp://www.tkk7.com/bily/comments/81370.htmlhttp://www.tkk7.com/bily/archive/2006/11/15/81370.html#Feedback2http://www.tkk7.com/bily/comments/commentRss/81370.htmlhttp://www.tkk7.com/bily/services/trackbacks/81370.htmlq里我以从一个用戯中查询用户信息ؓ(f)例演C其用法Q?br />
1.PageResultSet.java文g~译成class文gQƈ攑օ你的Web
应用E序的WEB-INF/classes/com/youngor/util目录下,可以对包名做相应修改?br />
2.在你的ActioncM:
先从业务处理逻辑cM取出数据(ArrayList或Vector格式)
UserBO userBO=new UserBO();
Collection data=userBO.findUsers();//CZҎ(gu)
再得到当前页curPage和每记录数pageSize
int curPage = Integer.parseInt(request.getParameter(“cur_page?);
int pageSize=15;
然后生成PageResultSet对象
PageResultSet dataList = new PageResultSet(data, curPage, pageSize);
request.setAttribute("usersList", usersList);

3.在你的JSP面?
 (tng) (tng) <%
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) PageResultSet pageResultSet=(PageResultSet)request.getAttribute("usersList");
 (tng) (tng) ArrayList usersList=(ArrayList)pageResultSet.getData();
 (tng) (tng) for(int i=0;i<usersList.size();i++)
 (tng) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) UserEO userEO=(UserEO)usersList.get(i);%>
 (tng) (tng) (tng) (tng) (tng) <tr>
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) <td><a href="view_user.do?id=<%=userEO.getId()%>"><%=userEO.getUsername()%></a></td>
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) <td><%=userEO.getName()%></td>
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) <td><%=userEO.getPhoneNumber()%></td>
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) <td><%=userEO.getEmailBox()%></td>
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) <td><%=userEO.getAddress()%></td>
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) <td><%=userEO.getPostcode()%></td>
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) </tr>
 (tng) (tng) (tng) <%}%>
 (tng) (tng) (tng) </table></td>
 (tng) </tr>
</table>

<!-- 昄分页工具?-->


<%=pageResultSet.getToolBar("list_users.do")%>


注意Q?br />1、如果你觉得分页工具栏不能满你的要求,可以用PageResultSetcM的公共方?br />first()、previous()、next()、last()定制自己的工hQƈ且,你还可以在PageResultSet中定义多个样式的工具栏;
2、getToolBar(String url)Ҏ(gu)接受带查询字W串的参敎ͼ比如“list_users.do?class_id=1“?br />


//PageResultSet.java
package com.youngor.util;


import java.util.*;


/**
 (tng)* <p>Title: PageResultSet</p>
 (tng)*
 (tng)* <p>Description:分页c?</p>
 (tng)*
 (tng)* <p>Copyright: Copyright (c) 2004</p>
 (tng)*
 (tng)* <p>Company:youngor-studio(http://www.54youngor.com) </p>
 (tng)* @author:伍维?br /> (tng)* @version 1.0
 (tng)*/
public class PageResultSet {
 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * 分页数据
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) private Collection data = null;
 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * 当前?br /> (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) private int curPage;
 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * 每页昄的记录数
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) private int pageSize;
 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * 记录行数
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) private int rowsCount;
 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * |
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) private int pageCount;


 (tng) (tng) (tng) public PageResultSet(Collection data) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.data = data;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.curPage = 1;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.pageSize = 10;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.rowsCount = data.size();
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.pageCount = (int) Math.ceil((double) rowsCount / pageSize);
 (tng) (tng) (tng) }


 (tng) (tng) (tng) public PageResultSet(Collection data, int curPage) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.data = data;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.curPage = curPage;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.pageSize = 10;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.rowsCount = data.size();
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.pageCount = (int) Math.ceil((double) rowsCount / pageSize);
 (tng) (tng) (tng) }


 (tng) (tng) (tng) public PageResultSet(Collection data, int curPage, int pageSize) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.data = data;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.curPage = curPage;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.pageSize = pageSize;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.rowsCount = data.size();
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.pageCount = (int) Math.ceil((double) rowsCount / pageSize);
 (tng) (tng) (tng) }


 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * getCurPage:q回当前的页?br /> (tng) (tng) (tng) (tng) *
 (tng) (tng) (tng) (tng) * @return int
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) public int getCurPage() {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) return curPage;
 (tng) (tng) (tng) }


 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * getPageSizeQ返回分大?br /> (tng) (tng) (tng) (tng) *
 (tng) (tng) (tng) (tng) * @return int
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) public int getPageSize() {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) return pageSize;
 (tng) (tng) (tng) }


 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * getRowsCountQ返回总记录行?br /> (tng) (tng) (tng) (tng) *
 (tng) (tng) (tng) (tng) * @return int
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) public int getRowsCount() {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) return rowsCount;
 (tng) (tng) (tng) }


 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * getPageCountQ返回总页?br /> (tng) (tng) (tng) (tng) *
 (tng) (tng) (tng) (tng) * @return int
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) public int getPageCount() {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) return pageCount;
 (tng) (tng) (tng) }
 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * W一?br /> (tng) (tng) (tng) (tng) * @return int
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) public int first() {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) return 1;
 (tng) (tng) (tng) }
 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * 最后一?br /> (tng) (tng) (tng) (tng) * @return int
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) public int last() {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) return pageCount;
 (tng) (tng) (tng) }
 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * 上一?br /> (tng) (tng) (tng) (tng) * @return int
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) public int previous() {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) return (curPage - 1 < 1) ? 1 : curPage - 1;
 (tng) (tng) (tng) }
 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * 下一?br /> (tng) (tng) (tng) (tng) * @return int
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) public int next() {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) return (curPage + 1 > pageCount) ? pageCount : curPage + 1;
 (tng) (tng) (tng) }


 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * W一?br /> (tng) (tng) (tng) (tng) * @return boolean
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) public boolean isFirst() {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) return (curPage==1)?true:false;
 (tng) (tng) (tng) }


 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * W一?br /> (tng) (tng) (tng) (tng) * @return boolean
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) public boolean isLast() {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) return (curPage==pageCount)?true:false;
 (tng) (tng) (tng) }
 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * 获取当前|?br /> (tng) (tng) (tng) (tng) * @return Collection
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) public Collection getData() {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) Collection curData = null;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (data != null) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int start = (curPage - 1) * pageSize;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int end = 0;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (start + pageSize > rowsCount)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) end = rowsCount;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) else
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) end = start + pageSize;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) ArrayList arrayCurData = new ArrayList();
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) ArrayList arrayData = null;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) Vector vectorCurData = new Vector();
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) Vector vectorData = null;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) boolean isArray = true;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (data instanceof ArrayList) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) arrayData = (ArrayList) data;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) isArray = true;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) } else if (data instanceof Vector) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) vectorData = (Vector) data;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) isArray = false;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) for (int i = start; i < end; i++) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (isArray) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) arrayCurData.add(arrayData.get(i));
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) } else {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) vectorData.add(vectorData.elementAt(i));
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (isArray) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) curData = (Collection) arrayCurData;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) } else {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) curData = (Collection) vectorCurData;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) return curData;
 (tng) (tng) (tng) }
 (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) * 获取工具?br /> (tng) (tng) (tng) (tng) * @return String
 (tng) (tng) (tng) (tng) */
 (tng) (tng) (tng) public String getToolBar(String fileName){
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) String temp="";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(fileName.indexOf("?")==-1)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) temp="?";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) else
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) temp="&";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) String str="<form method='post' name='frmPage' action='"+fileName+"'>";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) str+="<p align='center'>";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(isFirst())
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) str+="首页 上一?amp;nbsp;";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) else
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) str+="<a href='"+fileName+temp+"cur_page=1'>首页</a>&nbsp;";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) str+="<a href='"+fileName+temp+"cur_page="+(curPage-1)+"'>上一?lt;/a>&nbsp;";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(isLast())
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) str+="下一?N&nbsp;";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) else
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) str+="<a href='"+fileName+temp+"cur_page="+(curPage+1)+"'>下一?lt;/a>&nbsp;";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) str+="<a href='"+fileName+temp+"cur_page="+pageCount+"'>N</a>&nbsp;";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) str+="&nbsp;?lt;b>"+rowsCount+"</b>条记?amp;nbsp;";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) str+="&nbsp;转到<select name='page' onChange=\"location='"+fileName+temp+"cur_page='+this.options[this.selectedIndex].value\">";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int i=1;i<=pageCount;i++)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(i==curPage)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) str+="<option value='"+i+"' selected>W?+i+"?lt;/option>";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) else
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) str+="<option value='"+i+"'>W?+i+"?lt;/option>";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) str+="</select></p></form>";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) return str;
 (tng) (tng) (tng) }
}



]]>
JSP与Java Servlethttp://www.tkk7.com/bily/archive/2006/11/15/81359.htmlC必?/dc:creator>C必?/author>Wed, 15 Nov 2006 12:12:00 GMThttp://www.tkk7.com/bily/archive/2006/11/15/81359.htmlhttp://www.tkk7.com/bily/comments/81359.htmlhttp://www.tkk7.com/bily/archive/2006/11/15/81359.html#Feedback0http://www.tkk7.com/bily/comments/commentRss/81359.htmlhttp://www.tkk7.com/bily/services/trackbacks/81359.html阅读全文

]]>
JSP内徏对象http://www.tkk7.com/bily/archive/2006/11/15/81358.htmlC必?/dc:creator>C必?/author>Wed, 15 Nov 2006 12:01:00 GMThttp://www.tkk7.com/bily/archive/2006/11/15/81358.htmlhttp://www.tkk7.com/bily/comments/81358.htmlhttp://www.tkk7.com/bily/archive/2006/11/15/81358.html#Feedback0http://www.tkk7.com/bily/comments/commentRss/81358.htmlhttp://www.tkk7.com/bily/services/trackbacks/81358.html<一>out - javax.servlet.jsp.jspWriter
out对象用于把结果输出到|页上?/p>

Ҏ(gu)Q?br />1. void clear() ;
清除输出~冲区的内容Q但是不输出到客L(fng)?/p>

2. void clearBuffer() ;
清除输出~冲区的内容Qƈ输出到客L(fng)?/p>

3. void close() ;
关闭输出,清除所有内宏V?/p>

4. void flush() ;
输出~冲区里面的数据?/p>

5. int getBufferSize() ;
获取以kb为单位的目前~冲区大?/p>

6. int getRemaining() ;
获取以kb为单位的~冲Z未被占用的空间大?/p>

7. boolean isAutoFlush() ;
是否自动h~冲区?/p>

8. void newLine() ;
输出一个换行字W?/p>

9. void print( boolean b ) ;
void print( char c ) ;
void print( char[] s ) ;
void print( double d ) ;
void print( float f ) ;
void print( int i ) ;
void print( long l ) ;
void print( Object obj ) ;
void print( String s ) ;
指定类型的数据输出到Http,不换行?/p>

10. void println( boolean b ) ;
void println( char c ) ;
void println( char[] s ) ;
void println( double d ) ;
void println( float f ) ;
void println( int i ) ;
void println( long l ) ;
void println( Object obj ) ;
void println( String s ) ;
指定类型的数据输出到Http,q输Z个换行符?/p>

11. Appendable append( char c ) ;
Appendable append( CharSequence cxq, int start, int end ) ;
Appendable append( CharSequence cxq ) ;
一个字W或者实C(jin)CharSequence接口的对象添加到输出的后面?/p>

成员Q?br />int DEFAULT_BUFFER = 0 - ~省~冲区大?br />int NO_BUFFER = -1 - writer是否处于~冲输出状?br />int UNBOUNDED_BUFFER = -2 - 是否限制~冲区大?/p>

<?gt;request - javax.servlet.http.HttpServletRequest
request对象包含所有请求的信息Q如h的来源、标头、cookies和请求相关的参数值等?/p>

Ҏ(gu)Q?br />1. Object getAttribute( String name ) ;
q回由name指定的属性|该属性不存在时返回null?/p>

2. Enumeration getAttributeNames() ;
q回request对象的所有属性名U的集合?/p>

3. String getAuthType() ;
q回用来保护servlet的认证方法的名称Q未受保护时q回null?/p>

4. String getCharacterEncoding() ;
q回h中的字符~码Ҏ(gu)Q可以在response对象中设|?/p>

5. int getContentLength() ;
q回h的BODY的长度,不能定长度时返?1。可以在response中设|?/p>

6. String getContentType() ;
q回在response中定义的内容cd?/p>

7. String getContentPath() ;
q回h的\径?/p>

8. Cookie[] getCookies() ;
q回客户端所有的Cookie的数l?/p>

9. Enumeration getHeaderNames() ;
q回所有HTTP头的名称的集合?/p>

10. Enumeration getHeaders( String name ) ;
q回指定HTTP头的所有值的集合?/p>

11. String getHeader( String name ) ;
q回指定名称的HTTP头的信息?/p>

12. long getDateHeader( String name ) ;
q回指定名称的Datacd的HTTP头的信息?/p>

13. int getIntHeader( String name ) ;
q回指定名称的Intcd的HTTP头的信息?/p>

14. ServletInputStream getInputStream() ;
q回h的输入流?/p>

15. Locale getLocale() ;
q回当前늚Locale对象Q可以在response中设定?/p>

16. Enumeration getLocales() ;
q回h中所有的Locale对象的集合?/p>

17. String getLocalName() ;
获取响应h的服务器端主机名?/p>

18. String getLocalAddr() ;
获取响应h的服务器端地址?/p>

19. int getLocalPort() ;
获取响应h的服务器端端?/p>

20. String getMethod() ;
获取客户端向服务器端发送请求的Ҏ(gu)(GET、POST)?/p>

21. String getParameter( String name ) ;
获取客户端发送给服务器端的参数倹{?/p>

22. Map getParameterMap() ;
该方法返回包含请求中所有参数的一个Map对象?/p>

23. Enumeration getParameterNames() ;
q回h中所有参数的集合?/p>

24. String[] getParameterValues( String name ) ;
获得h中指定参数的所有倹{?/p>

25. String getQueryString() ;
q回getҎ(gu)传递的参数字符Ԍ该方法不分解出单独的参数?/p>

26. String getPathInfo() ;
取出h中处于ServletPath和QueryString之间的额外信息?/p>

27. String getPathTranslated() ;
q回用getPathInfo()Ҏ(gu)取得的\径信息的实际路径?/p>

28. String getProtocol() ;
q回h使用的协议。可以是HTTP1.1或者HTTP1.0?/p>

29. BufferedReader getReader() ;
q回h的输入流对应的Reader对象Q该Ҏ(gu)和getInputStream()Ҏ(gu)在一个页面中只能调用一个?/p>

30. String getRemoteAddr() ;
获取发出h的客L(fng)IP地址?/p>

31. String getRemoteHost() ;
获取发出h的客L(fng)L?/p>

32. String getRemoteUser() ;
q回l过客户端验证的用户名,未经验证q回null?/p>

33. int getRemotePort() ;
q回发出h的客L(fng)L端口?/p>

34. String getRealPath( String path ) ;
q回l定虚拟路径的物理\径?/p>

35. RequestDispatcher getRequestDispatcher( String path ) ;
按给定的路径生成资源转向处理适配器对象?/p>

36. String getRequestedSessionId() ;
q回h的session的标识?/p>

37. String RequestURI() ;
q回发出h的客L(fng)地址Q但是不包括h的参数字W串?/p>

38. StringBuffer getRequestURI() ;
q回响应h的服务器端地址

39. String getScheme() ;
获取协议名称Q缺省gؓ(f)HTTP协议?/p>

40. String getServerName() ;
q回响应h的服务器名称?/p>

41. String getServletPath() ;
获取客户端所h的脚本文件的文g路径?/p>

42. int getServerPort() ;
获取响应h的服务器端主机端口号?/p>

43. void removeAttribute( String name ) ;
在属性列表中删除指定名称的属性?/p>

44. void setAttribute( String name, Object value ) ;
在属性列表中d/删除指定的属性?/p>

45. void setCharacterEncoding( String name ) ;
讄h的字W编码格式?/p>

46. HttpSession getSession() ;
HttpSession getSession( boolean create ) ;
获取sessionQ如果create为trueQ在无session的情况下创徏一个?/p>

47. boolean isRequestedSessionIdFromCookie() ;
(g)查请求的?x)话ID是否为通过Cookie传入?/p>

48. boolean isRequestedSessionIdFromURL() ;
(g)查请求的?x)话ID是否为通过URL传入?/p>

49. boolean isRequestedSessionIdValid() ;
(g)查请求的?x)话ID是否仍然有效?/p>

50. boolean isSecure() ;
(g)查请求是否用安全链接,如果HTTPS{?/p>

51. boolean isUserInRole( String role ) ;
(g)查已l通过验证的用h否在是role所指定的角艌Ӏ?/p>

52. Principal getUserPrincipal() ;
q回包含用户登陆名的一个java.security.Principal对象?/p>

成员Q?br />String BASIC_AUTH = "BASIC" -
String CLIENT_CERT_AUTH = "CLIENT_CERT" -
String DIGEST_AUTH = "DIGEST" -
String FORM_AUTH = "FORM" -

<?gt;response - javax.servlet.http.HttpServletResponse
response对象主要JSP容器处理后的l果传回到客L(fng)?/p>

Ҏ(gu)Q?br />1. void addCookie( Cookie cookie ) ;
d一个Cookie对象Q保存客L(fng)信息?/p>

2. void addDateHeader( String name, long value ) ;
d一个日期类型的HTTP头信息,覆盖同名的HTTP头信息?/p>

3. void addHeader( String name, String value ) ;
d一个HTTP_(d)覆盖同名的旧HTTP头?/p>

4. void addIntHeader( String name, int value ) ;
d一个整型的HTTP_(d)覆盖同名的旧HTTP头?/p>

5. boolean containsHeader( String name ) ;
判断指定的HTTP头是否存在?/p>

6. String encodeRedirectURL( String url ) ;
对sendRedirect()Ҏ(gu)使用的URLq行~码?/p>

7. String encodeURL( String url ) ;
URL予以~码Q回传包含session ID的URL?/p>

8. void flushBuffer() ;
强制把当前缓冲区的内容发送到客户端?/p>

9. int getBufferSize() ;
取得以kb为单位的~冲区大?/p>

10. String getCharacterEncoding() ;
获取响应的字W编码格式?/p>

11. String getContentType() ;
获取响应的类型?/p>

12. Locale getLocale() ;
获取响应的Locale对象?/p>

13. ServletOutputStream getOutputStream() ;
q回客户端的输出对象?/p>

14. PrintWriter getWriter() ;
获取输出对应的writer对象?/p>

15. boolean isCommitted() ;
判断服务器端是否已经数据输出到客户端?/p>

16. void reset() ;
清空buffer中的所有内宏V?/p>

17. void resetBuffer() ;
情况buffer中所有的内容Q但是保留HTTP头和状态信息?/p>

18. void sendError( int xc, String msg ) ;
void sendError( int xc ) ;
发送错误,包括状态码和错误信息?/p>

19. void sendRedirect( String locationg ) ;
把响应发送到另外一个位|进行处理?/p>

20. void setBufferSize( int size ) ;
讄以kb为单位的~冲区大?/p>

21. void setCharacterEncoding( String charset ) ;
讄响应使用的字W编码格式?/p>

22. void setContentLength( int length ) ;
讄响应的BODY长度?/p>

23. void setContentType( String type ) ;
讄响应的类型?/p>

24. void setDateHeader( String name, long value ) ;
讄指定名称的Datacd的HTTP头的倹{?/p>

25. void setHeader( String name, String value ) ;
讄指定名称的HTTP头的倹{?/p>

26. void setIntHeader( String name, int value ) ;
讄指定名称的intcd的HTTP头的倹{?/p>

27. void setStatus( int xc ) ;
讄响应状态码Q新g(x)覆盖当前倹{?/p>

成员(HTTP状态码)Q?br />int SC_CONTINUE = 100 int SC_SWITCHING_PROTOCOLS = 101
int SC_OK = 200 int SC_NON_AUTHORITATIVE_INFORMATION = 203
int SC_ACCEPTED = 202 int SC_CREATED = 201
int SC_NO_CONTENT = 204 int SC_RESET_CONTENT = 205
int SC_PARTIAL_CONTENT = 206 int SC_MULTIPLE_CHOICES = 300
int SC_MOVED_PERMANENTLY = 301 int SC_MOVED_TEMPORARILY = 302
int SC_FOUND = 302 int SC_SEE_OTHER = 303
int SC_NOT_MODIFIED = 304 int SC_USE_PROXY = 305
int SC_TEMPORARY_REDIRECT = 307 int SC_BAD_REQUEST = 400
int SC_UNAUTHORIZED = 401 int SC_PAYMENT_REQUIRED = 402
int SC_FORBIDDEN = 403 int SC_NOT_FOUND = 404
int SC_METHOD_NOT_ALLOWED = 405 int SC_NOT_ACCEPTABLE = 406
int SC_PROXY_AUTHENTICATION_REQUIRED = 407 int SC_REQUEST_TIMEOUT = 408
int SC_CONFLICT = 409 int SC_GONE = 410
int SC_LENGTH_REQUIRED = 411 int SC_PRECONDITION_FAILED = 412
int SC_REQUEST_ENTITY_TOO_LARGE = 413 int SC_REQUEST_URI_TOO_LONG = 414
int SC_UNSUPPORTED_MEDIA_TYPE = 415 int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416
int SC_EXPECTATION_FAILED = 417 int SC_INTERNAL_SERVER_ERROR = 500
int SC_NOT_IMPLEMENTED = 501 int SC_BAD_GATEWAY = 502
int SC_SERVICE_UNAVAILABLE = 503 int SC_GATEWAY_TIMEOUT = 504
int SC_HTTP_VERSION_NOT_SUPPORTED = 505

<?gt;session - javax.servlet.http.HttpSession
session对象表示目前个别用户的会(x)话状态,用来识别每个用户?/p>

Ҏ(gu)Q?br />1. Object getAttribute( String name ) ;
获取与指定名字相兌的session属性倹{?/p>

2. Enumeration getAttributeNames() ;
取得session内所有属性的集合?/p>

3. long getCreationTime() ;
q回session的创建时_(d)最单位千分之一U?/p>

4. String getId() ;
取得session标识?/p>

5. long getLastAccessedTime() ;
q回与当前session相关的客L(fng)最后一ơ访问的旉Q由1970-01-01vQ单位毫U?/p>

6. int getMaxInactiveInterval( int interval ) ;
q回L_(d)以秒为单位,表示session的有效时?session不活动时??1为永不过期?/p>

7. ServletContext getServletContext() ;
q回一个该JSP面对应的ServletContext对象实例?/p>

8. HttpSessionContext getSessionContext() ;


9. Object getValue( String name ) ;
取得指定名称的session变量|不推荐用?/p>

10. String[] getValueNames() ;
取得所有session变量的名U的集合Q不推荐使用?/p>

11. void invalidate() ;
销毁这个session对象?/p>

12. boolean isNew() ;
判断一个session是否由服务器产生Q但是客L(fng)q没有用?/p>

13. void pubValue( String name, Object value ) ;
d一个session变量Q不推荐使用?/p>

14. void removeValue( String name ) ;
U除一个session变量的|不推荐用?/p>

15. void setAttribute( String name, String value ) ;
讄指定名称的session属性倹{?/p>

16. void setMaxInactiveInterval( int interval ) ;
讄session的有效期?/p>

17. void removeAttribute( String name ) ;
U除指定名称的session属性?/p>

<?gt;pageContext - javax.servlet.jsp.PageContext
pageContext对象存储本JSP面相关信息Q如属性、内建对象等?/p>

Ҏ(gu)Q?br />1. void setAttribute( String name, Object value, int scope ) ;
void setAttribute( String name, Object value ) ;
在指定的׃n范围内设|属性?/p>

2. Object getAttribute( String name, int scope ) ;
Object getAttribute( String name ) ;
取得指定׃n范围内以name为名字的属性倹{?/p>

3. Object findAttribute( String name ) ;
按页面、请求、会(x)话和应用E序׃n范围搜烦(ch)已命名的属性?/p>

4. void removeAttribute( String name, int scope ) ;
void removeAttribute( String name ) ;
U除指定名称和共享范围的属性?/p>

5. void forward( String url ) ;
页面导航到指定的URL?/p>

6. Enumeration getAttributeNamesScope( int scope ) ;
取得指定׃n范围内的所有属性名U的集合?/p>

7. int getAttributeScope( String name ) ;
取得指定属性的׃n范围?/p>

8. ErrorData getErrorDate() ;
取得面的errorData对象?/p>

9. Exception getException() ;
取得面的exception对象?/p>

10. ExpressionEvaluator getExpressionEvaluator() ;
取得面的expressionEvaluator对象?/p>

11. JspWriter getOut() ;
取得面的out对象?/p>

12. Object getPage() ;
取得面的page对象?/p>

13. ServletRequest getRequest() ;
取得面的request对象?/p>

14. ServletResponse getResponse() ;
取得面的response对象?/p>

15. ServletConfig getConfig() ;
取得面的config对象?/p>

16. ServletContext getServletContext() ;
取得面的servletContext对象?/p>

17. HttpSession getSession() ;
取得面的session对象?/p>

18. VariableResolver getVariableResolver() ;
取得面的variableResolver对象?/p>

19. void include( String url, boolean flush ) ;
void include( String url ) ;
包含其他的资源,q指定是否自动刷新?/p>

20. void release() ;
重置pageContext内部状态,释放所有内部引用?/p>

21. void initialize( Servlet servlet, ServletRequest request, ServletResponse response,
String errorPageURL, boolean needSession, int bufferSize, boolean autoFlush ) ;
初始化未l初始化的pageContext对象?/p>

22. BodyContext pushBody() ;
BodyContext pushBody( Writer writer ) ;
保存当前的out对象Qƈ更新pageContext中page范围内的out对象?/p>

23. JspWrite popBody() ;
取出由pushBody()Ҏ(gu)保存的out对象?/p>

24. void handlePageException( Exception e ) ;
void handlePageException( Thrwoable t ) ;

成员Q?br />int PAGE_SCOPE = 1 - 面׃n范围
int REQUEST_SCOPE = 2 - h׃n范围
int SESSION_SCOPE = 3 - ?x)话׃n范围
int APPLICATION_SCOPE = 4 - 应用E序׃n范围
String PAGE = "javax.servlet.jsp.jspPage"
String PAGECONTEXT = "javax.servlet.jsp.jspPageContext"
String REQUEST = "javax.servlet.jsp.jspRequest"
String RESPONSE = "javax.servlet.jsp.jspResponse"
String CONFIG = "javax.servlet.jsp.jspConfig"
String SESSION = "javax.servlet.jsp.jspSession"
String OUT = "javax.servlet.jsp.jspOut"
String APPLICATION = "javax.servlet.jsp.jspApplication"
String EXCEPTION = "javax.servlet.jsp.jspException"

<?gt;application - javax.servlet.ServletContext
application主要功用在于取得或更改Servlet的设定?/p>

Ҏ(gu)Q?br />1. Object getAttribute( String name ) ;
q回由name指定的application属性?/p>

2. Enumeration getAttributes() ;
q回所有的application属性?/p>

3. ServletContext getContext( String uripath ) ;
取得当前应用的ServletContext对象?/p>

4. String getInitParameter( String name ) ;
q回由name指定的application属性的初始倹{?/p>

5. Enumeration getInitParameters() ;
q回所有的application属性的初始值的集合?/p>

6. int getMajorVersion() ;
q回servlet容器支持的Servlet API的版本号?/p>

7. String getMimeType( String file ) ;
q回指定文g的类型,未知cdq回null。一般ؓ(f)"text/html"?image/gif"?/p>

8. int getMinorVersion() ;
q回servlet容器支持的Servlet API的副版本受?/p>

9. String getRealPath( String path ) ;
q回l定虚拟路径所对应物理路径?/p>

10. RequestDispatcher getNamedDispatcher( String name ) ;
为指定名字的Servlet对象q回一个RequestDispatcher对象的实例?/p>

11. RequestDispatcher getRequestDispatcher( String path ) ;
q回一个RequestDispatcher对象的实例?/p>

12. URL getResource( String path ) ;
q回指定的资源\径对应的一个URL对象实例Q参数要?/"开头?/p>

13. InputStream getResourceAsStream( String path ) ;
q回一个由path指定位置的资源的InputStream对象实例?/p>

14. Set getResourcePaths( String path ) ;
q回存储在web-app中所有资源\径的集合?/p>

15. String getServerInfo() ;
取得应用服务器版本信息?/p>

16. Servlet getServlet( String name ) ;
在ServletContext中检索指定名U的servlet?/p>

17. Enumeration getServlets() ;
q回ServletContext中所有servlet的集合?/p>

18. String getServletContextName() ;
q回本web应用的名U?/p>

19. Enumeration getServletContextNames() ;
q回ServletContext中所有servlet的名U集合?/p>

20. void log( Exception ex, String msg ) ;
void log( String msg, Throwable t ) ;
void log( String msg ) ;
把指定的信息写入servlet log文g?/p>

21. void removeAttribute( String name ) ;
U除指定名称的application属性?/p>

22. void setAttribute( String name, Object value ) ;
讑֮指定的application属性的倹{?/p>

<?gt;config - javax.servlet.ServletConfig
config对象用来存放Servlet初始的数据结构?/p>

Ҏ(gu)Q?br />1. String getInitParameter( String name ) ;
q回名称为name的促(j)使参数的倹{?/p>

2. Enumeration getInitParameters() ;
q回q个JSP所有的?j)参数的名U集合?/p>

3. ServletContext getContext() ;
q回执行者的servlet上下文?/p>

4. String getServletName() ;
q回servlet的名U?/p>

<?gt;exception - java.lang.Throwable
错误对象Q只有在JSP面的page指o(h)中指定isErrorPage="true"后,才可以在本页面用exception对象?/p>

Ҏ(gu)Q?br />1. Throwable fillInStackTrace() ;
当前stack信息记录到exception对象中?/p>

2. String getLocalizedMessage() ;
取得本地语系的错误提CZ息?/p>

3. String getMessage()
取得错误提示信息?/p>

4. StackTrackElement[] getStackTrace() ;
q回对象中记录的call stack track信息?/p>

5. Throwable initCause( Throwable cause ) ;
另外一个异常对象嵌套进当前异常对象中?/p>

6. Throwable getCause() ;
取出嵌套在当前异常对象中的异常?/p>

7. void printStackTrace() ;
void printStackTrace( printStream s ) ;
void printStackTrace( printWriter s ) ;
打印出Throwable?qing)其call stack trace信息?/p>

8. void setStackTrace( StackTraceElement[] stackTrace )
讄对象的call stack trace信息?/p>

<?gt; page - javax.servlet.jsp.HttpJspPage
page对象代表JSP对象本nQ或者说代表~译后的servlet对象Q?br />可以? (javax.servlet.jsp.HttpJspPage)page )来取用它的方法和属性?/p>

]]>
session 时时监控例子http://www.tkk7.com/bily/archive/2006/11/15/81325.htmlC必?/dc:creator>C必?/author>Wed, 15 Nov 2006 09:11:00 GMThttp://www.tkk7.com/bily/archive/2006/11/15/81325.htmlhttp://www.tkk7.com/bily/comments/81325.htmlhttp://www.tkk7.com/bily/archive/2006/11/15/81325.html#Feedback0http://www.tkk7.com/bily/comments/commentRss/81325.htmlhttp://www.tkk7.com/bily/services/trackbacks/81325.html/**
q是理user信息的类
文g名ؓ(f)onLineUser.java
*/

import javax.servlet.http.*;
import javax.servlet.*;
import java.util.*;

public class onLineUser implements HttpSessionBindingListener {
 (tng)  (tng) (tng) public onLineUser(){
 (tng) (tng) }

 (tng) (tng) private Vector users=new Vector();
 (tng) (tng) public int getCount(){
 (tng)  (tng)  (tng) (tng) users.trimToSize();
 (tng)  (tng)  (tng) (tng) return users.capacity();
 (tng) (tng) }
 (tng) (tng) public boolean existUser(String userName){
 (tng)  (tng)  (tng) (tng) users.trimToSize();
 (tng)  (tng)  (tng) (tng) boolean existUser=false;
 (tng)  (tng)  (tng) (tng) for (int i=0;i<users.capacity();i++ )
 (tng)  (tng)  (tng) (tng) {
 (tng)  (tng)  (tng)  (tng)  (tng) (tng) if (userName.equals((String)users.get(i)))
 (tng)  (tng)  (tng)  (tng)  (tng) (tng) {
 (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng) (tng) existUser=true;
 (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng) (tng) break;
 (tng)  (tng)  (tng)  (tng)  (tng) (tng) }
 (tng)  (tng)  (tng) (tng) }
 (tng)  (tng)  (tng) (tng) return existUser;
 (tng) (tng) }

 (tng) (tng) public boolean deleteUser(String userName) {
 (tng)  (tng)  (tng) (tng) users.trimToSize();
 (tng)  (tng)  (tng) (tng) if(existUser(userName)){
 (tng)  (tng)  (tng)  (tng)  (tng) (tng) int currUserIndex=-1;
 (tng)  (tng)  (tng)  (tng)  (tng) (tng) for(int i=0;i<users.capacity();i++){
 (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng) (tng) if(userName.equals((String)users.get(i))){
 (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng) (tng) currUserIndex=i;
 (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng) (tng) break;
 (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng) (tng) }
 (tng)  (tng)  (tng)  (tng)  (tng) (tng) }
 (tng)  (tng)  (tng)  (tng)  (tng) (tng) if (currUserIndex!=-1){
 (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng) (tng) users.remove(currUserIndex);
 (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng) (tng) users.trimToSize();
 (tng)  (tng)  (tng)  (tng)  (tng)  (tng)  (tng) (tng) return true;
 (tng)  (tng)  (tng)  (tng)  (tng) (tng) }
 (tng)  (tng)  (tng) (tng) }
 (tng)  (tng)  (tng) (tng) return false;
 (tng) (tng) }

 (tng) (tng) public Vector getOnLineUser()
 (tng) (tng) {
 (tng)  (tng)  (tng) (tng) return users;
 (tng) (tng) }
 (tng)  (tng) (tng) public void valueBound(HttpSessionBindingEvent e) {
 (tng)  (tng)  (tng) (tng) users.trimToSize();
 (tng)  (tng)  (tng) (tng) if(!existUser(e.getName())){
 (tng)  (tng)  (tng)  (tng)  (tng) (tng) users.add(e.getName());
 (tng)  (tng)  (tng)  (tng)  (tng) (tng) System.out.print(e.getName()+"\t  (tng) d到系l\t"+(new Date()));
 (tng)  (tng)  (tng)  (tng)  (tng) (tng) System.out.println("  (tng)  (tng) (tng) 在线用户Cؓ(f)Q?+getCount());
 (tng)  (tng)  (tng) (tng) }else
 (tng)  (tng)  (tng)  (tng)  (tng) (tng) System.out.println(e.getName()+"已经存在");
 (tng)  (tng) (tng) }

 (tng)  (tng) (tng) public void valueUnbound(HttpSessionBindingEvent e) {
 (tng)  (tng)  (tng) (tng) users.trimToSize();
 (tng)  (tng)  (tng) (tng) String userName=e.getName();
 (tng)  (tng)  (tng) (tng) deleteUser(userName);
 (tng)  (tng)  (tng) (tng) System.out.print(userName+"\t  (tng) 退出系l\t"+(new Date()));
 (tng)  (tng)  (tng) (tng) System.out.println("  (tng)  (tng) (tng) 在线用户Cؓ(f)Q?+getCount());
 (tng)  (tng) (tng) }
}

/////////////////////////////////////////////////////////////////////////////
<%
/**q是昄在线用户的jsp文g
文g名ؓ(f)onLineUser.jsp
*/
%>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="onLineUser,java.util.*" %>
<jsp:useBean id="onlineuser" class="onLineUser" scope="application"/>
<html>
<head>
<title>搞定JSP在线人数</title>
</head>
<body>
<center>
 (tng) <p><h1>登陆成功Q欢q?zhn)讉K!</h1></p>
</center>
<%  (tng) session = request.getSession(false); %>
<%
 (tng) (tng) String username=request.getParameter("username");
 (tng) (tng) if (onlineuser.existUser(username)){
 (tng)  (tng)  (tng) (tng) out.println("用户<font color=red>"+username+"</font>已经登陆Q?);
 (tng) (tng) }else{
 (tng)  (tng)  (tng) (tng) session.setMaxInactiveInterval(50); file://Sesion有效旉Q以Uؓ(f)单位
 (tng)  (tng)  (tng) (tng) session.setAttribute(username,onlineuser);
 (tng)  (tng)  (tng) (tng) out.println("Ƣ迎新用?<font color=red>"+username+"</font>登陆到系l!");
 (tng) (tng) }
 (tng) (tng) out.println("<br>当前在线用户人数:<font color=red>"+onlineuser.getCount()+"</font><br>");
 (tng) (tng) Vector vt=onlineuser.getOnLineUser();
 (tng) (tng) Enumeration e = vt.elements();
 (tng) (tng) out.println("在线用户列表");
 (tng) (tng) out.println("<table border=1>");
 (tng) (tng) out.println("<tr><td>用户?lt;/td></tr>");
 (tng)  (tng) (tng) while(e.hasMoreElements()){
 (tng)  (tng)  (tng) (tng) out.println("<tr><td>");
 (tng)  (tng)  (tng) (tng) out.println((String)e.nextElement()+"<br>");
 (tng)  (tng)  (tng) (tng) out.println("</td></tr>");
 (tng) (tng) }
 (tng) (tng) out.println("</table>");
 (tng)  (tng) (tng)
%>
<center>
 (tng) <p>elapsed制作</p>
 (tng) <p> </p>
<%
 (tng) (tng) out.println("<p><a href='logout.jsp?username="+username+"'>退出系l?lt;/a></p>");
%>
</center>
</body>
</html>

////////////////////////////////////////////////////////////////////////////////////
<%
/**
q是用户退出的jsp文g
文g名ؓ(f)logout.jsp
*/
%>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="onLineUser,java.util.*" %>
<jsp:useBean id="onlineuser" class="onLineUser" scope="application"/>
<html>
<head>
<title>搞定JSP在线人数</title>
</head>
<body>
<center>
 (tng) <p><h1>登陆成功Q欢q?zhn)讉K!</h1></p>
</center>
<%
 (tng) (tng) String username=request.getParameter("username");
 (tng) (tng) if(onlineuser.deleteUser(username))
 (tng)  (tng)  (tng) (tng) out.println(username+"已经退出系l?");
 (tng) (tng) else
 (tng)  (tng)  (tng) (tng) out.println(username+"没有登陆到系l!");
%>
<center>
 (tng) <p>elapsed制作</p>
 (tng) <p> </p>
 (tng) <p><a href="logout.jsp">退出系l?lt;/a></p>
</center>
</body>
</html>



]]>
如何解决jsp的数据存攑ֈ数据库时q的问?/title><link>http://www.tkk7.com/bily/archive/2006/11/15/81323.html</link><dc:creator>C必?/dc:creator><author>C必?/author><pubDate>Wed, 15 Nov 2006 09:10:00 GMT</pubDate><guid>http://www.tkk7.com/bily/archive/2006/11/15/81323.html</guid><wfw:comment>http://www.tkk7.com/bily/comments/81323.html</wfw:comment><comments>http://www.tkk7.com/bily/archive/2006/11/15/81323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/bily/comments/commentRss/81323.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/bily/services/trackbacks/81323.html</trackback:ping><description><![CDATA[import (tng)javax.servlet.Filter;<br />import (tng)javax.servlet.FilterChain;<br />import (tng)javax.servlet.ServletRequest;<br />import (tng)javax.servlet.ServletResponse;<br />import (tng)java.io.IOException;<br />import (tng)javax.servlet.http.HttpServletRequest;<br />import (tng)javax.servlet.ServletException;<br />import (tng)javax.servlet.FilterConfig;<br /><br />public (tng)class (tng)EncodingFilter (tng)implements (tng)Filter (tng){<br /> (tng) (tng) (tng) (tng)<br /> (tng) (tng) (tng) (tng) (tng)protected (tng)FilterConfig (tng)filterConfig;<br /> (tng) (tng) (tng) (tng) (tng)private (tng)String (tng)targetEncoding (tng)= (tng)"gb2312";<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)public (tng)void (tng)init(FilterConfig (tng)config) (tng)throws (tng)ServletException (tng){<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)this.filterConfig (tng)= (tng)config;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)this.targetEncoding (tng)= (tng)config.getInitParameter("encoding");<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)public (tng) (tng)void (tng)doFilter(ServletRequest (tng)srequest, (tng)ServletResponse (tng) (tng)sresponse, (tng)FilterChain (tng)chain)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)throws (tng)I(yng)OException, (tng)ServletException (tng){<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)//System.out.println("使用以下Ҏ(gu)对请求进行编码:(x)encoding="+targetEncoding);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)HttpServletRequest (tng)request (tng)= (tng)(HttpServletRequest)srequest;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)request.setCharacterEncoding(targetEncoding);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)chain.doFilter(srequest,sresponse); (tng) (tng)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)} (tng) (tng) (tng)<br /><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)public (tng)void (tng)setFilterConfig(final (tng)FilterConfig (tng)filterConfig)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng){<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)this.filterConfig=filterConfig;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}<br /><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)public (tng)void (tng)destroy()<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng){<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)this.filterConfig=null;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}<br />}<br /><br />在WEB-INF/web.xml下面配置<br /> (tng) (tng) (tng)<filter><br /> (tng) (tng) (tng) (tng)<filter-name>EncodingFilter</filter-name><br /> (tng) (tng) (tng) (tng)<filter-class>com.david.common.sys.EncodingFilter</filter-class><br /> (tng) (tng) (tng) (tng)<init-param><br /> (tng) (tng) (tng) (tng) (tng) (tng)<param-name>encoding</param-name><br /> (tng) (tng) (tng) (tng) (tng) (tng)<param-value>gb2312</param-value><br /> (tng) (tng) (tng) (tng)</init-param><br /> (tng) (tng)</filter><br /> (tng) (tng)<filter-mapping><br /> (tng) (tng) (tng) (tng)<filter-name>EncodingFilter</filter-name><br /> (tng) (tng) (tng) (tng)<url-pattern>/*</url-pattern><br /> (tng) (tng)</filter-mapping><img src ="http://www.tkk7.com/bily/aggbug/81323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/bily/" target="_blank">C必?/a> 2006-11-15 17:10 <a href="http://www.tkk7.com/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.tkk7.com/bily/archive/2006/11/15/81324.html</link><dc:creator>C必?/dc:creator><author>C必?/author><pubDate>Wed, 15 Nov 2006 09:10:00 GMT</pubDate><guid>http://www.tkk7.com/bily/archive/2006/11/15/81324.html</guid><wfw:comment>http://www.tkk7.com/bily/comments/81324.html</wfw:comment><comments>http://www.tkk7.com/bily/archive/2006/11/15/81324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/bily/comments/commentRss/81324.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/bily/services/trackbacks/81324.html</trackback:ping><description><![CDATA[ <p> <strong>生成Ҏ(gu)Q一Q?/strong> <br />// 在内存(sh)创徏图象 <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 />// 取随Z生的认证?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>//认证码昄到图象中,q在12?8象素之间随机讑֮字体的大?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个干扰点Q图象中的认证码不易被其它E序探测?<br />for (int i=0;i<30;i++) <br />{ <br /> (tng) (tng) (tng) int x = random.nextInt(width); <br /> (tng) (tng) (tng) int y = random.nextInt(height); <br /> (tng) (tng) (tng) g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));<br /> (tng) (tng) (tng) g.drawOval(x,y,0,1); <br />} </p> <p>// 图象生效 <br />g.dispose(); </p> <p>// 输出图象到页?<br />ImageIO.write(image, "JPEG", response.getOutputStream()); <br /><br /><strong>生成Ҏ(gu)Q二Q?/strong><br /><%@ page contentType="image/jpeg" import="java.awt.*,<br />java.awt.image.*,java.util.*,javax.imageio.*" %><br /><%!<br />Color getRandColor(int fc,int bc){//l定范围获得随机颜色<br />Random random = new Random();<br />if(fc>255) fc=255;<br />if(bc>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 />%><br /><%</p> <p>int randomLen=4;<br />try{<br />randomLen=Integer.parseInt(request.getParameter("param"));<br />}<br />catch(Exception e){<br /> (tng) 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>// 在内存(sh)创徏图象<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>//生成随机c?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条干扰线Q图象中的认证码不易被其它E序探测?br />g.setColor(getRandColor(160,200));<br />for (int i=0;i<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>// 取随Z生的认证?4位数?<br />String sRand="";<br />for (int i=0;i<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 />//调用函数出来的颜色相同,可能是因为种子太接近Q所以只能直接生?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 />%></p> <img src ="http://www.tkk7.com/bily/aggbug/81324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/bily/" target="_blank">C必?/a> 2006-11-15 17:10 <a href="http://www.tkk7.com/bily/archive/2006/11/15/81324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 的JDBC 数据库连接池实现Ҏ(gu)http://www.tkk7.com/bily/archive/2006/11/15/81322.htmlC必?/dc:creator>C必?/author>Wed, 15 Nov 2006 09:09:00 GMThttp://www.tkk7.com/bily/archive/2006/11/15/81322.htmlhttp://www.tkk7.com/bily/comments/81322.htmlhttp://www.tkk7.com/bily/archive/2006/11/15/81322.html#Feedback0http://www.tkk7.com/bily/comments/commentRss/81322.htmlhttp://www.tkk7.com/bily/services/trackbacks/81322.html (tng) (tng) (tng) (tng) (tng) (tng) (tng) 虽然 J2EE E序员(sh)般都有现成的应用服务器所带的JDBC 数据库连接池Q不q对于开发一般的 Java Application ?Applet 或?JSP、velocity Ӟ我们可用的JDBC 数据库连接池q不多,q且一般性能都不好?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) Java E序员都很M?Windows ADO Q只需?new Connection 可以直接从数据库连接池中返?Connection。ƈ?ADO Connection 是线E安全的Q多个线E可以共用一?ConnectionQ?所?ASP E序一般都?getConnection 攑֜ Global.asa 文g中,?IIS 启动时徏立数据库q接。ADO ?Connection ?Result 都有很好的缓Ԍq且很容易用?/p>

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) 其实我们可以自己写一个JDBC 数据库连接池。写 JDBC connection pool 的注意事Ҏ(gu)Q?/p>

1. 有一个简单的函数从连接池中得C?Connection?
2. close 函数必须?connection 攑֛ 数据库连接池?
3. 当数据库q接池中没有I闲?connectionQ?数据库连接池必须能够自动增加 connection 个数?
4. 当数据库q接池中?connection 个数在某一个特别的旉变得很大Q但是以后很长时间只用其中一部分,应该可以自动多余的 connection 关闭掉?
5. 如果可能Q应该提供debug 信息报告没有关闭?new Connection ?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) 如果?new Connection 可以直接从数据库连接池中返?ConnectionQ?可以q样? Mediator pattern ) (以下代码中用了(jin)中文全角I格)Q?/p>

public class EasyConnection implements java.sql.Connection{
private Connection m_delegate = null;
public EasyConnection(){
m_delegate = getConnectionFromPool();
}
public void close(){
putConnectionBackToPool(m_delegate);
}
public PreparedStatement prepareStatement(String sql) throws SQLException{
m_delegate.prepareStatement(sql);
}
//...... other method
}

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) 看来q不难。不q不q种写法Q因为应该尽量避免?Java Interface, 关于 Java Interface 的缺Ҏ(gu)另外再写文章讨论。大家关注的?Connection Pool 的实现方法。下面给ZU实现方法?

package connectionpool;

import java.sql.*;
import java.lang.reflect.*;
import java.util.*;
import java.io.*;

public class SimpleConnetionPool {
 (tng)private static LinkedList<Object> m_notUsedConnection = new LinkedList<Object>();
 (tng)private static HashSet<Object> m_usedUsedConnection = new HashSet<Object>();
 (tng)private static String m_url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=campusblog";
 (tng)private static String m_user = "sa";
 (tng)private static String m_password = "sa";
 (tng)static final boolean DEBUG = true;
 (tng)static private long m_lastClearClosedConnection = System.currentTimeMillis();
 (tng)public static long CHECK_CLOSED_CONNECTION_TIME = 4 * 60 * 60 * 1000; //4 hours

 (tng)static {
 (tng) (tng)initDriver();
 (tng) (tng)}

 (tng)private SimpleConnetionPool() { (tng)
 (tng)}

 (tng)private static void initDriver() {
 (tng) (tng)Driver driver = null;
 (tng) (tng)//load mysql driver
 (tng) (tng)try {
 (tng) (tng) (tng)driver = (Driver) Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
 (tng) (tng) (tng)installDriver(driver);
 (tng) (tng)}
 (tng) (tng)catch (Exception e) {}
 (tng) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////选择使用
 (tng) (tng)//load postgresql driver
 (tng) (tng)//try {
 (tng) (tng) (tng)//driver = (Driver) Class.forName("org.postgresql.Driver").newInstance();
 (tng) (tng) (tng)//installDriver(driver);
 (tng) (tng)//}
 (tng) (tng)//catch (Exception e){}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////选择使用

 (tng)}

 (tng)public static void installDriver(Driver driver) {
 (tng) (tng)try {
 (tng) (tng) (tng)DriverManager.registerDriver(driver);
 (tng) (tng)}
 (tng) (tng)catch (Exception e) {
 (tng) (tng) (tng)e.printStackTrace();
 (tng) (tng)}
 (tng)}


 (tng)public static synchronized Connection getConnection() {
 (tng) (tng)clearClosedConnection();
 (tng) (tng)while (m_notUsedConnection.size() > 0) {
 (tng) (tng) (tng)try{
 (tng) (tng) (tng) (tng)ConnectionWrapper wrapper = (ConnectionWrapper) m_notUsedConnection.removeFirst();
 (tng) (tng) (tng) (tng)if (wrapper.connection.isClosed()) {
 (tng) (tng) (tng) (tng) (tng)continue;
 (tng) (tng) (tng) (tng)}
 (tng) (tng) (tng) (tng)m_usedUsedConnection.add(wrapper);
 (tng) (tng) (tng) (tng)if(DEBUG){
 (tng) (tng) (tng) (tng) (tng)wrapper.debugInfo = new Throwable("Connection initial statement");
 (tng) (tng) (tng) (tng)}
 (tng) (tng) (tng)return wrapper.connection;
 (tng) (tng) (tng)}catch (Exception e){}
 (tng) (tng)}
 (tng) (tng)int newCount = getIncreasingConnectionCount();
 (tng) (tng)LinkedList<Object> list = new LinkedList<Object>();
 (tng) (tng)ConnectionWrapper wrapper = null;
 (tng) (tng)for (int i = 0; i < newCount; i++) {
 (tng) (tng) (tng)wrapper = getNewConnection();
 (tng) (tng) (tng)if (wrapper != null) {
 (tng) (tng) (tng) (tng)list.add(wrapper);
 (tng) (tng) (tng)}
 (tng) (tng)}
 (tng) (tng)if (list.size() == 0) {
 (tng) (tng) (tng)return null;
 (tng) (tng)}
 (tng) (tng)wrapper = (ConnectionWrapper) list.removeFirst();
 (tng) (tng)m_usedUsedConnection.add(wrapper);
 (tng) (tng)m_notUsedConnection.addAll(list);
 (tng) (tng)list.clear();
 (tng) (tng)return wrapper.connection;
 (tng)}
 (tng)
 (tng)private static ConnectionWrapper getNewConnection() {
 (tng) (tng)try{
 (tng) (tng) (tng)Connection con = DriverManager.getConnection(m_url, m_user, m_password);
 (tng) (tng) (tng)ConnectionWrapper wrapper = new ConnectionWrapper(con);
 (tng) (tng) (tng)return wrapper;
 (tng) (tng)}
 (tng) (tng)catch (Exception e) {
 (tng) (tng) (tng)e.printStackTrace();
 (tng) (tng)}
 (tng) (tng)return null;
 (tng)}
 (tng)
 (tng)static synchronized void pushConnectionBackToPool(ConnectionWrapper con) {
 (tng) (tng)boolean exist = m_usedUsedConnection.remove(con);
 (tng) (tng)if (exist) {
 (tng) (tng) (tng)m_notUsedConnection.addLast(con);
 (tng) (tng)}
 (tng)}
 (tng)
 (tng)public static int close() {
 (tng) (tng)int count = 0;
 (tng) (tng)I(yng)terator iterator = m_notUsedConnection.iterator();
 (tng) (tng)while (iterator.hasNext()) {
 (tng) (tng) (tng)try{
 (tng) (tng) (tng) (tng)((ConnectionWrapper) iterator.next()).close();
 (tng) (tng) (tng) (tng)count++;
 (tng) (tng) (tng)}
 (tng) (tng) (tng)catch (Exception e) {}
 (tng) (tng)}
 (tng) (tng)m_notUsedConnection.clear();
 (tng) (tng)iterator = m_usedUsedConnection.iterator();
 (tng) (tng)while (iterator.hasNext()) {
 (tng) (tng) (tng)try{
 (tng) (tng) (tng) (tng)ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next();
 (tng) (tng) (tng) (tng)wrapper.close();
 (tng) (tng) (tng) (tng)if (DEBUG) {
 (tng) (tng) (tng) (tng) (tng)wrapper.debugInfo.printStackTrace();
 (tng) (tng) (tng) (tng)}
 (tng) (tng) (tng) (tng)count++;
 (tng) (tng) (tng)}catch (Exception e){}
 (tng) (tng)}
 (tng) (tng)m_usedUsedConnection.clear();
 (tng) (tng)return count;
 (tng)}
 (tng)
 (tng)private static void clearClosedConnection() {
 (tng) (tng)long time = System.currentTimeMillis();
 (tng) (tng)//sometimes user change system time,just return
 (tng) (tng)if (time < m_lastClearClosedConnection) {
 (tng) (tng) (tng)time = m_lastClearClosedConnection;
 (tng) (tng) (tng)return;
 (tng) (tng)}
 (tng) (tng)//no need check very often
 (tng) (tng)if (time - m_lastClearClosedConnection < CHECK_CLOSED_CONNECTION_TIME) {
 (tng) (tng) (tng)return;
 (tng) (tng) (tng)}
 (tng) (tng)m_lastClearClosedConnection = time;
 (tng) (tng)//begin check
 (tng) (tng)I(yng)terator iterator = m_notUsedConnection.iterator();
 (tng) (tng)while (iterator.hasNext()) {
 (tng) (tng) (tng)ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next();
 (tng) (tng) (tng)try {
 (tng) (tng) (tng) (tng)if (wrapper.connection.isClosed()) {
 (tng) (tng) (tng) (tng) (tng)iterator.remove();
 (tng) (tng) (tng) (tng)}
 (tng) (tng) (tng) (tng)} catch (Exception e) {
 (tng) (tng) (tng) (tng) (tng)iterator.remove();
 (tng) (tng) (tng) (tng) (tng)if (DEBUG) {
 (tng) (tng) (tng) (tng) (tng) (tng)System.out.println("connection is closed, this connection initial StackTrace");
 (tng) (tng) (tng) (tng) (tng) (tng)wrapper.debugInfo.printStackTrace();
 (tng) (tng) (tng) (tng) (tng)}
 (tng) (tng) (tng) (tng)}
 (tng) (tng) (tng)}
 (tng) (tng)//make connection pool size smaller if too big
 (tng) (tng)int decrease = getDecreasingConnectionCount();
 (tng) (tng)if (m_notUsedConnection.size() < decrease) {
 (tng) (tng) (tng)return;
 (tng) (tng) (tng)}
 (tng) (tng)while (decrease-- > 0) {
 (tng) (tng) (tng)ConnectionWrapper wrapper = (ConnectionWrapper) m_notUsedConnection.removeFirst();
 (tng) (tng) (tng)try {
 (tng) (tng) (tng) (tng)wrapper.connection.close();
 (tng) (tng) (tng) (tng)} catch (Exception e){}
 (tng) (tng) (tng)}
 (tng) (tng)}
 (tng)
 (tng)/**
 (tng) * * get increasing connection count, not just add 1 connection
 (tng) * * @return count
 (tng) * */
 (tng)public static int getIncreasingConnectionCount(){
 (tng) (tng)int count = 1;
 (tng) (tng)int current = getConnectionCount();
 (tng) (tng)count = current / 4;
 (tng) (tng)if (count < 1) {
 (tng) (tng) (tng)count = 1;
 (tng) (tng) (tng)}
 (tng) (tng)return count;
 (tng)}
 (tng)
 (tng)/**
 (tng) * * get decreasing connection count, not just remove 1 connection
 (tng) * * @return count
 (tng) * */
 (tng)public static int getDecreasingConnectionCount(){
 (tng) (tng)//int count = 0;
 (tng) (tng)int current = getConnectionCount();
 (tng) (tng)if (current < 10){
 (tng) (tng) (tng)return 0;
 (tng) (tng)}
 (tng) (tng)return current / 3;
 (tng)}
 (tng)
 (tng)public synchronized static void printDebugMsg(){
 (tng) (tng)printDebugMsg(System.out);
 (tng)}
 (tng)
 (tng)public synchronized static void printDebugMsg(PrintStream out){
 (tng) (tng)if (DEBUG == false) {
 (tng) (tng) (tng)return;
 (tng) (tng)}
 (tng) (tng)StringBuffer msg = new StringBuffer();
 (tng) (tng)msg.append("debug message in " + SimpleConnetionPool.class.getName());
 (tng) (tng)msg.append("\r\n");
 (tng) (tng)msg.append("total count is connection pool: " + getConnectionCount());
 (tng) (tng)msg.append("\r\n");
 (tng) (tng)msg.append("not used connection count: " + getNotUsedConnectionCount());
 (tng) (tng)msg.append("\r\n");
 (tng) (tng)msg.append("used connection, count: " + getUsedConnectionCount());
 (tng) (tng)out.println(msg);
 (tng) (tng)I(yng)terator iterator = m_usedUsedConnection.iterator();
 (tng) (tng)while (iterator.hasNext()){
 (tng) (tng) (tng)ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next();
 (tng) (tng) (tng)wrapper.debugInfo.printStackTrace(out);
 (tng) (tng)}
 (tng) (tng)out.println();
 (tng)}
 (tng)
 (tng)public static synchronized int getNotUsedConnectionCount(){
 (tng) (tng)return m_notUsedConnection.size();
 (tng)}
 (tng)
 (tng)public static synchronized int getUsedConnectionCount(){
 (tng) (tng)return m_usedUsedConnection.size();
 (tng)}
 (tng)
 (tng)public static synchronized int getConnectionCount(){
 (tng) (tng)return m_notUsedConnection.size() + m_usedUsedConnection.size();
 (tng)}
}

class ConnectionWrapper implements InvocationHandler{
 (tng)private final static String CLOSE_METHOD_NAME = "close";
 (tng)public Connection connection = null;
 (tng)private Connection m_originConnection = null;
 (tng)public long lastAccessTime = System.currentTimeMillis();
 (tng)Throwable debugInfo = new Throwable("Connection initial statement");
 (tng)
 (tng)ConnectionWrapper(Connection con){
 (tng) (tng)Class[] interfaces = {java.sql.Connection.class};
 (tng) (tng)this.connection = (Connection) Proxy.newProxyInstance(con.getClass().getClassLoader(),interfaces, this);
 (tng) (tng)m_originConnection = con;
 (tng)}
 (tng)
 (tng)void close() throws SQLException {
 (tng) (tng)m_originConnection.close();
 (tng)}
 (tng)
 (tng)public Object invoke(Object proxy, Method m, Object[] args) throws Throwable{
 (tng) (tng)Object obj = null;
 (tng) (tng)if (CLOSE_METHOD_NAME.equals(m.getName())) {
 (tng) (tng) (tng)SimpleConnetionPool.pushConnectionBackToPool(this);
 (tng) (tng)}
 (tng) (tng)else {
 (tng) (tng) (tng)obj = m.invoke(m_originConnection, args);
 (tng) (tng)}
 (tng) (tng)lastAccessTime = System.currentTimeMillis();
 (tng) (tng)return obj;
 (tng)}
}

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) 使用Ҏ(gu)

public class TestConnectionPool{
  public static void main(String[] args) {
    SimpleConnetionPool.setUrl(DBTools.getDatabaseUrl());
    SimpleConnetionPool.setUser(DBTools.getDatabaseUserName());
    SimpleConnetionPool.setPassword(DBTools.getDatabasePassword());

    Connection con = SimpleConnetionPool.getConnection();
    Connection con1 = SimpleConnetionPool.getConnection();
    Connection con2 = SimpleConnetionPool.getConnection();

    //do something with con ...

    try {
      con.close();
    } catch (Exception e) {}

    try {
      con1.close();
    } catch (Exception e) {}

    try {
      con2.close();
    } catch (Exception e) {}

    con = SimpleConnetionPool.getConnection();
    con1 = SimpleConnetionPool.getConnection();
    try {
      con1.close();
    } catch (Exception e) {}

    con2 = SimpleConnetionPool.getConnection();
    SimpleConnetionPool.printDebugMsg();

  }
}



]]>
JSP基础知识70?/title><link>http://www.tkk7.com/bily/archive/2006/11/15/81320.html</link><dc:creator>C必?/dc:creator><author>C必?/author><pubDate>Wed, 15 Nov 2006 09:08:00 GMT</pubDate><guid>http://www.tkk7.com/bily/archive/2006/11/15/81320.html</guid><wfw:comment>http://www.tkk7.com/bily/comments/81320.html</wfw:comment><comments>http://www.tkk7.com/bily/archive/2006/11/15/81320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/bily/comments/commentRss/81320.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/bily/services/trackbacks/81320.html</trackback:ping><description><![CDATA[ <p>1. 问:(x)在JAVA与JSP中要调用一个LINUX上的脚本E序,或WINDOWS上的脚本E序,该怎么写?<br />{:(x)System.getRuntime().exec("bash < aaa.sh");</p> <p>2. 问:(x)java中用什么表C双引号<br />{:(x)"""</p> <p>3. 问:(x)如何在JSPE序里另起一个线E?<br />{:(x)JSP本n是独立U程q行而不象CGI都是独立q程.<br />一?Thread t = new Thread("你的对象");t.start();可以了(jin).<br />要求你这个对象要实现runnable接口或承thread.</p> <p>4. 问:(x)jsp如何获得客户端的IP地址Q?br />{:(x)request.getRemoteAddr()<br />看看各个webserver的API文档说明Q一般都有自带的Qresin和tomcat都有</p> <p>5. 问:(x)E序l止与输出终?br />{:(x)E序中止:return;<br />输出中止out.close();q一句相当于ASP的response.end</p> <p>6. 问:(x)jsp中如何得C늚URLQ?br />{:(x)request.getHeader("referer");</p> <p>7. 问:(x)提交|页的网过期功能是怎么做的Q?br />{:(x)response.setHader("Expires","0");</p> <p>8. 问:(x)在JSP|页中如何知道自已打开的页面的名称<br />{:(x)request.getRequestURI() ;//文g?br />request.getRequestURL() ;//全部QRQ?/p> <p>9. 问:(x)提交表单后验证没有通过Q返回提交页面,如何使原提交面中的数据保留Q?br />{:(x)javascript的go(-1)可以把上늚表单内容重新昄出来,但password域没?/p> <p>10. 问:(x)如何取得http的头信息Q?br />{:(x)request.getHader(headerName);</p> <p>11. 问:(x)&&?amp;的区别?<br />{:(x)&&是短路的与操作,也就是当C个条件是false的时候,W二个条件不用执?br />&相反Q两个条件L执行?/p> <p>12. 问:(x)?以正弦曲U的一个周期显C出?br />{:(x)<br />public void paint(Graphics g)<br />{<br />for(int i=0;i<200;i++)<br />g.drawString("*",i,(int)(Math.sin(i)*20)+50);<br />}<br />}</p> <p>13. 问:(x)点数相乘后l果不精如100.0 * 0.6 l果{于 60.0004<br />{:(x)q不叫错?float和double是这样实现的.如果要精计,java提供?jin)一个strictfp,它的计算遵@IEEE 754标准.而普通的float和double是由地^台QҎ(gu)式或g提供的额外精度或表示范围?/p> <p>14. 问:(x)如何获得当前用的cursors的位|?<br />{:(x)int row = rs.getRow()是当前指针行数,q有isFrist();isBeforeFist();isLast();isAfterLast();可以试是不是在Ҏ(gu)名所说的位置</p> <p>15. 问:(x)表单成功提交?jin),点后退昄|页q期<br />{:(x)?lt;head></head>里面加以下代?br /><META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Expires" CONTENT="0"> <br />或者在表单中加上<br /><% <br />response.setHeader("Pragma","no-cache"); <br />response.setHeader("Cache-Control","no-cache"); <br />response.setDateHeader("Expires",0); <br />%></p> <p>16. 问:(x)接口的简单理?br />{:(x)接口Z(jin)规范,比如我在接口中定义了(jin)一个方?getData()<br />q是用来从不同的数据库中取数据的,是JDBC的实现对于用?我不要知道每U数据库是如何做?但我知道如何它们要实现这个接口就一定有q个Ҏ(gu)可以供我调用.q样SUN把q个接口l各个数据库开发商,让他们自己实? 但ؓ(f)什么不用承而用接口?因ؓ(f)l承只能从一个你cȝ?而接口可以实现多?是说我实现的子cL多个规定好的接口中的功能. q只是简单的理解,{你深入理解抽象的时候就知道抽象到抽象时Z么还要再抽象到接?</p> <p>17. 问:(x)怎样~写一个取消按钮(怎样q回上一个页面,象工h的后退按钮Q?<br />{:(x)javascript把每ơ浏览过的location都压C(jin)一个栈?q个栈就是history,然后你如果要回到W几个页面它?yu)做几次POP操作,把最后POP出来的那个LOCATIONl你. q就是JAVASCRIPT在实现history.go(-x)的原?</p> <p>18. 问:(x)什么是回调Q?br />{:(x)单说,回调用不是让你去监听谁做完了(jin)什么事,而是谁做完了(jin)什么事报告给? q就是回调用的思想.例子太多?AWT的事?SWING事g模型都是q样? q有多线E中,如果要控制线E数,不能L查询每个U程是否l束,要在每个U程l束时让U程自己告诉ȝE我l束?你可以开新的U程?</p> <p>19. 问:(x)要介l一下compareToҎ(gu)<br />{:(x)compareToҎ(gu)是Comparable 接口必需实现的方?只要实现Comparable 可以用Arrays.srot()排序p实现Runnable接口的runpThread()一?</p> <p>20. 问:(x)如何可以从别的Web服务器检索页, 然后把检索到的网늚HTML代码储存在一个变量中q回q来<br />{:(x)q是一个简单的WEB ROBOT实现,用URLcdC|页中抓内容,然后自己写一个分析程序从中找出新的URL,不断递归下去p?</p> <p>21. 问:(x)applet中如何获得键盘的输入<br />{:(x)application的System.in是当前系l的标准输入,applet因ؓ(f)安全的原因不可能d当前pȝ(客户?的标准输?只能从它的ROOTlg的事件中,比如键盘?sh)g中取得键?</p> <p>22. 问:(x)怎样计算代码执行所p的时_(d)<br />{:(x)代码开始取旉Q结束后取时_(d)相减<br />long t1 = System.currentTimeMillis();<br />///////////////// your code<br />long t2 = System.currentTimeMillis() ;<br />long time = t2-t1;</p> <p>23. 问:(x)如何获在E序中获得一个文件的ContentTypeQ?br />{:(x)<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. 问:(x)q接池的使用是徏立很多连接池Q还是一个连接池里用多个q接Q?br />{:(x)只有在对象源不同的情况下才会(x)发生多个池化,如果你只q一l一个数据源,永远不要用多个连l池. 所以连l池的初始化一定要做成?rn)态的,而且应该在构造对象之?也就是只有在cLOAD的时?别的时候不应该有Q何生成新的连l池的时候?/p> <p>25. 问:(x)JavaMail要怎么安装Q?br />{:(x)下蝲两个包,一个是javamail包,另一个是jaf包。下载完直接把这两个包不解压加到CLASSPATH?/p> <p>26. 问:(x)怎样把地址栏里的地址锁定Q?br />{:(x)把你的服务器的可讉K目录索引选项关闭p?M服务器都有一个conf文g,里面都有q个选项?/p> <p>27. 问:(x)在JAVA中怎么取得环境变量啊。比如:(x) TEMP = CQTEMP Q?br />{:(x)String sss = System.getProperty(key)</p> <p>28. 问:(x)怎样实现四舍五入Q保留小数点后两位小敎ͼ<br />{:(x)<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. 问:(x)Applet和form如何通信Q?br />{:(x)取得的参C到param里面<br /><% <br />String xxx = request.getParameter("xxx"); <br />%> <br /><applet> <br /><param value="<%=xxx%>"> <br /></applet><br /><br />30. 问:(x)java-plug-in是什么?<br />{:(x)Java Runtime Environment的插件。用来运行javaE序。不需要什么特别的讄。等于你的机器里面有?jin)jvm?/p> <p>31. 问:(x)WEB上面怎么栯接上一个EXCEL表格Q?br />{:(x)定义面得contentType="application/vnd.ms-excel"Q让面以excel得Ş式打开。同样也可以以word得Ş式打开Qapplication/msword?/p> <p>32. 问:(x)怎样才能避免textarea字数限制Q?br />{:(x)是用了(jin)FORM的默认方法的~故,如果什么也不写默认是GET改用Post卛_Q在Form中定义mothod="post"?/p> <p>33. 问:(x)Z么加?lt;<a href="mailto:%@page"><font color="#1d58d1">%@page</font></a> contentType="text/html;charset=gb2312" %>插入数据库的中文Q依然是qQ?br />{:(x)q要从环境看,能显C明你的JSP引擎没有问题,但写入数据库时你的JDBC能不能处理中?同一公司不同版本的JDBC都有支持中文和不支持中文的情?RESIN自带的MYSQL JDBC׃支持,MM的就支持,q有你的数据库类型是否支持中?CHAR的一般支?但是否用binary存储双字节码<br /><br />34. 问:(x)对于JFrameQhide()Qshow()与setVisibel()有什么区别吗Q?br />{:(x)setVisible()从Componentl承q来Q而hide(),show()从Window里面l承q来?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. 问:(x)sendRedirectZ么不可以转到mms协议的地址的?response.sendRedirect("mms://missiah.adsldns.org:9394");<br />{:(x)javaq_目前实现的protocol中ƈ没有mms,你可以取pȝ属性java.protocol.handler.pkgs看看它的g有没有mms,所以如果要想重定向到mms://hostq样和URL,只有生成客户端的JAVASCRIPT让它来重定向</p> <p>37. 问:(x)JTable中怎样定义各个Columns和W(xu)idth和怎样讄表格的内定w做靠x居中Q?br />{:(x)<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. 问:(x)Ҏ(gu)作是否可用于select语句Q?br />{:(x)Ҏ(gu)作其实是指成批理更新的操?l对不可能用于select操作?/p> <p>39. 问:(x)Z么jsp路径太深文g名太长就无法d文gQ?br />{:(x)path不能过255长度,不然找不到?q是作业pȝ的事?/p> <p>40. 问:(x)如何让页面不保留~存Q?br />{:(x)<br /><% <br />response.setHeader("Pragma","No-cache"); <br />response.setHeader("Cache-Control","no-cache"); <br />response.setDateHeader("Expires", 0); <br />%></p> <p>41. 问:(x)我的applet code 中用到jbutton 时就出错是否׃ie不支持swing package 请问应怎么办?<br />{:(x)JBUTTON是SWING基本包啊,只要把jdk/jre/lib/rt.jar攑֜classpathp?不要加蝲M别的库?/p> <p>42. 问:(x)不知道java是否支持midi格式Q如果支持,应该怎么把wave格式转换成midi格式Q?br />{:(x)目前q(sh)?可以看一下JMF三个版中对MIDI的格式支持是read only,而W(xu)AVE是read/write,MIDI只能播放,不能生成?/p> <p>43. 问:(x)在jsp里面防止用户直接输入urlq去面Q应该怎么做呢Q?br />{:(x)一是从web服务器控?Ҏ(gu)一目录的所有访问要通过验证.<br />二是在要讉K的页面中加入控制.q个一般用session,也可以用h状态码实现</p> <p>44. 问:(x)例如后台有一计算应用E序Q此E序q算h很慢Q可持箋几分钟到几小Ӟq不,主要是能ȀzdQ,客户d提交后,服务器对dq行(g)无误后向服务器后台程序发送信息,q将其激zR要求如下:(x)<br />1Q首先将后台E序Ȁz,让它执行此Q务(比如Q前台将计算的C代码提交上后Q后台程序程序能马上调用Qƈ其q行Q?br />2Q要在前台JSP面中显C行过E信息(׃q行旉长,希望让客L(fng)到运行过E中产生的信息)(j)如何完成Q?br />{:(x)zL可以?q行一个shell让它去运行后台就?但不可能取出q行信息,因ؓ(f)HTTP的超旉制不可能永远{你后台q行?而且信息如果要动态实时推出来得用SERVER PUSH技术?/p> <p>45. 问:(x)数据库是datetime ?Q插入当前时间到数据库?<br />{:(x)<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. 问:(x)怎样L字符串前后的I格?br />{:(x)String.trim()</p> <p>47. 问:(x)session怎样存取intcd的变量?<br />{:(x)session.setAttribute("int", i+"");<br />int i = Integer.parseInt(session.getAttribute("int"));</p> <p>48. 问:(x)在javascript中如何输出的floatcd的数据保留两位小数?br />{:(x)Math.round(aaaaa*100)/100?/p> <p>49. 问:(x)在beanU如何调用session<br />{:(x)你可把session对象作ؓ(f)一个参Clbean<br />在BEAN中定义HttpServletRequest request;HttpSession session;<br />然后session = request.getSession(false);<br />false为如果session为空,不徏立新的session<br />session作ؓ(f)参数传入.其实只要request传入可?/p> <p>50. 问:(x)如何把txt或word文g按原格式昄在jsp面或servlet上?<br />{:(x)其实一个非常简单的解决Ҏ(gu)是在服务器的MIME中指点定TEXT和W(xu)ORD的解释方?然后用JSP或SERVLET生成它就行了(jin),客户端就?x)自动调用相应程序打开你的文档?br />如果是希望按原格式的昄在页面上Q而不是调用其他程序打开那么你可以试试用WEBDEV协议,可以说这是MS的一个亮?它是在WEB方式下打开文档,和共享一?完全W合的要求?/p> <p>51. 问:(x)object的cloneҎ(gu)Z么不能直接调用?<br />{:(x)q个Ҏ(gu)在object中是protected<br />Z么要把这个方法定义ؓ(f)protected,q是一个折?sh)?它的目的是想知道你这个方法在Object里只是一个标?而不是一个实?比如<br />public class Object<br />{<br />.............<br />protected Object clone()<br />{}<br />}</p> <p>所以直接承的clone()Ҏ(gu)q不能做M?你要使用q个Ҏ(gu)p重蝲q个Ҏ(gu)q放宽访问权限ؓ(f)public,或实现cloneable接口. 但它没法q样告诉你它没有真的实现,只好用protected Ҏ(gu)加以警示<br /><br />52. 问:(x)一个页面中如何h另外一个页面?<br />{:(x)要求是这些面必L兌,一是它们都有一个共同的层?也就是说是一个内的分面,当然可以是Q意,帧内再分帧也可以,另一个可能是当前H口弹出的窗?如果没有联系,那就不可能用一个页面刷新另一个页? 帧内只要一U一U引用就行了(jin). 比如在左帧中一个页面中写top.right.location.reload();那么名ؓ(f)right的右帧中的页面就?x)刷? 弹出的一?用open时的名称h子窗?子窗口用openerhȝ?/p> <p>53. 问:(x)如何在jsp中怎么样向客户端写cookiesQ?br />{:(x)<br />Cookie coo = new Cookie(name, value);<br />HttpServletResponse.addCookie(name);</p> <p>54. 问:(x)Z么jTextField1.setText("aaabbb");jTextField2.setText("AAABBB"); 得到的字体宽度不一P<br />{:(x)是说如果不是指定ؓ(f){宽字体,每个字体的宽度都是不一L(fng).因此JAVA中用FontMetrics cL取字W宽度?/p> <p>55. 问:(x)String kk=application/octet-stream; name="G:/SMBCrack.exe";如何得到SMBCrack.exeQ?br />{:(x)q应该是解析上传时候的二进制流得到的这一行里面格式是固定的,取到name="后面的字W串Q然后把";L。然后取最后一?后面的所有字W组成一个新字符串就行了(jin)?/p> <p>56. 问:(x)如何传值ƈ不刷新页面?<br />{:(x)弹出一个页面进行值的选择或者输入,ok后用将gl原H口Q用javascript关闭打开的窗口即可:(x)window.close();opener.focus();</p> <p>57. 问:(x)有一个字W串Q?EF0C114EA4"Q如何变?sh)a[0] = 0xEF a[1] = 0x0C a[2] = 0x11 a[3] = 0x4E a[4] = 0xA4Q?br />{:(x)<br />String str="EF0C114EA4F";<br />out.print(str+"<br>");<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<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+"<br>");<br />j+=2;<br />}</p> <p>58. 问:(x)怎样一个int转换成一个四字节的byte数组Q?br />{:(x)<br />int x = 1234567;<br />byte[] b = new byte[4];<br />for(int i=0;i<b.length;i++)<br />{<br />b = (x >>( i*8)) & 0xFF;<br />}</p> <p>59. 问:(x)indexOf()的用需要注意什么?<br />{:(x)参数是指从第几位Q?Q?Q?Q?..Q开始搜索,而返回值是指搜索到的位|(0Q?Q?Q?.......Q注意是从零v的?/p> <p>60. 问:(x)在Java应用E序中如何动态的d一个按钮?<br />{:(x)q里涉及(qing)一个组仉l的问题,lg要先于panel被显CZ处存?如果一panel已经昄?那么加在上面你能看到?但如果在同一个panel? 先有button A,假如按下它加?jin)butt on B,q时你如果整个panel重给,那么A本n要重l?它的事g监听没有了(jin),当然也就加不成B?所以如果要先有另一个panel,当按A时把B加在q个panel上ƈ重绘q个paenl,其实更好的方法是先把B加在panel?同一个也?把它setVisiable(flase),按A时设?true?/p> <p>61. 问:(x)book mybook=new book(bookid);book是servlet,出错?br />{:(x)book是servlet,能book mybook=new book(bookid);<br />说明自己实现?jin)servlet容器?不然,servlet能让你自己去调用? servlet如果调用其实和EJBq?%的区别都没有,它们都是自己l承或实C些接?在这些父cL接口中实C(jin)如果和容?打交?的方?然后容器调用q些Ҏ(gu)来管理它,让它生成实例,池化,钝化,销?再生{?所以这样写是错误的?/p> <p>62. 问:(x)l定一个字W串5*(5+9)/7怎样计算出结果?<br />{:(x)可有两种Ҏ(gu)<br />1。用堆栈完成<br />2。最单的Ҏ(gu)Q不用编E,如果有Q何一个数据库的化Q用select (5*(5+9)/7) from oneTable</p> <p>63. 问:(x)如何实现递交表单内容的加密解密?<br />{:(x)如果你用IE目前只能用SSL协议,q一层不要你考虑,否则只你用你自己的工具加密传?接收后再解密?至于如何加解,如果要和公认的系l结?q通用的MD5,RAS{公开法,如果你只是自׃自己?你随便按你的x把数据加上一些东?取回来按规则减掉q些东西,我敢保证除你自己没有M知道解密Ҏ(gu).</p> <p>64. 问:(x)Z么Integer.parseInt("+1");?x)抛出NumberFormatException的异常?<br />{:(x)因ؓ(f)"+"q行在JAVA中被重蝲.pȝ无法定你用的是术加还是字W??br />q一点可以在JAVASCRIPT中更好地理解:<br /><form name="t"><input name=s value=1234></form><br />var a = document.t.s.value+1;<br />q时a = 12345,因ؓ(f)document.t.s.value作ؓ(f)字符?但var a = document.t.s.value-1;<br />a 是1233,因ؓ(f)pȝ知道-q算肯定是算术运?所以把document.t.s.value转换成数?</p> <p> <br />65. 问:(x)hashCode() 有什么用Z么有时候需要覆盖Object里的hashcode()Ҏ(gu)Q?br />{:(x)q就是这个对象的w䆾证啊,要不如何区分哪个对象?/p> <p>66. 问:(x)怎样在tomcat中实C个定时执行的东东Q?br />{:(x)在应用程序启动时自动q行。servlet2.3中定义了(jin)ServletListener,监听Servlet Con text的启动或则关闭(可在配置文g中配|)(j)Q启动时触发一个守护程序的q行(可以实现java.util.Timer或则 javax.swing.Timer).</p> <p>67. 问:(x)E序可以输出自己吗?<br />{:(x)孔d(zhn)论q个非常有名的法?是说Q何程序都不可能输?gu)?</p> <p>68. 问:(x)能够把字W{化成ASCII码?比如?A 转化?65Q?br />{:(x)<br />int a='A';<br />out.println(a);</p> <p>69. 问:(x)如何区分输入的文字中的全角与半角Q?br />{:(x)׃不能分L出全角和半角字符的值有什么规?只好把全角符L(fng)丑և来了(jin).</p> <p>70. 问:(x)用户注册后的自动发信E序该怎么做?<br />{:(x)q种发信E序不考虑性能,因ؓ(f)不可?U就有一个h注册,我们说的考虑性能的发信程序是指上百万信在队列里要不停发送的那种,象你q个随便怎么写一个程序都?没有必要用JAVAMAIL.只要指定一个发信的服务器然后用cocketq它?5口就行了(jin).自己用SOCKETqSMTP?5口发一信好象两个邻居之间送一样东?直接递过d?用JAVAMAIL,消息机制是你把q个东西从邮局寄给你的d? </p> <img src ="http://www.tkk7.com/bily/aggbug/81320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/bily/" target="_blank">C必?/a> 2006-11-15 17:08 <a href="http://www.tkk7.com/bily/archive/2006/11/15/81320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP取当前时间ƈ以各UŞ式显C的代码http://www.tkk7.com/bily/archive/2006/11/15/81321.htmlC必?/dc:creator>C必?/author>Wed, 15 Nov 2006 09:08:00 GMThttp://www.tkk7.com/bily/archive/2006/11/15/81321.htmlhttp://www.tkk7.com/bily/comments/81321.htmlhttp://www.tkk7.com/bily/archive/2006/11/15/81321.html#Feedback0http://www.tkk7.com/bily/comments/commentRss/81321.htmlhttp://www.tkk7.com/bily/services/trackbacks/81321.html------------------------------------------------
<%
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

java.util.Date currentTime = new java.util.Date();//得到当前pȝ旉

String str_date1 = formatter.format(currentTime); //日期时间格式化
String str_date2 = currentTime.toString(); //Date型日期时间{换成字符串Ş?
%>
格式化成"yyyy-MM-dd HH:mm:ss"格式的日期时_(d)(x)<%=str_date1%>
未经格式化的String格式的日期时_(d)(x)<%=str_date2%>
未经格式化的Date格式的日期时_(d)(x)<%=currentTime%>
-------------------------------------------------
面的输出内容:(x)
格式化成"yyyy-MM-dd HH:mm:ss"格式的日期时_(d)(x)2005-03-17 09:55:40
未经格式化的String格式的日期时_(d)(x)Thu Mar 17 09:55:40 CST 2005
未经格式化的Date格式的日期时_(d)(x)Thu Mar 17 09:55:40 CST 2005

通常我们需要的是这U格式化后的旉Q?005-03-17 09:55:40。现在有q样一个问题:(x)?005-03-17 09:55:40”是一个字W串Q有些时候我们需要在q个字符串里提取出年、月、日{的相关信息Q怎么办呢Q看下面的代码:(x)
----------------------规则的字W串----------------------------------------------
规则的字W串Q年4位,?位,?位,中间用字W?”分隔)(j)Q?
<br>原字W串为:(x)
<%
String date="1989-12-30";
out.println(date+"<br>");
String year=date.substring(0,4);//取第0+1位至W??
String month=date.substring(5,7);//取第5+1位至W??
String day=date.substring(8,10);//取第8+1位至W?0?
out.println("year="+year+",month="+month+",day="+day);
%>
----------------------------------------------------------------------------------
从上面的代码我们可以看出来:(x)q只能针对规则的字符Ԍq?位,?位,?位)(j)Q要是不规则的呢Q年可能2位也可能4位,月和日可?位也可能2位,怎么办?通过对上面的代码修改Q可以得C面的通用的代码(q个“通用”有一个前提——年月日之间必须以?”分隔)(j)Q?
----------------------不规则的字符?---------------------------------------------
不规则的字符Ԍq、月、日长度不一定,中间用字W?”分隔)(j)Q?
<br>原字W串为:(x)
<%
String date="04-05-6";
out.println(date+"<br>");
int a=date.indexOf("-");//求第一个?”的位数
int b=date.lastIndexOf("-");//求最后一个?”的位数
int len=date.length();//求字W串的长?
year=date.substring(0,a);//取第一个?”前的字W串
month=date.substring(a+1,b);//取两个?”之间的字符?
day=date.substring(b+1,len);//取最后一个?”以后的字符?
out.println("year="+year+",month="+month+",day="+day);
%>
----------------------------------------------------------------------------------
现在q个问题解决?jin)。可是我们会(x)惛_Q每ơ需要对一个表C年月日的字W串q行分割的时候都需要在.jsp面里写上这么一D代码,不但ȝ(ch)而且佉K面显得؜乱,能不能以一U看h更清晰的Ҏ(gu)解决q个问题呢?当然可以?jin),用javabeanp?jin)?img src ="http://www.tkk7.com/bily/aggbug/81321.html" width = "1" height = "1" />

]]>
վ֩ģ壺 ޵Ӱ߲| ѹۿ˵ŮƵ| С豻| Ƶ߹ۿƵ| ˾Ʒ| ޹Ʒ߹ۿ97| һ˿wwwѸĻ| Ů18ëƬëƬ| þ޾ƷVA| 99þþù| AV˾þԭ | պaƵ| ߹ۿ޵Ӱ| ߿Ƭa | ձŷɫƵ߲| þþþþѹۿ| AVһ| 91߲| һĻ| պӰ߹ۿ| ޸һ| 51ƵƷȫ| ޸պƷһ| 91avƵ| 㽶߹ۿ| ߹ۿİ | ĻëƬѿ| AVĻɫ| ѵƵݮ| ɫ͵͵ۺav78| ˳վ18ֹһ| ҰƵѹۿȫ| ޹ƷþþþϼӰԺ| պƷƵ| һĻר| ߲| ѿƵվ| ĻŮ| պƷһ| ҹžƵ߹ۿ| ޳av޳av|