??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲春色在线视频,色窝窝亚洲AV网在线观看,亚洲人成日本在线观看http://www.tkk7.com/konhon/category/3032.html忘掉過去Q展望未來。找回自我,越自我? <br> <b>逃避不一定躲的过, 面对不一定最难过, 孤单不一定不快乐, 得到不一定能长久, 失去不一定不再拥? 可能因ؓ某个理由而伤心难q? 但我却能找个理由让自己快?</b><br><p> <!-- Search Google --> <left> <form method="get" action="http://www.google.com/custom" target="google_window"> <table> <tr><td nowrap="nowrap" valign="top" align="left" height="32"> <a > <img src="http://www.google.com/logos/Logo_25wht.gif" border="0" alt="Google" align="middle"></img></a> <input type="text" name="q" size="31" maxlength="255" value=""></input> <input type="submit" name="sa" value="搜烦"></input> <input type="hidden" name="client" value="pub-5408663347953425"></input> <input type="hidden" name="forid" value="1"></input> <input type="hidden" name="ie" value="UTF-8"></input> <input type="hidden" name="oe" value="UTF-8"></input> <input type="hidden" name="cof" value="GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1;"></input> <input type="hidden" name="hl" value="zh-CN"></input> </td></tr></table> </form> </left> <!-- Search Google --> zh-cnTue, 27 Feb 2007 11:12:04 GMTTue, 27 Feb 2007 11:12:04 GMT60Jsp问答?http://www.tkk7.com/konhon/archive/2006/03/31/38507.htmlkonhon 优华konhon 优华Fri, 31 Mar 2006 08:43:00 GMThttp://www.tkk7.com/konhon/archive/2006/03/31/38507.htmlhttp://www.tkk7.com/konhon/comments/38507.htmlhttp://www.tkk7.com/konhon/archive/2006/03/31/38507.html#Feedback0http://www.tkk7.com/konhon/comments/commentRss/38507.htmlhttp://www.tkk7.com/konhon/services/trackbacks/38507.html在JSP中可以用如下方式包含纯HTMLQ?
<!--#include file="data.inc"-->
但是如果data.inc中包含JSP CODE Q我们可以用:
<%@include file="data.inc"%>


如何执行一个线E安全的JSP?
只需增加如下指o
<%@ page isThreadSafe="false" %>


JSP如何处理HTML FORM中的数据?
通过内置的request对象卛_Q如下:
<%
String item = request.getParameter("item");
int howMany = new Integer(request.getParameter("units")).intValue();
%>


在JSP如何包含一个静态文?
静态包含如下:<%@ include file="copyright.html" %>
动态包含如下:<jsp:include page="copyright.html" flush="true"/>


在JSP中如何用注?
主要有四中方法:
1?lt;%-- ?--%>
2?/
3?**?*/
4?lt;!--?->


在JSP中如何执行浏览重定向?
使用如下方式卛_Qresponse.sendRedirect("http://ybwen.home.chinaren.com/index.html");
也能物理地改变HTTP HEADER属性,如下Q?
<%
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
String newLocn="/newpath/index.html";
response.setHeader("Location",newLocn);
%>


如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE?
把如下脚本加入到JSP文g的开始即可:
<%
response.setHeader("Cache-Control","no-store"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server
%>


在JSP中如何设|COOKIE?
COOKIE是作为HTTP HEADER的一部分被发送的Q如下方法即可设|:
<%
Cookie mycookie = new Cookie("aName","aValue");
response.addCookie(mycookie);
%>


在JSP中如何删除一个COOKIE?
<%
Cookie killMyCookie = new Cookie("mycookie", null);
killMyCookie.setMaxAge(0);
killMyCookie.setPath("/");
response.addCookie(killMyCookie);
%>


在一个JSP的请求处理中如何停止JSP的执?
如下例:
<%
if (request.getParameter("wen") != null) {
// do something
} else {
return;
}
%>


在JSP中如何定义方?
你可以定义方法,但是你不能直接访问JSP的内|对象,而是通过参数的方法传递。如下:
<%!
public String howBadFrom(HttpServletRequest req) {
HttpSession ses = req.getSession();
...
return req.getRemoteHost();
}
%>
<%
out.print("in general,lao lee is not baddie ");
%>
<%= howBadFrom(request) %>


如果BROWSER已关闭了COOKIESQ在JSP中我如何打开SESSION来跟t?
使用URL重写卛_Q如下:
hello1.jsp
<%@ page session="true" %>
<%
Integer num = new Integer(100);
session.putValue("num",num);
String url =response.encodeURL("hello2.jsp");
%>
<a href=&#39;<%=url%>&#39;>hello2.jsp</a>

hello2.jsp
<%@ page session="true" %>
<%
Integer i= (Integer )session.getValue("num");
out.println("Num value in session is "+i.intValue());
%>


在JSP中能发送EMAIL?
可以使用SUN的专用包Qsun.net.smtp包。如下脚本用SmtpClientcd送EMAIL?
<%@ page import="sun.net.smtp.SmtpClient, java.io.*" %>
<%
String from="ybwen@sina.com";
String to="hewenjun@yeah.net, lei@who.com.cn";
try{
SmtpClient client = new SmtpClient("mail.xxxxx.xxx");
client.from(from);
client.to(to);
PrintStream message = client.startMessage();
message.println("To: " + to);
message.println("Subject: Sending email from JSP!");
message.println("This was sent from a JSP page!");
message.println();
message.println("Cool! ");
message.println();
message.println("Good Boy");
message.println("I&#39;m in genius.com");
message.println();
client.closeServer();
}
catch (IOException e){
System.out.println("ERROR SENDING EMAIL:"+e);
}
%>


在SERVLET中我能调用一个JSP错误吗
当然没问题,如下展示了如何在一个SERVLET控制逻辑单元内调用一个JSP错误面?
protected void sendErrorRedirect(HttpServletRequest request,
HttpServletResponse response, String errorPageURL,
Throwable e)
throws ServletException, IOException {
request.setAttribute ("javax.servlet.jsp.jspException", e);
getServletConfig().getServletContext().
getRequestDispatcher(errorPageURL).forward(request,
response);
}

public void doPost(HttpServletRequest request,HttpServletResponse response) {
try {
// do something
} catch (Exception ex) {
try {
sendErrorRedirect(request,response,"/jsp/MyErrorPage.jsp",ex);
} catch (Exception e) {
e.printStackTrace();
}
}
}


JSP和APPLET如何通讯
JSP如何与EJB SessionBean通讯
下面的代码段作了很好的示?
<%@ page import="javax.naming.*, javax.rmi.PortableRemoteObject,
foo.AccountHome, foo.Account" %>
<%!
//定义一个对SessionBeanHome接口实例的全局引用
AccountHome accHome=null;

public void jspInit() {
//获得Home接口实例
InitialContext cntxt = new InitialContext( );
Object ref= cntxt.lookup("java:comp/env/ejb/AccountEJB");
accHome = (AccountHome)PortableRemoteObject.narrow(ref,AccountHome.class);
}
%>
<%
//实例化SessionBean
Account acct = accHome.create();
//调用q程Ҏ
acct.doWhatever(...);
// 如此{等
%>


当我使用一个结果集Ӟ如何防止字段?null"的字域显C在我的HTML输入文本域中?
可以定义一个简单的函数来达到目的,如下Q?
<%!
String blanknull(String s) {
return (s == null) ? "" : s;
}
%>

然后在JSP的FORM中,可以q样使用
<input type="text" name="shoesize" value="<%=blanknull(shoesize)%>">


如何中SERVLET或JSP下蝲一个文Ӟ如:binary,text,executable)Q?
现提供两个解x案:
AQ用HTTPQ如
点击下蝲|络恐龙囄(q个地址是假的)

BQ在Servlet中,通过讄ContentType和用java.io包的Stream{类可作?例如Q?
response.setContentType("application/x-msword");
然后惌出缓冲中写一些东东即可?

使用useBean标志初始化BEAN时如何接受初始化参数
使用如下两标{֍可:
<jsp:getProperty name="wenBean" property="someProperty"/>
<jsp:setProperty name="wenBean" property="someProperty" value="someValue"/>

konhon 优华 2006-03-31 16:43 发表评论
]]>
JSP 傳送中文參?/title><link>http://www.tkk7.com/konhon/archive/2006/03/31/38494.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Fri, 31 Mar 2006 08:15:00 GMT</pubDate><guid>http://www.tkk7.com/konhon/archive/2006/03/31/38494.html</guid><wfw:comment>http://www.tkk7.com/konhon/comments/38494.html</wfw:comment><comments>http://www.tkk7.com/konhon/archive/2006/03/31/38494.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/konhon/comments/commentRss/38494.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/konhon/services/trackbacks/38494.html</trackback:ping><description><![CDATA[偉送頁 to.jsp<br /><br /><%@ page contentType="text/html; charset=big5" %><br /><a href="from.jsp?word=<%=java.net.URLEncoder.encode("二廠成型","big5")%>">傳送字W?lt;/a><br /><br />接收?from.jsp<br /><pre class="overflow"><br /><%@ page contentType="text/html; charset=big5" %><br /><br /><%<br />request.setCharacterEncoding("big5");<br /><br />if(request.getParameter("word") != null){<br />        String bb = request.getParameter("word");<br />        out.print(bb);<br />}        <br />%> <br /><br /></pre><img src ="http://www.tkk7.com/konhon/aggbug/38494.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/konhon/" target="_blank">konhon 优华</a> 2006-03-31 16:15 <a href="http://www.tkk7.com/konhon/archive/2006/03/31/38494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[轉]樹Ş 法http://www.tkk7.com/konhon/archive/2006/03/31/38491.htmlkonhon 优华konhon 优华Fri, 31 Mar 2006 07:54:00 GMThttp://www.tkk7.com/konhon/archive/2006/03/31/38491.htmlhttp://www.tkk7.com/konhon/comments/38491.htmlhttp://www.tkk7.com/konhon/archive/2006/03/31/38491.html#Feedback0http://www.tkk7.com/konhon/comments/commentRss/38491.htmlhttp://www.tkk7.com/konhon/services/trackbacks/38491.html阅读全文

