﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-mordecai-文章分类-servlet</title><link>http://www.cnitblog.com/mordecai/category/5891.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 16 Oct 2011 17:16:03 GMT</lastBuildDate><pubDate>Sun, 16 Oct 2011 17:16:03 GMT</pubDate><ttl>60</ttl><item><title>动态页面和用户会话</title><link>http://www.cnitblog.com/mordecai/articles/31486.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Wed, 08 Aug 2007 02:15:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/31486.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/31486.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/31486.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/31486.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/31486.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.创建动态的内容动态网页的动态主要从以下几个方面获得：        根据时间的动态；        根据用户类型的动态；        根据用户自定义信息的动态；        根据用户来自的地区不一样的动态；        根据数据库的内容动态；    1.1 根据时间的动态dynamic_time.jsp&lt;%@ pa...&nbsp;&nbsp;<a href='http://www.cnitblog.com/mordecai/articles/31486.html'>阅读全文</a><img src ="http://www.cnitblog.com/mordecai/aggbug/31486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-08-08 10:15 <a href="http://www.cnitblog.com/mordecai/articles/31486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在JSP和Servlet中使用JDBC</title><link>http://www.cnitblog.com/mordecai/articles/31485.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Wed, 08 Aug 2007 02:14:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/31485.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/31485.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/31485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/31485.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/31485.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1 在JSP中使用JDBC访问数据库&nbsp; 本节将介绍在JSP页面中通过JDBC访问数据库，并且介绍在数据库中执行不同操作的方法。在数据库编程中，主要涉及到的操作有：    查询数据；    更新数据；    删除数据；    创建数据表、更改表、获得表本身的信息；&nbsp;&nbsp;&nbsp; 在介绍编程之前，请使用下列脚本在数据库中创建一个表。&...&nbsp;&nbsp;<a href='http://www.cnitblog.com/mordecai/articles/31485.html'>阅读全文</a><img src ="http://www.cnitblog.com/mordecai/aggbug/31485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-08-08 10:14 <a href="http://www.cnitblog.com/mordecai/articles/31485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>处理Java中的日期问题 </title><link>http://www.cnitblog.com/mordecai/articles/31482.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Wed, 08 Aug 2007 02:11:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/31482.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/31482.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/31482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/31482.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/31482.html</trackback:ping><description><![CDATA[Java统计从1970年1月1日起的毫秒的数量表示日期。也就是说，例如，1970年1月2日，是在1月1日后的86，400，000毫秒。同样的， 1969年12月31日是在1970年1月1日前86，400，000毫秒。Java的Date类使用long类型纪录这些毫秒值.因为long是有符号整数，所以日期可以在1970年1月1日之前，也可以在这之后。Long类型表示的最大正值和最大负值可以轻松的表示290，000，000年的时间，这适合大多数人的时间要求。 <br><br>　　Date 类 <br><br>　　Date类可以在java.util包中找到，用一个long类型的值表示一个指定的时刻。它的一个有用的构造函数是Date(),它创建一个表示创建时刻的对象。getTime()方法返回Date对象的long值。在下面的程序中，我使用Date()构造函数创建一个表示程序运行时刻的对象，并且利用getTime()方法找到这个日期代表的毫秒数量： <br><br>import java.util.*; <br><br><br>public class Now { <br><br>public static void main(String[] args) { <br><br>Date now = new Date(); <br><br>long nowLong = now.getTime(); <br><br>System.out.println("Value is " + nowLong); <br><br>} <br><br>} <br><br><br>　　当运行这个程序后，得到972,568,255,150.快速确认一下这个数字，起码在一个合理的范围：它不到31年，这个数值相对1970年1月1日到我写这篇文章的时间来说，是合理的。计算机是这个毫秒值表示时间，人们可不愿意说" 我将在996,321,998,34见到你。"幸运的是，Java提供了一个转换Date对象到字符串的途径，表示成传统的形式。我们在下一节讨论 DateFormat类，它直观的建立日期字符串。 <br><br>　　DateFormat类 <br><br>　　DateFormat类的一个目标是建立一个人们能够识别的字符串。然而，因为语言的差别，不是所有的人希望看到严格的相同格式的日期。法国人更喜欢看到"25 decembre 2000,",但是美国人习惯看到"December 25,2000."所以一个DateFormat的实例创建以后，这个对象包含了日期的显示格式的信息。如果使用用户电脑区域设置缺省的格式，你可以象下面那样，创建DateFormat对象，使用getDateInstance()方法： <br><br>DateFormat df = DateFormat.getDateInstance(); <br><br><br>DateFormat类在java.text包中可以找到。 <br><br><br>　　转换成字符串 <br><br>　　你可以使用format()方法转换Date对象为一个字符串。下面的示例程序说明了这个问题： <br><br>import java.util.*; <br><br>import java.text.*; <br><br>public class NowString { <br><br>public static void main(String[] args) { <br><br>Date now = new Date(); <br><br>DateFormat df = DateFormat.getDateInstance(); <br><br>String s = df.format(now); <br><br>System.out.println("Today is " + s); <br><br>} <br><br>} <br><br><br>　　在上面的代码中，展示了没有参数，使用缺省格式的getDateInstance()方法。Java还提供了几个选择日期格式，你可以通过使用重载的 getDateInstance(int style)获得。出于方便的原因，DateFormat提供了几种预置的常量，你可以使用这些常量参数。下面是几个SHORT, MEDIUM, LONG, 和FULL类型的示例： <br><br>import java.util.*; <br><br>import java.text.*; <br><br>public class StyleDemo { <br><br>public static void main(String[] args) { <br><br>Date now = new Date(); <br><br>DateFormat df = DateFormat.getDateInstance(); <br><br>DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT); <br><br>DateFormat df2 = DateFormat.getDateInstance(DateFormat.MEDIUM); <br><br>DateFormat df3 = DateFormat.getDateInstance(DateFormat.LONG); <br><br>DateFormat df4 = DateFormat.getDateInstance(DateFormat.FULL); <br><br>String s = df.format(now); <br><br>String s1 = df1.format(now); <br><br>String s2 = df2.format(now); <br><br>String s3 = df3.format(now); <br><br>String s4 = df4.format(now); <br><br>System.out.println("(Default) Today is " + s); <br><br>System.out.println("(SHORT) Today is " + s1); <br><br>System.out.println("(MEDIUM) Today is " + s2); <br><br>System.out.println("(LONG) Today is " + s3); <br><br>System.out.println("(FULL) Today is " + s4); <br><br>} <br><br>} <br><br><br>程序输出如下： <br><br>(Default) Today is Nov 8, 2000 <br><br>(SHORT) Today is 11/8/00 <br><br>(MEDIUM) Today is Nov 8, 2000 <br><br>(LONG) Today is November 8, 2000 <br><br>(FULL) Today is Wednesday, November 8, 2000 <br><br><br>　　同样的程序，在电脑上使用缺省设置运行后，改变区域设置为瑞典，输出如下： <br><br>(Default) Today is 2000-nov-08 <br><br>(SHORT) Today is 2000-11-08 <br><br>(MEDIUM) Today is 2000-nov-08 <br><br>(LONG) Today is den 8 november 2000 <br><br>(FULL) Today is den 8 november 2000 <br><br><br>　　从这里，你能看到，瑞典的月份不是大写的（虽然November还是november）.还有，LONG和FULL版本在瑞典语中是一样的，但是美国英语却不同。另外，有趣的是，瑞典语单词的星期三,onsdag，没有包含在FULL日期里，英语却包括。 <br><br>　　注意你能够使用getDateInstance()方法改变DateFormat实例的语种；但是，在上面的例子中，是通过改变Windows98的控制面板的区域设置做到的。不同的地方的区域设置不同，结果就不同，这样有好处，也有不足，Java程序员应该了解这些。一个好处是Java程序员可以只写一行代码就可以显示日期，而且世界不同地区的电脑运行同样的程序会有不用的日期格式。但是这也是一个缺点，当程序员希望显示同一种格式的时--这也有可取之处，举例来说，在程序中混合输出文本和日期，如果文本是英文，我们就不希望日期格式是其他的格式，象德文或是西班牙文。如果程序员依靠日期格式编程，日期格式将根据运行程序所在电脑的区域设置不用而不同。<br><br><br>　　解析字符串 <br><br>　　通过parse()方法，DateFormat能够以一个字符串创立一个Date对象。这个方法能抛出ParseException异常，所以你必须使用适当的异常处理技术。下面的例子程序通过字符串创建Date对象： <br><br>import java.util.*; <br><br>import java.text.*; <br><br>public class ParseExample { <br><br>public static void main(String[] args) { <br><br>String ds = "November 1, 2000"; <br><br>DateFormat df = DateFormat.getDateInstance(); <br><br>try { <br><br>Date d = df.parse(ds); <br><br>} <br><br>catch(ParseException e) { <br><br>System.out.println("Unable to parse " + ds); <br><br>} <br><br>} <br><br>} <br><br><br>　　在创建一个任意的日期时parse()方法很有用。我将通过另一种方法创建一个任意得日期。同时，你将看到怎样进行基本日期计算，例如计算90天后的另一天。你可以使用GregorianCalendar类来完成这个任务。 <br><br><br>　　GregorianCalendar类 <br><br>　　创建一个代表任意日期的一个途径使用GregorianCalendar类的构造函数，它包含在java.util包中： <br><br>　　GregorianCalendar(int year, int month, int date) <br><br><br>　　注意月份的表示，一月是0，二月是1，以此类推，是12月是11。因为大多数人习惯于使用单词而不是使用数字来表示月份，这样程序也许更易读，父类 Calendar使用常量来表示月份：JANUARY, FEBRUARY,等等。所以，创建Wilbur 和 Orville制造第一架动力飞机的日期（December 17, 1903），你可以使用： <br><br>　　GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17); <br><br>　　出于清楚的考虑，你应该使用前面的形式。但是，你也应该学习怎样阅读下面的短格式。下面的例子同样表示December 17,1903（记住，在短格式中，11表示December） <br><br>　　GregorianCalendar firstFlight = new GregorianCalendar(1903, 11, 17); <br><br><br>　　在前面，你学习了转换Date对象到字符串。这里，你可以做同样的事情；但是首先，你需要将GregorianCalendar对象转换到Date。要做到这一点，你可以使用getTime()方法，从它得父类Calendar继承而来。GetTime()方法返回GregorianCalendar相应的Date对象。你能够创建GregorianCalendar对象，转换到Date对象，得到和输出相应的字符串这样一个过程。下面是例子： <br><br>import java.util.*; <br><br>import java.text.*; <br><br>public class Flight { <br><br>public static void main(String[] args) { <br><br>GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17); <br><br>Date d = firstFlight.getTime(); <br><br>DateFormat df = DateFormat.getDateInstance(); <br><br>String s = df.format(d); <br><br>System.out.println("First flight was " + s); <br><br>} <br><br>} <br><br><br>　　有时候创建一个代表当前时刻的GregorianCalendar类的实例是很有用的。你可以简单的使用没有参数的GregorianCalendar构造函数，象这样： <br><br>GregorianCalendar thisday = new GregorianCalendar(); <br><br><br>　　一个输出今天日期的例子程序，使用GregorianCalendar对象： <br><br>import java.util.*; <br><br>import java.text.*; <br><br>class Today { <br><br>public static void main(String[] args) { <br><br>GregorianCalendar thisday = new GregorianCalendar(); <br><br>Date d = thisday.getTime(); <br><br>DateFormat df = DateFormat.getDateInstance(); <br><br>String s = df.format(d); <br><br>System.out.println("Today is " + s); <br><br>} <br><br>} <br><br><br>　　注意到，Date()构造函数和GregorianCalendar()构造函数很类似：都创建一个对象，条件简单，代表今天。
<img src ="http://www.cnitblog.com/mordecai/aggbug/31482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-08-08 10:11 <a href="http://www.cnitblog.com/mordecai/articles/31482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WEB.XML文件介绍</title><link>http://www.cnitblog.com/mordecai/articles/31481.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Wed, 08 Aug 2007 02:10:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/31481.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/31481.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/31481.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/31481.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/31481.html</trackback:ping><description><![CDATA[<div>web.xml文件是整个Web工程的配置文件,它负责对Web工程的Servlet\Struts标签等进行配置</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>webl.xml 文件以一个XML头开始.声明可以使用的XML版本为1.0,并给出文件的字符编码.--&gt;</div>
<div><font style="BACKGROUND-COLOR: #c7c7c7">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</font></div>
<div>&nbsp;</div>
<div>顶层(根元素为 web-app. </div>
<div>这里需要注意一点,不像html,xml是大小写敏感的.因此,web-app必须是小写,而web-App和WEB-APP是非法的.</div>
<div>XML元素不仅是大小写敏感的,而且它们还对出现在其他元素中的次序敏感</div>
<div>例如,XML头、web－app的次序不能改变。在web-app元素内，元素的次序也很重要。当元素次序不正确时，服务器可以拒绝执行web应用。使用非标准的web.xml文件时不可移植的</div>
<div>在如下的代码中，servlet元素必须出现在所有servlet-mapping元素之前</div>
<div>&nbsp;</div>
<div><font style="BACKGROUND-COLOR: #c7c7c7">&lt;web-app xmlns="</font><a href="http://java.sun.com/xml/ns/j2ee"><font style="BACKGROUND-COLOR: #c7c7c7" color=#0000ff><u>http://java.sun.com/xml/ns/j2ee</u></font></a><font style="BACKGROUND-COLOR: #c7c7c7">" xmlns:xsi="</font><a href="http://www.w3.org/2001/XMLSchema-instance"><font style="BACKGROUND-COLOR: #c7c7c7" color=#0000ff><u>http://www.w3.org/2001/XMLSchema-instance</u></font></a><font style="BACKGROUND-COLOR: #c7c7c7">" version="2.4" xsi:schemaLocation="</font><a href="http://java.sun.com/xml/ns/j2ee"><font style="BACKGROUND-COLOR: #c7c7c7" color=#0000ff><u>http://java.sun.com/xml/ns/j2ee</u></font></a><font style="BACKGROUND-COLOR: #c7c7c7">&nbsp;&nbsp; </font><a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><font style="BACKGROUND-COLOR: #c7c7c7" color=#0000ff><u>http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</u></font></a><font style="BACKGROUND-COLOR: #c7c7c7">"&gt;</font></div>
<div><font style="BACKGROUND-COLOR: #c7c7c7"></font>&nbsp;</div>
<div><font style="BACKGROUND-COLOR: #ffffff">&lt;servlet-name&gt;标签定义御用Web应用的servlet</font></div>
<div>下面两个元素指定由ActionServlet接收请求，并确定其如何响应</div>
<div>&nbsp;</div>
<div><font style="BACKGROUND-COLOR: #c7c7c7">&lt;servlet&gt;<br>&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;<br></font>&nbsp;&nbsp;&nbsp; &nbsp;&lt;init-param&gt;标签定义了servlet初始化参数</div>
<div>&nbsp;&nbsp; 利用config指示ActionServlet的行为由指定的配置文件&gt;/WEB-INF/struts-config.xml 来指导&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp;<font style="BACKGROUND-COLOR: #c7c7c7"> &lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;</font></div>
<div>&nbsp;&nbsp;&nbsp; 下面的debug为整数，他指定将有关处理的详细信息写到控制台的程度</div>
<div>默认为0，记录最少的日志信息。<br>&nbsp;&nbsp;&nbsp;<font style="BACKGROUND-COLOR: #c7c7c7"> &lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;3&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;</font></div>
<div>&nbsp;&nbsp;&nbsp;detail参数指示浆&#8220;映射详细信息写至控制台的程度&#8221;<br>&nbsp;&nbsp;&nbsp; <font style="BACKGROUND-COLOR: #c7c7c7">&lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;detail&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;3&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;</font></div>
<div>&nbsp;</div>
<div>&nbsp;&nbsp; 使用&lt;load-on-startup&gt;0&lt;/load-on-startup&gt;完成在启动应用程序时装入servlet的功能</div>
<div><br>&nbsp;&nbsp;&nbsp;<font style="BACKGROUND-COLOR: #c7c7c7"> &lt;load-on-startup&gt;0&lt;/load-on-startup&gt;<br>&nbsp; &lt;/servlet&gt;</font></div>
<div><font style="BACKGROUND-COLOR: #c7c7c7"></font>&nbsp;</div>
<div><font style="BACKGROUND-COLOR: #ffffff">利用&lt;servlet－mapping元素指定URL的结尾命名模式&gt;</font></div>
<div>&nbsp; <font style="BACKGROUND-COLOR: #c7c7c7">&lt;servlet-mapping&gt;<br>&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br>&nbsp; &lt;/servlet-mapping&gt;</font></div>
<div>&nbsp;</div>
<div>使用welcome-file-list元素指定欢迎页面</div>
<div>&nbsp;<font style="BACKGROUND-COLOR: #c7c7c7"> &lt;welcome-file-list&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br>&nbsp; &lt;/welcome-file-list&gt;</font></div>
<div>&nbsp;</div>
<div>声明web应用程序所使用的Struts标签库</div>
<div><font style="BACKGROUND-COLOR: #c7c7c7">&lt;taglib&gt;</font></div>
<div><font style="BACKGROUND-COLOR: #c7c7c7">&nbsp;&nbsp; &lt;taglib-uri&gt;/WEB-INF/struts-logic.tld&lt;/taglib-url&gt;</font></div>
<div><font style="BACKGROUND-COLOR: #c7c7c7">&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/struts-logic.tld&lt;/taglib-location&gt;</font></div>
<div><font style="BACKGROUND-COLOR: #c7c7c7">&lt;/taglib&gt;</font></div>
<img src ="http://www.cnitblog.com/mordecai/aggbug/31481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-08-08 10:10 <a href="http://www.cnitblog.com/mordecai/articles/31481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>servlet 技术</title><link>http://www.cnitblog.com/mordecai/articles/31480.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Wed, 08 Aug 2007 02:09:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/31480.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/31480.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/31480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/31480.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/31480.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.Servlet 介绍1.1什么是Servlet&nbsp; Servlet（java服务器小程序） 是用java编写的服务器端程序，是由服务器调用和执行的、按照Servlet自身规范编写的java类。Servlet可以看成是用Java编写的CGI，但是他的功能和性能比CGI更加强大。1.2 Servlet 的生命周期&nbsp;&nbsp; Servlet 部署在容器里，它的生命周期由容器管理...&nbsp;&nbsp;<a href='http://www.cnitblog.com/mordecai/articles/31480.html'>阅读全文</a><img src ="http://www.cnitblog.com/mordecai/aggbug/31480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-08-08 10:09 <a href="http://www.cnitblog.com/mordecai/articles/31480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Servlet技术实现Web数据库查询</title><link>http://www.cnitblog.com/mordecai/articles/31479.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Wed, 08 Aug 2007 02:08:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/31479.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/31479.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/31479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/31479.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/31479.html</trackback:ping><description><![CDATA[---- Servlet最重要的用途之一就是实现三层结构的Web数据库模式，即客户浏览器、 Web服务器和数据库服务器三层结构，这也是当前Internet/Intranet最流行的应用模式之一。本文讨论了基于这种模式利用Servlet技术查询Web数据库的方法。 <br><br>----本文使用的软件包为jsdk2.1，安装的目录为 C:\\jdk1.2\\jsdk2.1。客户机的平台为<a class=wordstyle href="http://www.newasp.cn/" target=_blank><u><font color=#0000ff>Windows</font></u></a> 98，安装IE 5.0，Web服务器为<a class=wordstyle href="http://www.newasp.cn/" target=_blank><u><font color=#0000ff>Windows</font></u></a> NT 4.0 SP4，安装Microsoft Internet Information Server (IIS) 4.0，IP地址为98.53.72.169。 <br><br>一、关于Servlet <br>----Servlet是用Java编写的、协议和平台独立的服务器端组件，它采用&#8220;请求/响应&#8221;模式， 提供了一种基于Java的Web服务器的解决方案，可以动态地扩展支持Java的Web服务器。由于Servlet运行在服务器内部，它们不需要图形用户接口。 <br>----虽然所有的Servlet都是用Java写的，但它们的客户端可以使用别的语言编写，当Servlet作为在分布式应用系统的中间层使用时，对于用其他语言编写的其他的服务，它们可以交替地成为客户机或服务器。 <br><br>----Servlet API的最大优点是协议的独立性，它不假定<a class=wordstyle href="http://www.newasp.cn/" target=_blank><u><font color=#0000ff>网络</font></u></a>传输使用的协议、Servlet如何装载以及运行的服务器环境，这些特性使得Servlet API可以方便地嵌入到许多不同种类的服务器中。另外，它还具有可扩展、简单、短小、容易使用的特点。 <br><br>----Servlet最突出的特征之一就是对于每一个请求不需要像 CGI那样单独创建一个新的进程。在大多数环境中，许多Servlet可以并行运行在与服务器相同的进程中，这是因为Servlet仅仅要求轻量级的、现成的上下文转换，即便是Fast －CGI，每个请求都涉及重量级的进程上下文的转换。由于在大多数环境中，Servlet可以处理许多已初始化的客户请求，这些初始化的开销由许多方法分担，对于该Service方法所面对的所有客户请求，它们都有机会共享数据和通讯资源，并充分利用系统缓存的优点。 <br><br>二、Servlet编程基础 <br>----1． HttpServlet类 <br>----HttpServlet类是一个抽象类，我们可以从该类派生出一个子类来实现一个Http servlet，接受来自Web站点的请求（该请求来自访问该Web站点的客户浏览器），并将处理后的响应结果发回Web站点（Web站点再将响应结果发送给客户浏览器），在HttpServlet的子类中，我们必须至少重载表1中所列的一种方法。对于表 1中的每一种Http请求，service方法通过分派它们到相应的handler线程（doXXX方法）来处理这些标准的Http请求。 <br><br><br><br>----Servlet通常运行在多线程的服务器中，因此，我们编写的 Servlet代码必须能够处理并行请求和对数据资源的同步访问。共享资源包括内存中的数据（例如：实例或类变量）和外部对象（例如：文件、数据库连接或<a class=wordstyle href="http://www.newasp.cn/" target=_blank><u><font color=#0000ff>网络</font></u></a>连接）。 <br><br>----在DemoTable.java中使用的doGet方法的原型如下: <br>----protected void doGet (HttpServletRequest req, HttpServletResponse resp) <br>----throws ServletException, IOException <br><br>----doGet方法从service方法接受并处理HTTP GET请求。 GET方法允许客户读取来自Web服务器的信息，客户通过传递一个带URL的查询字符串可以告诉服务器它需要什么信息。 <br><br>----如果重载该方法，我们应该从请求读数据，在响应中设置整个headers，访问PrintWriter或输出流对象，最后写响应数据。当设置headers时，应确保包含content type和encoding。如果使用PrintWriter对象返回响应，在存取PrintWriter对象之前必须设置content type。Servlet引擎必须在写响应数据之前写headers，因为在写数据之后headers随时都可能被刷新。如果请求的格式不正确，doGet方法将返回一个HTTP BAD_REQUEST信息。 <br><br>----参数req为一个HttpServletRequest对象，含有客户浏览器的Servlet请求；resp是一个HttpServletResponse对象，含有Servlet发送给客户浏览器的响应。 <br><br>----2．HttpServletRequest接口 <br><br>----HttpServletRequest接口扩展了javax.servlet. ServletRequest 接口，用于提供更多的功能给HttpServlet。Servlet引擎实现该接口，创建HttpServletRequest 对象，将来自客户浏览器的信息传递给HttpServlet的service方法。 <br><br>----3．HttpServletResponse接口 <br><br>----HttpServletResponse接口扩展了OutputStream类，因此，我们可以使用OutputStream类中声明的方法，例如getOutputStream和println方法。 <br><br>三、<a class=wordstyle href="http://www.newasp.cn/" target=_blank><u><font color=#0000ff>Windows</font></u></a> NT服务器端数据库的设置 <br>----为简单起见，本文不使用SQL Server作为数据库服务器，而是直接使用一个简单的数据库DemoTable.DBF，该数据库的内容如图2所示。NT服务器上设置ODBC数据库资源的方法如下： <br>----（1）在&#8220;控制面板&#8221;选择&#8220;ODBC Data Sources&#8221;； <br><br>----（2）在弹出的对话框中选择&#8220;User DSN&#8221;选项卡，选择&#8220;Visual FoxPro Tables&#8221;，点击&#8220;Add...&#8221;按钮； <br><br>----（3）在弹出的对话框中选择&#8220;Microsoft Visual FoxPro Driver(＊.dbf)&#8221;，点击&#8220;下一步&#8221;按钮； <br><br>----（4）在&#8220;ODBC Visual FoxPro Setup&#8221;对话框中，按图1所示的内容设置。 <br><img style="CURSOR: pointer" onclick=javascript:window.open(this.src); src="http://www.linuxaid.com.cn/developer/jsp/0486901.jpg" onload="return imgzoom(this,550)"><br><br><br>四、源程序：DemoTable.java<br>import java.io.＊;<br>import java.sql.＊;<br>import javax.servlet.＊;<br>import javax.servlet.http.＊;<br><br>public class DemoTable extends HttpServlet<br>{<br>Connection con;<br><br>public void init(ServletConfig config) <br>throws ServletException <br>{<br>super.init(config);<br><br>try {<br>// 加载 jdbc－odbc 桥驱动程序<br>Class.forName(&#8220;sun.jdbc.odbc.JdbcOdbcDriver\");<br>//得到与数据库的连接<br>con = DriverManager.getConnection<br>(&#8220;jdbc:odbc:DemoTable\", &#8220;\", &#8220;\");<br>}catch (ClassNotFoundException e){ <br>throw new UnavailableException(this, <br>&#8220;Couldn\t load JdbcOdbcDriver\");<br>}catch (SQLException e) { <br>throw new UnavailableException(this,<br>&#8220;Couldn\t get db connection\");<br>} <br>}<br><br>public void doGet(HttpServletRequest req, <br>HttpServletResponse res)<br>throws ServletException, IOException <br>{<br>String sql = &#8220;SELECT<br>＊ from DemoTable ORDER BY test_id\";<br><br>try {<br>//建立输出的类型<br>res.setContentType(&#8220;text/plain\");<br>//得到输出流<br>ServletOutputStream out = res.getOutputStream();<br><br>try {<br>//得到一个Statement对象<br>Statement stmt = con.createStatement();<br><br>if (stmt.execute(sql))<br>{ <br>//查询数据库中的表DemoTable，<br>得到以test_id排序后的所有记录，<br>并存储在ResultSet对象rs中<br>ResultSet rs = stmt.getResultSet(); <br>out.println(&#8220;&lt; TABLE &gt;\\n\");<br><br>ResultSetMetaData rsmd = rs.getMetaData();<br>int numcols = rsmd.getColumnCount();<br>// 输出表头<br>out.println(&#8220;&lt; TR &gt;\");<br>for (int i = 1; i &lt; = numcols; i＋＋)<br>out.println(&#8220;&lt; TH &gt;\" ＋ rsmd.getColumnLabel(i));<br>out.println(&#8220;&lt; /TR &gt;\\n\");<br><br>//输出记录<br>while(rs.next()){<br>out.println(&#8220;&lt; TR &gt;\");<br><br>for(int i = 1; i &lt; = numcols; i＋＋) {<br>out.println(&#8220;&lt; TD &gt;\");<br>Object obj = rs.getObject(i);<br>if (obj != null)<br>out.println(obj.toString());<br>else<br>out.println(&#8220;＆nbsp;\");<br>}<br>out.println(&#8220;&lt; /TR &gt;\\n\");<br>}<br>out.println(&#8220;&lt; /TABLE &gt;\\n\");<br>}<br>else {<br>out.println(&#8220;&lt; B &gt;Records Affected:&lt; /B &gt; <br>\" ＋stmt.getUpdateCount()); <br>}<br>}catch (SQLException e) {<br>out.println(&#8220;&lt; /TABLE &gt;&lt; H1 &gt;ERROR:<br>&lt; /H1 &gt; \" ＋ e.getMessage());<br>} <br>con.close();//关闭与数据库的连接<br>}catch(SQLException e) {<br>//不处理异常<br>} <br>}<br>}<br><br>五、程序编译与发布 <br>----在编译Servlet程序时，必须指定Javax包的类路径，我们即可以在CLASPATH环境变量中设置server.jar和servlet.jar的路径，也可以直接在编译时指定，例如： <br>---- javac －classpath c:\\jdk1.2\\jsdk2.1\\server.jar; c:\\jdk1.2\\jsdk2.1\\servlet.jar DemoTable.java <br>----编译通过后，我们应该将编译得到的HelloWorl.class文件复制到Servlet服务器的HOME目录下，由于当前jsdk2.1的安装目录为C:\\jdk1.2\\jsdk2.1，所以其HOME目录为C:\\jdk1.2\\jsdk2.1\\examples\\WEB－INF\\servlets，这是一个真实路径，对于本例中所使用的服务器而言，其对应的虚拟路径为：<a style="COLOR: #003793" href="http://98.53.72.169:8080/servlets/" target=_blank><u>http://98.53.72.169:8080/servlets/</u></a>，客户浏览器访问Servlet服务器时，应该使用虚拟路径，如图2所示。 <br><br>六、运行Servlet <br>----在使用浏览器访问该 Servlet之前，必须先启动Servlet 服务器。在<a class=wordstyle href="http://www.newasp.cn/" target=_blank><u><font color=#0000ff>Windows</font></u></a> NT上启动Servlet服务器很简单，可以在MS－DOS命令行上直接运行startserver批处理文件（在C:\\jdk1.2\\jsdk2.1目录下）。如果Servlet服务器启动正确，将弹出另一个DOS窗口，作为一个单独的进程运行。在DOS命令行上运行stopserver可以停止Servlet服务器的运行。 <br>----客户机浏览器运行结果如图2所示。 <br>
<img src ="http://www.cnitblog.com/mordecai/aggbug/31479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-08-08 10:08 <a href="http://www.cnitblog.com/mordecai/articles/31479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>