konhon 优华 2006-03-31 15:54 发表评论
]]>
web.xml學習{記http://www.tkk7.com/konhon/archive/2006/03/29/38012.htmlkonhon 优华konhon 优华Wed, 29 Mar 2006 03:52:00 GMThttp://www.tkk7.com/konhon/archive/2006/03/29/38012.htmlhttp://www.tkk7.com/konhon/comments/38012.htmlhttp://www.tkk7.com/konhon/archive/2006/03/29/38012.html#Feedback0http://www.tkk7.com/konhon/comments/commentRss/38012.htmlhttp://www.tkk7.com/konhon/services/trackbacks/38012.html阅读全文

konhon 优华 2006-03-29 11:52 发表评论
]]>
Servlets/JSP开发技术问{?/title><link>http://www.tkk7.com/konhon/archive/2006/03/24/37160.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Fri, 24 Mar 2006 02:53:00 GMT</pubDate><guid>http://www.tkk7.com/konhon/archive/2006/03/24/37160.html</guid><wfw:comment>http://www.tkk7.com/konhon/comments/37160.html</wfw:comment><comments>http://www.tkk7.com/konhon/archive/2006/03/24/37160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/konhon/comments/commentRss/37160.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/konhon/services/trackbacks/37160.html</trackback:ping><description><![CDATA[<b>Z么GenericServlet在init(ServletConfig config)基础上增加了一个init()ҎQ?/b> <br /> <br />  init()Ҏ被GenericServlet.init(ServletConfig config)Ҏ调用?br />  <br />  init()Ҏ方便了开发h员定制Servlet的初始化Q而无dl护ServletConfig对象的存储工作?br />  <br />  重写GenericServlet.init(ServletConfig config)必须要显C的调用super.init(config)Ҏ?br />  <br />  <b>ServletContext.getContext(java.lang.String uripath)的作用是什么?</b><br />  <br />  q回同一Server中指定的path对应的ServletContext对象,通过该对象可以实CServer中的其他Context打交道?br />  <br />  uripath必须是以"/"开始(该\径的含义是相对于整个Servlet文档的根路径Q而不是当前ServletContext的根路径Q?br />  <br />  <b>Servlet生命周期是什么?</b><br />  <br />  一般的Servlet(GenericServlet,即与协议无关的Servlet)的生命周期:init() --> GenericServlet.service(ServletRequest req, ServletResponse res) --> destroy.<br />  <br />  HttpServlet的生命周? init() --> GenericServlet.service(ServletRequest req, ServletResponse res)---> service(HttpServletRequest req, HttpServletResponse resp) --> doXXXX()-->destroy.<br />  <br />  <b>有没有必要重写GenericServlet.service()ҎQ?/b><br />  <br />  对于HttpServlet来说没有必要。只需要重写它的doXXXX()Ҏ可以了。HttpServlet中service()Ҏ会自动的Ҏ用户hcd把请求{发给相应的doXXXX()ҎQ例如doGet()ҎQ?br />  <br />  <b>ServletRequest.getReader()和ServletRequest.getInputStream()如何使用Q?/b><br />  <br />  注意两个Ҏ不能同时使用?br />  <br />  ServletRequest.getRealPath(String path)Ҏ已经不推荐用?br />  <br />  请用ServletContext.getRealPath(String path)Ҏ?br />  <br />  <b>ServletResponse~省的字W集(charset)是什?</b><br /><br />  ServletResponse~省的字W集(charset)是ISO-8859-1,可以通过setContentType(java.lang.String)Ҏ改变新的字符集?br />  <br />  例如QsetContentType("text/html; charset=Shift_JIS").<br />  <br />  关于字符集信息,可以览RFC 2045<br />  <br />  <b>HttpServletRequest.getRequestURI()和HttpServletRequest.getRequestURL()区别是什?</b> <br /> <br />  request.getRequestURI() q回值类|/xuejava/requestdemo.jsp<br />  <br />  request.getRequestURL() q回值类|http://localhost:8080/xuejava/requestdemo.jsp<br />  <br />  <b>HttpServletRequest.encodeURL()和HttpServletRequest.encodeRedirectURL(()区别是什?Z么要有两个不同的Ҏ呢?</b><br />  <br />  当用URL-rewriting方式来管理Session的时候,需要用C上的两个Ҏ?br />  <br />  两个Ҏ的不同点是:两个Ҏ定是否需要包含session ID的逻辑不同?br />  <br />  在调用HttpServletResponse.sendRedirect前,应该先调用encodeRedirectURL()ҎQ否则可能会丢失Sesssion信息?...<br />  <br />  <b>如何使你的Servlet或者JSP实现Single Thread Model?</b>  <br /><br />  对于Servlet实现javax.single.SingleThreadModel接口?br />  <br />  对于JSP,在Page Directive中写如下的语?lt;%@ page isThreadSafe="false" %><br />  <br />  JSP Tag ?JSP XML-based Tag<br />  <br />  ...<br />  <br />  <b>如何把某一个JSP Page定义成ؓError Page?Z么要q样做?</b><br />  <br />  实现ҎQ?<%@ page isErrorPage="true" %><br />  <br />  Z么? 因ؓ需要获取Exception 对象Q缺省情况下Q在JSP Page中是不能直接使用“隐含对象?exception的)?br />  <br />  <b>JSP Page的执行顺序是如何的?</b><br />  <br />  JSP Page的执行顺序如下:<br />  <br />  JSP Page Translation. JSP Page --> Servlet source code.<br />  JSP Page Compilation. Servlet source code --> Servlet class.<br />  Load Class(First time or the server restarted)<br />  <br />  Create instance(可能会很多次Q如果JSP Page中声明了<%@ page isThreadSafe="false" %>)<br />  <br />  Call jspInit methodQ一般的JSP Page都没有重写这个方法,重写需要在声明语句D中Q?br />  <br />  Call _jspService methodQ类g一般HttpServlet的doGet和doPostҎQ但是可以同时用来处理Post和GetqhQ?br />  <br />  Call jspDestroy methodQServer在卸载Servet的时候,例如当Servlet很久没有使用的情况)?br />  <br />  <b>JSP Page中有哪些隐含对象(Implicity Object)?各自的类型和作用是什么?</b><br />  <br />  request --<br />  reponse --<br />  session --<br />  application --<br />  out --<br />  page --<br />  pagecontext --<br />  exception -- 只有在当前JSP Page为Error Page的时候才有效?br />  config --<br />  <br />  <b><jsp:include page="/foo/foo.jsp" %> ?<@ include file="/foo/foo.jsp" %>的区别是什么?</b><br />  <br />  <jsp:include ... -- request time.<br />  <@ include ... -- Page translation time.<br />  <br />  <b>Servlets/JSP Container(Engine)有几U运行方式?</b><br />  <br />  Standalone<br />  Tomcat standalone mode<br />  In-process<br />  Tomcat running inside Apache Web Server.<br />  Out-of-process<br />  Apache + mod_jk + Tomcat<br />  <br />  Servlet,Servlet开发h员,Servlet API, Servlet Container的关pL什么?<br />  <br />  Servlet,Servlet开发h?--->Servlet API --> Servlet Container<br />  The parts of an HTTP message<br />  <br />  Message part Description<br />  The initial lineQ?Specifies the purpose of the request or response message<br />  例子QGET /reports/sales/index.html HTTP/1.0<br />  The header section:Specifies the meta-information, such as size, type, and encoding,<br />  about the content of the message<br />  A blank line:<br />  An optional message body: The main content of the request or response message<br />  <br />  下面是一个Response的例子:<br />  <br />  HTTP/1.0 200 OK<br />  Date: Tue, 01 Dec 2001 23:59:59 GMT<br />  Content-Type: text/html<br />  Content-Length: 52<br />  <br />  <html><br />  <body><br />  <h1>Hello, John!</h1><br />  </body><br />  </html><br />  <br />  <b>HTTP规范中定义了哪些ҎQ各自有什么用途?</b><br />  <br />  GET<br />  HEAD<br />  POST<br />  ?Http 1.1规范开始,增加了以下的Ҏ:<br />  <br />  PUT<br />  OPTIONS<br />  TRACE<br />  DELETE<br />  CONNECT<br />  <br />  ServetRequest中ؓ什么要定义:getContentType(),getContentLength()Ҏ?br />  <br />  ҎHTTP协议规范QRequest ?Response一样也有这些必不可的内容Q?br />  <br />  所以需要首先了?HTTP Message的概念和其内容的格式Q这些东西对于Request和Reponse是一L?br />  <br />  对于GET方式发送的hQ其内容cd为:null<br />  <br />  对于POST方式发送的hQ其内容cd为:application/x-www-form-urlencoded<br />  <br />  POST方式发送请求的内容cM于:username=xuejava.<br />  <br />  RequestDispatcher.forward()和HttpServletResponse.sendRedirect()的区别是什么?<br />  <br />  RequestDispatcher.forward()是在服务器端q行QHttpServletResponse.sendRedirect()是通过向客h览器发送命令来完成?br />  <br />  所以RequestDispatcher.forward()对于览器来说是“透明的”;而HttpServletResponse.sendRedirect()则不是?br />  <br />  另外Q还要注意RequestDispatcher.forward()在调用的时候Response不能已经Commit了(Response.isCommitted()Q?br />  <br />  ServletContext.getRequestDispatcher(String url)和ServletRequest.getRequestDispatcher(String url)的区别是什么?Z么?<br />  <br />  ServletContext.getRequestDispatcher(String url)中的url只能使用l对路径Q而ServletRequest.getRequestDispatcher(String url)中的url可以使用相对路径?br />  <br />  因ؓServletRequesth相对路径的概念;而ServletContext对象无次概念?br />  <br />  <b>如何把请求{Ud另外一个Web App中的某个地址Q?/b><br />  <br />  ServletContext.getRequestDispatcher(String url)和ServletRequest.getRequestDispatcher(String url)只能把请求{Ud同一个Web App中的地址?br />  <br />  如果需要把h转移到另外一个Web App中的某个地址Q可以按下面的做法:<br />  <br />  1. 获得另外一个Web App的ServletConext对象(currentServletContext.getContext(uripath)).<br />  <br />  2. 调用ServletContext.getRequestDispatcher(String url)Ҏ?img src ="http://www.tkk7.com/konhon/aggbug/37160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/konhon/" target="_blank">konhon 优华</a> 2006-03-24 10:53 <a href="http://www.tkk7.com/konhon/archive/2006/03/24/37160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Session详解 http://www.tkk7.com/konhon/archive/2006/03/24/37153.htmlkonhon 优华konhon 优华Fri, 24 Mar 2006 02:35:00 GMThttp://www.tkk7.com/konhon/archive/2006/03/24/37153.htmlhttp://www.tkk7.com/konhon/comments/37153.htmlhttp://www.tkk7.com/konhon/archive/2006/03/24/37153.html#Feedback0http://www.tkk7.com/konhon/comments/commentRss/37153.htmlhttp://www.tkk7.com/konhon/services/trackbacks/37153.html一、术语session
在我的经验里Qsessionq个词被滥用的程度大概仅ơ于transactionQ更加有的是transaction与session在某些语境下的含义是相同的?br />
sessionQ中文经常翻译ؓ会话Q其本来的含义是指有始有l的一pd动作/消息Q比如打电话时从拿v电话拨号到挂断电话这中间的一pdq程可以UCZ?session。有时候我们可以看到这L话“在一个浏览器会话期间Q?..”,q里的会话一词用的就是其本义Q是指从一个浏览器H口打开到关闭这个期?①。最混ؕ的是“用P客户端)在一ơ会话期间”这样一句话Q它可能指用L一pd动作Q一般情况下是同某个具体目的相关的一pd动作Q比如从d到选购商品到结账登样一个网上购物的q程Q有时候也被称Z个transactionQ,然而有时候也可能仅仅是指一ơ连接,也有可能是指含义①,其中的差别只能靠上下文来推断②?br />
然而当session一词与|络协议相关联时Q它又往往隐含了“面向连接”和/或“保持状态”这样两个含义, “面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到Ҏ接了电话通信才能开始,与此相对的是写信Q在你把信发出去的时候你q不能确认对方的地址是否正确Q通信渠道不一定能建立Q但对发信h来说Q通信已经开始了。“保持状态”则是指通信的一方能够把一pd的消息关联v来,使得消息之间可以互相依赖Q比如一个服务员能够认出再次光的老顾客ƈ且记得上ơ这个顾客还Ơ店里一块钱。这一cȝ例子有“一个TCP session”或?“一个POP3 session”③?br />
而到了web服务器蓬勃发展的时代Qsession在web开发语境下的语义又有了新的扩展Q它的含义是指一cȝ来在客户端与服务器之间保持状态的解决Ҏ④。有时候session也用来指q种解决Ҏ的存储结构,如“把xxx保存在session 里”⑤。由于各U用于web开发的语言在一定程度上都提供了对这U解x案的支持Q所以在某种特定语言的语境下Qsession也被用来指代该语a的解x案,比如l常把Java里提供的javax.servlet.http.HttpSessionUCؓsession⑥?br />
鉴于q种混ؕ已不可改变,本文中session一词的q用也会Ҏ上下文有不同的含义,请大家注意分辨?br />在本文中Q用中文“浏览器会话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表辑֐义⑤Q用具体的“HttpSession”来表达含义?br />
二、HTTP协议与状态保?/b>
HTTP 协议本n是无状态的Q这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器h下蝲某些文gQ无论是客户端还是服务器都没有必要纪录彼此过ȝ行ؓQ每一ơ请求之间都是独立的Q好比一个顾客和一个自动售货机或者一个普通的Q非会员Ӟ大卖Z间的关系一栗?br />
然而聪明(或者贪心?Q的Z很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用Q就像给有线电视加上Ҏ功能一栗这U需求一斚wqHTML逐步d了表单、脚本、DOM{客L行ؓQ另一斚w在服务器端则出现了CGI规范以响应客L的动态请求,作ؓ传输载体的HTTP协议也添加了文g上蝲?cookieq些Ҏ。其中cookie的作用就是ؓ了解决HTTP协议无状态的~陷所作出的努力。至于后来出现的session机制则是又一U在客户端与服务器之间保持状态的解决Ҏ?br />
让我们用几个例子来描qC下cookie和session机制之间的区别与联系。笔者曾l常ȝ一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠Q然而一ơ性消?杯咖啡的Z微乎其微Q这时就需要某U方式来U录某位֮的消Ҏ量。想象一下其实也无外乎下面的几种ҎQ?br />1、该店的店员很厉宻I能记住每位顾客的消费数量Q只要顾客一走进咖啡店,店员q道该怎么对待了。这U做法就是协议本w支持状态?br />2、发l顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每ơ消ҎQ如果顾客出C张卡片,则此ơ消费就会与以前或以后的消费相联pv来。这U做法就是在客户端保持状态?br />3、发l顾客一张会员卡Q除了卡号之外什么信息也不纪录,每次消费Ӟ如果֮出示该卡片,则店员在店里的纪录本上找到这个卡号对应的U录d一些消费信息。这U做法就是在服务器端保持状态?br />
׃HTTP协议是无状态的Q而出于种U考虑也不希望使之成ؓ有状态的Q因此,后面两种Ҏ成为现实的选择。具体来说cookie机制采用的是在客L保持状态的ҎQ而session机制采用的是在服务器端保持状态的Ҏ。同时我们也看到Q由于采用服务器端保持状态的Ҏ在客L也需要保存一个标识,所以session机制可能需要借助于cookie机制来达C存标识的目的Q但实际上它q有其他选择?br />
三、理解cookie机制
cookie机制的基本原理就如上面的例子一L单,但是q有几个问题需要解冻I“会员卡”如何分发;“会员卡”的内容Q以及客户如何用“会员卡”?br />
正统的cookie分发是通过扩展HTTP协议来实现的Q服务器通过在HTTP的响应头中加上一行特D的指示以提C浏览器按照指示生成相应的cookie。然而纯_的客户端脚本如JavaScript或者VBScript也可以生成cookie?br />
而cookie 的用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器查所有存储的cookieQ如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置Q则把该cookie附在h资源的HTTPh头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示Q如果某家分店还发行了自q会员卡,那么q这家店的时候除了要出示麦当劳的会员卡,q要出示q家店的会员卡?br />
cookie的内容主要包括:名字Q|q期旉Q\径和域?br />其中域可以指定某一个域比如.google.comQ相当于d招牌Q比如宝z公司,也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.comQ可以用飘柔来做比?br />路径是跟在域名后面的URL路径Q比?或?foo{等Q可以用某飘柔专柜做比?br />路径与域合在一起就构成了cookie的作用范围?br />如果不设|过期时_则表C个cookie的生命期为浏览器会话期间Q只要关闭浏览器H口Qcookie消׃。这U生命期为浏览器会话期的 cookie被称Z话cookie。会话cookie一般不存储在硬盘上而是保存在内存里Q当然这U行为ƈ不是规范规定的。如果设|了q期旉Q浏览器׃把cookie保存到硬盘上Q关闭后再次打开览器,q些cookie仍然有效直到过讑֮的过期时间?br />
存储在硬盘上的cookie 可以在不同的览器进E间׃nQ比如两个IEH口。而对于保存在内存里的cookieQ不同的览器有不同的处理方式。对于IEQ在一个打开的窗口上?Ctrl-NQ或者从文g菜单Q打开的窗口可以与原窗口共享,而用其他方式新开的IEq程则不能共享已l打开的窗口的内存cookieQ对?Mozilla Firefox0.8Q所有的q程和标{N都可以共享同Lcookie。一般来说是用javascript的window.open打开的窗口会与原H口׃n内存cookie。浏览器对于会话cookie的这U只认cookie不认人的处理方式l常l采用session机制的web应用E序开发者造成很大的困扰?br />
下面是一个goolge讄cookie的响应头的例?br />
HTTP/1.1 302 Found
Location: http://www.google.com/intl/zh-CN/
Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Content-Type: text/html



q是使用HTTPLookq个HTTP Sniffer软g来俘LHTTP通讯U录的一部分


览器在再次讉Kgoolge的资源时自动向外发送cookie


用Firefox可以很容易的观察现有的cookie的?br />使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理?br />

IE也可以设|在接受cookie前询?br />
四、理解session机制

session机制是一U服务器端的机制Q服务器使用一U类g散列表的l构Q也可能是使用散列表)来保存信息?br />
当程序需要ؓ某个客户端的h创徏一个session的时候,服务器首先检查这个客L的请求里是否已包含了一个session标识 - UCؓ session idQ如果已包含一个session id则说明以前已lؓ此客L创徏qsessionQ服务器按照session id把这?session索出来用(如果索不刎ͼ可能会新Z个)Q如果客Lh不包含session idQ则为此客户端创Z个sessionq且生成一个与此session相关联的session idQsession id的值应该是一个既不会重复Q又不容易被扑ֈ规律以仿造的字符Ԍq个 session id被在本ơ响应中q回l客L保存?br />
保存q个session id的方式可以采用cookieQ这样在交互q程中浏览器可以自动的按照规则把q个标识发挥l服务器。一般这个cookie的名字都是类gSEEESIONIDQ而。比如weblogic对于web应用E序生成的cookieQJSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764Q它的名字就?JSESSIONID?br />
׃cookie可以被h为的止Q必L其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一U技术叫做URL重写Q就是把session id直接附加在URL路径的后面,附加方式也有两种Q一U是作ؓURL路径的附加信息,表现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
另一U是作ؓ查询字符串附加在URL后面Q表现Ş式ؓhttp://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
q两U方式对于用h说是没有区别的,只是服务器在解析的时候处理的方式不同Q采用第一U方式也有利于把session id的信息和正常E序参数区分开来?br />Z在整个交互过E中始终保持状态,必d每个客户端可能请求的路径后面都包含这个session id?br />
另一U技术叫做表单隐藏字Dc就是服务器会自动修改表单,d一个隐藏字D,以便在表单提交时能够把session id传递回服务器。比如下面的表单
<form name="testform" action="/xxx">
<input type="text">
</form>


在被传递给客户端之前将被改写成
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>


q种技术现在已较少应用Q笔者接触过的很古老的iPlanet6(SunONE应用服务器的前n)׃用了q种技术?br />实际上这U技术可以简单的用对action应用URL重写来代ѝ?br />
在谈论session机制的时候,常常听到q样一U误解“只要关闭浏览器Qsession消׃”。其实可以想象一下会员卡的例子,除非֮d对店家提出销卡,否则店家l对不会L删除֮的资料。对session来说也是一LQ除非程序通知服务器删除一个sessionQ否则服务器会一直保留,E序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会d在关闭之前通知服务器它要关闭Q因此服务器Ҏ不会有机会知道浏览器已经关闭Q之所以会有这U错觉,是大部分session机制都用会话cookie来保存session idQ而关闭浏览器后这?session id消׃Q再ơ连接服务器时也无法找到原来的session。如果服务器讄的cookie被保存到盘上,或者用某U手D|写浏览器发出的HTTPh_把原来的session id发送给服务器,则再ơ打开览器仍然能够找到原来的session?br />
恰恰是由于关闭浏览器不会Dsession被删除,q服务器ؓseesion讄了一个失效时_当距dL上一ơ用session的时间超q这个失效时间时Q服务器可以认为客L已经停止了活动,才会把session删除以节省存储空间?br />
五、理解javax.servlet.http.HttpSession
HttpSession是Javaq_对session机制的实现规范,因ؓ它仅仅是个接口,具体到每个web应用服务器的提供商,除了对规范支持之外,仍然会有一些规范里没有规定的细微差异。这里我们以BEA的Weblogic Server8.1作ؓ例子来演C?br />
首先QWeblogic Server提供了一pd的参数来控制它的HttpSession的实玎ͼ包括使用cookie的开关选项Q用URL重写的开关选项Qsession持久化的讄Qsession失效旉的设|,以及针对cookie的各U设|,比如讄cookie的名字、\径、域Q?cookie的生存时间等?br />
一般情况下Qsession都是存储在内存里Q当服务器进E被停止或者重启的时候,内存里的session也会被清I,如果讄了session的持久化Ҏ,服务器就会把session保存到硬盘上Q当服务器进E重新启动或q些信息能够被再次使用Q?Weblogic Server支持的持久性方式包括文件、数据库、客Lcookie保存和复制?br />
复制严格说来不算持久化保存,因ؓsession实际上还是保存在内存里,不过同样的信息被复制到各个cluster内的服务器进E中Q这样即使某个服务器q程停止工作也仍然可以从其他q程中取得session?br />
cookie生存旉的设|则会媄响浏览器生成的cookie是否是一个会话cookie。默认是使用会话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解?br />
cookie的\径对于web应用E序来说是一个非帔R要的选项QWeblogic Server对这个选项的默认处理方式得它与其他服务器有明昄区别。后面我们会专题讨论?br />
关于session的设|参考[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869

六、HttpSession常见问题
Q在本小节中session的含义ؓ⑤和⑥的混合Q?br />
1、session在何时被创徏
一个常见的误解是以为session在有客户端访问时p创徏Q然而事实是直到某server端程序调?HttpServletRequest.getSession(true)q样的语句时才被创徏Q注意如果JSP没有昄的?<% @page session="false"%> 关闭sessionQ则JSP文g在编译成Servlet时将会自动加上这样一条语?HttpSession session = HttpServletRequest.getSession(true);q也是JSP中隐含的 session对象的来历?br />
׃session会消耗内存资源,因此Q如果不打算使用sessionQ应该在所有的JSP中关闭它?br />
2、session何时被删?br />l合前面的讨论,session在下列情况下被删除a.E序调用HttpSession.invalidate();或b.距离上一ơ收到客L发送的session id旉间隔过了session的超时设|?或c.服务器进E被停止Q非持久sessionQ?br />
3、如何做到在览器关闭时删除session
严格的讲Q做不到q一炏V可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进E这些非常规手段仍然无能为力?br />
4、有个HttpSessionListener是怎么回事
你可以创Llistenerȝ控session的创建和销毁事Ӟ使得在发生这L事g时你可以做一些相应的工作。注意是session的创建和销毁动作触发listenerQ而不是相反。类似的与HttpSession有关的listenerq有 HttpSessionBindingListenerQHttpSessionActivationListener?HttpSessionAttributeListener?br />
5、存攑֜session中的对象必须是可序列化的?br />不是必需的。要求对象可序列化只是ؓ了session能够在集中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在 Weblogic Server的session中放|一个不可序列化的对象在控制C会收C个警告。我所用过的某个iPlanet版本如果 session中有不可序列化的对象Q在session销毁时会有一个ExceptionQ很奇怪?br />
6、如何才能正的应付客户端禁止cookie的可能?br />Ҏ有的URL使用URL重写Q包括超链接Qform的actionQ和重定向的URLQ具体做法参见[6]
http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770

7、开两个览器窗口访问应用程序会使用同一个sessionq是不同的session
参见W三节对cookie的讨论,对session来说是只认id不认人,因此不同的浏览器Q不同的H口打开方式以及不同的cookie存储方式都会对这个问题的{案有媄响?br />
8、如何防止用h开两个览器窗口操作导致的session混ؕ
q个问题与防止表单多ơ提交是cM的,可以通过讄客户端的令牌来解冟뀂就是在服务器每ơ生成一个不同的idq回l客LQ同时保存在session里,客户端提交表单时必须把这个id也返回服务器Q程序首先比较返回的id与保存在session里的值是否一_如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表C层模式的部分。需要注意的是对于用javascript window.open打开的窗口,一般不讄q个idQ或者用单独的idQ以防主H口无法操作Q徏议不要再window.open打开的窗口里做修Ҏ作,q样可以不用设|?br />
9、ؓ什么在Weblogic Server中改变session的值后要重新调用一ơsession.setValue
做这个动作主要是Z在集环境中提示Weblogic Server session中的值发生了改变Q需要向其他服务器进E复制新的session倹{?br />
10、ؓ什么session不见?br />排除session正常失效的因素之外,服务器本w的可能性应该是微乎其微的,虽然W者在iPlanet6SP1加若q补丁的Solaris版本上倒也遇到q;览器插件的可能性次之,W者也遇到q?721插g造成的问题;理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题?br />出现q一问题的大部分原因都是E序的错误,最常见的就是在一个应用程序中去访问另外一个应用程序。我们在下一节讨个问题?br />
七、跨应用E序的session׃n

常常有这L情况Q一个大目被分割成若干项目开发,Z能够互不q扰Q要求每个小目作ؓ一个单独的web应用E序开发,可是C最后突然发现某几个项目之间需要共享一些信息,或者想使用session来实现SSO(single sign on)Q在session中保存login的用户信息,最自然的要求是应用E序间能够访问彼此的session?br />
然而按照Servlet规范Qsession的作用范围应该仅仅限于当前应用程序下Q不同的应用E序之间是不能够互相讉KҎ的session的。各个应用服务器从实际效果上都遵守了q一规范Q但是实现的l节却可能各有不同,因此解决跨应用程序session׃n的方法也各不相同?br />
首先来看一下Tomcat是如何实现web应用E序之间session的隔ȝQ从 Tomcat讄的cookie路径来看Q它对不同的应用E序讄的cookie路径是不同的Q这样不同的应用E序所用的session id是不同的Q因此即使在同一个浏览器H口里访问不同的应用E序Q发送给服务器的session id也可以是不同的?br />

image

Ҏq个Ҏ,我们可以推测Tomcat中session的内存结构大致如下?br />image

W者以前用q的iPlanet也采用的是同L方式Q估计SunONE与iPlanet之间不会有太大的差别。对于这U方式的服务器,解决的思\很简单,实际实行h也不难。要么让所有的应用E序׃n一个session idQ要么让应用E序能够获得其他应用E序的session id?br />
iPlanet中有一U很单的Ҏ来实现共享一个session idQ那是把各个应用程序的cookie路径都设?Q实际上应该?NASAppQ对于应用程序来讲它的作用相当于根)?br />
<session-info>
<path>/NASApp</path>
</session-info>


需要注意的是,操作׃n的session应该遵@一些编E约定,比如在session attribute名字的前面加上应用程序的前缀Q?setAttribute("name", "neo")变成setAttribute("app1.name", "neo")Q以防止命名I间冲突Q导致互相覆盖?br />
在Tomcat中则没有q么方便的选择。在Tomcat版本3上,我们q可以有一些手D|׃nsession。对于版?以上的TomcatQ目前笔者尚未发现简单的办法。只能借助于第三方的力量,比如使用文g、数据库、JMS或者客LcookieQURL参数或者隐藏字D늭手段?br />
我们再看一下Weblogic Server是如何处理session的?br />image
image

从截屏画面上可以看到Weblogic ServerҎ有的应用E序讄的cookie的\径都?Q这是不是意味着在Weblogic Server中默认的可以共享session了呢Q然而一个小实验卛_证明即不同的应用程序用的是同一个sessionQ各个应用程序仍然只能访问自己所讄的那些属性。这说明Weblogic Server中的session的内存结构可能如?br />image

对于q样一U结构,?session机制本n上来解决session׃n的问题应该是不可能的了。除了借助于第三方的力量,比如使用文g、数据库、JMS或者客L cookieQURL参数或者隐藏字D늭手段Q还有一U较为方便的做法Q就是把一个应用程序的session攑ֈServletContext中,q样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下,

应用E序A
context.setAttribute("appA", session); 


应用E序B
contextA = context.getContext("/appA");
HttpSession sessionA = (HttpSession)contextA.getAttribute("appA");


值得注意的是q种用法不可ULQ因为根据ServletContext的JavaDocQ应用服务器可以处于安全的原因对于context.getContext("/appA");q回I|以上做法在Weblogic Server 8.1中通过?br />
那么Weblogic ServerZ么要把所有的应用E序的cookie路径都设?呢?原来是ؓ了SSOQ凡是共享这个session的应用程序都可以׃n认证的信息。一个简单的实验可以证明这一点,修改首先d的那个应用程序的描述Wweblogic.xmlQ把cookie路径修改?appA 讉K另外一个应用程序会重新要求dQ即使是反过来,先访问cookie路径?的应用程序,再访问修改过路径的这个,虽然不再提示dQ但是登录的用户信息也会丢失。注意做q个实验时认证方式应该用FORMQ因为浏览器和web服务器对basic认证方式有其他的处理方式Q第二次h的认证不是通过 session来实现的。具体请参看[7] secion 14.8 AuthorizationQ你可以修改所附的CZE序来做q些试验?br />
八、ȝ
session机制本nq不复杂Q然而其实现和配|上的灵zL却使得具体情况复杂多变。这也要求我们不能把仅仅某一ơ的l验或者某一个浏览器Q服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析?br />摘要Q虽然session机制在web应用E序中被采用已经很长旉了,但是仍然有很多h不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制ƈ且对在Java web application中应用session机制时常见的问题作出解答?img src ="http://www.tkk7.com/konhon/aggbug/37153.html" width = "1" height = "1" />

konhon 优华 2006-03-24 10:35 发表评论
]]>
Servlet容器工作原理Q一Q?/title><link>http://www.tkk7.com/konhon/archive/2006/03/24/37134.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Fri, 24 Mar 2006 01:29:00 GMT</pubDate><guid>http://www.tkk7.com/konhon/archive/2006/03/24/37134.html</guid><wfw:comment>http://www.tkk7.com/konhon/comments/37134.html</wfw:comment><comments>http://www.tkk7.com/konhon/archive/2006/03/24/37134.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/konhon/comments/commentRss/37134.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/konhon/services/trackbacks/37134.html</trackback:ping><description><![CDATA[<em>~者注:本文和同pd的前面一文“基于Java的Web服务器工作原理”,都摘自“Tomcat q行内幕”一书(一本有?Tomcat 的教E)。在阅读本文前,最好先阅读前文Q以巩固基础信息。在此,介l如何徏立两?servlet 容器?随附本书的应用程序可以下?Q如果您有兴,可以在近D|间内?作者网?下蝲</em>?br /><br />  本文介绍一个简?servlet 容器的基本原理。现有两?servlet 容器Q第一个很单,W二个则是根据第一个写出。ؓ了ɽW一个容器尽量简单,所以没有做得很完整。复杂一些的 servlet 容器 Q包?TOMCAT 4 ?5Q??TOMCAT q行内幕的其他章节有介绍?<br /><br />  两个 servlet 容器都处理简单的 servlet ?staticResource 。您可以使用 webroot/ 目录下的 PrimitiveServlet 来测试它。复杂一些的 servlet会超些容器的定wQ您可以?TOMCAT  q行内幕 一书学习创建复杂的 servlet 容器?<br /><br />  两个应用E序的类都封装在ex02.pyrmont 包下。在理解应用E序如何q作之前Q您必须熟悉 javax.servlet.Servlet 接口。首先就来介l这个接口。随后,׃l?servlet 容器服务servlet 的具体内宏V?br /><br /><br />  <b>javax.servlet.Servlet 接口</b><br /><br />  servlet ~程Q需要引用以下两个类和接口:javax.servlet ?javax.servlet.httpQ在q些cd接口中,javax.servlet.Servlet接口ؓ重要。所有的 servlet 必须实现q个接口或承已实现q个接口的类?br />  Servlet 接口有五个方法,如下Q?br /><br /><pre class="overflow">&#8226; public void init(ServletConfig config) throws ServletException<br />&#8226; public void service(ServletRequest request, ServletResponse response)  throws ServletException, java.io.IOException<br />&#8226; public void destroy()<br />&#8226; public ServletConfig getServletConfig()<br />&#8226; public java.lang.String getServletInfo()</pre><br /><br />  init、service?destroy  Ҏ?Servlet 生命周期的方法。当 Servlet cd例化后,容器加蝲 initQ以通知 servlet 它已q入服务行列。init Ҏ必须被加载,Servelt 才能接收和请求。如果要载入数据库驱动程序、初始化一些值等{,E序员可以重写这个方法。在其他情况下,q个Ҏ一般ؓI?br /><br />  service Ҏ?Servlet 容器调用Q以允许 Servlet 响应一个请求。Servlet 容器传?javax.servlet.ServletRequest 对象?javax.servlet.ServletResponse 对象。ServletRequest 对象包含客户?HTTP h信息QServletResponse 则封装servlet 响应。这两个对象Q您可以写一些需?servlet 怎样服务和客h样h的代码?<br /><br />  ?service 中删?Servlet 实例之前Q容器调?destroy Ҏ。在 servlet 容器关闭或servlet 容器需要更多的内存Ӟp用它。这个方法只有在servlet 的service Ҏ内的所有线E都退出的时候,或在时的时候才会被调用。在 servlet 容器调用 destroyҎ之后Q它不再调?servlet?serviceҎ。destroy Ҏl了 servlet ZQ来清除所有候住的资源(比如Q内存,文g处理和线E)Q以保在内存中所有的持箋状态和 servlet的当前状态是同步的。Listing 2.1 包含了PrimitiveServlet 的代码,此servlet非常单,?可以用它来测试本文中?servlet 容器应用E序?br /><br />  PrimitiveServlet cdCjavax.servlet.Servlet q提供了五个servletҎ的接?。它做的事情也很单:每次调用 init,service ?destroyҎ的时候,servlet向控制口写入方法名。service Ҏ也从ServletResponsec对象中获得java.io.PrintWriter 对象Qƈ发送字W串到浏览器?br /><br /><pre class="overflow">Listing 2.1.PrimitiveServlet.java<br />import javax.servlet.*;<br />import java.io.IOException;<br />import java.io.PrintWriter;<br /><br />public class PrimitiveServlet implements Servlet {<br />    public void init(ServletConfig config) throws ServletException {<br />        System.out.println("init");<br />    }<br /><br />    public void service(ServletRequest request, ServletResponse  response) throws ServletException, IOException {<br />        System.out.println("from service");<br />        PrintWriter out = response.getWriter();<br />        out.println("Hello.Roses are red.");<br />        out.print("Violets are blue.");<br />    }<br /><br />    public void destroy() {<br />        System.out.println("destroy");<br />    }<br /><br />    public String getServletInfo() {<br />        return null;<br />    }<br /><br />    public ServletConfig getServletConfig() {<br />        return null;<br />    }<br />}</pre><br /><br /><br />  <b>Application 1</b><br /><br />  现在Q我们从 servlet容器的角度来看看 servlet ~程。一个功能健全的 servlet容器对于每个 servlet ?HTTPh会完成以下事情:<br /><br />&#8226; ?servlet W一ơ被调用的时候,加蝲?servletcdƈ调用它的initҎQ仅调用一ơ) <br />&#8226; 响应每次h的时?Q构Z个javax.servlet.ServletRequest ?javax.servlet.ServletResponse实例?br />&#8226; Ȁz?servlet ?service ҎQ传?ServletRequest ?ServletResponse 对象?<br />&#8226; ?servlet cd闭的时候,调用 servlet 的destroy ҎQƈ卸蝲 servlet cR?<br /><br />  发生?servlet 容器内部的事复杂多了。只是这个简单的 servlet 容器的功能不很健全,所以,q它只能q行非常单的servelt Qƈ不能调用 servlet ?init 和destroy Ҏ。然而,它也执行了以下动作:<br /><br />&#8226; {待  HTTP h?<br />&#8226; 构徏 ServletRequest 和  ServletResponse 对象  <br />&#8226; 如果h的是一个staticResourceQ就会激zStaticResourceProcessor实例?processҎQ传递ServletRequest ?ServletResponse 对象?<br />&#8226; 如果h的是一个servlet ,载入该类QƈȀzd的service ҎQ传递ServletRequest 和ServletResponse 对象。注意:在这个servlet 容器Q每?servlet被请求的时候该cd被蝲入?<br /><br />  在第一个应用程序中Qservlet容器由六个类l成 ?br /><br />&#8226; HttpServer1 <br />&#8226; Request <br />&#8226; Response <br />&#8226; StaticResourceProcessor <br />&#8226; ServletProcessor1 <br />&#8226; Constants <br /><br />  正如前文中的应用E序一Pq个E序的进入口Q静?main ҎQ是HttpServer cR这个方法创ZHttpServer实例Qƈ调用它的awaitҎ。这个方法等?HTTP LQ然后创Z?request 对象?response对象Q根据请求是否是staticResourceq是 servlet 来分z֮们到 StaticResourceProcessor实例或ServletProcessor实例?br /><br />  Constants cd?static find WEB_ROOTQ它是从其他cd用的?WEB_ROOT 指明 PrimitiveServlet 位置 和容器服务的staticResource?br />HttpServer1 实例{待 HTTP hQ直到它收到一?shutdown 命o。发?shutdown命o和前文是一L?br /><br />  q个应用E序中的每一个类在下节介绍?br /><img src ="http://www.tkk7.com/konhon/aggbug/37134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/konhon/" target="_blank">konhon 优华</a> 2006-03-24 09:29 <a href="http://www.tkk7.com/konhon/archive/2006/03/24/37134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库ؕ码解x?/title><link>http://www.tkk7.com/konhon/archive/2006/03/23/36961.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Thu, 23 Mar 2006 00:06:00 GMT</pubDate><guid>http://www.tkk7.com/konhon/archive/2006/03/23/36961.html</guid><wfw:comment>http://www.tkk7.com/konhon/comments/36961.html</wfw:comment><comments>http://www.tkk7.com/konhon/archive/2006/03/23/36961.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/konhon/comments/commentRss/36961.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/konhon/services/trackbacks/36961.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #000000">你插入数据的时候,?br /><img id="Codehighlighter1_11_52_Open_Image" onclick="this.style.display='none'; Codehighlighter1_11_52_Open_Text.style.display='none'; Codehighlighter1_11_52_Closed_Image.style.display='inline'; Codehighlighter1_11_52_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_11_52_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_11_52_Closed_Text.style.display='none'; Codehighlighter1_11_52_Open_Image.style.display='inline'; Codehighlighter1_11_52_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span> <span id="Codehighlighter1_11_52_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span> <span id="Codehighlighter1_11_52_Open_Text"> <span style="COLOR: #008000">/**</span> <span style="COLOR: #008000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />* 转变字符串的q函数<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />* </span> <span style="COLOR: #808080">@param</span> <span style="COLOR: #008000"> str<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />* </span> <span style="COLOR: #808080">@return</span> <span style="COLOR: #008000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span> <span style="COLOR: #008000">*/</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> String getStr(String str)<br /><img id="Codehighlighter1_87_248_Open_Image" onclick="this.style.display='none'; Codehighlighter1_87_248_Open_Text.style.display='none'; Codehighlighter1_87_248_Closed_Image.style.display='inline'; Codehighlighter1_87_248_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_87_248_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_87_248_Closed_Text.style.display='none'; Codehighlighter1_87_248_Open_Image.style.display='inline'; Codehighlighter1_87_248_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span> <span id="Codehighlighter1_87_248_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.tkk7.com/images/dot.gif" /> </span> <span id="Codehighlighter1_87_248_Open_Text"> <span style="COLOR: #000000">{<br /><img id="Codehighlighter1_92_209_Open_Image" onclick="this.style.display='none'; Codehighlighter1_92_209_Open_Text.style.display='none'; Codehighlighter1_92_209_Closed_Image.style.display='inline'; Codehighlighter1_92_209_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_92_209_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_92_209_Closed_Text.style.display='none'; Codehighlighter1_92_209_Open_Image.style.display='inline'; Codehighlighter1_92_209_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span> <span style="COLOR: #0000ff">try</span> <span id="Codehighlighter1_92_209_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.tkk7.com/images/dot.gif" /> </span> <span id="Codehighlighter1_92_209_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />String temp_p </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> str;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span> <span style="COLOR: #0000ff">byte</span> <span style="COLOR: #000000"> [] temp_t </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> temp_p.getBytes(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">ISO8859-1</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />String temp </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> String(temp_t);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> temp;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img id="Codehighlighter1_229_246_Open_Image" onclick="this.style.display='none'; Codehighlighter1_229_246_Open_Text.style.display='none'; Codehighlighter1_229_246_Closed_Image.style.display='inline'; Codehighlighter1_229_246_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /> <img id="Codehighlighter1_229_246_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_229_246_Closed_Text.style.display='none'; Codehighlighter1_229_246_Open_Image.style.display='inline'; Codehighlighter1_229_246_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">catch</span> <span style="COLOR: #000000">(Exception e)</span> <span id="Codehighlighter1_229_246_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.tkk7.com/images/dot.gif" /> </span> <span id="Codehighlighter1_229_246_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">null</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">向bean里面赋?/span> <span style="COLOR: #008000"> <br /> <img id="Codehighlighter1_300_332_Open_Image" onclick="this.style.display='none'; Codehighlighter1_300_332_Open_Text.style.display='none'; Codehighlighter1_300_332_Closed_Image.style.display='inline'; Codehighlighter1_300_332_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_300_332_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_300_332_Closed_Text.style.display='none'; Codehighlighter1_300_332_Open_Image.style.display='inline'; Codehighlighter1_300_332_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000"> setAction(String action) </span> <span id="Codehighlighter1_300_332_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.tkk7.com/images/dot.gif" /> </span> <span id="Codehighlighter1_300_332_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span> <span style="COLOR: #0000ff">this</span> <span style="COLOR: #000000">.action </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> getStr(action);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <br /> <img id="Codehighlighter1_384_428_Open_Image" onclick="this.style.display='none'; Codehighlighter1_384_428_Open_Text.style.display='none'; Codehighlighter1_384_428_Closed_Image.style.display='inline'; Codehighlighter1_384_428_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_384_428_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_384_428_Closed_Text.style.display='none'; Codehighlighter1_384_428_Open_Image.style.display='inline'; Codehighlighter1_384_428_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000"> setAddmanagerid(String addmanagerid) </span> <span id="Codehighlighter1_384_428_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.tkk7.com/images/dot.gif" /> </span> <span id="Codehighlighter1_384_428_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span> <span style="COLOR: #0000ff">this</span> <span style="COLOR: #000000">.addmanagerid </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> getStr(addmanagerid);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />转换一下,看看可以吗,我的数据库是ORACLE没问题?/span> </div><img src ="http://www.tkk7.com/konhon/aggbug/36961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/konhon/" target="_blank">konhon 优华</a> 2006-03-23 08:06 <a href="http://www.tkk7.com/konhon/archive/2006/03/23/36961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java~程电子书籍下蝲 http://www.tkk7.com/konhon/archive/2006/03/21/36685.htmlkonhon 优华konhon 优华Tue, 21 Mar 2006 12:27:00 GMThttp://www.tkk7.com/konhon/archive/2006/03/21/36685.htmlhttp://www.tkk7.com/konhon/comments/36685.htmlhttp://www.tkk7.com/konhon/archive/2006/03/21/36685.html#Feedback0http://www.tkk7.com/konhon/comments/commentRss/36685.htmlhttp://www.tkk7.com/konhon/services/trackbacks/36685.htmlJava~程电子书籍下蝲


环境安装配置Q?br />
TOMCAT的配|?br />http://download.chinaitlab.com/soft/10791.htm

JAVA配置文g~写说明文
http://download.chinaitlab.com/soft/10010.htm

一步一步学会配|Kjava开发环?br />http://download.chinaitlab.com/soft/9483.htm

Weblogic7开发EJB的配|?br />http://download.chinaitlab.com/soft/4938.htm

图解JSP环境安装配置
http://download.chinaitlab.com/soft/2157.htm

Tomcat配置Ҏ
http://download.chinaitlab.com/soft/931.htm

全程指导Linux下JAVA环境配置
http://download.chinaitlab.com/soft/11272.htm

学习ҎQ?br />
通过JB4学习JAVA
http://download.chinaitlab.com/soft/7589.htm

10步学?JavaScript
http://download.chinaitlab.com/soft/6492.htm

Java Sctipt学习不求?br />http://download.chinaitlab.com/soft/6361.htm

JSP学习指南
http://download.chinaitlab.com/soft/6152.htm

JAVA学习文
http://download.chinaitlab.com/soft/6114.htm

J2EE学习W记
http://download.chinaitlab.com/soft/6048.htm

JavaScript学习
http://download.chinaitlab.com/soft/3029.htm

Java2 学习指南
http://download.chinaitlab.com/soft/2743.htm

Juniper学习指南
http://download.chinaitlab.com/soft/2227.htm

J2EE学习资料
http://download.chinaitlab.com/soft/1618.htm

JSP由浅入深
http://download.chinaitlab.com/soft/1315.htm

面向对象~程Q?br />
Java面向对象~程指南
http://download.chinaitlab.com/soft/9792.htm

JAVA的核心技术:面向对象~程
http://download.chinaitlab.com/soft/9093.htm

Java ?UML 面向对象E序设计
http://download.chinaitlab.com/soft/6053.htm

Java 2 ~程21天自学?br />http://download.chinaitlab.com/soft/10507.htm

J2EE~程h
http://download.chinaitlab.com/soft/10506.htm

Java面向对象~程指南
http://download.chinaitlab.com/soft/9792.htm

Java专业~程指南
http://download.chinaitlab.com/soft/9791.htm

Java服务器高U编E?br />http://download.chinaitlab.com/soft/9790.htm

J2EE EAI~程指南
http://download.chinaitlab.com/soft/9784.htm

J2MEMIDP无线讑֤~程指南
http://download.chinaitlab.com/soft/9765.htm

JAVA~程思想 中文?br />http://download.chinaitlab.com/soft/9481.htm

Java XML~程指南
http://download.chinaitlab.com/soft/9097.htm

Java 数据库编E宝?br />http://download.chinaitlab.com/soft/9095.htm

JAVA的核心技术:面向对象~程
http://download.chinaitlab.com/soft/9093.htm

JDBC API数据库编E实作教?br />http://download.chinaitlab.com/soft/9087.htm

核心 JSF ~程
http://download.chinaitlab.com/soft/7946.htm

JAVA 2应用~程150?br />http://download.chinaitlab.com/soft/6815.htm

JAVA数据库编EJDBC
http://download.chinaitlab.com/soft/6113.htm

深入掌握J2EE~程技?br />http://download.chinaitlab.com/soft/6030.htm

实用J2EE设计模式~程指南
http://download.chinaitlab.com/soft/5033.htm

Java for Internet~程技?br />http://download.chinaitlab.com/soft/4198.htm

Java安全性编E指?br />http://download.chinaitlab.com/soft/3773.htm

J2ME无线讑֤~程
http://download.chinaitlab.com/soft/3669.htm

J2EE EJB~程实例
http://download.chinaitlab.com/soft/3141.htm

Java~程思想 W三?br />http://download.chinaitlab.com/soft/2982.htm

Java 极限~程
http://download.chinaitlab.com/soft/1707.htm

Java2~程详解
http://download.chinaitlab.com/soft/1705.htm


|络~程Q?br />
J2EE|络~程标准教程
http://download.chinaitlab.com/soft/9100.htm

Java|络~程实例
http://download.chinaitlab.com/soft/9090.htm

Java P2P|络~程技?br />http://download.chinaitlab.com/soft/6333.htm

Java|络~程
http://download.chinaitlab.com/soft/3871.htm

|络~程基础之 Java Script
http://download.chinaitlab.com/soft/3618.htm

Solaris Shell ~程
http://download.chinaitlab.com/soft/6426.htm

SUN Solaris理手册
http://download.chinaitlab.com/soft/5732.htm

Solaris性能理
http://download.chinaitlab.com/soft/11247.htm

Solaris9安装指南
http://download.chinaitlab.com/soft/5022.htm

SOLARIS高pȝ理员指?br />http://download.chinaitlab.com/soft/3726.htm

Solaris操作环境安全
http://download.chinaitlab.com/soft/1500.htm

Solaris GNOME2.0桌面用户指南
http://download.chinaitlab.com/soft/1488.htm

Solaris 9 12/03 安装指南
http://download.chinaitlab.com/soft/1484.htm

Solaris理员指?br />http://download.chinaitlab.com/soft/1475.htm

中文Solaris9 pȝ理员指?br />http://download.chinaitlab.com/soft/1463.htm

Solaris安全性专题指?br />http://download.chinaitlab.com/soft/746.htm


XMLpdQ?br />
Java XML~程指南
http://download.chinaitlab.com/soft/9097.htm

JavaE序设计EJB、XML与数据库
http://download.chinaitlab.com/soft/9094.htm

XML l极教程
http://download.chinaitlab.com/soft/9057.htm

Java&XML应用
http://download.chinaitlab.com/soft/6211.htm

XML_JAVA指南
http://download.chinaitlab.com/soft/6163.htm

JDBCQ?br />
JDBC API数据库编E实作教?br />http://download.chinaitlab.com/soft/9087.htm

JAVA数据库编EJDBC
http://download.chinaitlab.com/soft/6113.htm

JDBC API 参考教E第三版
http://download.chinaitlab.com/soft/6057.htm

JDBC与Java数据库程序设?br />http://download.chinaitlab.com/soft/6018.htm

Java语言SQL接口 JDBCprogram
http://download.chinaitlab.com/soft/5938.htm

JSP应用E序开发指?br />http://download.chinaitlab.com/soft/1546.htm

?JDBC 理数据库连?br />http://download.chinaitlab.com/soft/935.htm

JDOQ?br />
全面了解JDO数据库编E?br />http://download.chinaitlab.com/soft/7992.htm

StrutsQ?br />
Struts中文手册
http://download.chinaitlab.com/soft/10516.htm

Struts架构指导
http://download.chinaitlab.com/soft/7529.htm

_Nstruts技?br />http://download.chinaitlab.com/soft/6801.htm

Struts 学习h问答
http://download.chinaitlab.com/soft/6156.htm

HibernateQ?br />
Hibernate2.1.2参考手册中文版
http://download.chinaitlab.com/soft/8919.htm



JAVA与模式\J2EE模式Q?br />
J2EE 核心模式
http://download.chinaitlab.com/soft/9785.htm

Java 企业设计模式
http://download.chinaitlab.com/soft/9096.htm

Java单工厂创立性模式介l?br />http://download.chinaitlab.com/soft/7398.htm

EJB设计模式
http://download.chinaitlab.com/soft/6135.htm

JAVA设计模式
http://download.chinaitlab.com/soft/6112.htm

实用J2EE设计模式~程指南
http://download.chinaitlab.com/soft/5033.htm

Java与模?br />http://download.chinaitlab.com/soft/3073.htm

设计模式Java?br />http://download.chinaitlab.com/soft/1723.htm


JBuilder开发Servlet及JSPQ?br />
_NJBuilder
http://download.chinaitlab.com/soft/10565.htm

JBuilder速成资料
http://download.chinaitlab.com/soft/9714.htm

Jbuilder7和weblogic7整合开发手
http://download.chinaitlab.com/soft/9664.htm

JBUILDER9 软g开发项目实?br />http://download.chinaitlab.com/soft/9089.htm

JbuilderX开发指?br />http://download.chinaitlab.com/soft/9088.htm

Jbuilder x 指南
http://download.chinaitlab.com/soft/7984.htm

JBuilder4开发h员指?br />http://download.chinaitlab.com/soft/5939.htm

JBuilder7 Weblogic7整和开发培训手?br />http://download.chinaitlab.com/soft/4727.htm

JBuilder开发数据库应用E序
http://download.chinaitlab.com/soft/1701.htm

Java开发指?-Servlets和JSP?br />http://download.chinaitlab.com/soft/9793.htm

Java Servlets ~程指南
http://download.chinaitlab.com/soft/9098.htm

Oreilly Java Servlet
http://download.chinaitlab.com/soft/6522.htm

Java Servlet开发与实例
http://download.chinaitlab.com/soft/6029.htm

深入Java Servlet |络~程
http://download.chinaitlab.com/soft/9783.htm

用JSP_Servlet构徏三层式管理信息系l?br />http://download.chinaitlab.com/soft/6034.htm

Java Servlet帮助文
http://download.chinaitlab.com/soft/2981.htm

JSP|站~程教程
http://download.chinaitlab.com/soft/11256.htm

JSP语法分析
http://download.chinaitlab.com/soft/11257.htm

JSP实用教程
http://download.chinaitlab.com/soft/10792.htm

JSP语法Q?Q?-HTML注释
http://download.chinaitlab.com/soft/10790.htm

JSP应用开发详?br />http://download.chinaitlab.com/soft/10025.htm

JSP技术揭U?br />http://download.chinaitlab.com/soft/9387.htm

JSP技术大?br />http://download.chinaitlab.com/soft/9388.htm

JSP|上书店实例详解
http://download.chinaitlab.com/soft/9386.htm

JSP动态网|技?br />http://download.chinaitlab.com/soft/8920.htm

JSP 技术大?br />http://download.chinaitlab.com/soft/7782.htm

JSP高开发与应用
http://download.chinaitlab.com/soft/7633.htm

JSP 完全探烦
http://download.chinaitlab.com/soft/7546.htm

JSP 高开发与应用
http://download.chinaitlab.com/soft/7116.htm

JSP~程技?br />http://download.chinaitlab.com/soft/7114.htm

JSP速成教程
http://download.chinaitlab.com/soft/6882.htm

JSP|络~程技?br />http://download.chinaitlab.com/soft/6880.htm

JSPE序设计指南
http://download.chinaitlab.com/soft/6690.htm

最新JSP入门与应?br />http://download.chinaitlab.com/soft/6697.htm

JSP快速入?br />http://download.chinaitlab.com/soft/6636.htm

JSP|页~程
http://download.chinaitlab.com/soft/6527.htm

JSP 实用教程
http://download.chinaitlab.com/soft/6334.htm

JSP入门与提?br />http://download.chinaitlab.com/soft/6326.htm

JSP语法
http://download.chinaitlab.com/soft/6116.htm

掌握自定义JSP标签
http://download.chinaitlab.com/soft/6096.htm

JSP 动态网站技术入门与提高
http://download.chinaitlab.com/soft/6019.htm

JSP实例入门
http://download.chinaitlab.com/soft/4377.htm

JSP教程之与数据库通信
http://download.chinaitlab.com/soft/3673.htm

如何成ؓ优秀的JSP E序?br />http://download.chinaitlab.com/soft/3002.htm

JSP数据库编E指?br />http://download.chinaitlab.com/soft/2946.htm

JSP 高~程
http://download.chinaitlab.com/soft/2635.htm

JSP实用~程实例集锦
http://download.chinaitlab.com/soft/2154.htm

JSPE序设计_ֽ实例
http://download.chinaitlab.com/soft/2151.htm

JSPx应用
http://download.chinaitlab.com/soft/1547.htm

JSPE序设计_ֽ实例
http://download.chinaitlab.com/soft/1543.htm

JSP实用~程实例集锦
http://download.chinaitlab.com/soft/1537.htm

JSP基础
http://download.chinaitlab.com/soft/894.htm

Eclipse开发Servlet及JSPQ?br />
Eclipse+Tomcat集成开发servle
http://download.chinaitlab.com/soft/6134.htm

J2EE Jboss Ejb With Eclipse 2003
http://download.chinaitlab.com/soft/6045.htm

konhon 优华 2006-03-21 20:27 发表评论
]]>
如何q行后缀不是jsp的jsp文gQ?/title><link>http://www.tkk7.com/konhon/archive/2006/03/21/36674.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Tue, 21 Mar 2006 10:37:00 GMT</pubDate><guid>http://www.tkk7.com/konhon/archive/2006/03/21/36674.html</guid><wfw:comment>http://www.tkk7.com/konhon/comments/36674.html</wfw:comment><comments>http://www.tkk7.com/konhon/archive/2006/03/21/36674.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/konhon/comments/commentRss/36674.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/konhon/services/trackbacks/36674.html</trackback:ping><description><![CDATA[<p>需要在你的web.xml中定义如下:</p> <p>    <servlet><br />        <servlet-name>jsp</servlet-name><br />        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class><br />        <init-param><br />            <param-name>fork</param-name><br />            <param-value>false</param-value><br />        </init-param><br />        <init-param><br />            <param-name>xpoweredBy</param-name><br />            <param-value>false</param-value><br />        </init-param><br />        <load-on-startup>3</load-on-startup><br />    </servlet></p> <p>    <servlet-mapping><br />        <servlet-name>jsp</servlet-name><br />        <url-pattern>*.jsm</url-pattern><br />    </servlet-mapping><br /></p><img src ="http://www.tkk7.com/konhon/aggbug/36674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/konhon/" target="_blank">konhon 优华</a> 2006-03-21 18:37 <a href="http://www.tkk7.com/konhon/archive/2006/03/21/36674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat 默認首頁http://www.tkk7.com/konhon/archive/2006/03/21/36592.htmlkonhon 优华konhon 优华Tue, 21 Mar 2006 03:42:00 GMThttp://www.tkk7.com/konhon/archive/2006/03/21/36592.htmlhttp://www.tkk7.com/konhon/comments/36592.htmlhttp://www.tkk7.com/konhon/archive/2006/03/21/36592.html#Feedback0http://www.tkk7.com/konhon/comments/commentRss/36592.htmlhttp://www.tkk7.com/konhon/services/trackbacks/36592.html我想用tomcat作ؓ服务器 ?br />键入http://127.0.0.1显C我在  e:/mysite/  下的index.jsp文g  
而不是诸如 ?a target="_blank">http://127.0.0.1/site/  
请问如何讄  
---------------------------------------------------------------  
 
?步:  
   1  把你的tomcat端口改ؓ80  
   2。把你的文g攑ֈwebapps目录下的ROOT目录下,最好先把原来的文g备䆾一下,再删除 ?br />         或者做个在tomcat上做虚拟LQ目录就可以随便设 ?br />---------------------------------------------------------------  
 
修改  
tomcat_home/conf/server.xml  
 
 ?br /><Connector  className="org.apache.coyote.tomcat4.CoyoteConnector"  port="8080"  minProcessors="5"  maxProcessors="75"  enableLookups="true"  redirectPort="8443"  acceptCount="100"  debug="0"  connectionTimeout="20000"  useURIValidationHack="false"  disableUploadTimeout="true"/>  
 
這裡面的8080Ҏ80  
 
 
d  
<Context  path=""  docBase="e:/mysite/"  
               debug="0"  privileged="true">  
</Context>刊W?br /></host>  
之前。 ?br />

konhon 优华 2006-03-21 11:42 发表评论
]]>
J2EE面试题集?/title><link>http://www.tkk7.com/konhon/archive/2006/03/14/35163.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Tue, 14 Mar 2006 00:35:00 GMT</pubDate><guid>http://www.tkk7.com/konhon/archive/2006/03/14/35163.html</guid><wfw:comment>http://www.tkk7.com/konhon/comments/35163.html</wfw:comment><comments>http://www.tkk7.com/konhon/archive/2006/03/14/35163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/konhon/comments/commentRss/35163.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/konhon/services/trackbacks/35163.html</trackback:ping><description><![CDATA[<P>/**<BR> * By metaphy 2005-11-12<BR> * Version: 0.01<BR> * ?题目{案来源于metaphyq去的知识或|络,metaphy不能保证其正或完整?仅供参?BR>**/</P> <P><STRONG>一、基问答</STRONG></P> <P>  <STRONG>1.下面哪些cd以被l承?</STRONG></P> <P>   java.lang.Thread (T)<BR>   java.lang.Number (T)<BR>   java.lang.Double (F)<BR>   java.lang.Math  (F)<BR>   java.lang.Void  (F)<BR>   java.lang.Class  (F)<BR>   java.lang.ClassLoader (T)</P> <P>  <STRONG>2.抽象cd接口的区?/STRONG></P> <P>  (1)接口可以被多重implements,抽象cd能被单一extends<BR>  (2)接口只有定义,抽象cd以有定义和实?BR>  (3)接口的字D定义默认ؓ:public static final, 抽象cdD默认是"friendly"(本包可见)</P> <P>  <STRONG>3.Hashtable的原?q说出HashMap与Hashtable的区?/STRONG></P> <P>  HashTable的原?通过节点的关键码定节点的存储位|?即给定节点的关键码k,通过一定的函数关系H(散列函数),得到函数值H(k),此D释ؓ该节点的存储地址.<BR>HashMap 与Hashtable很相?但HashMap 是非同步(unsynchronizded)和可以以null为关键码?</P> <P>  <STRONG>4.forward和redirect的区?/STRONG></P> <P>  forward: an internal transfer in servlet<BR>  redirect: 重定??ơrequest,W?ơrequest丢q一ơ的attributs/parameters{?/P> <P>  <STRONG>5.什么是Web容器?</STRONG></P> <P>  实现J2EE规范中web协议的应?该协议定义了webE序的运行时环境,包括:q发?安全?生命周期理{等.</P> <P>  6.解释下面关于J2EE的名?/P> <P>  (1)JNDI:Java Naming & Directory Interface,JAVA命名目录服务.主要提供的功能是Q提供一个目录系l,让其它各地的应用E序在其上面留下自己的烦引,从而满_速查扑֒定位分布式应用程序的功能.<BR>  (2)JMSQJava Message Service,JAVA消息服务.主要实现各个应用E序之间的通讯.包括点对点和q播.<BR>  (3)JTAQJava Transaction API,JAVA事务服务.提供各种分布式事务服?应用E序只需调用其提供的接口卛_.<BR>  (4)JAF: <A title=Java HREF="/konhon/category/3016.html" target=_blank><a title="Java" href="http://www.tkk7.com/konhon/category/3016.html" target="_blank">Java</a></A> Action FrameWork,JAVA安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部v和自定义实现自己的个性安全控制策?<BR>  (5)RMI:Remote Method Interface,q程Ҏ调用</P> <P>  <STRONG>7.EJB是基于哪些技术实现的Qƈ?出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区?</STRONG></P> <P>  EJB包括Session Bean、Entity Bean、Message Driven BeanQ基于JNDI、RMI、JAT{技术实?</P> <P>  SessionBean在J2EE应用E序中被用来完成一些服务器端的业务操作Q例如访问数据库、调用其他EJBlg.EntityBean被用来代表应用系l中用到的数?对于客户机,SessionBean是一U非持久性对象,它实现某些在服务器上q行的业务逻辑;EntityBean是一U持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用E序实现的实?</P> <P>  Session Bean q可以再l分?Stateful Session Bean ?Stateless Session Bean .q两U的 Session Bean都可以将pȝ逻辑攑֜ method之中执行Q不同的?Stateful Session Bean 可以记录呼叫者的状态,因此通常来说Q一个用者会有一个相对应?Stateful Session Bean 的实?Stateless Session Bean 虽然也是逻辑lgQ但是他却不负责记录使用者状态,也就是说当用者呼?Stateless Session Bean 的时候,EJB Container q不会找ȝ定的 Stateless Session Bean 的实体来执行q个 method.换言之,很可能数个用者在执行某个 Stateless Session Bean ?methods Ӟ会是同一?Bean ?Instance 在执?从内存方面来看, Stateful Session Bean ?Stateless Session Bean 比较Q?Stateful Session Bean 会消?J2EE Server 较多的内存,然?Stateful Session Bean 的优势却在于他可以维持用者的状?</P> <P>  <STRONG>8.XML的解析方?/STRONG></P> <P>  Sax,DOM,JDOM</P> <P>  <STRONG>9.什么是Web Service?</STRONG></P> <P>  Web Service是Z使原来各孤立的站点之间的信息能够怺通信、共享而提出的一U接口?BR>Web Service所使用的是Internet上统一、开攄标准Q如HTTP、XML、SOAPQ简单对象访问协议)、WSDL{,所以Web Service可以在Q何支持这些标准的环境QWindows,LinuxQ中使用?/P> <P>  注:SOAP协议QSimple Object Access Protocal,单对象访问协议),它是一个用于分散和分布式环境下|络信息交换的基于XML的通讯协议。在此协议下QY件组件或应用E序能够通过标准的HTTP协议q行通讯。它的设计目标就是简单性和扩展性,q有助于大量异构E序和^C间的互操作性,从而存在的应用程序能够被q泛的用戯问?/P> <P>  优势Q?/P> <P>  (1).跨^台?BR>  (2).SOAP协议是基于XML和HTTPq些业界的标准的Q得C所有的重要公司的支持?BR>  (3).׃使用了SOAPQ数据是以ASCII文本的方式而非二进制传输,调试很方便;q且׃q样Q它的数据容易通过防火墙,不需要防火墙ZE序而单独开一个“漏z”?BR>  (4).此外QWebService实现的技术难度要比CORBA和DCOM得多?BR>  (5).要实现B2B集成QEDI比较完善与比较复杂;而用WebService则可以低成本的实玎ͼ公怹可以用上?BR>  (6).在C/S的程序中QWebService可以实现|页无整体刷新的与服务器打交道ƈ取数?/P> <P>  ~点Q?/P> <P>  (1).WebService使用了XMLҎ据封装,会造成大量的数据要在网l中传输?BR>  (2).WebService规范没有规定M与实现相关的l节Q包括对象模型、编E语aQ这一点,它不如CORBA?/P> <P>  <STRONG>10.多线E有几种实现Ҏ,都是什?同步有几U实现方?都是什?</STRONG></P> <P>  {:多线E有两种实现ҎQ分别是l承ThreadcM实现Runnable接口<BR>  同步的实现方面有两种Q分别是synchronized,wait与notify</P> <P>  <STRONG>11.JSP中动态INCLUDE与静态INCLUDE的区别?</STRONG> </P> <P>  动态INCLUDE用jsp:include动作实现</P> <P><jsp:include page="included.jsp" flush="true"/></P> <P>  它L会检查所含文件中的变化,适合用于包含动态页面,q且可以带参?/P> <P>  静态INCLUDE用include伪码实现,定不会检查所含文件的变化Q适用于包含静态页?/P> <P>  <%@ include file="included.htm" %></P><img src ="http://www.tkk7.com/konhon/aggbug/35163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/konhon/" target="_blank">konhon 优华</a> 2006-03-14 08:35 <a href="http://www.tkk7.com/konhon/archive/2006/03/14/35163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何直接在浏览器内运行SQL命ohttp://www.tkk7.com/konhon/archive/2006/03/13/35045.htmlkonhon 优华konhon 优华Mon, 13 Mar 2006 07:30:00 GMThttp://www.tkk7.com/konhon/archive/2006/03/13/35045.htmlhttp://www.tkk7.com/konhon/comments/35045.htmlhttp://www.tkk7.com/konhon/archive/2006/03/13/35045.html#Feedback0http://www.tkk7.com/konhon/comments/commentRss/35045.htmlhttp://www.tkk7.com/konhon/services/trackbacks/35045.html
  如果你正在用ISPQInternet Service ProviderQ提供的数据库,可能已经熟悉SQL|关应用的概念了。有的ISP会提供一个操作数据库的HTML面Q就象本文提供的|关应用一栗如果ISP没有提供q样的界面,你可以把本文的程序上载到服务器,以后要访问ISP服务器上的数据库很方便了?

  SQL|关应用不仅可以用于开发过E,而且q可以直接提供给比较熟悉pȝ的最l用户用。当Ӟ允许最l用L接在数据库上q行SQL命o会带来一些安全隐患,应当慎重考虑?

  本文要求读者具备一定的Java、Servlet、JSP和数据库的基知识Q如果要q行本文的程序,q要有一个Servlet/JSP服务器和数据库服务器。在下面的说明中Q我们要使用的是Tomcat 4.0和MySQLQ但它应该也能在其他JSP/Servlet容器中运行;如果你要改用MySQL之外的其他数据库Q只要提供一个适当的驱动程序,然后修改数据库连接字W串可以了?

  一、用L?/B>

  ?是本文SQL|关的用L面。在q个界面中,SQL|关已经执行了一条SQL命oq返回了l果?



?QSQL|关的用L?


  从图1可以看出Q页面底部的一条信息显C出最q执行的SQL命o影响的行数。如果SQL命o是一个SELECT语句Q当SELECT语句执行成功Q页面底部将用HTML表格昄出查询结果,如图二所C?



?QHTML表格昄出查询结果集


  当然Q如果SQL命o执行p|QSQL|关返回异怿息?

  二、设计JSP面

  在JSP面中,我们首先攑օ一个ScriptletQ它的功能是从session对象提取两个属性:

<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<% 
   String sqlStatement=(String)session.getAttribute("sqlStatement");
   if (sqlStatement == null)    sqlStatement = "";
   String message =  (String) session.getAttribute("message");
   if (message == null)  message = "";
%>


  W一个属性sqlStatement 表示SQL命o字符ԌW二个属性message 是包含结果信息的字符丌Ӏ如果这两个属性的值是nullQ则表示它们未被设|,我们把sqlStatement和message变量讄成空字符丌Ӏ?

  JSP面q有一个HTML表单QHTML表单包含一个文本区域(TEXTAREAQ和一个“执行”按钮?

<form action="../servlet/test.SQLGatewayServlet" method="post">
<b>SQL命o:</b><br>
<textarea name="sqlStatement" cols=60 rows=8>
<%=sqlStatement%></textarea><br>
<br>
<input type="submit" value="执行">
</form>


  表单中的文本区域用来输入SQL命o。我们将sqlStatement变量的g为文本区域的默认内容Q文本区域的大小是宽60字符、高8行。当JSP面W一ơ运行时Q这个文本区域的内容为空。如果用LL本区域下面的“执行”按钮,JSP面把表单内Ҏ交给SQLGatewayServletQ稍后再详细介绍Q?

  JSP面底部的表格显C出message字符串的内容。如前所qͼmessage的内Ҏq行SQL命o的结果?

<b>SQL命o执行l果:</b><br>
<table cellpadding="5" border="1">
<%=message%>
</table>


  三、编写Servlet

  SQLGatewayServlet首先导入java.sql包以便用JDBCcR另外,它还要声明一个Connection对象Q以便Servlet之内的所有方法都可以使用数据库连接?

package test;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class SQLGatewayServlet extends HttpServlet{

    private Connection connection;


  当Servlet引擎开始运行这个ServletQServlet的initҎ打开一个数据库q接Q?

public void init() throws ServletException{
    try{
        Class.forName("org.gjt.mm.mysql.Driver");
        String dbURL = "jdbc:mysql://localhost/murach";
        String username = "root";
        String password = "";
        connection = DriverManager.getConnection
	(dbURL, username, password);
    }
    catch(ClassNotFoundException e){
        System.out.println("找不到数据库驱动E序.");
    }
    catch(SQLException e){
        System.out.println("不能打开数据库连? "
                           + e.getMessage());
    }
}


  在这个例子中QServlet利用一个MysQL数据库的驱动E序打开murach数据库的q接Q数据库和Servletq行在同一个服务器上。此外,Servlet使用MySQL的默认用户名字rootQ密码ؓI。不q,你可以修改这里的代码Q只要有适当的驱动程序,可以让Servletq接CQ何服务器上的M数据库(有关MySQL数据库的更多信息Q请参见www.mysql.comQ?

  Servlet引擎关闭Servlet之前Q调用destroyҎ关闭数据库连接,释放q接资源Q?

public void destroy() {
    try{
        connection.close();
    }
    catch(SQLException e){
        System.out.println("不能关闭数据库连? " + e.getMessage());
    }
}


  前面介绍的JSP面要调用Servlet的doPostҎQdoPostҎ调用doGetҎQ?

public void doPost(HttpServletRequest request,
                   HttpServletResponse response)
                   throws IOException, ServletException{
     doGet(request, response);
 }


  在doGetҎ之中Q第一个语句首先获取用户在JSP面中输入的SQL命oQ第二个语句声明message变量Q?

public void doGet(HttpServletRequest request,
                   HttpServletResponse response)
                   throws IOException, ServletException{

     String sqlStatement = request.getParameter("sqlStatement");
     String message = "";


  然后Q在try块之内,W一个语句利用Connection对象创徏Statement对象Q接下来的两个语句利用String对象的trimҎ和substringҎq回用户输入的SQL命o的前六个字符?

try{
     Statement statement = connection.createStatement();
     sqlStatement = sqlStatement.trim();
     String sqlType = sqlStatement.substring(0, 6);


  如果SQL命o的前六个字符是“select”,则利用Statement的executeQueryҎ执行SQL语句Q获得一个ResultSet对象Q把q个对象传递给SQLUtilc(E后详细说明Q的getHtmlRowsҎQgetHtmlRowsҎ把记录集中的记录格式化成HTML表格q返回?

if  (sqlType.equalsIgnoreCase("select")){
     ResultSet resultSet = statement.executeQuery(sqlStatement);
     // 构造一个StringQ其中包含HTML表格形式的结果集数据
     message = SQLUtil.getHtmlRows(resultSet);
 }


  如果SQL语句的前六个字符不是“select”,则我们调用Statement对象的executeUpdateҎQexecuteUpdateҎq回当前操作影响的行数——如果这个数字是0Q则该SQL命o是一个DDL命oQ例如DROP TABLE或CREATE TABLE{;否则Q则表明SQL命o可能是DML命oQ如INSERT、UPDATE或DELETE命o。无论是哪一USQL命oQ我们都把message变量讄成相应的消息?

else
     {
         int i = statement.executeUpdate(sqlStatement);
         if (i == 0) // q是一个DDL命o
           message =
             "<tr><td>" +
               "命o执行成功." +
             "</td></tr>";
         else // q是一个INSERT、UPDATE或DELETE命o
             message =
               "<tr><td>" +
                 "SQL命o执行成功?lt;br>" +
                 "已更? + i + " 行? +
                "</td></tr>";
     }
     statement.close();
 }


  如果try块里面的M一个语句抛Z个SQLExceptionQcatch块就讄message变量Q其包含有兌SQLException的信息。例如,如果在表单中输入的SQL命o语法错误Q下面设|的message变量值将帮助你排解错误?

catch(SQLException e){
    message = "<tr><td>执行SQL命o旉到错误:<br>"
            + e.getMessage() + "</tr></td>";
}


  在catch块之后,接下来的三个语句获得session对象Q把sqlStatement和message变量讄为session的属性:

HttpSession session = request.getSession();
 session.setAttribute("message", message);
 session.setAttribute("sqlStatement", sqlStatement);


  接下来,最后两个语句创Z个RequestDispatcherQƈ转发request和response对象l前文介l的JSP面Q?

RequestDispatcher dispatcher =
     getServletContext().getRequestDispatcher(
         "/sql/sql_gateway.jsp");
 dispatcher.forward(request, response);


  四、编写工L

  下面来看看工LSQLUtil的代码:

package test;
import java.sql.*;
public class SQLUtil{


  SQLUtilcd含一个getHtmlRows静态方法,前面的Servlet正是通过调用该方法将l果集格式化成HTML表格。getHtmlRows的输入参数是一个ResultSet对象Q其q回值是一个String对象Q这个String对象的内Ҏ记录集的所有列表题和行的HTML代码。ؓ了构造出q样一个String对象QgetHtmlRows声明了一个名为htmlRows的StringBuffer对象Q然后在Ҏ执行q程中向q个StringBuffer对象q加数据。在getHtmlRowsҎ的末,我们用toStringҎStringBuffer的内容{换成StringQ最后将q个Stringq回lServletQ?

public static synchronized String getHtmlRows(ResultSet results)
throws SQLException{
    StringBuffer htmlRows = new StringBuffer();
    ResultSetMetaData metaData = results.getMetaData();
    int columnCount = metaData.getColumnCount();
    // 记录集中列的名UC为HTML表格列的标题
    htmlRows.append("<tr>");
    for (int i = 1; i <= columnCount; i++)
        htmlRows.append("<td><b>" + metaData.getColumnName(i) + "</td>");
    htmlRows.append("</tr>");
    // 对于l果集中的每一?..
    while (results.next()){
        htmlRows.append("<tr>");
        // 该行中的每一个列转换成一个表格单?
        for (int i = 1; i <= columnCount; i++)
            htmlRows.append("<td>" + results.getString(i) + "</td>");
    }
    htmlRows.append("</tr>");
    return htmlRows.toString();
}


  Z获得记录集对象的列标题,getHtmlRowsҎ利用ResultSet的getMetaDataҎ来创Z个ResultSetMetaData对象QResultSetMetaData对象包含了有兌录集的描qC息,例如列的数量、列的名U可以分别调用ResultSetMetaData的getColumnCount和getColumnNameҎ获得?

  Z提取记录集的数据QgetHtmlRowsҎ利用一个嵌套的循环Q即while循环里面嵌套的for循环Q来提取每一个行里面每一个列的倹{在循环之内Q我们用记录集的getStringҎ来获取各个字D늚|不管字段值原来的cd是什么,getStringҎ都会它转换成String?

  h意这个方法的声明中带有synchronized关键词,q是Z避免两个或两个以上的ServletU程同时执行该方法?


konhon 优华 2006-03-13 15:30 发表评论
]]>
JSP实现论坛树型l构的具体算?/title><link>http://www.tkk7.com/konhon/archive/2006/03/13/35044.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Mon, 13 Mar 2006 07:26:00 GMT</pubDate><guid>http://www.tkk7.com/konhon/archive/2006/03/13/35044.html</guid><wfw:comment>http://www.tkk7.com/konhon/comments/35044.html</wfw:comment><comments>http://www.tkk7.com/konhon/archive/2006/03/13/35044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/konhon/comments/commentRss/35044.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/konhon/services/trackbacks/35044.html</trackback:ping><description><![CDATA[实现论坛树型l构的算法很多,我现在的JSP论坛采用的也是当中的一U:不用递归实现树型l构的算法,现在我将论坛树型l构的具体算法和大家介绍一下,和大家一起交? <P> </P> <P>1、演C的结构: </P> <P>   表名Qmybbslist <BR>   字段     数据cd  说明 <BR>   BBSID    自动~号   <BR>   RootID    Int     根帖IDQ本wؓ根帖则RootID = ID <BR>   FID     Int     父帖IDQ上一层帖子的IDQ如是根帖则FID = 0 <BR>   DEPTH    Int     根帖Level=0Q其他依据回复的深度递增 <BR>   BBSSubject  Char    主题 </P> <P><BR>2。创Q?</P> <P><BR>create table mybbslist ( <BR> forumID int(20) not null, <BR> bbsID int auto_increment primary key, <BR> rootid int(20) not null, <BR> fid int(20) not null, <BR> depth int(20) not null, <BR> userID int(20) not null, <BR> bbsUser varchar(24) not null, <BR> bbsSubject varchar(100) not null, <BR> bbsContent text, <BR> bbsTime varchar(30), <BR> bbsRead int(20), <BR> bbsReply int(20), <BR>INDEX forumID (forumID))  </P> <P>3、连接MYSQL数据库的BEAN </P> <P><BR>package netzero; <BR>import java.sql.*; <BR>public class mydb <BR>{ <BR>String driverName = "org.gjt.mm.mysql.Driver"; <BR>Connection conn = null; <BR>Statement stmt = null; <BR>ResultSet rs = null; <BR>String connURL= "jdbc:mysql://localhost/mybbs?user=root&password=how&useUnicode=true&characterEncode=8859_1"; <BR>//String connURL= "jdbc:mysql://localhost/netzerobbs?user=root&password=how"; <BR>public mydb() <BR>{ <BR>try <BR>{ <BR>Class.forName(driverName); <BR>} <BR>catch (java.lang.ClassNotFoundException e) <BR>{ <BR>System.err.println("netzero(String): " + e.getMessage()); <BR>} <BR>} </P> <P><BR>public ResultSet executeQuery(String sql) throws SQLException <BR>{ <BR>conn = DriverManager.getConnection(connURL); <BR>stmt = conn.createStatement(); <BR>rs = stmt.executeQuery(sql); <BR>return rs; <BR>} </P> <P><BR>public boolean closeConn() <BR>{ <BR>try <BR>{ <BR>if (rs!=null) rs.close(); <BR>if (stmt!=null) stmt.close(); <BR>if (conn!=null) conn.close(); <BR>return true; <BR>} <BR>catch ( SQLException ex ) <BR>{ <BR>System.err.println("closeConn: " + ex.getMessage()); <BR>return false; <BR>} <BR>} </P> <P><BR>} <BR> </P> <P>4、显C坛的JSPE序 </P> <P><BR><jsp:useBean id="mybbs" scope="session" class="netzero.mydb" /> <BR><%@ page contentType="text/html;charset=gb2312" %> <BR><%@ page import="java.io.*" %> <BR><%@ page import="java.sql.*" %> <BR><% <BR>int intRowCount; <BR>out.print("昄论坛树Şl构"); <BR>out.print("<br><br>"); <BR>try { <BR>String sql="select * from mybbslist order by rootid desc,depth,fid,bbsid"; <BR>ResultSet rs = mybbs.executeQuery(sql); <BR>if (rs.next()) <BR>{ <BR>rs.last(); <BR>intRowCount=rs.getRow(); <BR>out.print("论坛树中?); <BR>out.print(intRowCount); <BR>out.print("个叶子节?); <BR>rs.first(); <BR>int j=0; <BR>int Depth = 0; <BR>out.print("<ul>"); <BR>while(j<intRowCount) <BR>{ <BR>int rsDepth=rs.getInt("Depth"); <BR>if (rsDepth<Depth) <BR>{ <BR>for(int i=1;i<Depth+1;i=i+1) <BR>{ <BR>out.print("</ul>"); <BR>} <BR>} <BR>rsDepth=rs.getInt("Depth"); <BR>if (rsDepth>Depth) <BR>{ <BR>out.print("<ul>"); <BR>} <BR>out.print("<li>"); </P> <P><BR>String bbssubject=rs.getString("bbssubject"); <BR>out.print(bbssubject); <BR>out.print("</li>"); <BR>Depth = rs.getInt("Depth"); <BR>j=j+1; <BR>rs.next(); <BR>} <BR>out.print("</ul>"); <BR>} <BR>else <BR>{ <BR>out.print("数据库中无记?); <BR>} <BR>}catch (SQLException E) { <BR>out.println("SQLException: " + E.getMessage()); <BR>out.println("SQLState: " + E.getSQLState()); <BR>out.println("VendorError: " + E.getErrorCode()); <BR>} <BR>%> <BR><% //关闭mysqlq接 <BR>try { <BR>if(!mybbs.closeConn()); <BR>} catch (Exception ex) { <BR>System.err.println("closeConn: " + ex.getMessage()); <BR>} <BR>%> <BR> <BR></P><img src ="http://www.tkk7.com/konhon/aggbug/35044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/konhon/" target="_blank">konhon 优华</a> 2006-03-13 15:26 <a href="http://www.tkk7.com/konhon/archive/2006/03/13/35044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP在内存生成的囄昄到页http://www.tkk7.com/konhon/archive/2006/03/13/35042.htmlkonhon 优华konhon 优华Mon, 13 Mar 2006 07:23:00 GMThttp://www.tkk7.com/konhon/archive/2006/03/13/35042.htmlhttp://www.tkk7.com/konhon/comments/35042.htmlhttp://www.tkk7.com/konhon/archive/2006/03/13/35042.html#Feedback0http://www.tkk7.com/konhon/comments/commentRss/35042.htmlhttp://www.tkk7.com/konhon/services/trackbacks/35042.htmlImaging_ToWeb.jsp

<%@ page autoFlush="false"  import="java.awt.*,java.awt.image.*,com.sun.image.codec.jpeg.*,java.util.*"%>
<%
    String ImageStr = request.getParameter("ID_Text");
    if(ImageStr==null || ImageStr.equals(""))
    {
        response.setContentType("text/html; charset=gb2312");
 %>
<HTML>
 <HEAD>
  <title>Http://www.lionsky.net</title>
  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
 </HEAD>
 <body>
  <form id="Form1" method="post">
    <input type="text" id="ID_Text" name=ID_Text>
    <input type=submit value="GO">
  </form>
 </body>
</HTML>

<%
       }
       else
       {
        out.clear();
        response.setContentType("image/jpeg");
        response.addHeader("pragma","NO-cache");
        response.addHeader("Cache-Control","no-cache");
        response.addDateHeader("Expries",0);
        int width=300, height=100;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        //以下填充背景颜色
        g.setColor(Color.lightGray);
        g.fillRect(0, 0, width, height);
        String random="random";
        //以下讄前景?BR>        g.setColor(Color.BLACK);
        g.drawString("Http://www.knowsky.com",10,20);
        g.drawString("Author:Lion[lion-a@sohu.com]",10,40);
        g.drawLine(10,50,290,50);
        g.drawString(ImageStr,10,70);
        g.dispose();
        ServletOutputStream outStream = response.getOutputStream();
        JPEGImageEncoder encoder =JPEGCodec.createJPEGEncoder(outStream);
        encoder.encode(image);
        outStream.close();
    }

%>



konhon 优华 2006-03-13 15:23 发表评论
]]>
Java examples (example source code) http://www.tkk7.com/konhon/archive/2005/09/09/12500.htmlkonhon 优华konhon 优华Fri, 09 Sep 2005 00:37:00 GMThttp://www.tkk7.com/konhon/archive/2005/09/09/12500.htmlhttp://www.tkk7.com/konhon/comments/12500.htmlhttp://www.tkk7.com/konhon/archive/2005/09/09/12500.html#Feedback0http://www.tkk7.com/konhon/comments/commentRss/12500.htmlhttp://www.tkk7.com/konhon/services/trackbacks/12500.html
http://www.java2s.com/ExampleCode/J2ME/CatalogJ2ME.htm


konhon 优华 2005-09-09 08:37 发表评论
]]>
JSP/Servlet的重定向技术综q?/title><link>http://www.tkk7.com/konhon/archive/2005/09/09/12497.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Fri, 09 Sep 2005 00:06:00 GMT</pubDate><guid>http://www.tkk7.com/konhon/archive/2005/09/09/12497.html</guid><wfw:comment>http://www.tkk7.com/konhon/comments/12497.html</wfw:comment><comments>http://www.tkk7.com/konhon/archive/2005/09/09/12497.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.tkk7.com/konhon/comments/commentRss/12497.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/konhon/services/trackbacks/12497.html</trackback:ping><description><![CDATA[<div id="hz7rrjb" class=forumcontent>有关JSP/Servlet的重定向技术综q如下[补充]<BR><BR>1.RequestDispatcher.forward()<BR>是在服务器端起作?当用forward()?Servlet engine传递HTTPh从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文g,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在b.jsp都可以获?参数自动传?<BR>但forward()无法重定向至有frame的jsp文g,可以重定向至有frame的html文g,同时forward()无法在后面带参数传?比如servlet?name=frank,q样不行,可以E序内通过response.setAttribute("name",name)来传至下一个页?<BR><BR>重定向后览器地址栏URL不变.<BR><BR>?在servlet中进行重定向<BR> <DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"> <DIV><IMG src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000"> doPost(HttpServletRequest request,HttpServletResponse response)<BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align=top>throws ServletException,IOException<BR><IMG id=Codehighlighter1_112_327_Open_Image onclick="this.style.display='none'; Codehighlighter1_112_327_Open_Text.style.display='none'; Codehighlighter1_112_327_Closed_Image.style.display='inline'; Codehighlighter1_112_327_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_112_327_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_112_327_Closed_Text.style.display='none'; Codehighlighter1_112_327_Open_Image.style.display='inline'; Codehighlighter1_112_327_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_112_327_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.tkk7.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_112_327_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>response.setContentType(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">text/html; charset=gb2312</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>ServletContext sc </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> getServletContext();<BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>RequestDispatcher rd </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>rd </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> sc.getRequestDispatcher(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">/index.jsp</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">); </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">定向的页?/SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>rd.forward(request, response);<BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV></DIV><BR>通常在servlet中用,不在jsp中用?BR><BR>2.response.sendRedirect()<BR>是在用户的浏览器端工?sendRedirect()可以带参C?比如servlet?name=frank传至下个面,同时它可以重定向至不同的L?sendRedirect()可以重定向有frame.的jsp文g.<BR>重定向后在浏览器地址栏上会出现重定向面的URL<BR>?在servlet中重定向<BR> <DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"> <DIV><IMG src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000"> doPost(HttpServletRequest request,HttpServletResponse response)<BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align=top>throws ServletException,IOException<BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_114_210_Open_Image onclick="this.style.display='none'; Codehighlighter1_114_210_Open_Text.style.display='none'; Codehighlighter1_114_210_Closed_Image.style.display='inline'; Codehighlighter1_114_210_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_114_210_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_114_210_Closed_Text.style.display='none'; Codehighlighter1_114_210_Open_Image.style.display='inline'; Codehighlighter1_114_210_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_114_210_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.tkk7.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_114_210_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>response.setContentType(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">text/html; charset=gb2312</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>response.sendRedirect(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">/index.jsp</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV><BR>׃response是jsp面中的隐含对象Q故在jsp面中可以用response.sendRedirect()直接实现重定位?BR>注意Q?BR>(1).使用response.sendRedirectӞ前面不能有HTML输出?BR>qƈ不是l对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制Q一般在8KQ我是说JSP SERVERQ,q就意味着Q除非你关闭了cacheQ或者你使用了out.flush()强制hQ那么在使用sendRedirect之前Q有量的HTML输出也是允许的?BR>(2).response.sendRedirect之后Q应该紧跟一句return;<BR>我们已经知道response.sendRedirect是通过览器来做{向的Q所以只有在面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出q有什么意义呢Q而且有可能会因ؓ后面的输出导致{向失败?BR>比较Q?BR>(1).Request Dispatcher.forward()是容器中控制权的转向Q在客户端浏览器地址栏中不会昄{向后的地址Q?BR>(2).response.sendRedirect()则是完全的蟩转,览器将会得到蟩转的地址Qƈ重新发送请求链接。这P从浏览器的地址栏中可以看到跌{后的链接地址?BR>前者更加高效,在前者可以满需要时Q尽量用RequestDispatcher.forward()Ҏ.<BR><BR>注:在有些情况下Q比如,需要蟩转到一个其它服务器上的资源Q则必须使用HttpServletResponse.sendRequest()Ҏ?BR><BR>3.<?xml:namespace prefix = jsp /><jsp:forward page=""></jsp:forward> <BR><BR>它的底层部分是由RequestDispatcher来实现的Q因此它带有RequestDispatcher.forward()Ҏ的印记?BR><BR><BR>如果?jsp:forward>之前有很多输?前面的输出已使缓冲区?自动输出到客户?那么该语句将不v作用,q一点应该特别注意?BR>另外要注意:它不能改变浏览器地址Q刷新的话会D重复提交<BR><BR>4.修改HTTP header的Location属性来重定?BR>通过讄直接修改地址栏来实现面的重定向?BR>jsp文g代码如下Q?BR><BR>Q?<BR>response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);<BR>String newLocn = "/newpath/jsa.jsp";<BR>response.setHeader("Location",newLocn);<BR>%Q?BR><BR>5.JSP中实现在某页面停留若q秒?自动重定向到另一面<BR>在html文g中,下面的代码:<BR> <META http-equiv=refresh content="300; url=target.jsp"><BR>它的含义Q在5分钟之后正在览的页面将会自动变为target.htmlq一c代码中300为刷新的延迟旉Q以Uؓ单位。targer.htmlZ惌{向的目标?若ؓ本页则ؓ自动h本页?BR>׃可知Q可以通过setHeader来实现某面停留若干U后,自动重定向到另一面?BR>关键代码Q?BR>String content=stayTime+";URL="+URL;<BR>response.setHeader("REFRESH",content);<BR><BR>如果ȝ得不够全面,请各位发表自q意见或经验?BR></DIV></jsp:forward><img src ="http://www.tkk7.com/konhon/aggbug/12497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/konhon/" target="_blank">konhon 优华</a> 2005-09-09 08:06 <a href="http://www.tkk7.com/konhon/archive/2005/09/09/12497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP Errorhttp://www.tkk7.com/konhon/archive/2005/09/08/12443.htmlkonhon 优华konhon 优华Thu, 08 Sep 2005 08:52:00 GMThttp://www.tkk7.com/konhon/archive/2005/09/08/12443.htmlhttp://www.tkk7.com/konhon/comments/12443.htmlhttp://www.tkk7.com/konhon/archive/2005/09/08/12443.html#Feedback0http://www.tkk7.com/konhon/comments/commentRss/12443.htmlhttp://www.tkk7.com/konhon/services/trackbacks/12443.html

我們知道JSPi究會轉換為ServletQ而運行時真正動作的是Servlet,所以錯誤可能發生在兩個時候:一個是JSP轉換?Servlet原始時Q因為JSP語法錯誤而導致無法生成Servlet原始|或是已轉換為ServletE式|但編譯時R譯器檢查出錯誤Q這稱之為Translation Time Processing ErrorsQ第二個錯誤發生的時期在於客戶請求埯Servlet時,因為E式邏輯或運行時未考慮到的錯誤而產生例外,這稱之為Client Request Time Processing Errors?

如何在JSP運行時判別錯誤發生的E類Q如果錯誤報告頁面出?....encountered an internal error...."Q就有可能是轉換時期錯誤Q或?Generated servlet error: [javac] Compiling 1 source file...."Q就有可能是R譯器在R譯ServletE式時發現錯誤Q這個時候您必須檢查一下JSP語法是否有錯誤,或是E式邏輯有明可讓編譯器檢查出的錯誤?


konhon 优华 2005-09-08 16:52 发表评论
]]>
jsp+tomcat+mysql&sevlet&javabean配置全过E?[轉]http://www.tkk7.com/konhon/archive/2005/08/10/9699.htmlkonhon 优华konhon 优华Wed, 10 Aug 2005 00:54:00 GMThttp://www.tkk7.com/konhon/archive/2005/08/10/9699.htmlhttp://www.tkk7.com/konhon/comments/9699.htmlhttp://www.tkk7.com/konhon/archive/2005/08/10/9699.html#Feedback0http://www.tkk7.com/konhon/comments/commentRss/9699.htmlhttp://www.tkk7.com/konhon/services/trackbacks/9699.html 

在配|jsp开发环境的q程中会到不少问题Q感谢网上的许多前辈的经验ȝQ作者cl41的JSPq接Mysql数据库攻略和作者Saulzy的MySQL学习W记{文章对我来说简直是雪中送碳Qؓ了帮助象我一L初学者在此ȝ了不作者的l验Q非常感谢他们的无私奉献_Q也希望更多的h把这U精发扬光大,呵呵Q再ơ对所参考文章的作者表C最崇高的敬意!
以下软g下蝲q接地址无法昄的话Q请直接到官方网站下载即可!
 
软g下蝲
Mysql
下蝲版本Qmysql-4.1.13-win32.zip(Windows downloads)
http://dev.mysql.com/downloads/mysql/4.1.html

JDBC驱动
下蝲版本Qmysql-connector-java-3.1.10.zip
http://dev.mysql.com/downloads/connector/j/3.1.html

下蝲j2sdk
下蝲版本Qjdk-1_5_0_04-windows-i586-p.exe
http://java.sun.com/j2se/1.5.0/download.jsp

下蝲tomcat
下蝲版本: jakarta-tomcat-5.5.9.exe
http://jakarta.apache.org/site/downloads/downloads_tomcat-5.cgi

安装,配置j2sdkQ?/P>

执行j2sdk安装E序Q按默认讄q行安装Q也可自定义路径Q但需修改下面的配|?/P>

配置j2sdk:

配置环境变量:

我的电脑->属?>高->环境变量->pȝ变量中添加以下环境变量:
JAVA_HOME=C:\Program Files\Java\jdk1.5.0_04
CLASSPATH=%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
path=%JAVA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem

写一个简单的javaE序来测试J2SDK是否已安装成功:
public class hello
{
 public static void main(String args[])
 {
 System.out.println("Hello");
 }
}

程序保存ؓ文g名ؓhello.java的文件?

打开命o提示W窗口,q入到hello.java所在目录,键入下面的命?
javac hello.java
java hello
此时若打印出来hello则安装成功,若没有打印出q句话,仔细查以上配|是否正?BR>注意pȝ文g多w项中应定“隐藏已知文件类型的扩展名”不N(我的电脑—工具—查看)

安装,配置tomcat
执行tomcat安装E序Q按默认讄q行安装Q也可自定义路径Q但需修改下面的配|?/P>

我的电脑->属?>高->环境变量->pȝ变量中添加以下环境变?BR>CATALINA_HOME=C:\Program Files\Apache Software Foundation\Tomcat 5.5
CATALINA_BASE=C:\Program Files\Apache Software Foundation\Tomcat 5.5

修改环境变量中的classpathQ把tomat安装目录下的common\lib下的servlet-api.jard到classpath中去Q?BR>修改后的classpath如下Q?
classpath=%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib\servlet-api.jar;

启动tomcatQ在IE中访?A href="http://localhost:8080/">http://localhost:8080Q若看到tomcat的欢q页面的话说明安装成功?/P>

安装mysql
解压~mysql-4.1.13-win32.zipQ运行setup.exe
首先出现的是安装向导Ƣ迎界面,直接点击“Next?BR>l箋Q选择安装cd,选择“自定义”custom安装Q然后点“Next”下一步,出现自定义安装界?BR>选择安装路径QC:\MySQL Server 4.1(可自定义)
点“OK”返回到自定义安装界面,路径已改|的路径
点“Next”,准备开始安?BR>点“Install”开始安?BR>完成后出现创建MySQL.com帐号的界?BR>如果是首ơ用MySQLQ选“Create anew free MySQL.com accout?BR>点“Next”,输入你的Email地址和自p定的用于dMySQL.com的密?BR>填完后点“Next”进入第二步
填写姓名{相关信息,填完点“Next”,q入W三?BR>填完电话L、公司名U等信息后,点“Next”,
然后出现预览你刚才填的信息的界面Q点“Next”出现安装完成界?BR>注意Q这里有个配|向导的选项QConfigure the MySQL Server nowQ,
N立即配|你的MySQL。许多说安装完MySQL后无法启动,原因在于没有配|MySQL?BR>点击“Finish”完成安装,q开始配|MySQL
点“Next”,q入配置cd选择面。选“Detailed configuration?详细配置)
点“Next”,q入服务cd选择面。选“Developer Machine”(开发者机器)Q这样占用系l的资源不会很多
点“Next”后Q进入数据库用法选择面。选择“Multifunctional Database?BR>点“Next”,q入选择InnoDB数据存放位置面
不用更改讄Q直接放在Installation Path安装目录里即可,然后点“Next”,选择MySQL的同时联接数
选择“Manual Setting”,讄?00(Ҏ自己需要,酌情讄)
点“Next”,配置MySQL在TCP/IP通讯环境中的端口选择默认?306端口卛_?BR>点“Next”,选择MySQL中的字符讄
注意Q这里的选择会影响你是否能在MySQL中用中文。选择gb2312字符集以便支持简体中?BR>点“Next”,讄Windows服务选项
注意Q这里的选择很关键?BR>“Install As Windows Service”一定要N,q是MySQL作ؓWindows的服务运行?BR>“Service Name”就用默认的“MySQL?BR>下面的“Launch the MySQL Server automatically”一定要N,q样Windows启动ӞMySQL׃自动启动服务Q要不然p手工启动MySQL?BR>许多安装MySQL后无法启动、无法连接、出?0061错误Q原因就在这里?BR>点“Next”,讄根帐号root的登录密?BR>“Modify Security Settings”是讄根帐L密码Q输入你讑֮的密码即可?BR>“Create An Anonymous Account”是创徏一个匿名帐Pq样会导致未l授权的用户非法讉K你的数据库,有安全隐患,不要N?BR>点“Next”,MySQL配置向导依据你上面的所有设定配|MySQLQ以便MySQL的运行符合你的需?BR>点“Execute”开始配|,当出现“Service started successfully”时Q说明你的配|完成,MySQL服务启动成功
点“Finish”完成,整个MySQL的配|完成,剩下的就是用MySQL客户端连接MySQL服务器,然后使用了?/P>


安装JDBC驱动Q?BR>解压~mysql-connector-java-3.1.10.zip
要使用的是mysql-connector-java-3.1.10-bin-g.jar和mysql-connector-java-3.1.10-bin.jar

配置
在C:\Program Files\Java目录下徏立mysqlforjdbc子目录,q入该目录将mysql-connector-java-3.1.10-bin.jar到该目录?BR>q入C:\Program Files\Java\jdk1.5.0_04\lib目录mysql-connector-java-3.1.10-bin-g.jar拯到该目录?BR>然后配置classpathQ追?JAVA_HOME%\lib\mysql-connector-java-3.1.10-bin-g.jar;C:\Program Files\Java\mysqlforjdbc\mysql-connector-java-3.1.10-bin.jar;到该环境变量中去
q加以后环境变量如下Q?BR>CLASSPATH=%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;C:\Program Files\Apache Software Foundation\Tomcat5.5\common\lib\servlet-api.jar;%JAVA_HOME%\lib\mysql-connector-java-3.1.10-bin-g.jar;C:\Program Files\Java\mysqlforjdbc\mysql-connector-java-3.1.10-bin.jar;
配置q个的目的是让java应用E序扑ֈq接mysql的驱动.


查看q启动MySQL服务
在Windows XP下安装完MySQL后,它就已经自动启动服务了,q且在开始菜单中有其客户端的快捷方式q接
可以通过Windows的服务管理器查看。“开始”-“运行”,输入“services.msc”,回R?BR>弹出Windows的服务管理器Q然后就可以看见服务名ؓ“mysql”的服务了Q其双标明“已启动?BR>在开始菜?所有程?MySQL-MySQL Server 4.1-MySQL Command Line Client用客L的快h式连?BR>输入安装是设|的密码卛_


数据库的使用

Mysql安装完毕以后Q在开始菜?所有程?MySQL-MySQL Server 4.1-MySQL Command Line Client用客L的快h式连?BR>输入安装时设|的密码

使用mysql的基本命?在mysql命o行编辑每输入完命令后最后一定要有分?
昄数据库:show databases;
使用数据库:use 数据库名Q?/P>


建库
在mysql里徏一个数据库firstQ以及在数据库里Z个表about
命oQcreate database first;

为数据库讄权限Q用户和密码Q?BR>命oQgrant all privileges on first.* to test@localhost identified by  ?23456?
当你执行完这个命令以后,只要你再以用户名Qtest,密码Q?23456d时你只可以对firstq个数据库操作,q样避开使用root
输入命oQuse first;
使用first数据库;

在first库中
命oQcreate table about(id int(8) primary key,name varchar(10));

在表中假如数据:
命oQinsert into  about values('xyw1026','laojiang');

退?BR>命oQexit

JSPq接mysql
在C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps目录下徏立子目录myapp
q入C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\myapp目录?BR>用记事本~写一个文件保存ؓfirst.jsp
代码如下Q?BR><%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<html>
<body>
<%Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//firstZ的数据库?
Connection conn= DriverManager.getConnection(url);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from first";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {%>
您的W一个字D内容ؓQ?lt;%=rs.getString(1)%>
您的W二个字D内容ؓQ?lt;%=rs.getString(2)%>
<%}%>
<%out.print("数据库操作成功,恭喜?);%>
<%rs.close();
stmt.close();
conn.close();
%>
</body>
</html>

在浏览器中输入:
http://127.0.0.1:8080/myapp/first.jsp
若出玎ͼ
id|num
0 |laojiang

数据库操作成功,恭喜?/P>

表示配置成功


q入C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\myapp目录
在myapp目录下新Z个目录WEB-INFQ注意,目录名称是区分大写的;
在WEB-INF下用C本新Z个文Ӟ命名为web.xmlQ内容如下:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"

<web-app>
<display-name>My Web Application</display-name>
<description>
A application for test.
</description>
</web-app>

在myapp下用C本新Z个测试的jsp面Q文件名为index.jspQ文件内容如下:

<html><body><center>
Now time is: <%=new java.util.Date()%>
</center></body></html>


重启Tomcat
打开览器,输入
http://localhost:8080/myapp/index.jsp
看到当前旉的话说明成功安装?

建立自己的ServletQ?
用记事本新徏一个servletE序Q文件名为HelloWorld.javaQ文件内容如下:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
{

response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>");
out.println("This is my first Servlet");
out.println("</title></head><body>");
out.println("<h1>Hello,World!</h1>");
out.println("</body></html>");

}
}


~译
HelloWorld.java剪切到C:\Program Files\Apache Software Foundation\Tomcat5.5\common\classes目录?BR>命o行方式下输入Q?
cd C:\Program Files\Apache Software Foundation\Tomcat5.5\common\classes
javac HelloWorld.java
用javac HelloWorld.java来编译这个文Ӟ如果出现无法import javax.servlet.*
则将C:\Program Files\Apache Software Foundation\Tomcat5.5\common\lib目录下的servlet-api.jar文g拯q添加到
C:\Program Files\Java\jre1.5.0_04\lib\ext目录中去可以了

然后在C:\Program Files\Apache Software Foundation\Tomcat5.5\common\classes下会产生一个编译后的servlet文gQHelloWorld.class
用记事本打开C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\ROOT\WEB-INF目录下的web.xml如下所C,d后的内容如下:
.
.
.
<!-- JSPC servlet mappings start -->

    <servlet>
        <servlet-name>org.apache.jsp.index_jsp</servlet-name>
        <servlet-class>org.apache.jsp.index_jsp</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>org.apache.jsp.index_jsp</servlet-name>
        <url-pattern>/index.jsp</url-pattern>
    </servlet-mapping>

   
    <servlet>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>HelloWorld</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/servlet/HelloWorld</url-pattern>
    </servlet-mapping>

<!-- JSPC servlet mappings end -->

</web-app>

q段话中的servletq一D声明了你要调用的ServletQ而servlet-mapping则是声明的servlet“映”到/servlet/HelloWorld地址?

启动TomcatQ启动浏览器Q输?A href="http://localhost:8080//servlet/HelloWorld">http://localhost:8080//servlet/HelloWorld 如果看到输出HelloWorldQ就说明~写的servlet成功了?
注意Q修改了web.xml以及新加了classQ都要重启Tomcat


也可以在自己创徏的目录下试如:
HelloWorld.class拯到C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\myapp\WEB-INF\classes目录?BR>其中classes目录若没有就创徏一?BR>用记事本打开C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\myapp\WEB-INF目录下的web.xml如下所C,修改后的内容如下:
.
.
.
<!-- JSPC servlet mappings start -->
   
    <servlet>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>HelloWorld</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/servlet/HelloWorld</url-pattern>
    </servlet-mapping>

<!-- JSPC servlet mappings end -->

</web-app>


启动TomcatQ启动浏览器Q输?A href="http://localhost:8080/myapp/servlet/HelloWorld">http://localhost:8080/myapp/servlet/HelloWorld 如果看到输出HelloWorldQ就说明~写的servlet成功了?
注意Q修改了web.xml以及新加了classQ都要重启Tomcat


建立自己的javaBeanQ?

用记事本新徏一个javaE序Q文件名为TestBean.javaQ文件内容如下:
package test;
public class TestBean{
private String name = null;
public TestBean(String strName_p){
this.name=strName_p;
}
public void setName(String strName_p){
this.name=strName_p;
}
public String getName(){
return this.name;
}
}

~译
TestBean.java攑֜c:\test下,使用如下命o~译Q?
C:\test>javac TestBean.java
然后在c:\Test下会产生一个编译后的bean文gQTestBean.class
TestBean.class文g剪切到C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\myapp\WEB-INF\classes\test目录下,
若无某些子目录则创徏一?

新徏一个TestBean.jsp文gQ文件内容ؓQ?
<%@ page import="test.TestBean" %>
<html><body><center>
<%
TestBean testBean=new TestBean("This is a test java bean.");
%>
Java bean name is: <%=testBean.getName()%>
</center></body></html>

重启TomcatQ启动浏览器Q输?A href="http://localhost:8080/myapp/TestBean.jsp">http://localhost:8080/myapp/TestBean.jsp 如果看到输出Java bean name is: This is a test java bean
p明编写的javaBean成功了?


Q特别注明:本文内容均来自互联网Q?/P>



konhon 优华 2005-08-10 08:54 发表评论
]]>
վ֩ģ壺 ƷƵվ| ˿wwwƵ| Ʒվa| Ʒۺߵһ| 弶18ѿ| ˳߹ۿŹ| ŷav߹ۿ| ëƬƵ| ޾Ʒһۺ99þ| ëƬ߲| ר˿| AVվ߹ۿ| ¹Ʒ| պƵվ| Ƶվ߹ۿ| ޹˾þһþ| ҹƬ߹ۿ| ޹Ʒ۲ӰԺ߹ۿ| ͵Ƶѹۿ| ޵Ӱѹۿ| AV鶹Խ | ž޹Ʒ| һѻɫƬ| պŷcom91tv| ձƬйһ| ޾ƷѹۿƵ| ӰԺֻ߹ۿ| ޹Ʒһ | aëƬ| Ʒav벻| ˳www| ۲ݳѹۿ| vavavaֻ| ҰƵۿ| 91Ʒѹ| ҹƷ| ?v˿߹ۿ| 2019Ļ߹ۿ| ޹һ߹ۿ| av˾Ʒ߲ | ҳվƵ|