<?xml version="1.0" encoding='utf-8'?>
<!-- 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
-->
<?xml-stylesheet type="text/xsl" href="http://study.ywicc.edu.cn/roller/roller-ui/styles/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom">
    <title type="html">JSP</title>
    <subtitle type="html">网页应用程序开发</subtitle>
    <id>http://study.ywicc.edu.cn/roller/jsp/feed/entries/atom</id>
        <link rel="self" type="application/atom+xml" href="http://study.ywicc.edu.cn/roller/jsp/feed/entries/atom" />
    <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/" />
    <updated>2022-07-18T11:16:05+08:00</updated>
    <generator uri="http://roller.apache.org" version="6.1.1">Apache Roller</generator>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C13_%E5%95%86%E5%BA%97%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%AE%9E%E7%8E%B0</id>
        <title type="html">JSP实验13 商店系统的实现</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C13_%E5%95%86%E5%BA%97%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%AE%9E%E7%8E%B0"/>
        <published>2012-12-24T13:59:10+08:00</published>
        <updated>2013-12-23T15:11:36+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="实验" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;1 后台管理系统框架&lt;br /&gt;2 后台商店管理模块&lt;br /&gt;3 前台商品浏览模块&lt;br /&gt;4 购物车功能的实现&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;教学目的：掌握商店子系统的实现过程&lt;/p&gt; 
  &lt;p&gt;本次实验在实验12完成进度的基础上进行，如实验12内容已删除，请在教学辅助系统中下载JSP项目包ROOT-12.rar及所用的数据库cloud.mdb，重建jsproot站点，发布到Tomcat服务器的根目录。&lt;/p&gt; 
  &lt;p&gt;新增组件：商店子系统使用了实现购物车功能的JavaBean类tools.ShoppingCart，包含在Java项目包Tools中，将相应类文件ShoppingCart.class（连带包目录tools）放到发布目录的类文件夹WEB-INF\classes。&lt;/p&gt; 
  &lt;p&gt;在JSP中使用购物车JavaBean的，首先引入JavaBean作为阶段级对象：&lt;/p&gt; 
  &lt;p&gt;&amp;lt;jsp:useBean id=&amp;quot;oCart&amp;quot; scope=&amp;quot;session&amp;quot; class=&amp;quot;tools.ShoppingCart&amp;quot; /&amp;gt;&lt;/p&gt; 
  &lt;p&gt;然后执行以下方法操作购物车：&lt;/p&gt; 
  &lt;p&gt;oCart.setItem(商品ID, 数量) //指定商品，默认数量为1&lt;/p&gt; 
  &lt;p&gt;oCart.setAct(操作) //指定操作，添加add/删除remove/更新update&lt;/p&gt; 
  &lt;p&gt;oCart.processRequest() //执行针对指定商品的指定操作&lt;/p&gt; 
  &lt;p&gt;购物车返回的内容为散列表映射集HashMap，可用迭代器Iterator读取（需要引入java.util包）&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;1 后台管理系统框架&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;1-1 建立后台管理系统框架&lt;/p&gt; 
  &lt;p&gt;在线商店由管理员来负责经营，因此需要建立一个后台管理系统，简单起见目前只建立后台管理系统的框架并实现商店管理的添加商品功能。&lt;/p&gt; 
  &lt;p&gt;首先注册一个会员账号admin，在会员表中将会员类型由默认的usr改为adm。&lt;/p&gt; 
  &lt;p&gt;在站点发布目录下创建adm文件夹，在其中基于BlueRain模板的temp.htm创建管理首页main.jsp和管理登录页index.jsp。&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;在main.jsp中添加包括文件header.jsp和footer.jsp并在header.jsp中动态设置当前栏目：&lt;/p&gt; 
  &lt;p&gt;&amp;lt;li class=&amp;quot;&amp;lt;%= section.equals(&amp;quot;adm_main&amp;quot;)?&amp;quot;selected&amp;quot;:&amp;quot;&amp;quot; %&amp;gt;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;main.jsp&amp;quot;&amp;gt;后台首页&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br clear=&quot;none&quot; /&gt; &amp;lt;li class=&amp;quot;&amp;lt;%= section.equals(&amp;quot;adm_shop&amp;quot;)?&amp;quot;selected&amp;quot;:&amp;quot;&amp;quot; %&amp;gt;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;shop.jsp&amp;quot;&amp;gt;商店管理&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/p&gt; 
  &lt;p&gt;管理首页main.jsp顶部添加设置对应的栏目变量值&lt;/p&gt; 
  &lt;p&gt;&amp;lt;% String section = &amp;quot;adm_main&amp;quot;; %&amp;gt;&lt;/p&gt; 
  &lt;p&gt;其他栏目页面只需修改此变量值即可。&lt;/p&gt; 
  &lt;p&gt;1-2 管理登录页index.jsp&lt;/p&gt; 
  &lt;p&gt;功能：登录后台管理系统，登录时应设置访问级别&lt;/p&gt; 
  &lt;p&gt;index.jsp先删除页面导航栏，设置登录表单并添加“登录用户”服务器行为，这一次要加上选取访问级别字段type&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/9c23461a-6937-4b34-9e4a-b501d58d6acf&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;添加实现MD5变换的JavaBean：&lt;/p&gt; 
  &lt;p&gt;&amp;lt;jsp:useBean id=&amp;quot;oMD5&amp;quot; scope=&amp;quot;request&amp;quot; class=&amp;quot;tools.MD5&amp;quot; /&amp;gt;&lt;/p&gt; 
  &lt;p&gt;修改自动生成的代码添加密码的MD5变换：&lt;/p&gt; 
  &lt;p&gt;MM_statementUser.setObject(2, &lt;span style=&quot;color: #ff0000;&quot;&gt;oMD5.getMD5ofStr(&lt;/span&gt;request.getParameter(&amp;quot;password&amp;quot;)&lt;span style=&quot;color: #ff0000;&quot;&gt;)&lt;/span&gt;);&lt;/p&gt; 
  &lt;p&gt;登录失败后直接回到登录页面并显示提示文本：&lt;/p&gt; 
  &lt;p&gt;&amp;lt;%= (request.getParameter(&amp;quot;err&amp;quot;) != null &amp;amp;&amp;amp; request.getParameter(&amp;quot;err&amp;quot;).equals(&amp;quot;1&amp;quot;))?&amp;quot;登录失败！&amp;quot;:&amp;quot;&amp;quot; %&amp;gt;&lt;/p&gt; 
  &lt;p&gt;（注意：实用的管理员登录功能应有更高的安全设置，例如增加图形化的随机验证码等）&lt;/p&gt; 
  &lt;p&gt;1-3 管理首页main.jsp&lt;/p&gt; 
  &lt;p&gt;功能：提供后台管理系统各栏目导航，限管理员登录&lt;/p&gt; 
  &lt;p&gt;main.jsp添加“限制对页的访问”服务器行为，选取允许级别为adm&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/89b7bc57-2d3c-48f8-bed9-ed66baf895b7&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt;修改自动生成的代码，增加判断是否存在阶段变量MM_UserAuthorization（原代码存在BUG，如登录用户服务器行为未设置访问级别，则普通用户登录后也能访问受限页面）：&lt;/p&gt; 
  &lt;pre&gt;if (session.getValue(&quot;MM_Username&quot;) != null &amp;amp;&amp;amp; !session.getValue(&quot;MM_Username&quot;).equals(&quot;&quot;)
&lt;span style=&quot;color: #ff0000;&quot; data-mce-style=&quot;color: #ff0000;&quot;&gt;&amp;amp;&amp;amp; session.getValue(&quot;MM_UserAuthorization&quot;) != null &amp;amp;&amp;amp; !session.getValue(&quot;MM_UserAuthorization&quot;).equals(&quot;&quot;)&lt;/span&gt;) {&lt;/pre&gt; 
  &lt;p&gt;&lt;strong&gt;2 后台商店管理模块&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;2-1 商店管理首页shop.jsp&lt;/p&gt; 
  &lt;p&gt;功能：提供商店管理各功能页导航，限管理员登录&lt;/p&gt; 
  &lt;p&gt;基于main.jsp创建shop.jsp（所有后台页面都基于main.jsp创建），使用包括指令添加左侧导航栏lefter_shop.jsp，设置链接：商店管理首页、新增商品&lt;/p&gt; 
  &lt;p&gt;2-2 商店管理-新增商品页shop_additem.jsp&lt;/p&gt; 
  &lt;p&gt;功能：使用表单提交商品信息并上传商品图片插入商品表&lt;/p&gt; 
  &lt;p&gt;基于shop.jsp创建shop_additem.jsp，在head区段引入样式表文件uploadify.css和脚本文件jquery.min.js、jquery.uploadify.min.js，设置上传客户端插件：&amp;nbsp;&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function(e) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;$(&quot;#uploadify&quot;).uploadify({
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;&apos;swf&apos; : &apos;../uploadify.swf&apos;,
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;&apos;multi&apos; : false,
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;&apos;uploader&apos; : &apos;../upload&apos;,
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;&apos;buttonText&apos; : &apos;上传图片&apos;,
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;&apos;fileTypeExts&apos; : &apos;*.jpg;*.png;*.gif&apos;,
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;&apos;flleSizeLimit&apos; : &apos;2000KB&apos;,
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;&apos;onUploadSuccess&apos; : function(file, data, response) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;$(&quot;#pic&quot;).attr(&quot;value&quot;, data); &amp;nbsp;// 商品图片文本域的值设为上传的图片文件名
&lt;span class=&quot;Apple-tab-span&quot;&gt;			&lt;/span&gt;$(&quot;#photo&quot;).append(&quot;&amp;lt;img src=&apos;../upload?getthumb=&quot; + data + &quot;&apos; /&amp;gt;&quot;);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;$(&quot;#uploadify&quot;).hide(); &amp;nbsp;// 隐藏上传按钮
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;$(&quot;#uploadify-queue&quot;).hide(); &amp;nbsp;// 隐藏上传进度条
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;});
});
&amp;lt;/script&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在页面中添加表单并设置表单域：商品名称itemname，介绍detail，价格price，图片pic（只读文本域，上传图片后将值设置为上传的图片文件名）&lt;/p&gt; 
  &lt;p&gt;选定表单添加“检查表单”行为和“插入记录”服务器行为即可&lt;/p&gt; 
  &lt;p&gt;再添加名为uploadify的文件域和名为photo的层用于上传和显示图片缩略图（注意：Uploadify插件自带表单，所以应置于插入记录表单之外否则会导致冲突；也可以将插入记录表单的提交方式改为GET（即在地址栏中附加参数）；或是只使用Uploadify上传图片后执行预处理语句自动将商品信息写入数据库，具体实现参看相册系统）&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/409c47e5-c87b-4fc8-a941-1240078e6dd3&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;3 前台商品浏览模块&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;3-1 商店首页shop.jsp&lt;/p&gt; 
  &lt;p&gt;功能：显示商品列表，访问者可点击链接查看商品详情或将商品加入购物车&lt;/p&gt; 
  &lt;p&gt;修改网站导航栏header.jsp添加商店栏目链接；基于lefter_home.jsp创建商店的左侧导航栏lefter_shop.jsp：浏览商品shop.jsp，查看购物车shop_cart.jsp，我的订单shop_order.jsp&lt;/p&gt; 
  &lt;p&gt;基于user.jsp创建shop.jsp（商店首页允许所有访问者浏览，因此要删掉原有的“限制对页的访问”服务器行为和会员信息记录集），设置左侧导航栏。在右侧的detail_right层中显示商品信息（具体实现请参看相册页面），效果如下（注意可以在绑定面板中设置价格字段的显示格式为货币）：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/93d6b3f3-e98c-462e-98ba-7b177c9cb412&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;加入购物车的链接目标是操作购物车页shop_dealcart.jsp，提交参数为商品ID号itemid、商品数量num（设为1）、操作类型act（设为add）&lt;/p&gt; 
  &lt;p&gt;shop_dealcart.jsp?itemid=&amp;lt;%= rsItem.getString(&amp;quot;itemid&amp;quot;) %&amp;gt;&amp;amp;itemnum=1&amp;amp;act=add&amp;quot;&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;3-2 商品详情页shop_detail.jsp&lt;/p&gt; 
  &lt;p&gt;功能：显示指定商品的详情，提供加入购物车链接（可修改商品数量）&lt;/p&gt; 
  &lt;p&gt;基于shop.jsp页创建shop_detail.jsp，设置记录集筛选指定的商品并显示。&lt;/p&gt; 
  &lt;p&gt;商品详情页使用文本域设置要提交的商品数量，使用表单提交信息到操作购物车页shop_dealcart.jsp&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;4 购物车功能的实现&amp;nbsp;&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;4-1 操作购物车页shop_dealcart.jsp&lt;/p&gt; 
  &lt;p&gt;功能：根据访问者提交的信息操作购物车（加入/删除/修改）&lt;/p&gt; 
  &lt;p&gt;新建文件shop_delcart.jsp，此文件不显示任何内容，完成特定操作后跳转回商品浏览页或查看购物车页：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;jsp:useBean id=&quot;oCart&quot; class=&quot;tools.ShoppingCart&quot; scope=&quot;session&quot;/&amp;gt;
&amp;lt;%
String id = &quot;&quot;;
String num = &quot;&quot;;
String act = &quot;&quot;;
request.setCharacterEncoding(&quot;utf-8&quot;);
if (request.getParameter(&quot;itemid&quot;) != null) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;id = request.getParameter(&quot;itemid&quot;);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;oCart.setItem(id);
}
if (request.getParameter(&quot;itemnum&quot;) != null) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;num=request.getParameter(&quot;itemnum&quot;);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;oCart.setItem(id, num);
}
if (request.getParameter(&quot;act&quot;) != null) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;act=request.getParameter(&quot;act&quot;);
}
oCart.setAct(act);
oCart.processRequest();
if (act.equals(&quot;add&quot;))
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;response.sendRedirect(&quot;shop.jsp&quot;);
else
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;response.sendRedirect(&quot;shop_cart.jsp&quot;);
%&amp;gt;&amp;nbsp;&lt;/pre&gt; 
  &lt;p&gt;4-2 查看购物车页shop_cart.jsp&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;功能：显示访问者的购物车信息，并可修改商品数量或移除商品&lt;/p&gt; 
  &lt;p&gt;基于shop.jsp创建shop_cart.jsp，在页顶引入所需类包、实现购物车的JavaBean并根据统一设置创建数据库连接：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ page import=&quot;java.util.*&quot; %&amp;gt;
&amp;lt;%@ page import=&quot;java.text.*&quot; %&amp;gt;
&amp;lt;jsp:useBean id=&quot;oCart&quot; class=&quot;tools.ShoppingCart&quot; scope=&quot;session&quot;/&amp;gt;
&amp;lt;%
//根据统一设置创建数据库连接
Class.forName(MM_conn_DRIVER);
Connection conn = DriverManager.getConnection(MM_conn_STRING,MM_conn_USERNAME,MM_conn_PASSWORD);
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在页面中插入2行3行表格用于显示购物车中的商品名称、价格和数量，在表格之前添加代码段判断购物车是否为空，不为空时才允许显示购物车表格：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%
HashMap map = oCart.getItems();
if (map.isEmpty()) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;out.println(&quot;您还没有在购物车中放入任何商品！&quot;);
}
else {
DecimalFormat df=new DecimalFormat(&quot;.00&quot;);
Statement stmt = conn.createStatement();
ResultSet rsCart = null;
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在表格第二行之前添加代码段循环处理购物车中的商品，根据商品ID创建记录集获取商品信息：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;for (Iterator iter = map.keySet().iterator(); iter.hasNext();) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;Object key = iter.next();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;rsCart = stmt.executeQuery(&quot;SELECT * FROM item WHERE itemid=&quot; + key);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;rsCart.next();
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在第二行的三个单元格中分别显示商品名称&amp;lt;%= rsCart.getString(&amp;quot;itemname&amp;quot;) %&amp;gt;，商品价格&amp;lt;%= df.format(Double.parseDouble(rsCart.getString(&amp;quot;price&amp;quot;))) %&amp;gt;，和商品数量（并提供修改数量的功能）：&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;pre&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;form action=&quot;shop_dealcart.jsp&quot;&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;&amp;lt;input name=&quot;itemid&quot; type=&quot;hidden&quot; value=&quot;&amp;lt;%= key %&amp;gt;&quot; /&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;input name=&quot;act&quot; type=&quot;hidden&quot; value=&quot;update&quot; /&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;input name=&quot;itemnum&quot; type=&quot;text&quot; class=&quot;Input&quot; id=&quot;itemnum&quot; value=&quot;&amp;lt;%= map.get(key) %&amp;gt;&quot; size=&quot;3&quot; maxlength=&quot;2&quot; /&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;input name=&quot;button&quot; type=&quot;submit&quot; class=&quot;Button&quot; id=&quot;button&quot; value=&quot;修改数量&quot; /&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/form&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在第二行之后添加代码段结束循环语句并关闭数据对象&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;rsCart.close();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;stmt.close();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;conn.close();
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在表格之后添加代码段结束判断语句&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%
}
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;购物车的显示效果如下。要实现从购物车中移除商品只需向shop_dealcart.jsp提交参数为商品ID号itemid和操作类型act（设为remove），注意由于使用ODBC驱动不能两次读取同一字段，需要事先将itemid字段赋值给变量：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/cd5b285a-f649-47ea-bb09-3d318c7fcd91&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;时间所限本实验略去了下单购买和订单管理等模块的实现部分，有兴趣的可以进一步完善功能。&amp;nbsp; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A613_%E5%95%86%E5%BA%97%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%AE%BE%E8%AE%A1</id>
        <title type="html">JSP教学13 商店系统的设计</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A613_%E5%95%86%E5%BA%97%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%AE%BE%E8%AE%A1"/>
        <published>2012-12-21T13:37:55+08:00</published>
        <updated>2012-12-23T21:38:59+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="教学" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;13.1 需求描述&lt;br /&gt;13.2 功能设计&lt;br /&gt;13.3 数据库设计&lt;/p&gt;</summary>
        <content type="html">&lt;h2 style=&quot;font-size: 1.286em; margin-top: 1.111em; margin-bottom: 0.5556em; padding: 0px; border: 0px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif; line-height: 1.111em; letter-spacing: normal;&quot;&gt;&lt;span style=&quot;line-height: 1.428571em; font-size: 14px;&quot;&gt;教学目的：了解商店子系统的设计过程&amp;nbsp;&lt;/span&gt;&lt;/h2&gt; 
  &lt;div style=&quot;margin: 0px; padding: 0px; border: 0px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif; font-size: 14px; line-height: 19.983333587646484px;&quot;&gt; 
    &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;&lt;strong&gt;13.1 需求描述&lt;/strong&gt;&lt;/p&gt; 
    &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;为“云端网”设计商店子系统，要求实现以下基本功能：&lt;/p&gt; 
    &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;- 访问者可以查看并挑选商品&lt;br clear=&quot;none&quot; /&gt;- 会员可以下单购买选定的商品&lt;br clear=&quot;none&quot; /&gt;- 会员可以查看自己的订单&lt;br clear=&quot;none&quot; /&gt;- 管理员可以编辑商品信息&lt;br clear=&quot;none&quot; /&gt;- 管理员可以管理所有订单&lt;/p&gt; 
    &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;&lt;strong&gt;13.2 功能设计&lt;/strong&gt;&lt;/p&gt; 
    &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;根据需求进行功能设计，使用简单的文本描述设计思路：&lt;/p&gt; 
    &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;1）会员查看商品并挑选商品：商品首页显示商品列表，提供“加入购物车”链接&lt;br clear=&quot;none&quot; /&gt;2）会员下单购买选定的商品：购物车页显示选定的商品，提供“下单购买”链接（简单起见只考虑货到付款的支付方式）&lt;br clear=&quot;none&quot; /&gt;3）会员查看本人订单：查看订单页显示会员订单信息和订单状态（未发货/已发货/已收货）&lt;br clear=&quot;none&quot; /&gt;4）管理员编辑商品信息：后台商品管理页显提供商品编辑功能&lt;br clear=&quot;none&quot; /&gt;5）管理员管理所有订单：后台订单管理页显示订单列表，管理员可以设置订单状态&lt;br /&gt;6）购物车：购物车功能可以通过session级&lt;span style=&quot;line-height: 1.428571em;&quot;&gt;JavaBean实现，使用HashMap保存选定商品项，键为商品ID，值为商品数量，购物车中商品的详细信息可根据商品ID从商品表中获取&lt;/span&gt;&lt;/p&gt; 
    &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;&lt;strong&gt;13.3 数据库设计&lt;/strong&gt;&lt;/p&gt; 
    &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;根据功能要求确定使用的数据库系统及数据表结构（字段名和类型说明）&lt;/p&gt; 
    &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;1）商品表item&lt;/p&gt; 
    &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;商品ID：itemid 自动编号，主键&lt;br /&gt;商品名：itemname 文本(20)，必填字段&lt;br /&gt;说明：detail 文本(50)，必填字段&lt;br /&gt;价格：price 货币，必填字段&lt;br /&gt;&lt;span style=&quot;font-family: arial, helvetica, clean, sans-serif; line-height: 17px;&quot;&gt;图片：pic 文本(20)&lt;/span&gt;&lt;/p&gt; 
    &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;2）订单表order&lt;/p&gt; 
    &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;订单ID：orderid 自动编号，主键&lt;br /&gt;下单时间：ordertime 日期/时间，必填字段，默认值Now()&lt;br /&gt;订单状态：orderstate 文本(5)，必填字段，默认值未发货&lt;br /&gt;会员ID：userid 数字(长整型)，必填字段（关联到会员表的会员ID）&lt;br /&gt;&lt;span style=&quot;line-height: 1.428571em;&quot;&gt;收货地址：destination 文本(50&lt;/span&gt;&lt;span style=&quot;line-height: 1.428571em;&quot;&gt;)，必填字段&lt;/span&gt;&lt;/p&gt; 
    &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;3）订单商品表orderitem&lt;/p&gt; 
    &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;订单商品ID：orderitemid 自动编号，主键&lt;br /&gt;订单ID：orderid 数字(长整型)，必填字段（关联到订单表的订单ID）&lt;br /&gt;商品ID：itemid 数字(长整型)，必填字段（关联到商品表的商品ID）&lt;br /&gt;数量：num 数字(长整型)，必填字段，默认值1&lt;br /&gt;价格：price 货币，必填字段&lt;/p&gt; 
    &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;以上是一个最简化的商店系统表结构，可在此基础上继续修改完善。&lt;/p&gt; 
    &lt;div style=&quot;margin: 0px; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt; 
      &lt;p style=&quot;margin: 0px 0px 0.714285em; padding: 0px; border: 0px; line-height: 1.428571em;&quot;&gt;另外对于后台管理功能的实现，可以修改会员表增加一个字段：会员类型type，普通会员的类型为默认值usr，后台页面限类型为adm的管理员登录。&lt;/p&gt; 
    &lt;/div&gt; 
  &lt;/div&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C12_%E7%9B%B8%E5%86%8C%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%AE%9E%E7%8E%B0</id>
        <title type="html">JSP实验12 相册系统的实现</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C12_%E7%9B%B8%E5%86%8C%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%AE%9E%E7%8E%B0"/>
        <published>2012-12-17T08:43:21+08:00</published>
        <updated>2013-12-23T15:10:58+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="实验" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;1 设置栏目框架&lt;br /&gt;2 上传照片模块&lt;br /&gt;3 浏览照片模块&lt;/p&gt;</summary>
        <content type="html">&lt;div style=&quot;margin: 0px; padding: 0px; border: 0px none;&quot;&gt; 
    &lt;p&gt; &lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;实验目的：掌握相册子系统的实现过程&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;本次实验在实验11完成进度的基础上进行，如果实验11内容已删除，请在教学辅助系统中下载JSP项目包ROOT-11.rar及所用的数据库cloud.mdb，重建jsproot站点，发布到Tomcat服务器的根目录。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;新增第三方组件：相册子系统使用了JavaScript库jQuery的图片浏览插件fancyBox，需将其脚本文件及辅助文件放到发布目录。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif;&quot;&gt;&lt;strong&gt;1 设置栏目框架&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;相册系统需要获取会员ID保存到照片表中，为此修改index.jsp中的“登录用户”服务器行为的代码，增加获取会员ID字段userid，并将其为阶段变量userid（以下红字部分为新增的修改）：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt; &lt;/p&gt; 
    &lt;pre&gt;&amp;nbsp; Driver MM_driverUser = (Driver)Class.forName(MM_conn_DRIVER).newInstance();
&amp;nbsp; Connection MM_connUser = DriverManager.getConnection(MM_conn_STRING,MM_conn_USERNAME,MM_conn_PASSWORD);
&amp;nbsp; String MM_pSQL = &quot;SELECT &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;userid, &lt;/span&gt;logname, password&quot;;
&amp;nbsp; if (!MM_fldUserAuthorization.equals(&quot;&quot;)) MM_pSQL += &quot;,&quot; + MM_fldUserAuthorization;
&amp;nbsp; MM_pSQL += &quot; FROM [user] WHERE logname=? AND password=?&quot;;
&amp;nbsp; PreparedStatement MM_statementUser = MM_connUser.prepareStatement(MM_pSQL);
&amp;nbsp; MM_statementUser.setObject(1, MM_valUsername);
&amp;nbsp; MM_statementUser.setObject(2, oMD5.getMD5ofStr(request.getParameter(&quot;password&quot;)));
&amp;nbsp; ResultSet MM_rsUser = MM_statementUser.executeQuery();
&amp;nbsp; boolean MM_rsUser_isNotEmpty = MM_rsUser.next();
&amp;nbsp; if (MM_rsUser_isNotEmpty) {
&amp;nbsp; &amp;nbsp; // username and password match - this is a valid user
&amp;nbsp; &amp;nbsp; session.putValue(&quot;MM_Username&quot;, MM_valUsername);
&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&amp;nbsp; &amp;nbsp; session.setAttribute(&quot;userid&quot;, MM_rsUser.getString(&quot;userid&quot;));&lt;/span&gt;&lt;/pre&gt; 
    &lt;p&gt; &lt;/p&gt; 
    &lt;p&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif;&quot;&gt;基于模板的temp_index.html创建相册首页album.jsp，作为本栏目其他页面的样本。&lt;/span&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;使用包括指令加入新建的栏目导航文件album_menu.jsp，在其中添加文本链接：个人相册album.jsp，公共相册album_pub.jsp、上传照片album_up.jsp，再添加条件语句段，使未登录的访问者看不到导航栏&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;pre&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.983333587646484px;&quot;&gt;&amp;lt;%@ page contentType=&quot;text/html; charset=utf-8&quot; language=&quot;java&quot; %&amp;gt;
&lt;/span&gt;&lt;/font&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.983333587646484px;&quot;&gt;&amp;lt;% if (session.getAttribute(&quot;MM_Username&quot;) != null &amp;amp;&amp;amp; !session.getAttribute(&quot;MM_Username&quot;).equals(&quot;&quot;)) { %&amp;gt;
&lt;/span&gt;&lt;/font&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.983333587646484px;&quot;&gt;&amp;lt;a href=&quot;album.jsp&quot;&amp;gt;个人相册&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;album_pub.jsp&quot;&amp;gt;公共相册&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;album_up.jsp&quot;&amp;gt;上传照片&amp;lt;/a&amp;gt; 编辑相册
&lt;/span&gt;&lt;/font&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.983333587646484px;&quot;&gt;&amp;lt;% } %&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt; 
    &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/a1d5cd9a-40f9-45d8-bf3e-eb707f8af5b8&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;&lt;strong&gt;2 上传照片模块&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;2-1 上传照片页album_up.jsp&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;功能：上传照片到uploads文件夹，同时将照片信息写入照片表，未经登录限制访问&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif;&quot;&gt;基于album.jsp创建上传照片页album_up.jsp，删除所有样例内容&lt;/span&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;添加上传客户端插件Uploadify：附加样式表uploadify.css；插入JavaScript脚本jquery.min.js和jquery.uploadify.min.js。再编写&lt;/span&gt;&lt;/font&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif;&quot;&gt;实现上传的JavaScript脚本，让名为uploadify的元素执行上传操作，上传内容提交到upload（即不带参数执行UploadServlet，上传的文件会按系统时间重命名保存并返回保存文件名），每次上传成功后在photo层中动态加入上传的图片，并在insert层中动态加载插入照片记录页album_insert.jsp（传入三个参数：原文件名filename、保存文件名savename、是否公开public）&lt;/span&gt;&lt;/p&gt; 
    &lt;p&gt; &lt;/p&gt; 
    &lt;pre&gt;&amp;lt;link href=&quot;uploadify.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;jquery.uploadify.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function(e) {
    $(&quot;#uploadify&quot;).uploadify({
		&apos;swf&apos; : &apos;uploadify.swf&apos;,
		&apos;uploader&apos; : &apos;upload&apos;,
		&apos;buttonText&apos; : &apos;上传照片&apos;,
		&apos;fileTypeExts&apos; : &apos;*.jpg;*.png;*.gif&apos;,
		&apos;flleSizeLimit&apos; : &apos;2000KB&apos;,
		&apos;onUploadSuccess&apos; : function(file, data, response) {
			$(&quot;#photo&quot;).append(&quot;&amp;lt;div class=&apos;box&apos;&amp;gt;&amp;lt;img src=&apos;upload?getthumb=&quot; + data + &quot;&apos; /&amp;gt;&amp;lt;br /&amp;gt;&quot; + file.name + &quot;&amp;lt;/div&amp;gt;&quot;);
			$(&quot;#insert&quot;).load(&quot;album_insert.jsp&quot;, {
				&apos;filename&apos; : file.name,
				&apos;savename&apos; : data,
				&apos;public&apos; : ($(&quot;#public&quot;).attr(&quot;checked&quot;)?&quot;1&quot;:&quot;0&quot;)
			});
		}
	});
});
&amp;lt;/script&amp;gt;&lt;/pre&gt; 
    &lt;p&gt; &lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;在页面中插入1行2列表格，添加文件域uploadify，复选框public及文本“公开发布”（还可增加表单域提交主题和说明等信息，相关功能留待以后继续完善）&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;在表格之下添加层：用于加载写入相片表页的insert、用于附加已上传照片信息的photo&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/a2729296-d537-4a0a-bd57-99cbe7f62593&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;最后添加“用户身份验证&amp;gt;限制对页的访问”服务器行为，如访问被拒则转到album.jsp&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif;&quot;&gt;2-2 插入照片记录页album_insert.jsp&lt;/span&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif;&quot;&gt;功能：每次上传照片成功后将照片信息（原文件名、保存文件名、是否公开）写入照片表，并输出上传照片的原文件名&lt;/span&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif;&quot;&gt;创建album_insert.jsp，添加预处理语句“已准备（插入、更新、删除）”，名为preIns&lt;/span&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;插入photo表的userid、filename、savename、public字段，对应添加参数变量pUserID（值为阶段变量userid）、pFileName（值为提交参数filename）、pSaveName（值为提交参数savename）、pPublic（值为提交参数public）&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/ad45aac9-c98e-42ac-9a43-ac35507c28d5&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;在页面中显示上传的照片文件名：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;&amp;lt;%= request.getParameter(&amp;quot;filename&amp;quot;) %&amp;gt;已写入照片表！&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif;&quot;&gt;完成以上页面后即可测试上传模块查看效果：&lt;/span&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/99aa4f73-a81d-4847-972c-2e0869ab20e6&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;&lt;strong&gt;3 浏览照片模块&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;3-1 个人相册页（相册首页）album.jsp&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;功能：相册首页显示会员个人相册的最新照片缩略图，点击缩略图可打开浮动窗口查看原图，未经登录则自动跳转到公共相册页&lt;/span&gt;&lt;/font&gt; &lt;/p&gt; 
    &lt;p&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif;&quot;&gt;打开album.jsp删除content层中的其他元素只保留一个类名为box margin_r_20的层（右侧边距20像素的方框，用于放置缩略图和说明文本）&lt;/span&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif;&quot;&gt;添加图片浏览插件fancyBox：附加样式表jquery.fancybox.css，&lt;/span&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif;&quot;&gt;插入JavaScript脚本：jquery.min.js和jquery.fancybox.pack.js，再编写&lt;/span&gt;&lt;span style=&quot;font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif; font-size: 14px; line-height: 19.9833px;&quot;&gt;实现图片浏览的JavaScript脚本，给类名为fancybox的链接添加浮动窗口效果：&lt;/span&gt;&lt;/p&gt; 
    &lt;pre&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.983333587646484px;&quot;&gt;&amp;lt;link href=&quot;jquery.fancybox.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;jquery.fancybox.pack.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function() {
	$(&quot;.fancybox&quot;).fancybox();
});
&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt; 
    &lt;p&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif;&quot;&gt;添加记录集rsAlbum，获取photo表，筛选userid=阶段变量userid的记录，以photoid降序排列（最新上传的照片排在前面）&lt;/span&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/d2409ce6-8128-4858-a6b7-780e697f51a9&quot; /&gt; &lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;在页面中以box层动态显示单张照片缩略图（&lt;/span&gt;&lt;/font&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;尺寸设定为198*146&lt;/span&gt;&lt;/font&gt;）和原图链接，以映射到/upload的UploadServlet负责显示图片，将保存文件名作为getfile参数可显示原图，作为getthumb参数可显示缩略图（本例中缩略图是用原图动态生成的，实际应用中为提高效率应当同时保存原图文件和缩略图文件），缩略图下显示原文件名和上传时间：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;pre&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.983333587646484px; white-space: pre;&quot;&gt;&amp;lt;div class=&quot;box margin_r_20&quot;&amp;gt;
&lt;/span&gt;&lt;/font&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.983333587646484px; white-space: pre;&quot;&gt;    &amp;lt;%
&lt;/span&gt;&lt;/font&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.983333587646484px; white-space: pre;&quot;&gt;	String filename = rsAlbum.getString(&quot;filename&quot;);
&lt;/span&gt;&lt;/font&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.983333587646484px; white-space: pre;&quot;&gt;	String savename = rsAlbum.getString(&quot;savename&quot;);
&lt;/span&gt;&lt;/font&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.983333587646484px; white-space: pre;&quot;&gt;	%&amp;gt;
&lt;/span&gt;&lt;/font&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.983333587646484px; white-space: pre;&quot;&gt;    &amp;lt;div class=&quot;thumb_wrapper&quot;&amp;gt;&amp;lt;a class=&quot;fancybox&quot; rel=&quot;gallery&quot; href=&quot;upload?getfile=&amp;lt;%= savename %&amp;gt;&quot; title=&quot;&amp;lt;%= filename %&amp;gt; &quot;&amp;gt;&amp;lt;img src=&quot;upload?getthumb=&amp;lt;%= savename %&amp;gt;&quot; width=&quot;198&quot; height=&quot;146&quot;  /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/font&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.983333587646484px; white-space: pre;&quot;&gt;    &amp;lt;h3&amp;gt;&amp;lt;%= filename %&amp;gt;&amp;lt;/h3&amp;gt;
&lt;/span&gt;&lt;/font&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.983333587646484px; white-space: pre;&quot;&gt;    &amp;lt;p&amp;gt;&amp;lt;%= rsAlbum.getString(&quot;uptime&quot;) %&amp;gt;&amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;/font&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.983333587646484px; white-space: pre;&quot;&gt;  &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt; 
    &lt;p&gt;&lt;span style=&quot;font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif; font-size: 14px; line-height: 19.9833px;&quot;&gt;为box层添加“重复区域”服务器行为，显示最新的8条记录。在页面下方设置“上一页”“下一页”链接，并为链接加入“记录集分页”服务器行为，即可实现所有记录的翻页显示。&lt;/span&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;span style=&quot;font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif; font-size: 14px; line-height: 19.9833px;&quot;&gt;最后添加“限制对页的访问”服务器行为，访问被拒绝则跳转到album_pub.jsp&lt;/span&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;font face=&quot;Helvetica, Arial, Droid Sans, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px;&quot;&gt;3-2 公共相册页album_pub.jsp&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;p&gt; &lt;/p&gt; 
    &lt;p&gt; &lt;/p&gt; 
    &lt;p&gt;功能：显示会员公开的照片，允许任何访问者浏览&lt;/p&gt; 
    &lt;p&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif;&quot;&gt;基于album.jsp创建album_pub.jsp，并删除&lt;/span&gt;&lt;span style=&quot;font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif; font-size: 14px; line-height: 19.9833px; white-space: pre;&quot;&gt;“限制对页的访问”服务器行为&lt;/span&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;span style=&quot;font-size: 14px; line-height: 19.9833px; font-family: Helvetica, Arial, &apos;Droid Sans&apos;, sans-serif;&quot;&gt;修改rsAlbum记录集，去除原来的筛选条件，切换到高级模式。使用以下SQL语句获取照片表中所有公开的记录（并关联会员表获取相应的会员账号）&lt;/span&gt;&lt;/p&gt; 
    &lt;p&gt;SELECT photo.*, logname&lt;br /&gt;FROM photo, user&lt;br /&gt;WHERE [public] = true AND photo.userid = user.userid&lt;br /&gt;ORDER BY photoid DESC&lt;br /&gt;&lt;/p&gt; 
    &lt;p&gt;然后修改显示照片说明的文本增加显示会员账号即可。&lt;/p&gt; 
    &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/0012f247-017a-46c2-9547-af0d8aa6189d&quot; /&gt;&lt;/p&gt; 
    &lt;p&gt;时间所限本次实验略去了照片信息修改和设置主题模块的实现部分，有兴趣的可以进一步完善功能。&amp;nbsp;&lt;/p&gt; 
    &lt;p&gt; &lt;/p&gt; 
    &lt;p&gt; &lt;/p&gt; 
    &lt;p&gt; &lt;/p&gt; 
    &lt;p&gt; &lt;/p&gt; 
  &lt;/div&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A613_%E7%9B%B8%E5%86%8C%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%AE%BE%E8%AE%A1</id>
        <title type="html">JSP教学12 相册系统的设计</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A613_%E7%9B%B8%E5%86%8C%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%AE%BE%E8%AE%A1"/>
        <published>2012-12-14T13:29:29+08:00</published>
        <updated>2012-12-23T19:11:46+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="教学" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;12.1 需求描述&lt;br /&gt;12.2 功能设计&lt;br /&gt;12.3 数据库设计&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;教学目的：了解相册子系统的设计过程&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;12.1 需求描述&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;为“云端网”设计相册子系统，要求实现以下基本功能：&lt;/p&gt; 
  &lt;p&gt;- 会员可以上传自己的照片&lt;br /&gt;- 会员可以浏览自己的照片&lt;br /&gt;- 会员可以为自己的照片添加主题&lt;br /&gt;- 会员可以为自己的照片添加说明&lt;br /&gt;- 会员可以公开自己的某些照片&lt;br /&gt;- 访问者可以浏览所有会员公开的照片&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;12.2 功能设计&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;根据需求进行功能设计，使用简单的文本描述设计思路：&lt;/p&gt; 
  &lt;p&gt;1）上传照片：上传照片页可以上传照片并将照片信息存入数据库&lt;br /&gt;2）浏览相册：相册主页显示“个人相册”的最新照片缩略图，并可翻页查看所有照片缩略图&lt;br /&gt;3）查看照片：点击相册中的照片缩略图打开查看照片页显示完整照片，并可翻页查看所有照片&lt;br /&gt;4）编辑照片：查看照片页提供打开编辑照片信息页链接，编辑照片页可修改照片信息&lt;br /&gt;5）编辑主题：相册主页提供打开编辑照片主题页链接，编辑主题页可编辑照片主题&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;12.3 数据库设计&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;根据功能要求确定使用的数据库系统及数据表结构（字段名和类型说明）&lt;/p&gt; 
  &lt;p&gt;1）照片表photo&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;div&gt;照片ID：photoid 自动编号，主键&lt;/div&gt; 
  &lt;div&gt; 
    &lt;div&gt; 
      &lt;div&gt;主题ID：topicid 数字(长整型)，默认值0（关联到主题表的主题ID）&lt;/div&gt; 
      &lt;div&gt;会员ID：userid 数字(长整型)，必填字段（关联到会员表的会员ID）&lt;/div&gt; 
      &lt;div&gt;文件名：filename 文本(20)，必填字段&lt;br /&gt;保存文件名：savename 文本(20)，必填字段（为避免重名问题上传到服务器的文件应当重命名后保存）&lt;br /&gt;&lt;/div&gt; 
    &lt;/div&gt; 
    &lt;div&gt;上传时间：uptime 日期/时间，必填字段，默认值Now()&lt;/div&gt; 
    &lt;div&gt; 
      &lt;div&gt;照片说明：detail 文本(50)&lt;/div&gt; 
    &lt;/div&gt; 
    &lt;div&gt;是否公开：public 逻辑，默认值False&lt;/div&gt; 
  &lt;/div&gt; 
  &lt;p&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;2）主题表topic&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;div&gt;主题ID：topicid 自动编号，主键&lt;br /&gt;分类名：topicname 文本(15)，必填字段&lt;br /&gt;会员ID：userid 数字(长整型)，必填字段（关联到会员表的会员ID）&lt;/div&gt; 
  &lt;div&gt; 
    &lt;p&gt;以上是一个最简化的相册系统表结构，可在此基础上继续加以完善，例如照片表还可以加上浏览次数和评分字段，增强会员间的互动。&lt;/p&gt; 
  &lt;/div&gt; 
  &lt;p&gt; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/%E5%AE%9E%E9%AA%8C11_%E4%BC%9A%E5%91%98%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%AE%9E%E7%8E%B02</id>
        <title type="html">JSP实验11 会员系统的实现2</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/%E5%AE%9E%E9%AA%8C11_%E4%BC%9A%E5%91%98%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%AE%9E%E7%8E%B02"/>
        <published>2012-12-10T14:22:04+08:00</published>
        <updated>2013-12-25T09:20:23+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="实验" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;1 编辑个人信息模块&lt;br /&gt;2 登录密码加密功能&lt;br /&gt;3 上传会员头像功能&amp;nbsp;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;实验目的：掌握会员子系统新增功能的实现过程&lt;/p&gt; 
  &lt;p&gt;本次实验在实验10完成进度的基础上进行，如果实验10内容已删除，请在教学辅助系统中下载JSP项目包ROOT-10.rar及所用的数据库cloud.mdb，重建jsproot站点，发布到Tomcat服务器的根目录。&lt;/p&gt; 
  &lt;p&gt;本次实验还要使用：&lt;br /&gt;- 自建的Java项目包Tools，将其中的类文件（连带包目录tools）放到发布目录的类文件夹WEB-INF\classes&lt;br /&gt;- 文件上传组件commons-fileupload-1.2.2.jar、输入输出组件commons-io-2.4.jar和图片尺寸调整组件imgscalr-lib-4.2.jar，放到发布目录的类库文件夹WEB-INF\lib&lt;br /&gt;- JavaScript库jQuery及其上传客户端插件Uploadify，将其中的脚本文件及辅助文件放到发布目录&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;1 编辑个人信息模块&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;1-1 查看个人信息页user.jsp&lt;/p&gt; 
  &lt;p&gt;功能：点击登录用户名进入个人信息页查看个人信息，未经登录则限制访问&lt;/p&gt; 
  &lt;p&gt;修改header.jsp将登录用户名文本链接到user.jsp&lt;/p&gt; 
  &lt;p&gt;基于temp.jsp创建user.jsp，基于lefter_home.jsp创建lefter_user.jsp作为本模块共有的左侧导航栏&lt;/p&gt; 
  &lt;p&gt;在左侧导航栏添加文本“查看个人信息”并链接到user.jsp &lt;/p&gt; 
  &lt;p&gt;添加提示文本“查看个人信息：”，添加5行2列表格，表格中添加文本：账号、联系电话、电子邮箱、通讯地址、真实姓名&lt;/p&gt; 
  &lt;p&gt;添加记录集rsUser，从user表中筛选出logname=阶段变量MM_Username的记录（即当前登录会员的信息），将rsUser记录集的字段拖入相应单元格以显示会员个人信息&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/826b08f6-3a2d-4c0c-9bbb-deea1310775e&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt;最后添加服务器行为“用户身份验证&amp;gt;限制对页的访问”，拒绝访问时转到index.jsp&lt;/p&gt; 
  &lt;p&gt;1-2 修改个人信息页user_edit.jsp&lt;/p&gt; 
  &lt;p&gt;功能：在左侧导航栏点击“修改个人信息”链接进入修改个人信息页，使用表单提交信息更新会员表，未经登录则限制访问&lt;/p&gt; 
  &lt;p&gt;在左侧导航栏添加文本“修改个人信息”并链接到user_edit.jsp&lt;/p&gt; 
  &lt;p&gt;基于user.jsp创建user_edit.jsp，在页顶添加代码以支持表单提交中文信息：&amp;lt;% request.setCharacterEncoding(&amp;quot;utf-8&amp;quot;); %&amp;gt;&lt;/p&gt; 
  &lt;p&gt;添加提示文本“修改个人信息：”，插入表单，添加6行2列表格，表格中添加文本和文本域：账号（账号不允许修改所以不用文本域）、联系电话phone、电子邮箱email、通讯地址address（多行文本域）、真实姓名realname和提交按钮，将rsUser记录集的字段拖入相应文本域以显示会员个人信息&lt;/p&gt; 
  &lt;p&gt;添加服务器行为“更新记录”，更新user表，选取记录自rsUser，唯一键列为userid，更新成功后跳转到user.jsp&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/d5b49d04-a0ad-46a8-bbbe-9b1dac4160b0&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;2 登录密码加密功能&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;2-1 使用实现MD5算法的JavaBean&lt;/p&gt; 
  &lt;p&gt;使用Java开发工具编写实现MD5算法的类tools.MD5，进行MD5变换的方法为String getMD5ofStr(String inbuf)，传入参数是要进行MD5变换的字符串，返回结果是变换后的字符串&lt;/p&gt; 
  &lt;p&gt;将生成的字节码文件MD5.class放置在应用程序目录的WEB-INF\classes\tools文件夹中，即可在JSP文件中作为JavaBean使用&lt;/p&gt; 
  &lt;p&gt;2-2 修改登录密码页user_editpass.jsp&lt;/p&gt; 
  &lt;p&gt;功能：在左侧导航栏点击“修改登录密码”链接进入修改登录密码页，使用表单提交信息更新会员表密码字段，未经登录则限制访问&lt;/p&gt; 
  &lt;p&gt;在左侧导航栏添加文本“修改登录密码”并链接到user_editpass.jsp &lt;/p&gt; 
  &lt;p&gt;基于user.jsp创建user_editpass.jsp，添加提示文本“修改登录密码：”，插入表单，添加4行2列表格，表格中添加文本和文本域：账号（不用文本域），输入新密码password，确认新密码passrepeat和提交按钮&lt;/p&gt; 
  &lt;p&gt;添加服务器行为“更新记录”，更新user表，选取记录自rsUser，唯一键列为userid，更新成功后跳转到user.jsp&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/73df0260-eb95-45d1-accc-bfac6262e9c5&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt;选中表单添加行为“检查表单”，修改自动生成的JavaScript代码的MM_validateForm函数，在if (errors)之前手工添加检查两次密码是否一致的代码：&lt;/p&gt; 
  &lt;pre&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;if (password.value != passrepeat.value) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;errors+=&apos;- 两次输入的密码不一致。&apos;;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;password.value=&apos;&apos;;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;passrepeat.value=&apos;&apos;;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;password.focus();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;}&lt;/pre&gt; 
  &lt;p&gt;在页顶添加标记生成MD5加密Bean对象oMD5：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;jsp:useBean id=&quot;oMD5&quot; scope=&quot;request&quot; class=&quot;tools.MD5&quot; /&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;修改“更新记录”服务器行为的代码，将提交的密码进行MD5变换再更新user表：&lt;/p&gt; 
  &lt;pre&gt;MM_fields[i+1] = ((request.getParameter(MM_fields[i])!=null)?oMD5.getMD5ofStr((String)request.getParameter(MM_fields[i])):&quot;&quot;);&lt;/pre&gt; 
  &lt;p&gt;2-3 修改登录页和注册页的密码处理&lt;/p&gt; 
  &lt;p&gt;密码加密保存后，其他用到密码字段的页面都需要增加相应的处理才能正常使用：&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;修改登录页index.jsp的“登录用户”服务器行为的代码，将提交的密码进行MD5变换再与user表中保存的加密密码进行比对：&lt;/p&gt; 
  &lt;pre&gt;MM_statementUser.setObject(2, oMD5.getMD5ofStr(request.getParameter(&quot;password&quot;)));&lt;/pre&gt; 
  &lt;p&gt;同样在页顶添加标记生成Bean对象&amp;nbsp;&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;jsp:useBean id=&quot;oMD5&quot; scope=&quot;request&quot; class=&quot;tools.MD5&quot; /&amp;gt; &lt;/pre&gt; 
  &lt;p&gt;修改注册页register.jsp的“插入记录”服务器行为的代码，将提交的密码进行MD5变换再插入user表：&lt;/p&gt; 
  &lt;pre&gt;// set the form values&lt;br clear=&quot;none&quot;&gt; for (int i=0; i+1 &amp;lt; MM_fields.length; i+=2) {&lt;br clear=&quot;none&quot;&gt;&amp;nbsp; &amp;nbsp; MM_fields[i+1] = ((request.getParameter(MM_fields[i])!=null)?(String)request.getParameter(MM_fields[i]):&quot;&quot;);&lt;br clear=&quot;none&quot;&gt; }&lt;br clear=&quot;none&quot;&gt;//提交的密码文本域要进行MD5变换&lt;br clear=&quot;none&quot;&gt;MM_fields[3] = ((request.getParameter(MM_fields[2])!=null)?oMD5.getMD5ofStr((String)request.getParameter(MM_fields[2])):&quot;&quot;);&lt;/pre&gt; 
  &lt;p&gt;同样在页顶添加标记生成Bean对象&amp;nbsp;&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;jsp:useBean id=&quot;oMD5&quot; scope=&quot;request&quot; class=&quot;tools.MD5&quot; /&amp;gt; &lt;/pre&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;3 上传会员头像功能&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;3-1 使用处理图片上传的Servlet&lt;/p&gt; 
  &lt;p&gt;使用Java开发工具编写实现处理图片上传的Servlet类tools.UploadServlet，接收avatar参数，将表单提交的JPG文件转为120像素的小图片并保存到应用程序目录的uploads文件夹，保存文件名为参数值。&lt;/p&gt; 
  &lt;p&gt;UploadServlet使用了开源项目文件上传组件、输入输出组件和图片尺寸调整组件，要将相应的类库放到类库文件夹WEB-INF\lib。&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;将生成的字节码文件UploadServlet.class放置在应用程序目录的WEB-INF\classes\tools文件夹中&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;然后在Web应用程序部署文件WEB-INF\web.xml中配置UploadServlet的访问地址：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&amp;gt;
&amp;lt;web-app&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;servlet&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;servlet-name&amp;gt;UploadServlet&amp;lt;/servlet-name&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;servlet-class&amp;gt;tools.UploadServlet&amp;lt;/servlet-class&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/servlet&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;servlet-mapping&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;servlet-name&amp;gt;UploadServlet&amp;lt;/servlet-name&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;url-pattern&amp;gt;/upload&amp;lt;/url-pattern&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/servlet-mapping&amp;gt;
&amp;lt;/web-app&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;即可以通过浏览器以upload?avatar=参数值的形式访问此Servlet&lt;/p&gt; 
  &lt;p&gt;3-2 上传会员头像页user_avatar.jsp&lt;/p&gt; 
  &lt;p&gt;功能：在左侧导航栏添加图片标签显示会员头像，点击“上传会员头像”链接进入上传会员头像页，使用文件域提交JPG文件上传到应用程序目录的uploads文件夹，图片尺寸为120像素，图片文件名为会员账号，未经登录则限制访问&lt;/p&gt; 
  &lt;p&gt;在左侧导航栏添加文本“上传会员头像”并链接到user_avatar.jsp，并添加背景表格和图片标签显示名为会员账号的图片的标记：&lt;/p&gt; 
  &lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;table width=&quot;130&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;th height=&quot;130&quot; scope=&quot;col&quot;&amp;gt;&amp;lt;img name=&quot;avatar&quot; src=&quot;uploads/&amp;lt;%= session.getAttribute(&quot;MM_Username&quot;) %&amp;gt;.jpg&quot; alt=&quot;会员头像&quot; /&amp;gt;&amp;lt;/th&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/table&amp;gt; &lt;/pre&gt; 
  &lt;p&gt;基于user.jsp创建user_avatar.jsp，该页面使用JavaScript库jQuery及其上传客户端插件Uploadify实现更便捷的上传界面，需要在head区段引入所需的脚本jquery.min.js、jquery.uploadify.min.js并附加样式表uploadify.css。再编写如下脚本给名为uploadify的元素设置处理函数：文件提交到/upload并附加avatar参数值为当前登录账号，只允许上传JPG文件，尺寸限1000KB，上传完成后跳转到user.jsp&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;link href=&quot;uploadify.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;jquery.uploadify.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(function() {
	$(&quot;#uploadify&quot;).uploadify({
		&apos;swf&apos; : &apos;uploadify.swf&apos;,
		&apos;uploader&apos; : &apos;/upload?avatar=&amp;lt;%= session.getAttribute(&quot;MM_Username&quot;) %&amp;gt;&apos;,
		&apos;buttonText&apos; : &apos;上传头像&apos;,
		&apos;fileTypeExts&apos; : &apos;*.jpg&apos;,
		&apos;fileSizeLimit&apos; : &apos;1000KB&apos;,
		&apos;onUploadComplete&apos; : function(file) {
			window.location.href=&quot;user.jsp&quot;;
		}
	});
});
&amp;lt;/script&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;添加提示文本“上传会员头像：”，删掉原有的rsUser记录集和表格，插入一个名为uploadify的文件域即可&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/e758a05e-0871-4467-9271-f4edd4170eb7&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt;完成后即可通过此页面上传头像并在左侧栏显示。&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A611_%E4%BC%9A%E5%91%98%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%AE%BE%E8%AE%A12</id>
        <title type="html">JSP教学11 会员系统的设计2</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A611_%E4%BC%9A%E5%91%98%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%AE%BE%E8%AE%A12"/>
        <published>2012-12-07T14:23:53+08:00</published>
        <updated>2012-12-09T21:12:33+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="教学" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;11.1 JavaBean介绍&lt;br /&gt;11.2 使用JavaBean&lt;br /&gt;11.3 Servlet类&lt;br /&gt;11.4 使用Servlet&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;教学目的：了解JavaBean与Servlet的概念与使用方法&lt;/p&gt; 
  &lt;p&gt;“云端网”会员系统将使用JavaBean实现密码加密功能，使用Servlet实现上传图片作为头像功能，本课将介绍这两个技术的概念及其在JSP中的使用&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;11.1 JavaBean类&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;JavaBean（或称Bean）是一种Java类，通过封装属性和方法成为具有特定功能或处理某个业务的对象。&lt;/p&gt; 
  &lt;p&gt;JavaBean的编写规范：&lt;br /&gt;- 必须是一个公共类（访问属性应为public）&lt;br /&gt;- 必须有一个公共的且不带参数的构造方法&lt;br /&gt;- 不应有公共属性（访问属性应为private）&lt;br /&gt;- 类的属性应通过一组存取方法（getXxx和setXxx）来访问。&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;11.2 使用JavaBean&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;要在JSP中使用JavaBean，须将Bean类文件放入Web应用程序目录的类文件夹WEB-INF\classes中（包名对应子目录名），这样就可使用jsp:useBean标记创建Bean类的实例：&lt;/p&gt; 
  &lt;p&gt;&amp;lt;jsp:useBean id=&amp;quot;Bean实例名&amp;quot; scope=&amp;quot;有效期&amp;quot; class=&amp;quot;Bean类名&amp;quot; /&amp;gt;&lt;/p&gt; 
  &lt;p&gt;然后如果Bean的属性有存取方法，就可以在HTML代码中使用jsp:setProperty标记设置Bean的属性值：&lt;/p&gt; 
  &lt;p&gt;&amp;lt;jsp:setProperty name=&amp;quot;Bean实例名&amp;quot; property=&amp;quot;Bean的属性名&amp;quot; value=&amp;quot;值&amp;quot; /&amp;gt;&lt;/p&gt; 
  &lt;p&gt;或者使用jsp:getProperty标记获取Bean的属性值：&lt;/p&gt; 
  &lt;p&gt;&amp;lt;jsp:getProperty name=&amp;quot;Bean实例名&amp;quot; property=&amp;quot;Bean的属性名&amp;quot; /&amp;gt;&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;也可以在JSP代码中使用标准Java语言执行Bean的方法。&lt;/p&gt; 
  &lt;div&gt; 
    &lt;p&gt;JavaBean的有效期取值：&lt;br /&gt;- page：有效期为当前页面&lt;br /&gt;- request：有效期为请求页面（即当前页面提交信息后对象仍有效）&lt;br /&gt;- session：有效期为用户会话（即用户关闭浏览器前对象一直有效）&lt;br /&gt;- application：有效期为应用程序（即应用程序运行期间所有用户共享同一对象）&lt;/p&gt; 
  &lt;/div&gt; 
  &lt;p&gt;例：tools.MD5是一个MD5加密Bean，则类的字节码文件放置路径应为WEB-INF\classes\tools\MD5.class &lt;/p&gt; 
  &lt;p&gt;先创建实例对象oMD5&lt;/p&gt; 
  &lt;p&gt;&amp;lt;jsp:useBean id=&amp;quot;oMD5&amp;quot; scope=&amp;quot;request&amp;quot; class=&amp;quot;tools.MD5&amp;quot; /&amp;gt;&lt;/p&gt; 
  &lt;p&gt;然后就可以用类的getMD5ofStr方法将提交的密码变换为加密后的字符串&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;oMD5.getMD5ofStr(request.getParameter(&amp;quot;password&amp;quot;))&lt;/p&gt; 
  &lt;div&gt; 
    &lt;p&gt;&lt;b&gt;11.3 Servlet类&lt;/b&gt;&lt;/p&gt; 
  &lt;/div&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;Servlet是一种Java类，为javax.servlet.http.HttpServlet类的子类&lt;/p&gt;
  &lt;p&gt;编写Servlet需要引入javax.servlet和javax.servlet.http包（相应类库文件为Tomcat安装目录下的lib\servlet-api.jar）&lt;/p&gt; 
  &lt;p&gt;可以使用与访问JSP页面相同的方式访问Servlet，包括以表单或URL参数的方式提交用户信息&lt;/p&gt; 
  &lt;p&gt;（注意：实际上JSP技术的基础就是Servlet，JSP页面创建或修改后都是由JSP引擎自动转化为Servlet程序编译运行的）&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;11.4 使用Servlet&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;要在JSP中使用Servlet，首先须将Servlet类文件放入Web应用程序目录的类文件夹WEB-INF\classes中（包名对应子目录名）&lt;/p&gt; 
  &lt;p&gt;然后在Web应用程序部署文件WEB-INF\web.xml中配置Servlet（此文件更改后Tomcat会自动重载Web应用程序）&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&amp;gt;
&amp;lt;web-app&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;servlet&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;servlet-name&amp;gt;Servlet名&amp;lt;/servlet-name&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;servlet-class&amp;gt;Servlet类名&amp;lt;/servlet-class&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/servlet&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;servlet-mapping&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;servlet-name&amp;gt;Servlet名&amp;lt;/servlet-name&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;url-pattern&amp;gt;/Servlet访问路径&amp;lt;/url-pattern&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/servlet-mapping&amp;gt;
&amp;lt;/web-app&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;这样就可以用浏览器直接访问此Servlet&lt;/p&gt; 
  &lt;p&gt;例：tools.UploadServlet是一个上传图片的Servlet，则类的字节码文件放置路径应为WEB-INF\classes\tools\UploadServlet.class&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;然后在Web应用程序部署文件WEB-INF\web.xml中配置UploadServlet&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&amp;gt;
&amp;lt;web-app&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;servlet&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;servlet-name&amp;gt;UploadServlet&amp;lt;/servlet-name&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;servlet-class&amp;gt;tools.UploadServlet&amp;lt;/servlet-class&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/servlet&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;servlet-mapping&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;servlet-name&amp;gt;UploadServlet&amp;lt;/servlet-name&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;url-pattern&amp;gt;/upload&amp;lt;/url-pattern&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/servlet-mapping&amp;gt;
&amp;lt;/web-app&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;将带有文件域的表单的动作设置为upload，就可以实现提交图片文件保存到服务器的功能，传入avatar参数abc，则上传的图片会转为120像素的小图片abc.jpg再保存到服务器。&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;form id=&quot;fileupload&quot; action=&quot;upload?avatar=abc&quot; method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;input type=&quot;file&quot; name=&quot;fileField&quot; id=&quot;fileField&quot;&amp;gt;
&amp;lt;/form&amp;gt;&lt;/pre&gt; 
  &lt;p&gt; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C10_%E4%BC%9A%E5%91%98%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%AE%9E%E7%8E%B0</id>
        <title type="html">JSP实验10 会员系统的实现</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C10_%E4%BC%9A%E5%91%98%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%AE%9E%E7%8E%B0"/>
        <published>2012-12-03T18:09:05+08:00</published>
        <updated>2013-12-23T12:58:14+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="实验" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;1 建立系统框架&lt;br /&gt;2 在线注册模块&lt;br /&gt;3 会员登录模块&lt;br /&gt;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;实验目的：掌握会员子系统的实现过程&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;1 建立系统框架&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;1-1 创建站点和页面&lt;/p&gt; 
  &lt;p&gt;首先用DW创建一个使用JSP技术的站点jsproot（站点目录使用tomcat的Web应用程序根目录ROOT）&lt;/p&gt; 
  &lt;p&gt;使用现成的Web设计模板templatemo227，包括样例页面、图片和附加样式表，复制到站点目录，根据模板创建网站的样本页temp.jsp&lt;/p&gt; 
  &lt;p&gt;本例中我们使用包括指令（Include）在所有页面中包括相同的顶部导航栏和底部信息栏文件，这样当需要调整这些设置时只需修改一次，具体做法如下：&lt;br /&gt;- 建立header.jsp，保存样例页面中类名为site_title_bar_wrapper的div区段的内容&lt;br /&gt;- 建立footer.jsp，保存样例页面中类名为footer_wrapper的div区段的内容&lt;br /&gt;- 在页面body区段的开始和末尾分别添加包括指令&amp;lt;%@ include file=&amp;quot;header.jsp&amp;quot; %&amp;gt;和&amp;lt;%@ include file=&amp;quot;footer.jsp&amp;quot; %&amp;gt;&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/c3f02eb5-1826-4700-9cf0-2d5bdd95b9b6&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt;其他通用的页面元素例如左侧栏也可以使用包括指令。要使各页面中导航栏中相应栏目项能够设为当前项状态，需使header.jsp的导航链接的类名动态化，例如创建“主页”index.jsp和“相册”album.jsp两个栏目首页：&lt;/p&gt; 
  &lt;p&gt;&amp;lt;li&amp;gt;&amp;lt;a class=&amp;quot;&amp;lt;%= section.equals(&amp;quot;home&amp;quot;)?&amp;quot;current&amp;quot;:&amp;quot;&amp;quot; %&amp;gt;&amp;quot; href=&amp;quot;index.jsp&amp;quot;&amp;gt;主页&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&amp;lt;a class=&amp;quot;&amp;lt;%= section.equals(&amp;quot;album&amp;quot;)?&amp;quot;current&amp;quot;:&amp;quot;&amp;quot; %&amp;gt;&amp;quot; href=&amp;quot;album.jsp&amp;quot;&amp;gt;相册&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/p&gt; 
  &lt;p&gt;然后在各页面的顶端添加设置所属栏目变量值的代码段，例如主页index.jsp中：&lt;/p&gt; 
  &lt;p&gt;&amp;lt;% String section = &amp;quot;home&amp;quot;; %&amp;gt;&lt;/p&gt; 
  &lt;p&gt;1-2 添加数据库连接&lt;/p&gt; 
  &lt;p&gt;准备好数据库文件cloud.mdb&lt;/p&gt; 
  &lt;p&gt;在DW数据库面板中添加数据库连接conn&lt;/p&gt; 
  &lt;p&gt;驱动程序为sun.jdbc.odbc.JdbcOdbcDriver&lt;br /&gt;连接URL为jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=d:/cloud.mdb&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;2 在线注册模块&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;2-1 注册页register.jsp&lt;/p&gt; 
  &lt;p&gt;功能：显示注册新会员表单，将提交的注册信息保存到会员表&lt;/p&gt; 
  &lt;p&gt;以首页为样本创建注册页register.jsp&lt;br /&gt;在页顶添加代码段以正常处理表单提交的中文信息：&amp;lt;% request.setCharacterEncoding(&amp;quot;utf-8&amp;quot;); %&amp;gt;&lt;br /&gt;插入表单，表单中添加提示文本“请输入您的注册信息，带*号的为必填项：”，添加8行2列表格，表格中添加文本和文本域账号logname、密码password（密码文本域）、确认密码passrepeat（密码文本域）、联系电话phone、电子邮箱email、通讯地址address（多行文本域）、真实姓名realname和提交按钮&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/d265a540-b710-424a-baf5-86d69598e153&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt;使用“行为”面板为表单添加“检查表单”行为，将账号和密码设为必填项&lt;br /&gt;使用“服务器行为”面板添加“插入记录”服务器行为，插入成功后转到reg_success.jsp&lt;br /&gt;继续添加“用户身份验证&amp;gt;检查新用户名”服务器行为，如果输入的用户名已存在则转到reg_exist.jsp&lt;/p&gt; 
  &lt;p&gt;（补充说明：DW提供的行为不能检查两次密码是否一致，需要修改自动生成的JavaScript代码的MM_validateForm函数，在if (errors)之前手工添加检查两次密码是否一致的代码：）&amp;nbsp;&lt;/p&gt; 
  &lt;pre&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if (password.value != passrepeat.value) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;errors+=&apos;- 两次输入的密码不一致。&apos;;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;password.value=&apos;&apos;;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;passrepeat.value=&apos;&apos;;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;password.focus();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;}&amp;nbsp;&lt;/pre&gt; 
  &lt;p&gt;2-2 提示注册成功页reg_success.jsp&lt;/p&gt; 
  &lt;p&gt;功能：提示注册成功，并提供返回主页的链接&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;以index.jsp为样本创建提示注册成功页reg_success.jsp，添加“注册成功，欢迎你成为新会员！前往登录页面。”并添加前往index.jsp的链接。&lt;/p&gt; 
  &lt;p&gt;2-3 提示账号已存在页reg_exist.jsp&lt;/p&gt; 
  &lt;p&gt;功能：提示账号已存在，并提供返回注册页的链接&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;以reg_exist.jsp为样本创建提示账号已存在页reg_exist.jsp，添加“注册失败，你输入的账号已存在！返回注册页面。”并添加返回register.jsp的链接。&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;3 会员登录模块&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;3-1 登录页index.jsp&lt;/p&gt; 
  &lt;p&gt;功能：在首页显示会员登录表单，将提交的账号和密码与会员表中的账号和密码进行比对，比对成功则显示欢迎信息，将登录账号存入阶段变量并隐藏登录表单&lt;/p&gt; 
  &lt;p&gt;在首页index.jsp中插入表单，表单中添加文本域logname、密码文本域password和登录按钮，为表单添加“检查表单”行为，再添加“用户身份验证&amp;gt;登录用户”服务器行为，设置登录成功转到index.jsp或前一个URL，如果登录失败则转到log_fail.jsp&lt;/p&gt; 
  &lt;p&gt;再在登录表单外围添加如下代码段，使得登录成功后不再显示登录表单而是欢迎登录会员的信息：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;% if (session.getAttribute(&quot;MM_Username&quot;) == null || session.getAttribute(&quot;MM_Username&quot;).equals(&quot;&quot;)) { %&amp;gt;
（此处为登录表单form区段）
&amp;lt;% } else { %&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;h4&amp;gt;欢迎光临云端网，&amp;lt;%= session.getAttribute(&quot;MM_Username&quot;) %&amp;gt;！&amp;lt;/h4&amp;gt;
&amp;lt;% } %&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;（补充说明：阶段变量不能直接支持中文，获取包含中文的阶段变量后需要进行编码转换才能正常显示，参见以下代码）&lt;/p&gt; 
  &lt;pre&gt;byte b[] = session.getAttribute(&quot;MM_Username&quot;).toString().getBytes(&quot;iso-8859-1&quot;);
String str = new String(b, &quot;utf-8&quot;);&lt;/pre&gt; 
  &lt;p&gt;3-2 提示登录失败页log_fail.jsp&lt;/p&gt; 
  &lt;p&gt;功能：提示登录失败，并提供返回登录页的链接&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;以reg_exist.jsp为样本创建登录登录失败页log_fail.jsp，添加“登录失败，请重新输入登录信息！返回登录页面。”并添加返回index.jsp的链接。&lt;/p&gt; 
  &lt;p&gt;3-3 登录用户注销登录&lt;/p&gt; 
  &lt;p&gt;功能：注销登录实际上就是清除登录相关的阶段变量，已登录的会员应该能在任何页面注销登录&lt;/p&gt; 
  &lt;p&gt;在header.jsp中的网站logo之后添加如下代码段，使得所有页面都显示当前登录会员信息：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;% if (session.getAttribute(&quot;MM_Username&quot;) == null || session.getAttribute(&quot;MM_Username&quot;).equals(&quot;&quot;)) { %&amp;gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;&amp;lt;a href=&quot;register.jsp&quot;&amp;gt;注册&amp;lt;/a&amp;gt;
&amp;lt;% } else { %&amp;gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;&amp;lt;%= session.getAttribute(&quot;MM_Username&quot;) %&amp;gt;
&amp;lt;% } %&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在账号名之后添加文本“退出”，选定文本添加“用户身份验证&amp;gt;注销用户”服务器行为，注销后转到index.jsp&lt;/p&gt; 
  &lt;p&gt;注册会员登录后的显示效果：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/0eb040de-fc23-490c-bb3a-2c70c247f689&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt;
  &lt;p&gt;（下次课程将继续介绍会员子系统的修改资料、密码加密和上传头像功能）&lt;/p&gt; 
  &lt;p&gt;&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A610_%E4%BC%9A%E5%91%98%E7%AE%A1%E7%90%86%E5%AD%90%E7%B3%BB%E7%BB%9F</id>
        <title type="html">JSP教学10 会员系统的设计</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A610_%E4%BC%9A%E5%91%98%E7%AE%A1%E7%90%86%E5%AD%90%E7%B3%BB%E7%BB%9F"/>
        <published>2012-11-30T14:55:26+08:00</published>
        <updated>2012-12-07T20:14:16+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="教学" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;10.1 需求描述&lt;br /&gt;10.2 功能设计&lt;br /&gt;10.3 数据库设计&lt;br /&gt;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;教学目的：了解会员子系统的设计过程&lt;/p&gt; 
  &lt;p&gt;在课程设计阶段，我们将完成一个综合性Web应用项目——“云端网”在线社区的开发（在功能完整的前提下尽量简化以方便学习）。&lt;br /&gt;开发大型应用系统时应当通过初步设计将其划分出若干个相对独立的子系统模块，再进行分别的设计和实现。&lt;br /&gt;本课将介绍项目的第一个子系统：会员子系统的设计过程。&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;10.1 需求描述&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;为“云端网”设计会员子系统，要求实现以下基本功能：&lt;/p&gt; 
  &lt;p&gt;- 访问者可以在线注册，成为网站会员&lt;br /&gt;- 会员可以使用账号和密码登录，并可退出登录&lt;br /&gt;- 会员可以修改个人信息&lt;br /&gt;- 会员可以上传图片作为个性化头像&lt;br /&gt;- 会员的密码信息应当加密保存&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;10.2 功能设计&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;根据需求进行功能设计，使用简单的文本描述设计思路：&lt;/p&gt; 
  &lt;p&gt;1）在线注册：主页提供“注册新会员”链接，注册页使用表单提交注册信息，存入会员表&lt;br /&gt;2）会员登录：主页使用表单提交账号和密码，验证通过后显示个性化主页，在所有页面提供退出登录链接&lt;br /&gt;3）修改个人信息：个性化主页提供“修改个人信息”链接，修改个人信息页使用表单提交个人信息，更新会员表&lt;br /&gt;4）个性化头像：修改个人信息页提供“上传头像”链接，作为头像上传的图片应自动转换为统一的尺寸&lt;br /&gt;5）密码加密：提交的密码信息使用MD5算法进行加密处理&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;10.3 数据库设计&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;根据功能要求确定使用的数据库系统及数据表结构（字段名和类型说明）：&lt;/p&gt; 
  &lt;p&gt;- 会员表user&lt;/p&gt; 
  &lt;p&gt;会员ID：userid 自动编号，主键&lt;br /&gt;账号：logname 文本(15)，必填字段，有索引(无重复)&lt;br /&gt;密码：password 文本(32)，必填字段&lt;br /&gt;联系电话：phone 文本(20)&lt;br /&gt;电子邮箱：email 文本(30)&lt;br /&gt;通讯地址：address 文本(50)&lt;br /&gt;真实姓名：realname 文本(20)&lt;/p&gt; 
  &lt;p&gt;以上是一个最简化的会员表结构，可在此基础上继续加以完善。 &lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C09_%E6%8A%95%E7%A5%A8%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%AE%9E%E7%8E%B0</id>
        <title type="html">JSP实验09 投票系统的实现</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C09_%E6%8A%95%E7%A5%A8%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%AE%9E%E7%8E%B0"/>
        <published>2012-11-24T19:00:51+08:00</published>
        <updated>2013-12-23T12:57:20+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="实验" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;1 建立系统框架
  &lt;br /&gt;2 投票功能模块
  &lt;br /&gt;3 后台维护模块
  &lt;br /&gt; &lt;br /&gt; &lt;/p&gt;</summary>
        <content type="html">&lt;div&gt; 
    &lt;p&gt; &lt;/p&gt; 
    &lt;p&gt;实验目的：以投票系统为例，掌握Web应用项目的实现过程
  &lt;/p&gt; 
    &lt;p&gt;&lt;strong&gt;1 建立系统框架&lt;/strong&gt; &lt;/p&gt; 
    &lt;p&gt;1-1 创建站点和页面
  &lt;/p&gt; 
    &lt;p&gt;首先用DW创建一个使用JSP技术的站点jspvote
    &lt;br /&gt;使用现成的Web设计模板Blue Rain，包括样例页面、图片和和附加样式表，复制到站点目录即可
    &lt;br /&gt;编辑temp.htm作为原型页另存为其他页面（在导航菜单中加入三个相应的链接）：系统首页index.jsp，投票结果info.jsp，后台维护manage.jsp（及后台登录login.jsp）
  &lt;/p&gt; 
    &lt;p&gt;1-2 添加数据库连接
  &lt;/p&gt; 
    &lt;p&gt;准备好数据库文件vote.mdb，并输入一些数据供测试
    &lt;br /&gt;在DW数据库面板中添加数据库连接connVote
    &lt;br /&gt;驱动程序为sun.jdbc.odbc.JdbcOdbcDriver
    &lt;br /&gt;连接URL为jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=d:/vote.mdb
  &lt;/p&gt; 
    &lt;p&gt;&lt;strong&gt;2 投票功能模块&lt;/strong&gt; &lt;/p&gt; 
    &lt;p&gt;2-1 首页index.jsp
  &lt;/p&gt; 
    &lt;p&gt;功能：显示所有投票项供选择
  &lt;/p&gt; 
    &lt;p&gt;打开首页index.jsp，添加记录集rsItems，获取voteinfo表的所有记录
    &lt;br /&gt;插入表单，动作属性设为vote.jsp
    &lt;br /&gt;表单中添加提示文本“请决定你的选择”，添加2行1列表格宽300像素
    &lt;br /&gt;表格第一行单元格中添加单选钮id，选定值绑定到rsItems.id，单选钮后插入动态文本rsItems.item
    &lt;br /&gt;选定表格第一行添加“重复区域”服务器行为
    &lt;br /&gt;表格第二行插入投票按钮
  &lt;/p&gt; 
    &lt;p&gt;2-2 投票处理页vote.jsp
  &lt;/p&gt; 
    &lt;p&gt;功能：获取表单提交的投票项id，为voteinfo表相应投票项count字段加1
  &lt;/p&gt; 
    &lt;p&gt;创建vote.jsp添加以下代码段即可：
  &lt;/p&gt; 
    &lt;pre&gt;&amp;lt;%@ include file=&quot;../Connections/connVote.jsp&quot; %&amp;gt;&amp;nbsp;
&amp;lt;%
//根据统一设置创建数据库连接
Class.forName(MM_connVote_DRIVER);
Connection connVote = DriverManager.getConnection(MM_connVote_STRING,MM_connVote_USERNAME,MM_connVote_PASSWORD);
//根据表单提交的ID为voteinfo表相应投票项的count字段加1
PreparedStatement preUpdate = connVote.prepareStatement(&quot;UPDATE voteinfo SET count=count+1 WHERE id=?&quot;);
preUpdate.setObject(1, request.getParameter(&quot;id&quot;));
preUpdate.executeUpdate();
connVote.close();
//投票后跳转至查看结果页
response.sendRedirect(&quot;info.jsp&quot;);
%&amp;gt;&lt;/pre&gt; 
    &lt;p&gt;（或是使用服务器行为，这会生成更通用但也更繁琐的代码）在数据工具栏中插入“已准备（插入、更新、删除）”，类型选择“更新”，SQL语句如下：
    &lt;br /&gt;UPDATE voteinfo SET count=count+1 WHERE id=voteId
    &lt;br /&gt;添加参数voteId，运行值为request.getParameter(&amp;quot;id&amp;quot;)
    &lt;br /&gt;插入jsp:forward，跳转到info.jsp
  &lt;/p&gt; 
    &lt;p&gt;2-3 投票结果页info.jsp
  &lt;/p&gt; 
    &lt;p&gt;功能：显示各项得票数和得票率
  &lt;/p&gt; 
    &lt;p&gt;添加2行3列表格宽500像素，第1行添加文本：投票项，得票数，得票率
    &lt;br /&gt;添加记录集rsTotal，获取voteinfo表内容，再切换到高级模式修改查询语句：SELECT sum(count) as totalNum FROM voteinfo
    &lt;br /&gt;添加记录集rsVotes，获取voteinfo表内容
    &lt;br /&gt;在表格前插入代码段获取总票数赋值给变量: &amp;lt;% int totalNum=rsTotal.getInt(&amp;quot;totalNum&amp;quot;); %&amp;gt;
    &lt;br /&gt;在内容行投票项列插入动态文本显示投票项: rsVotes.item
    &lt;br /&gt;在内容行左端插入代码段获取得票数赋值给变量: &amp;lt;% int num = rsVotes.getInt(&amp;quot;count&amp;quot;); %&amp;gt;
    &lt;br /&gt;在内容行得票数列插入表达式显示得票数和总票数: 得&amp;lt;%= num %&amp;gt;票，共&amp;lt;%= totalNum %&amp;gt;票
    &lt;br /&gt;在内容行得票率列插入表达式显示得票率及柱形图: 得票率&amp;lt;img src=&amp;quot;back.gif&amp;quot; width=&amp;quot;&amp;lt;%= num*200/totalNum %&amp;gt;&amp;quot; height=&amp;quot;9&amp;quot; /&amp;gt;&amp;lt;%= num*100/totalNum %&amp;gt;%
    &lt;br /&gt;（注意：由于计算得票率要用总票数作为分母，投票结果页必须已有人投票后才能正常显示，可以添加IP记录集不为空时才显示区域的服务器行为解决此问题）
    &lt;br /&gt;选定内容行添加重复区域服务器行为显示rsVotes记录集的所有记录
  &lt;/p&gt; 
    &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/5a43af66-1d43-4e6a-8a75-05708f88edbf&quot; /&gt; &lt;/p&gt; 
    &lt;p&gt; &lt;/p&gt; 
    &lt;p&gt;2-4 防止重复投票
  &lt;/p&gt; 
    &lt;p&gt;访问者投票的同时提交其IP地址信息，之后相同IP地址的访问者即无法再投票
  &lt;/p&gt; 
    &lt;p&gt;修改系统首页index.jsp，在页顶添加代码段，用request对象获取访问者IP地址并赋值给阶段变量ip：
    &lt;br /&gt;&amp;lt;% session.setAttribute(&amp;quot;ip&amp;quot;, request.getRemoteAddr()); %&amp;gt;
    &lt;br /&gt;添加记录集rsIP，从voteip表中筛选ip字段等于阶段变量ip的记录
    &lt;br /&gt;选定表单添加“如果记录集为空则显示区域”服务器行为，只有当rsIP记录集为空时才显示投票区域
    &lt;br /&gt;再添加一条提示文本“你已经投过票了”并为其添加“如果记录集不为空则显示区域”服务器行为（也可以直接跳转到投票结果页）
  &lt;/p&gt; 
    &lt;p&gt;再修改vote.jsp在更新投票数的代码段之后添加以下代码段（如果不保存阶段变量，则在此页面中需要再次获取访问者IP地址）：
  &lt;/p&gt; 
    &lt;pre&gt;//阶段变量ip写入voteip表的ip字段
PreparedStatement preInsert = connVote.prepareStatement(&quot;INSERT INTO voteip (ip) VALUES (?)&quot;);
preInsert.setObject(1, session.getAttribute(&quot;ip&quot;));
preInsert.executeUpdate();&lt;/pre&gt; 
    &lt;p&gt;（注意：更新数据库中多个表的操作最好是作为一个事务来处理，如何修改以上代码实现事务处理请参看教学08的事务处理部分）
  &lt;/p&gt; 
    &lt;p&gt;&lt;strong&gt;3 后台维护模块&lt;/strong&gt; &lt;/p&gt; 
    &lt;p&gt;3-1 系统维护首页manage.jsp
  &lt;/p&gt; 
    &lt;p&gt;功能：显示各投票项及“删除”超链接，显示添加投票项表单
  &lt;/p&gt; 
    &lt;p&gt;添加标题“维护投票项”，插入2行3列表格宽400像素，第1行输入文本：序号，投票项，维护
    &lt;br /&gt;添加记录集rsItems，获取voteinfo表内容
    &lt;br /&gt;第2行第3列输入文本“删除”，选定“删除”文本添加服务器行为: 转到详细页面delete.jsp，传递参数id
    &lt;br /&gt;第2列插入rsItems.item
    &lt;br /&gt;第1列插入JSP表达式: &amp;lt;%= Repeat1__index + 1 %&amp;gt;
    &lt;br /&gt;选定item行添加服务器行为: 重复区域
  &lt;/p&gt; 
    &lt;p&gt;添加标题“添加投票项”，插入表单，表单中加入文本域item和提交按钮
    &lt;br /&gt;添加“插入记录”服务器行为
    &lt;br /&gt;在页顶添加代码段以支持提交中文:&amp;nbsp;&amp;lt;% request.setCharacterEncoding(&amp;quot;utf-8&amp;quot;); %&amp;gt;
  &lt;/p&gt; 
    &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/2241a834-71d8-4eb3-916a-d0e4579ee8a0&quot; /&gt; &lt;/p&gt; 
    &lt;p&gt;3-2 删除投票项处理页delete.jsp
  &lt;/p&gt; 
    &lt;p&gt;功能：获取URL参数投票项id，删除vote表相应投票项记录
  &lt;/p&gt; 
    &lt;p&gt;创建delete.jsp添加以下代码段即可：
  &lt;/p&gt; 
    &lt;pre&gt;&amp;lt;%@ include file=&quot;../Connections/connVote.jsp&quot; %&amp;gt;
&amp;lt;%
//根据统一设置创建数据库连接
Class.forName(MM_connVote_DRIVER);
Connection connVote = DriverManager.getConnection(MM_connVote_STRING,MM_connVote_USERNAME,MM_connVote_PASSWORD);
//根据表单提交的ID删除voteinfo表中相应投票项
PreparedStatement preDelete = connVote.prepareStatement(&quot;DELETE FROM voteinfo WHERE id = ?&quot;);
preDelete.setObject(1, request.getParameter(&quot;id&quot;));
preDelete.executeUpdate();
connVote.close();
//删除后跳转至后台维护页
response.sendRedirect(&quot;manage.jsp&quot;);
%&amp;gt;&amp;nbsp;&lt;/pre&gt; 
    &lt;p&gt;（或）添加服务器行为: 已准备（插入、更新、删除）
    &lt;br /&gt;DELETE FROM voteinfo WHERE id=voteId
    &lt;br /&gt;添加参数voteId，运行值为request.getParameter(&amp;quot;id&amp;quot;)
    &lt;br /&gt;插入jsp:forward跳转到manage.jsp
  &lt;/p&gt; 
    &lt;p&gt;3-3 管理员登录login.jsp
  &lt;/p&gt; 
    &lt;p&gt;功能：显示管理员登录表单
  &lt;/p&gt; 
    &lt;p&gt;添加标题“输入登录信息”，插入表单，添加3行2列表格宽350像素，添加文本域name、文本域password（类型属性为密码）和登录按钮
    &lt;br /&gt;添加“登录用户”服务器行为，连接admin表验证账号和密码，登录成功跳转到manage.jsp，登录失败跳转到login.jsp
  &lt;/p&gt; 
    &lt;p&gt;为manage.jsp页添加“限制对页的访问”服务器行为，如果访问被拒绝跳转到login.jsp
    &lt;br /&gt;再次点击“后台维护”链接时就会转到登录页面
  &lt;/p&gt; 
    &lt;p&gt;现在这个投票系统已经初步完成，大家还可以考虑如何进一步完善，例如：
  &lt;/p&gt; 
    &lt;p&gt;如果要实现设置多个投票主题，可以增加投票主题表，投票信息表和投票IP表也需要加上投票主题ID字段。即可添加新的投票主题开始新一轮投票。
    &lt;br /&gt;如果要实现多选投票：可以使用复选框提交表单信息，request对象接收参数后可将其作为数组处理
    &lt;br /&gt;如果要增加各投票项的对应图片，可以参照前述上传图片到数据库的方法。
  &lt;/p&gt; 
    &lt;p&gt; &lt;/p&gt; 
    &lt;p&gt; &lt;/p&gt; 
  &lt;/div&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A609_%E6%8A%95%E7%A5%A8%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%AE%BE%E8%AE%A1</id>
        <title type="html">JSP教学09 投票系统的设计</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A609_%E6%8A%95%E7%A5%A8%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%AE%BE%E8%AE%A1"/>
        <published>2012-11-22T20:22:48+08:00</published>
        <updated>2013-12-23T12:56:42+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="教学" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;9.1 需求描述&lt;br /&gt;9.2 功能设计&lt;br /&gt;9.3 数据库设计&lt;/p&gt;</summary>
        <content type="html">&lt;div&gt; 
    &lt;p&gt; &lt;/p&gt; 
    &lt;p&gt;教学目的：以投票系统为例，了解Web应用项目的设计过程 &lt;br /&gt;&lt;/p&gt; 
    &lt;p&gt;&lt;strong&gt;9.1 需求描述&lt;/strong&gt;&lt;/p&gt; 
    &lt;p&gt;设计一个最简单的在线投票系统，要求实现以下功能：&lt;/p&gt; 
    &lt;p&gt;- 显示所有投票项，访问者可以选择其中一项并点击投票按钮完成投票。&lt;br /&gt;- 显示当前投票情况，包括各投票项的票数、总票数、得票率，并以柱形图直观表示。&lt;br /&gt;- 提供后台维护，管理员可以添加和删除投票项&lt;br /&gt;- 提供防止访问者重复投票的机制&lt;/p&gt; 
    &lt;p&gt;&lt;strong&gt;9.2 功能设计&lt;/strong&gt;&lt;/p&gt; 
    &lt;p&gt;根据需求进行功能设计，使用简单的文本描述设计思路：&lt;/p&gt; 
    &lt;p&gt;1）投票：首页使用表单提交投票信息，一个投票项对应一个单选钮&lt;br /&gt;2）显示投票情况：查看投票情况页显示各选项的票数、总票数、得票率，以柱形图片的宽度直观表示&lt;br /&gt;3）后台维护-管理员登录：登录页使用表单提交账号和密码，验证通过后进入后台维护首页&lt;br /&gt;4）后台维护-删除投票项：后台维护首页显示所有投票项和对应的删除链接&lt;br /&gt;5）后台维护-添加投票项：后台维护首页使用表单提交新投票项信息&lt;br /&gt;6）防止重复投票：访问者投票的同时提交其IP地址信息，之后相同IP地址的访问者即无法再投票&lt;/p&gt; 
    &lt;p&gt;可以使用DW创建各个静态页面作为系统的界面原型。&lt;/p&gt; 
    &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/823e0b7b-544a-46a0-b061-2e5f1f23842a&quot; /&gt; &lt;/p&gt; 
    &lt;p&gt;对于更复杂系统的功能设计可分为初步设计和详细设计，初步设计为系统划分出功能模块，详细设计为各模块的具体实现确定思路。&lt;/p&gt; 
    &lt;p&gt;在设计阶段还可以绘制模块结构图、系统流程图和界面原型图等作为辅助。&lt;/p&gt; 
    &lt;p&gt;&lt;strong&gt;9.3 数据库设计&lt;/strong&gt;&lt;/p&gt; 
    &lt;p&gt;根据功能要求确定使用的数据库系统及数据表结构（字段名和类型说明）：&lt;/p&gt; 
    &lt;p&gt;1）管理员表admin&lt;/p&gt; 
    &lt;p&gt;管理员ID：id 自动编号，主键&lt;br /&gt;管理员帐号：name 文本(50)&lt;br /&gt;管理员密码：password 文本(50)&lt;/p&gt;&lt;span style=&quot;font-family: arial, helvetica, clean, sans-serif; font-size: 14.399999618530273px; line-height: 13.600000381469727px;&quot;&gt;&lt;/span&gt; 
    &lt;p&gt;2）投票信息表voteinfo&lt;/p&gt; 
    &lt;p&gt;投票项ID：id 自动编号，主键&lt;br /&gt;投票项名称：item 文本(50)&lt;br /&gt;投票项得票数：count 数字(长整型)&lt;/p&gt; 
    &lt;p&gt;3）投票者IP表voteip&amp;nbsp;&lt;/p&gt; 
    &lt;p&gt;&lt;span style=&quot;font-family: arial, helvetica, clean, sans-serif; font-size: 14.399999618530273px; line-height: 13.600000381469727px;&quot;&gt;投票者ID：id 自动编号，主键&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: arial, helvetica, clean, sans-serif; font-size: 14.399999618530273px; line-height: 13.600000381469727px;&quot;&gt;投票者IP：ip 文本(15)&lt;/span&gt; &lt;/p&gt; 
    &lt;p&gt;以上是一个最简化的投票系统数据库结构，可在此基础上继续加以完善。&lt;/p&gt; 
    &lt;p&gt;对于更复杂的数据库结构应该使用表格来描述，并绘制数据表间关系图。 &lt;/p&gt; 
  &lt;/div&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C08_%E5%9B%BE%E7%89%87%E5%AD%98%E5%85%A5%E6%95%B0%E6%8D%AE%E5%BA%93</id>
        <title type="html">JSP实验08 图片存入数据库</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C08_%E5%9B%BE%E7%89%87%E5%AD%98%E5%85%A5%E6%95%B0%E6%8D%AE%E5%BA%93"/>
        <published>2012-11-15T13:58:16+08:00</published>
        <updated>2013-12-23T12:55:53+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="实验" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;1 文件上传组件&lt;br /&gt; 2 上传图片并写入图片字段&lt;br /&gt;3 读取图片字段在页面中显示&lt;br /&gt;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;实验目的：掌握在JSP中存取数据库图片字段的方法。&lt;/p&gt; 
  &lt;p&gt;本实验使用示例数据库Northwind，实现雇员表Employees中图片字段的存取。Employees表的Photo字段为“图片类型”（或称“二进制数据”，实际上能以字节形式原样保存任何文件）。&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;1 文件上传组件&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;本实验使用了开源项目文件上传组件并需要输入输出组件的支持，因此要先将相应的类库文件commons-fileupload-1.2.2.jar和commons-io-2.4.jar放到Java类库文件夹。&lt;/p&gt; 
  &lt;p&gt;首先创建主页面index.jsp，参照教学6.4，完成以表格显示雇员信息功能（连接名称为conn，记录集名称为rs），除雇员号、姓氏、名字和职位外，再增加一个“照片”列用于显
示雇员照片。在照片列的内容单元格中插入图像标签并设置属性：替换文本是“照片”（这样如果雇员还没有照片，则会在页面中显示替换文本），源文件是showimg.jsp并传递EmployeeID参数（即由
showimg.jsp负责输出相应雇员的照片数据）；链接是upimg.jsp并也传递EmpoyeeID参数（这样点击图片时将由upimg.jsp
负责上传相应雇员的照片文件）。&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;2 上传图片并写入图片字段&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;创建图片上传页面upimg.jsp，先在页顶引入所需的类：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ page import=&quot;java.io.*&quot; %&amp;gt;
&amp;lt;%@ page import=&quot;java.util.*&quot; %&amp;gt;
&amp;lt;%@ page import=&quot;org.apache.commons.fileupload.servlet.*&quot; %&amp;gt;
&amp;lt;%@ page import=&quot;org.apache.commons.fileupload.disk.*&quot; %&amp;gt;
&amp;lt;%@ page import=&quot;org.apache.commons.fileupload.*&quot; %&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;再用以下代码段根据统一设置创建数据库连接：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ include file=&quot;../Connections/conn.jsp&quot; %&amp;gt;
&amp;lt;%
Class.forName(MM_conn_DRIVER);
Connection conn = DriverManager.getConnection(MM_conn_STRING,MM_conn_USERNAME,MM_conn_PASSWORD);
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在页面中添加表单，在表单中插入一个文件域photo和一个提交按钮，DW会自动设置提交文件数据的表单编码方式enctype=&amp;quot;multipart/form-data&amp;quot;&lt;/p&gt; 
  &lt;p&gt;最后添加以下代码段上传图片并保存到雇员表的图片字段&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;% &amp;nbsp;//上传图片
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) { &amp;nbsp;//提交了文件
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;FileItemFactory factory = new DiskFileItemFactory();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;ServletFileUpload upload = new ServletFileUpload(factory);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;List&amp;lt;FileItem&amp;gt; items = upload.parseRequest(request);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;Iterator iter = items.iterator();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;while (iter.hasNext()) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;FileItem item = (FileItem) iter.next();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (item.isFormField()) { &amp;nbsp;//普通域
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;else { &amp;nbsp;//文件域
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;/*以下代码段用于保存到服务端目录
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;String fileName = item.getName();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;File saveFile = new File(config.getServletContext().getRealPath(&quot;/&quot;) + fileName);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;item.write(saveFile);*/
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;/*以下代码段用于读取字节输入流
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;InputStream is = item.getInputStream();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;byte b[] = new byte[is.available()];
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;is.read(b);*/
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;//以下代码段用于写入数据库图片字段并跳转回主页面
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;byte b[] = item.get();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;String sql = &quot;UPDATE Employees SET photo=? WHERE EmployeeID=?&quot;;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;PreparedStatement pstmt = conn.prepareStatement(sql);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;pstmt.setBytes(1, b);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;pstmt.setString(2, request.getParameter(&quot;EmployeeID&quot;));
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;pstmt.execute();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;pstmt.close();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;response.sendRedirect(&quot;index.jsp&quot;);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}
}
%&amp;gt;&amp;nbsp;&lt;/pre&gt; 
  &lt;p&gt;上传的图片文件也可以保存到服务器目录，或是用来创建字节输入流，具体方法请参看上面代码段中被注释掉的部分。&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;3 读取图片字段在页面中显示&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;创建图片显示页面showimg.jsp，先在页顶引入所需的类：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ page import=&quot;java.io.*&quot; %&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;再在绑定面板中创建记录集rsImg，根据提交的EmployeeID参数筛选出唯一的雇员记录（只需Photo列即可）。&lt;/p&gt; 
  &lt;p&gt;最后添加以下代码段即可读取图片字段并输出：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%
response.setContentType(&quot;image/jpeg&quot;);
OutputStream os = response.getOutputStream();
byte[] b = rsImg.getBytes(&quot;Photo&quot;);
os.write(b);
os.flush();
os.close();
%&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;如果采用图片文件上传到服务器目录而在数据库中保存图片文件名的方式，则图像标签的源文件属性设为图片文件的相对路径即可。&lt;/p&gt; 
  &lt;p&gt;（注意：Northwind数据库的Employees表的Photo字段实际上已存有图片数据，但此数据包含78字节的头信息，因此输出字节流时要指定开始位置为78才能正常显示原有图片&lt;span style=&quot;font-family: Simsun; font-size: 14px;&quot;&gt;os.write(b, 78, b.length-78)&lt;/span&gt;。）&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/ab1878ee-28b5-4fe1-9613-fbca8ebac39a&quot; /&gt; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A608_%E6%95%B0%E6%8D%AE%E5%BA%93%E9%AB%98%E7%BA%A7%E5%8A%9F%E8%83%BD</id>
        <title type="html">JSP教学08 数据库高级功能</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A608_%E6%95%B0%E6%8D%AE%E5%BA%93%E9%AB%98%E7%BA%A7%E5%8A%9F%E8%83%BD"/>
        <published>2012-11-13T14:13:23+08:00</published>
        <updated>2014-02-28T12:17:53+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="教学" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;8.1 使用预存过程&lt;br /&gt;8.2 实现事务处理&lt;br /&gt;8.3 读写图片字段&lt;br /&gt;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;教学目的：了解如何在JSP中使用数据库系统的高级功能，例如预存过程、事务处理和图片字段等。&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;8.1 使用预存过程&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;预存过程（Stored Procedure）是在大型数据库系统中，一组为了完成特定功能的SQL语句集，经编译后存储在数据库中，用户通过指定预存过程的名字并给出参数（如果预存过程带有参数）来执行它。使用预存过程可以减少网络通信量、提高执行速度并增强安全性。&lt;/p&gt; 
  &lt;p&gt;（注意：Access数据库中也有类似预存过程的“查询”，但功能有限，不支持多条SQL语句，也不能使用逻辑语句） &lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;预存过程的编写请参看相关的数据库学习资料，这里只介绍预存过程的使用（以SQL Server的示例数据库Northwind为例）。&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;执行“产品价格排行榜”预存过程Ten Most Expensive Products，返回最贵的十种产品（产品名、单价）：&lt;/p&gt; 
  &lt;p&gt;EXEC [dbo].[Ten Most Expensive Products]&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;执行“客户订单详情”预存过程CustOrdersDetail（需要传入订单号参数）即可查询产品表和订单详情表，返回指定的客户订单详情（产品名、单价、数量、折扣、合计金额）：&lt;br /&gt;&lt;br /&gt;EXEC [dbo].[CustOrdersDetail] 10250&lt;/p&gt; 
  &lt;p&gt;在JSP中执行预存过程的基本方法和执行普通的SQL语句一样，使用Statement对象的excecuteQuery方法即可：&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;String proc = &amp;quot;EXEC [dbo].[CustOrdersDetail] 10250&amp;quot;;&lt;br /&gt;Statement stat = conn.createStatement();&lt;br /&gt;ResultSet rs = stat.executeQuery(proc);&lt;/p&gt; 
  &lt;p&gt;自动化的方式则是在DW的绑定面板中点击添加按钮选择“可调用（预存过程）”，在弹出对话框中选择预存过程、输入变量默认值和运行时值，并设置返回记录集即可。&lt;/p&gt; 
  &lt;p&gt;（注意：如果DW绑定面板中添加带空格的过程名则会出现错误，请避免在过程名中使用空格） &lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/5dc1a368-d311-44f0-85fe-f91ffbafdc37&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;8.2 实现事务处理&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;事务（Transaction）是由多个数据操作组成的一个处理单元，组成事务的操作必须全部都成功执行，如果其中一个操作失败，则系统将撤销所有其他操作，恢复本次事务处理之前的状态。事务是保证数据完整性与一致性的重要机制。&lt;/p&gt; 
  &lt;p&gt;JDBC实现事务处理的机制如下：&lt;/p&gt; 
  &lt;p&gt;1）连接对象创建后调用setAutoCommit(false)方法关闭自动提交模式&lt;br /&gt;2）连接对象调用createStatement方法创建语句对象&lt;br /&gt;3）语句对象执行各项数据操作&lt;br /&gt;4）连接对象调用commit方法让所有操作生效&lt;br /&gt;5）任何一项数据操作抛出异常时，连接对象调用rollback方法回滚到初始状态&lt;/p&gt; 
  &lt;p&gt;例如以下“职位调整”事务由雇员1晋级雇员2降级两个操作组成：&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;pre&gt;try {
	conn.setAutoCommit(false); //不自动提交操作
	String sql1 = &quot;UPDATE Employees SET Title=&apos;销售副总裁&apos; WHERE EmployeeID=1&quot;;
	String sql2 = &quot;UPDATE Employees SET Title=&apos;销售代表&apos; WHERE EmployeeID=2&quot;;
	Statement stmt=conn.createStatement();
	stmt.executeUpdate(sql1);
	stmt.executeUpdate(sql2);
	conn.commit(); //统一提交。
	out.print(&quot;职位调整已完成！&quot;);
}
catch (SQLException e){
	conn.rollback(); //任何一项操作失败则撤消所有操作
	out.print(&quot;职位调整未完成！&quot;);
}&lt;/pre&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;8.3 读写图片字段&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;许多Web应用都需要将图片信息存入数据库，此功能可通过两种方式实现：一是上传图片到服务器目录后在数据库中保存图片文件名；二是将上传图片内容直接存入数据库，前者实现起来较复杂但能够节省资源，后者实现起来更容易但十分消耗资源（数据库存储空间的成本远高于普通存储空间，数据库尺寸成倍增大也会影响运行效率），在实际开发中可以根据具体情况进行选择。保存图片文件名可使用普通文本型字段，保存图片内容要使用字节型的图片字段。&lt;/p&gt; 
  &lt;p&gt;例：上传雇员照片到示例数据库并在页面中显示&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/fa3071d0-d251-4caf-9e38-b688e2401b2e&quot; /&gt;&lt;br /&gt;&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C07_%E7%BC%96%E8%BE%91%E6%95%B0%E6%8D%AE%E5%BA%93</id>
        <title type="html">JSP实验07 编辑数据库</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C07_%E7%BC%96%E8%BE%91%E6%95%B0%E6%8D%AE%E5%BA%93"/>
        <published>2012-11-05T19:37:36+08:00</published>
        <updated>2013-12-23T12:54:20+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="实验" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;1 编辑记录&lt;br /&gt;2 编辑记录（DW自动生成代码）&amp;nbsp;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;实验目的：掌握在JSP中编辑数据库的方法&lt;/p&gt; 
  &lt;p&gt;本次实验使用Access数据库Northwind.mdb的英文版或中文版，实现雇员表Employees的编辑功能（添加/更新/删除），该表包含的必填字段如下：&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;table cellspacing=&quot;1&quot; cellpadding=&quot;1&quot; border=&quot;1&quot; style=&quot;width: 100%;&quot;&gt; 
    &lt;tbody&gt; 
      &lt;tr&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&lt;strong&gt;&amp;nbsp;英文版字段名&lt;/strong&gt;&lt;/td&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&lt;strong&gt;中文版字段名&amp;nbsp;&lt;/strong&gt;&lt;/td&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&lt;strong&gt;&amp;nbsp;数据类型和长度&lt;/strong&gt;&lt;/td&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&lt;strong&gt;说明&amp;nbsp;&lt;/strong&gt;&lt;/td&gt; 
      &lt;/tr&gt; 
      &lt;tr&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;EmployeeID&lt;/td&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;雇员ID&lt;/td&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;自动编号&lt;/td&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;主键&lt;/td&gt; 
      &lt;/tr&gt; 
      &lt;tr&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;LastName&lt;/td&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;姓氏&lt;/td&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;文本(20)&lt;/td&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt; &lt;br /&gt;&lt;/td&gt; 
      &lt;/tr&gt; 
      &lt;tr&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;FirstName&lt;/td&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;名字&lt;/td&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;文本(10)&lt;/td&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt; &lt;br /&gt;&lt;/td&gt; 
      &lt;/tr&gt; 
      &lt;tr&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;Title&lt;/td&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;职务&lt;/td&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;文本(30)&lt;/td&gt; 
        &lt;td style=&quot;width: 25%;&quot;&gt;&lt;br /&gt;&lt;/td&gt; 
      &lt;/tr&gt; 
    &lt;/tbody&gt; 
  &lt;/table&gt; 
  &lt;p&gt;&lt;strong&gt;1 编辑记录&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;本例以JDBC-ODBC桥接方式连接数据库编辑雇员表。&lt;/p&gt; 
  &lt;p&gt;所有编辑功能采用弹出模态窗口的形式以方便操作，在主页面中添加JavaScript客户端脚本（这里为简化脚本的编写而引入了JavaScript库jQuery），为所有popup类元素的单击事件添加处理函数）：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function() {
&amp;nbsp; &amp;nbsp; $(&quot;.popup&quot;).click(function() {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; showModalDialog($(this).attr(&quot;href&quot;), window, &quot;status:0;dialogWidth:&quot; + $(this).data(&apos;width&apos;) + &quot;;dialogHeight:&quot; + $(this).data(&apos;height&apos;));
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return false;
&amp;nbsp; &amp;nbsp; });
});
&amp;lt;/script&amp;gt;&lt;/pre&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;一、创建主页面main.jsp，添加代码查询雇员表：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%
Class.forName(&quot;sun.jdbc.odbc.JdbcOdbcDriver&quot;);
Connection conn = DriverManager.getConnection(&quot;jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=d:/Northwind.mdb&quot;);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(&quot;SELECT * FROM Employees&quot;);
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;&lt;span style=&quot;font-family: verdana, arial, &apos;Bitstream Vera Sans&apos;, helvetica, sans-serif; white-space: normal;&quot;&gt;然后以表格形式输出所有记录，加上添加/修改/删除链接（修改和删除链接都要传递雇员号作为参数，而ODBC驱动不允许多次读取同一字段，因此取出雇员号字段值后先赋值给变量）：&lt;/span&gt;&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;table border=&quot;1&quot;&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;th&amp;gt;雇员号&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;姓&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;名&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;职位&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;&amp;lt;a class=&quot;popup&quot; data-width=&quot;400px&quot; data-height=&quot;150px&quot; href=&quot;add.jsp&quot;&amp;gt;+ 添加&amp;lt;/a&amp;gt;&amp;lt;/th&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;%
while (rs.next()) {
%&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;% String EmployeeID = rs.getString(&quot;EmployeeID&quot;); %&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;%= EmployeeID %&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;%= rs.getString(&quot;LastName&quot;) %&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;%= rs.getString(&quot;FirstName&quot;) %&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;%= rs.getString(&quot;Title&quot;) %&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;
&amp;lt;a class=&quot;popup&quot; data-width=&quot;400px&quot; data-height=&quot;150px&quot; href=&quot;edit.jsp?EmployeeID=&amp;lt;%= EmployeeID %&amp;gt;&quot;&amp;gt;修改&amp;lt;/a&amp;gt;
&amp;lt;a class=&quot;popup&quot; data-width=&quot;400px&quot; data-height=&quot;150px&quot; href=&quot;del.jsp?EmployeeID=&amp;lt;%= EmployeeID %&amp;gt;&quot;&amp;gt;删除&amp;lt;/a&amp;gt;
&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;%
}
%&amp;gt;
&amp;lt;/table&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;二、创建添加记录页面add.jsp，加入表单用文本域提交姓/名/职位信息，使用以下代码根据表单提交的参数插入新记录（添加记录后刷新主页面并关闭本页面）&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;% &amp;nbsp;
request.setCharacterEncoding(&quot;utf-8&quot;);
Class.forName(&quot;sun.jdbc.odbc.JdbcOdbcDriver&quot;);
Connection conn = DriverManager.getConnection(&quot;jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=d:/Northwind.mdb&quot;);
Statement stmt = conn.createStatement();
String LastName = request.getParameter(&quot;LastName&quot;);
String FirstName = request.getParameter(&quot;FirstName&quot;);
String Title = request.getParameter(&quot;Title&quot;);
if (LastName != null &amp;amp;&amp;amp; FirstName != null &amp;amp;&amp;amp; Title != null) {
&amp;nbsp; &amp;nbsp; stmt.executeUpdate(&quot;INSERT INTO Employees (LastName, FirstName, Title) VALUES (&apos;&quot; + LastName + &quot;&apos;, &apos;&quot; + FirstName + &quot;&apos;, &apos;&quot; + Title + &quot;&apos;)&quot; );
%&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
&amp;nbsp; &amp;nbsp; window.opener.location.reload();
&amp;nbsp; &amp;nbsp; window.close();
&amp;nbsp; &amp;nbsp; &amp;lt;/script&amp;gt;
&amp;lt;%
}
%&amp;gt;&amp;nbsp;&lt;/pre&gt; 
  &lt;p&gt;三、创建修改记录页面edit.jsp，根据雇员号参数查询雇员信息在表单中显示并允许编辑（使用文本域的value属性即可），使用以下代码根据表单提交的参数修改记录（修改记录后刷新主页面并关闭本页面）&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;pre&gt;&amp;lt;% &amp;nbsp;
request.setCharacterEncoding(&quot;utf-8&quot;);
Class.forName(&quot;sun.jdbc.odbc.JdbcOdbcDriver&quot;);
Connection conn = DriverManager.getConnection(&quot;jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=d:/Northwind.mdb&quot;);
Statement stmt = conn.createStatement();
String EmployeeID = request.getParameter(&quot;EmployeeID&quot;);
String LastName = request.getParameter(&quot;LastName&quot;);
String FirstName = request.getParameter(&quot;FirstName&quot;);
String Title = request.getParameter(&quot;Title&quot;);
if (LastName != null &amp;amp;&amp;amp; FirstName != null &amp;amp;&amp;amp; Title != null) {
&amp;nbsp; &amp;nbsp; stmt.executeUpdate(&quot;UPDATE Employees SET LastName=&apos;&quot; + LastName + &quot;&apos;, FirstName=&apos;&quot; + FirstName + &quot;&apos;, Title=&apos;&quot; + Title + &quot;&apos; WHERE EmployeeID=&quot; + EmployeeID);
%&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
&amp;nbsp; &amp;nbsp; window.opener.location.reload();
&amp;nbsp; &amp;nbsp; window.close();
&amp;nbsp; &amp;nbsp; &amp;lt;/script&amp;gt;
&amp;lt;%
}
ResultSet rs = stmt.executeQuery(&quot;SELECT * FROM Employees WHERE EmployeeID=&quot; + EmployeeID);
rs.next();
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;四、创建删除记录页面del.jsp，根据雇员号参数查询雇员信息在表单中显示（不允许编辑），使用以下代码根据完成删除操作（删除记录后刷新主页面并关闭本页面）&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;pre&gt;&amp;lt;% &amp;nbsp;
Class.forName(&quot;sun.jdbc.odbc.JdbcOdbcDriver&quot;);
Connection conn = DriverManager.getConnection(&quot;jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=d:/Northwind.mdb&quot;);
Statement stmt = conn.createStatement();
String EmployeeID = request.getParameter(&quot;EmployeeID&quot;);
String del = request.getParameter(&quot;del&quot;);
if (del != null) {
&amp;nbsp; &amp;nbsp; stmt.executeUpdate(&quot;DELETE FROM Employees WHERE EmployeeID=&quot; + EmployeeID);
%&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
&amp;nbsp; &amp;nbsp; window.opener.location.reload();
&amp;nbsp; &amp;nbsp; window.close();
&amp;nbsp; &amp;nbsp; &amp;lt;/script&amp;gt;
&amp;lt;%
}
ResultSet rs = stmt.executeQuery(&quot;SELECT * FROM Employees WHERE EmployeeID=&quot; + EmployeeID);
if (rs.next()) {
%&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form id=&quot;form1&quot; name=&quot;form1&quot; method=&quot;post&quot; action=&quot;&quot;&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;table width=&quot;360&quot; border=&quot;1&quot;&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;tr&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;td&amp;gt;姓：&amp;lt;/td&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%= rs.getString(&quot;LastName&quot;) %&amp;gt;&amp;lt;/td&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/tr&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;tr&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;td&amp;gt;名：&amp;lt;/td&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%= rs.getString(&quot;FirstName&quot;) %&amp;gt;&amp;lt;/td&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/tr&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;tr&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;td&amp;gt;职位：&amp;lt;/td&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%= rs.getString(&quot;Title&quot;) %&amp;gt;&amp;lt;/td&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/tr&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;tr&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input name=&quot;del&quot; type=&quot;hidden&quot; id=&quot;del&quot; value=&quot;yes&quot; /&amp;gt;&amp;lt;/td&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input type=&quot;submit&quot; name=&quot;button&quot; id=&quot;button&quot; value=&quot;确定删除&quot; /&amp;gt;&amp;lt;/td&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/tr&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/table&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;%
}
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;&lt;strong&gt;2 编辑记录（DW自动生成代码）&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;本例使用Dreamweaver的服务器行为自动生成代码来实现雇员表的编辑功能（注意：CS3及以下版本的DW不支持中文字段名）。&lt;/p&gt; 
  &lt;p&gt;一、创建主页面index.jsp，参照教学6.4，完成显示雇员表功能：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/c5f7eed5-d755-4974-b97a-be4dc24c2f03&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;“+ 添加”文本链接到添加记录页面insert.jsp，“修改”和“删除”文本分别添加“转到详细页面”服务器行为，目标分别是修改记录页面update.jsp和删除记录页面delete.jsp&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;二、创建添加记录页面insert.jsp，加入表单用文本域提交姓/名/职位信息，添加“插入记录”服务器行为即可（注意设置请求信息的字符编码以支持提交中文：&amp;lt;% request.setCharacterEncoding(&amp;quot;utf-8&amp;quot;); %&amp;gt;）&lt;/p&gt; 
  &lt;p&gt;三、创建修改记录页面update.jsp，根据雇员号参数查询雇员信息在表单的文本域中显示，添加“更新记录”服务器行为即可（注意设置请求信息的字符编码以支持提交中文：&amp;lt;% request.setCharacterEncoding(&amp;quot;utf-8&amp;quot;); %&amp;gt;）&lt;/p&gt; 
  &lt;p&gt;四、创建删除记录页面delete.jsp，根据雇员号参数查询雇员信息在表单中显示，添加“删除记录”服务器行为即可&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A607_%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E5%86%99%E5%85%A5</id>
        <title type="html">JSP教学07 数据库的写入</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A607_%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E5%86%99%E5%85%A5"/>
        <published>2012-10-30T14:53:01+08:00</published>
        <updated>2013-12-23T12:53:04+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="教学" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;7.1 添加记录&lt;br /&gt;7.2 修改记录&lt;br /&gt;7.3 删除记录&lt;br /&gt;7.4 使用DW的服务器行为写入数据库&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;教学目的：了解如何在JSP中更新数据库内容，包括记录的添加、修改和删除&lt;/p&gt; 
  &lt;p&gt;更新数据库内容的包括记录的添加、修改和删除，这些操作在JSP中可以通过执行语句对象的executeUpdate方法来实现的。&lt;/p&gt; 
  &lt;p&gt;int executeUpdate(String sql)&amp;nbsp; //sql参数为要执行的数据操作SQL语句(&lt;code&gt;INSERT&lt;/code&gt;/&lt;code&gt;UPDATE/&lt;/code&gt;&lt;code&gt;DELETE)，返回值是受影响的记录条数&lt;/code&gt;&lt;/p&gt; 
  &lt;p&gt;本次教学完成通过JSP页面更新示例数据库Northwind的雇员表Employees记录的三种操作：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/73544c83-2db4-410a-bfa2-bc47fa4696e3&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;7.1 添加记录&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;添加记录的SQL语句为：&lt;/p&gt; 
  &lt;p&gt;INSERT INTO 表名 (字段列表) VALUES (值列表)&lt;/p&gt; 
  &lt;p&gt;如在雇员表中添加一条记录：&lt;/p&gt; 
  &lt;p&gt;INSERT INTO Employees (LastName, FirstName, Title) VALUES (&apos;刘&apos;, &apos;三&apos;, &apos;销售代表&apos;)&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;7.2 修改记录&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;修改记录的SQL语句为：&lt;/p&gt; 
  &lt;p&gt; UPDATE 表名 SET (字段赋值列表) WHERE 筛选条件&lt;/p&gt; 
  &lt;p&gt;如修改雇员表中指定雇员号的记录：&lt;/p&gt; 
  &lt;p&gt;UPDATE Employees SET LastName=&apos;李&apos;, FirstName=&apos;四&apos;, Title=&apos;副总裁&apos; WHERE EmployeeID=10&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;7.3 删除记录&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;删除记录的SQL语句为：&lt;/p&gt; 
  &lt;p&gt; DELETE FROM 表名 WHERE 筛选条件 &lt;/p&gt; 
  &lt;p&gt;如删除雇员表中指定雇员号的记录：&lt;/p&gt; 
  &lt;p&gt;DELETE FROM Employees WHERE EmployeeID=10&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;7.4 使用DW的服务器行为写入数据库&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;使用DW的服务器行为面板，能够以所见即所得的方式自动生成添加、修改和删除记录的代码而不必手工编写。&lt;/p&gt; 
  &lt;p&gt;使用以上写入数据类服务器行为都需要先创建相应的表单，使用修改和删除记录的服务器行为还需要先绑定一个筛选出单条记录的记录集。&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/8b4d3a2c-9a7d-4b08-846b-5e404454e98f&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C06_%E6%9F%A5%E8%AF%A2%E6%95%B0%E6%8D%AE%E5%BA%93</id>
        <title type="html">JSP实验06 查询数据库</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C06_%E6%9F%A5%E8%AF%A2%E6%95%B0%E6%8D%AE%E5%BA%93"/>
        <published>2012-10-26T09:22:37+08:00</published>
        <updated>2013-12-23T10:38:09+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="实验" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;1 查询记录&lt;br /&gt;2 查询记录（DW自动生成代码）&lt;br /&gt;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;实验目的：掌握在JSP页面中查询数据库的方法&lt;/p&gt; 
  &lt;p&gt;本次实验使用Access数据库Book.mdb，表名为bookForm，包含字段如下：&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;table width=&quot;547&quot; height=&quot;182&quot; cellspacing=&quot;1&quot; cellpadding=&quot;1&quot; border=&quot;1&quot;&gt; 
    &lt;tbody&gt; 
      &lt;tr&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&lt;strong&gt;&amp;nbsp;字段名称&lt;/strong&gt;&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt; &lt;strong&gt;数据类型和长度&lt;/strong&gt;&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt; &lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt; 
      &lt;/tr&gt; 
      &lt;tr&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;bookISBN&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;文本(50)&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;书号，该字段为主键&lt;br /&gt;&lt;/td&gt; 
      &lt;/tr&gt; 
      &lt;tr&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;bookName&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;文本(50)&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;书名&lt;/td&gt; 
      &lt;/tr&gt; 
      &lt;tr&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;bookAuthor&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;文本(50)&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;作者&lt;/td&gt; 
      &lt;/tr&gt; 
      &lt;tr&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;bookPrice&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;数字&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;价格，单精度浮点数&lt;/td&gt; 
      &lt;/tr&gt; 
      &lt;tr&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;bookPublish&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;文本(50)&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;出版社&lt;/td&gt; 
      &lt;/tr&gt; 
      &lt;tr&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;bookTime&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;日期/时间&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;出版时间&lt;/td&gt; 
      &lt;/tr&gt; 
      &lt;tr&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;bookAbstract&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;文本（255）&lt;/td&gt; 
        &lt;td style=&quot;width: 33%;&quot;&gt;&amp;nbsp;摘要&lt;/td&gt; 
      &lt;/tr&gt; 
    &lt;/tbody&gt; 
  &lt;/table&gt;&lt;br /&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;1 查询记录&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;本例使用自定义标记以JDBC-ODBC桥接方式连接数据库查询图书，用户可以输入查询条件和文本，例如书名包含“JSP”的所有图书。&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;首先创建图书查询页面inputMess.jsp，首先在页顶添加指令引入自定义标记：&lt;/p&gt; 
  &lt;pre&gt;&amp;nbsp;&amp;lt;%@ taglib tagdir=&quot;/WEB-INF/tags&quot; prefix=&quot;findBook&quot; %&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在页面中添加表单，在表单中添加文本域findContent、列表框condition（包含书名/作者/出版社/出版时间/内容提要等5个选项）和提交接钮：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/f334bc20-f8d7-4113-9801-a5385267cee9&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;继续在页面中添加代码段获取表单提交的查询文本和查询条件，添加自定义标记执行查询操作，添加表达式显示结果：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%&amp;nbsp; 
String findContent = request.getParameter(&quot;findContent&quot;);
String condition = request.getParameter(&quot;condition&quot;);
if (findContent == null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; findContent = &quot;&quot;;
}
if (condition == null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; condition = &quot;&quot;;
}
byte b[]=findContent.getBytes(&quot;iso-8859-1&quot;);
findContent=new String(b, &quot;utf-8&quot;);
%&amp;gt;
&amp;lt;findBook:FindBook dataSource=&quot;Driver={Microsoft Access Driver (*.mdb)};DBQ=d:/Book.mdb&quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp; tableName=&quot;bookForm&quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp; findContent=&quot;&amp;lt;%= findContent %&amp;gt;&quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp; condition=&quot;&amp;lt;%= condition %&amp;gt;&quot; /&amp;gt;
&amp;lt;%= giveResult %&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;接下来在在/WEB-INF/tags下创建标记文件FindBook.tag，内容如下：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ tag import=&quot;java.sql.*&quot; %&amp;gt;
&amp;lt;%@ tag pageEncoding=&quot;utf-8&quot; %&amp;gt;
&amp;lt;%@ attribute name=&quot;dataSource&quot; required=&quot;true&quot; %&amp;gt;
&amp;lt;%@ attribute name=&quot;tableName&quot; required=&quot;true&quot; %&amp;gt;
&amp;lt;%@ attribute name=&quot;findContent&quot; required=&quot;true&quot; %&amp;gt;
&amp;lt;%@ attribute name=&quot;condition&quot; required=&quot;true&quot; %&amp;gt;
&amp;lt;%@ variable name-given=&quot;giveResult&quot; variable-class=&quot;java.lang.StringBuffer&quot; scope=&quot;AT_END&quot; %&amp;gt;
&amp;lt;%&amp;nbsp; 
try {
&amp;nbsp;&amp;nbsp;&amp;nbsp; Class.forName(&quot;sun.jdbc.odbc.JdbcOdbcDriver&quot;);
}
catch(ClassNotFoundException e){
&amp;nbsp;&amp;nbsp;&amp;nbsp; out.print(e);
}
Connection con;
Statement sql;
ResultSet rs;
StringBuffer queryResult = new StringBuffer();
String uri = &quot;jdbc:odbc:&quot; + dataSource;
try {
&amp;nbsp;&amp;nbsp;&amp;nbsp; con = DriverManager.getConnection(uri,&quot;&quot;,&quot;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; sql = con.createStatement();
&amp;nbsp;&amp;nbsp;&amp;nbsp; String s = &quot;SELECT * FROM &quot; + tableName + &quot; WHERE &quot; + condition + &quot; Like&apos;%&quot; + findContent + &quot;%&apos;&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp; rs=sql.executeQuery(s);
&amp;nbsp;&amp;nbsp;&amp;nbsp; queryResult.append(&quot;查询到的图书：&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; queryResult.append(&quot;&amp;lt;table border=1&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; queryResult.append(&quot;&amp;lt;tr&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; queryResult.append(&quot;&amp;lt;th&amp;gt;ISBN&amp;lt;/td&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; queryResult.append(&quot;&amp;lt;th&amp;gt;图书名称&amp;lt;/td&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; queryResult.append(&quot;&amp;lt;th&amp;gt;作者&amp;lt;/td&amp;gt;&quot;); 
&amp;nbsp;&amp;nbsp;&amp;nbsp; queryResult.append(&quot;&amp;lt;th&amp;gt;价格&amp;lt;/td&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; queryResult.append(&quot;&amp;lt;th&amp;gt;出版社&amp;lt;/td&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; queryResult.append(&quot;&amp;lt;th&amp;gt;出版时间&amp;lt;/td&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; queryResult.append(&quot;&amp;lt;th&amp;gt;摘要&amp;lt;/td&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; queryResult.append(&quot;&amp;lt;/tr&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; int fields = 7;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while (rs.next()) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; queryResult.append(&quot;&amp;lt;tr&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; String bookISBN = &quot;&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for (int k=1; k&amp;lt;=fields; k++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (k == 7) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; String bookAbstract = rs.getString(k);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; String abs = &quot;&amp;lt;textarea rows=6 colums=10/&amp;gt;&quot; + bookAbstract + &quot;&amp;lt;/textarea&amp;gt;&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; queryResult.append(&quot;&amp;lt;td&amp;gt;&quot; + abs + &quot;&amp;lt;/td&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; queryResult.append(&quot;&amp;lt;td&amp;gt;&quot;+rs.getString(k)+&quot;&amp;lt;/td&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; queryResult.append(&quot;&amp;lt;/table&amp;gt;&quot;); 
&amp;nbsp;&amp;nbsp;&amp;nbsp; jspContext.setAttribute(&quot;giveResult&quot;,queryResult);
&amp;nbsp;&amp;nbsp;&amp;nbsp; con.close();
}
catch(SQLException exp){
&amp;nbsp;&amp;nbsp;&amp;nbsp; jspContext.setAttribute(&quot;giveResult&quot;,new StringBuffer(&quot;请设置查询条件。&quot;));
}
%&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;完成后在浏览器中运行inputMess.jsp，输入查询文本并选择查询条件，点击提交按钮执行查询：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/b4efaea0-d507-4c74-a11b-04a0aaac5632&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;2 查询记录（DW自动生成代码）&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;本例使用Dreamweaver的数据库面板自动生成代码来实现图书查询功能。&lt;/p&gt; 
  &lt;p&gt;首先创建图书查询页面findBook.jsp，在页面中添加与上例相同的查询表单，提交查询内容参数findContent和查询字段参数condition。&lt;/p&gt; 
  &lt;p&gt;接下来创建数据库连接：在数据库面板中点击“+”按钮，选择“自定义JDBC连接”；在“自定义JDBC连接”对话框中设置连接信息，连接名称为connBook，驱动程序为com.hxtt.sql.access.AccessDriver，URL为jdbc:access:/d:/Book.mdb，点击“测试”按钮测试连接，点击“确定”按钮完成连接的创建。 &lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/04703271-e9e3-4a22-ae70-3228a08772df&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt;接下来是绑定记录集：切换到“绑定”面板，点击“+”按钮，选择“记录集（查询）”；在“记录集”对话框中设置记录集信息：名称为rsBook，连接为connBook，表格为bookForm，先设置筛选为bookName包含URL/表单变量findContent。点击“测试”按钮测试，点击“确定”按钮完成记录集的创建。 &lt;/p&gt; 
  &lt;p&gt; &lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/79dee777-e2ba-404c-8894-d530af1ebceb&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;注意：在记录集对话框中只能设置筛选书名字段的内容，而不能根据用户提交的参数改变要筛选的字段。想实现更复杂的查询记录集，还需要对自动生成的代码进行一些修改。&lt;/p&gt; 
  &lt;p&gt;在页顶添加以下代码段，获取用户提交的查询条件参数condition，默认值设为书名字段bookName：&lt;br /&gt;&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%
request.setCharacterEncoding(&quot;utf-8&quot;);
String condition = &quot;bookName&quot;;
if (request.getParameter(&quot;condition&quot;) != null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; condition = request.getParameter(&quot;condition&quot;);
}
%&amp;gt; 
&lt;/pre&gt; 
  &lt;p&gt;然后在代码中找到rsBook记录集对应的查询语句，即下面这一行： &lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;PreparedStatement StatementrsBook = ConnrsBook.prepareStatement(&amp;quot;SELECT * FROM bookForm WHERE &lt;span style=&quot;color: #ff0000;&quot;&gt;bookName&lt;/span&gt; LIKE ?&amp;quot;);&lt;/p&gt; 
  &lt;p&gt;修改查询语句将固定的书名字段改为变量： &lt;/p&gt; 
  &lt;p&gt;PreparedStatement StatementrsBook = ConnrsBook.prepareStatement(&amp;quot;SELECT * FROM bookForm WHERE &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot; + condition + &amp;quot;&lt;/span&gt; LIKE ?&amp;quot;);
&lt;/p&gt; 
  &lt;p&gt;接下来是添加显示记录集第一条记录的各个字段的动态文本，在页面中添加一个2行7列的表格，先输入表头文本，然后将绑定面板中rsBook记录集的各个拖到表格第2行的各个单元格即可：&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/9ed97550-9bcd-4fa7-9674-4d7f0f84106a&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt;然后还要通过循环显示记录集的所有记录：先在页面中选定动态文本所在的行，切换到“服务器行为”面板，点击“+”按钮，选择“重复区域”，在重复区域对话框中选择显示rsBook记录集的所有记录即可。&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/2971134c-3766-4d69-91f3-0fdb5a6addf4&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;注意如果查询所得的rsBook记录集中没有任何记录，运行显示记录的服务器行为就会导致错误，因此还需要选中整个表格并添加一个有条件显示区域的服务器行为，如果记录集不为空则显示区域：&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/bc623dd1-ca18-46bd-b14e-f0f7710794e8&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;可以看到DW能够自动生成各种通用功能的代码，为Web应用程序的开发提供极大的便利，但要满足更特殊的需求、实现更灵活的功能，阅读和修改代码仍然是开发者必须掌握的能力。&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A606_%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E8%BF%9E%E6%8E%A5%E5%92%8C%E6%9F%A5%E8%AF%A2</id>
        <title type="html">JSP教学06 数据库的连接</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A606_%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E8%BF%9E%E6%8E%A5%E5%92%8C%E6%9F%A5%E8%AF%A2"/>
        <published>2012-10-19T14:46:14+08:00</published>
        <updated>2013-12-23T10:36:58+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="教学" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;6.1 数据库与JDBC&lt;br /&gt;6.2 连接数据库&lt;br /&gt;6.3 查询记录&lt;br /&gt;6.4 使用DW的数据库面板连接数据库&lt;br /&gt;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;教学目的：了解如何在JSP中连接和查询数据库&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;6.1 数据库与JDBC&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;Web应用程序大都需要数据库系统的支持，JSP通过JDBC来实现数据库操作。&lt;/p&gt; 
  &lt;p&gt;JDBC即“Java数据库连接”，是Java平台的一个标准应用程序接口（API）。&lt;/p&gt; 
  &lt;p&gt;JDBC定义了Java平台上数据库驱动的编写和使用规范，采用标准查询语言（SQL）并支持与“开放数据库互连”（ODBC）应用程序接口之间的桥接。&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/4e078d40-f472-475b-acc5-66963a39461b&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;JDBC的主要对象：&lt;/p&gt; 
  &lt;p&gt;Driver：驱动，负责加载特定种类的数据库&lt;br /&gt;DriverManager：驱动管理器，负责管理所有种类的数据库驱动&lt;br /&gt;Connection：连接，负责与数据库进行通讯&lt;br /&gt;Statement：语句，负责封装标准查询语言的语句并传递给数据库&lt;br /&gt;ResultSet：结果集，负责存放查询数据库所返回的临时表，一个结果集包含若干条记录（行），一条记录包含若干个字段（列）&lt;/p&gt; 
  &lt;p&gt;JDBC对象相应的类和接口都属于数据库类包java.sql.*，访问数据库的JSP页面需要引入此类包（注意：DW创建的JSP页面默认都添加了引入此类包的指令代码）&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;6.2 连接数据库&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;要在JSP页面中建立数据库连接，首先需使用Class类的forName方法加载特定的数据库驱动：&lt;/p&gt; 
  &lt;p&gt;static Class forName(String className)&amp;nbsp; //className参数是要加载的数据库驱动类名&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;然后再使用DriverManager类的getConnection方法创建数据库连接对象：&lt;/p&gt; 
  &lt;p&gt;static Connection getConnection(String url)&amp;nbsp; //url参数是数据库连接字符串，不同的数据库使用不同的连接字符串&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt; 
  如果某种数据库没有JDBC驱动但有ODBC驱动，则可以使用JDK内置的JDBC-ODBC桥接器建立数据库连接对象（驱动类名是sun.jdbc.odbc.JdbcOdbcDriver）&lt;/p&gt; 
  &lt;p&gt;例：使用JDBC-ODBC桥接器驱动连接Access数据库&lt;/p&gt; 
  &lt;pre&gt;Class.forName(&quot;sun.jdbc.odbc.JdbcOdbcDriver&quot;);
Connection conn = DriverManager.getConnection(&quot;jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=d:/Northwind.mdb&quot;);&lt;/pre&gt; 
  &lt;p&gt;使用JDBC-ODBC桥接器驱动连接SQL Server数据库&lt;/p&gt; 
  &lt;pre&gt;Class.forName(&quot;sun.jdbc.odbc.JdbcOdbcDriver&quot;);
Connection conn = DriverManager.getConnection(&quot;jdbc:odbc:Driver={SQL Server};Server=localhost;Database=Northwind;Uid=leo;Pwd=123&quot;);&lt;/pre&gt; 
  &lt;p&gt;也可以在操作系统提供的“ODBC数据源管理器”中预先添加数据源，则此处的连接字符串只要写为“jdbc:odbc:数据源名”即可。SQL Server 2000原版存在安全漏洞所以操作系统会自动禁止通过TCP/IP协议连接，只允许连接本机数据源，必须打上SP4补丁方可启用网络方式访问。&lt;/p&gt; 
  &lt;p&gt;（注意：使用JDBC-ODBC桥接器连接数据库在可用功能和运行效率上存在不足，只要某种数据库提供了专门的JDBC驱动，就应当避免使用JDBC-ODBC桥接器。）&lt;/p&gt; 
  &lt;p&gt;数据库厂商大都会提供其数据库的JDBC驱动程序，JDBC驱动程序通常是一个jar文件，其中包含了特定的数据库驱动类，将其复制到以下Java类库文件夹之一并重启Tomcat即可使用：&lt;/p&gt; 
  &lt;p&gt;1、JDK安装目录下的jre\lib\ext文件夹：本机上运行的所有Java应用程序都可使用该驱动&lt;br /&gt;2、Tomcat安装目录下的lib文件夹：Tomcat上运行的所有Web应用程序都可使用该驱动&lt;br /&gt;3、Web应用程序目录下的WEB-INF\lib文件夹：只有该Web应用程序可使用该驱动&lt;/p&gt; 
  &lt;p&gt;（注意：第一个文件夹是Java的默认类库，DriverManager的getConnection方法会根据连接字符串参数确定数据库类型自动加载其中的数据库驱动，不必使用Class类的forName方法预先加载） 
  &lt;/p&gt; 
  &lt;p&gt;例：使用专门的JDBC驱动连接Access数据库（驱动类名为com.hxtt.sql.access.AccessDriver，注意这是第三方出品的商业软件，演示版有50次查询限制，仅能用于学习场合）&lt;/p&gt; 
  &lt;pre&gt;Class.forName(&quot;com.hxtt.sql.access.AccessDriver&quot;);
Connection conn = DriverManager.getConnection(&quot;jdbc:access:/d:/Northwind.mdb&quot;);&lt;/pre&gt; 
  &lt;p&gt;使用专门的JDBC驱动连接SQL Server数据库（驱动类名为com.microsoft.sqlserver.jdbc.SQLServerDriver）&lt;/p&gt; 
  &lt;pre&gt;Class.forName(&quot;com.microsoft.sqlserver.jdbc.SQLServerDriver&quot;);
Connection conn = DriverManager.getConnection(&quot;jdbc:sqlserver://localhost;DatabaseName=Northwind;User=leo;Password=123&quot;);
&lt;/pre&gt; 
  &lt;p&gt;（注意：SQL Server 2000必须打上SP4补丁才能使用3.0以下版本的JDBC驱动，微软最新版驱动也已经不再支持SQL Server 2000）&lt;/p&gt; 
  &lt;p&gt;建立数据库连接之后，就可与数据库进行各种交互，例如查询、添加、修改和更新等操作，不论是对哪种数据库，这些操作所使用的代码都是一样的。&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;6.3 查询记录&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;在JSP页面建立数据库连接对象后，可以使用JDBC提供的API发送SQL语句实现和数据库的交互，下面介绍查询记录操作的具体步骤。&lt;/p&gt; 
  &lt;p&gt;首先让连接对象调用createStatement方法创建一个语句对象（在实际应用中更常见的是用prepareStatement方法创建一个“预处理语句”对象PreparedStatement，这样可以向SQL中动态地传入参数）：&lt;/p&gt; 
  &lt;p&gt;Statement createStatement()&lt;/p&gt; 
  &lt;p&gt;然后再让语句对象调用executeQuery方法获得一个结果集对象：&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;ResultSet executeQuery(String sql) //sql参数是要执行的查询语句&lt;/p&gt; 
  &lt;p&gt;结果集对象先执行next方法按行移动数据游标，再执行get方法获得当前行的特定字段值（传入参数为字段名字符串或字段序号数值）&lt;/p&gt; 
  &lt;p&gt;boolean next() //如果返回flase，说明数据游标已经移至结果集的末尾，不能再执行get方法&lt;/p&gt; 
  &lt;p&gt;操作完毕后应当让结果集对象、语句对象和连接对象调用close方法关闭对象以及时释放系统资源&lt;/p&gt; 
  &lt;p&gt;void close()&lt;/p&gt; 
  &lt;p&gt;例：在示例数据库Northwind中查询雇员表Employees并以表格形式在页面中输出所有雇员的编号、姓名和职位&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%&amp;nbsp; 
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(&quot;SELECT * FROM Employees&quot;);
%&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;table&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;雇员号&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;姓&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;名&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;职位&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;%
while (rs.next()) {
%&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;%= rs.getString(&quot;EmployeeID&quot;) %&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;%= rs.getString(&quot;LastName&quot;) %&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;%= rs.getString(&quot;FirstName&quot;) %&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;%= rs.getString(&quot;Title&quot;) %&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;%
}
%&amp;gt;
&amp;lt;/table&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;&lt;strong&gt;6.4 使用DW的数据库面板连接数据库&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;使用DW的数据库面板，能够以所见即所得方式自动生成操作数据库的代码而不必手工编写，为Web应用程序的开发提供更多便利。&lt;/p&gt; 
  &lt;p&gt;（注意：使用CS4以上版本的DW的数据库面板，需要将专用JDBC驱动复制到DW安装目录下的configuration\JDBCDriver文件夹中，否则以专用JDBC驱动连接数据库时会提示找不到类；还需要将JDK安装目录下的jre\lib\charsets.jar复制到DW安装目录下的jvm\lib文件夹中，否则以专用JDBC驱动连接SQL Server数据库时会提示不支持中文排序规则，以JDBC-ODBC驱动连接数据库时也会提示不支持中文编码）&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;例：使用DW的数据库面板访问罗斯文商贸数据库并查询雇员表中的记录&lt;/p&gt; 
  &lt;p&gt;首先创建Web应用程序页面，在数据库面板中点击“+”按钮，选择“自定义JDBC连接” &lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/00091a4f-bc60-4585-a845-e959176d0e29&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;在“自定义JDBC连接”对话框中设置连接信息，连接名称为conn，驱动程序为com.hxtt.sql.access.AccessDriver，URL为jdbc:access:/d:/罗斯文.mdb，点击“测试”按钮测试连接，点击“确定”按钮完成连接的创建。&lt;/p&gt; 
  &lt;p&gt;（注意：CS3以下版本的DW不能直接使用本机的驱动程序，建立数据库连接时应选择“使用测试服务器上的驱动程序”）&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/1fdb2b40-be6c-4e56-8079-1a982d74a286&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;创建连接后即可在数据库面板中直接查看数据库的内容。&lt;/p&gt; 
  &lt;p&gt;第二步是绑定记录集（即结果集），切换到“绑定”面板，点击“+”按钮，选择“记录集（查询）”&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/10950685-2de7-4c88-b6f5-316f8e924f41&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;在“记录集”对话框中设置记录集信息：名称为rsEmployees，连接为conn，表格为雇员，按默认设置返回所有记录，点击“测试”按钮测试记录集，点击“确定”按钮完成记录集的创建&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/784f19be-23cf-4c15-abd0-937035bd9bc8&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;绑定记录集后即可在记录集面板看到记录集的全部字段。&lt;/p&gt; 
  &lt;p&gt;第三步是添加显示记录集第一条记录的各个字段的动态文本，在页面中添加一个2行4列的表格，先输入表头文本，然后将绑定面板中rsEmployees记录集的“姓氏”字段直接拖到表格第2行的第1个单元格即可将动态文本放入单元格。以同样方法将其他字段分别放入第2行的其他单元格：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/4622b743-7ae2-4af5-8834-824ecbcfb75c&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;第四步是通过循环显示记录集的所有记录，先在页面中选定动态文本所在的行，切换到“服务器行为”面板，点击“+”按钮，选择“重复区域”&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/6b5c3c0a-4932-4ae5-91cb-2fa16e7b45e9&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;在“重复区域”对话框中设置重复区域服务器行为，记录集为rsEmployees，显示所有记录，点击“确定”按钮添加重复区域服务器行为&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/e751125d-ea56-423f-a10c-de341e7daa10&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;最后在浏览器中运行页面查看显示效果（出生日期字段的动态文本应设为只显示日期，可以修改代码用getString方法或，在绑定面板中设置显示格式）&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/08e2d7e8-df97-4bc9-b830-0ec82bdcb2a7&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;DW会以指定连接名在Connections目录下创建连接文件供整个站点的所有页面引用，这样修改数据库连接设置时只需修改一个文件即可。如果需要基于这个统一的设置手动创建连接对象可以用如下的代码段：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ include file=&quot;../Connections/conn.jsp&quot; %&amp;gt;
&amp;lt;%
Class.forName(MM_conn_DRIVER);
Connection conn = DriverManager.getConnection(MM_conn_STRING,MM_conn_USERNAME,MM_conn_PASSWORD);
%&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;（注意：由于本例数据库使用了中文文件名，因此需要修改连接文件添加页面指令设置与其他页面相同的字符编码。实际开发中建议不要使用中文文件名和中文字段名以避免麻烦）&lt;br /&gt;&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C05_%E6%96%87%E4%BB%B6%E7%9A%84%E8%AF%BB%E5%86%99%E6%93%8D%E4%BD%9C</id>
        <title type="html">JSP实验05 文件操作示例</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C05_%E6%96%87%E4%BB%B6%E7%9A%84%E8%AF%BB%E5%86%99%E6%93%8D%E4%BD%9C"/>
        <published>2012-10-15T16:08:13+08:00</published>
        <updated>2013-12-23T10:26:53+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="实验" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;1 使用字节流读写文件&lt;br /&gt;2 使用字符流读写文件&lt;br /&gt;3 使用数据流读写数据&lt;br /&gt;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;实验目的：掌握文件的读写操作相关类的使用 &lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;1 使用字节流读写文件&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;使用文件输入/输出流FileInputStream/FileOutStream以字节为单位的读写文件，实现“在线文件柜”功能&lt;/p&gt; 
  &lt;p&gt;在应用程序根目录下创建files文件夹作为“在线文件柜”目录，再创建首页文件index.jsp，在页顶添加代码引入所需类包：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ page import=&quot;java.io.*&quot; %&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在页面中添加表单，在表单中添加文本域newname及提交按钮：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/f14cc235-a209-4b88-a1ab-230c0bd16fdf&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;在页面中添加代码，实现文件列表、新建和删除等基本操作：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%&amp;nbsp; 
//在线文件柜目录
String myfiles = application.getRealPath(&quot;/files/&quot;);
File dir = new File(myfiles);
//根据用户提交的名字新建文件
String newname = request.getParameter(&quot;newname&quot;);
if (newname != null &amp;amp;&amp;amp; newname != &quot;&quot; ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; File newFile = new File(myfiles, newname);
&amp;nbsp;&amp;nbsp;&amp;nbsp; newFile.createNewFile();
}
else {
&amp;nbsp;&amp;nbsp;&amp;nbsp; //根据用户提交的名字删除文件
&amp;nbsp;&amp;nbsp;&amp;nbsp; String delname = request.getParameter(&quot;delname&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (delname != null &amp;amp;&amp;amp; delname != &quot;&quot; ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; byte del[] = delname.getBytes(&quot;iso-8859-1&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; delname = new String(del, &quot;utf-8&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; File delFile = new File(myfiles, delname);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; delFile.delete();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}
//列出在线文件柜目录下的文件
File file[] = dir.listFiles();
for (int i = 0; i &amp;lt; file.length; i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (file[i].isFile()) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; out.print(&quot;&amp;lt;a href=&apos;content.jsp?filename=&quot; + file[i].getName().toString() + &quot;&apos;&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; out.print(file[i].getName().toString() + &quot;&amp;lt;/a&amp;gt; - &quot; + file[i].length() + &quot;字节&amp;nbsp; &quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; out.print(&quot;&amp;lt;a href=&apos;?delname=&quot; + file[i].getName().toString() + &quot;&apos;&amp;gt;删除&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;创建查看和编辑文件内容页content.jsp，在页顶添加代码引入所需类包： &lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ page import=&quot;java.io.*&quot; %&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在页面中添加表单，在表单中添加文本区域content及提交按钮：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/db990540-fded-4e3d-993b-6705b403c095&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt;在文本区域标签内添加代码，实现文件内容的读取和写入：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;% &amp;nbsp;
//在线文件柜目录
String myfiles = application.getRealPath(&quot;/files/&quot;);
File dir = new File(myfiles);
String content = request.getParameter(&quot;content&quot;);
String filename = request.getParameter(&quot;filename&quot;);
//根据用户提交的内容，以字节流写入原文件
if (content != null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; File f = new File(myfiles, filename);
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileOutputStream o = new FileOutputStream(f);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BufferedOutputStream bo = new BufferedOutputStream(o);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte c[] = content.getBytes();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bo.write(c);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bo.flush();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bo.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; o.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(IOException e) {}
}
//根据用户提交的文件名，以字节流读取文件并显示
if (filename != null &amp;amp;&amp;amp; filename != &quot;&quot; ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; File f = new File(myfiles, filename);
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileInputStream i = new FileInputStream(f);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BufferedInputStream bi = new BufferedInputStream(i);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte b[] = new byte[100];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int n = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((n = bi.read(b)) != -1) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String temp = new String(b, 0, n);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.print(temp);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bi.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(IOException e) {}
}
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在浏览器中运行index.jsp即可显示files目录下的文件列表并进行各种操作：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/d1984676-5b2e-47d9-b7e1-6b01c0036b94&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt; &lt;strong&gt;2 使用字符流读写文件&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;使用字节流&lt;span style=&quot;color: #000000; font-family: arial, helvetica, clean, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 17px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; float: none; display: inline !important;&quot;&gt;读写文件在处理汉字时会出现乱码。本例修改上例的content.jsp文件，使用字符流类InputStreamReader/OutputStreamWriter读写文件。&lt;/span&gt; &lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%&amp;nbsp; 
//在线文件柜目录
String myfiles = application.getRealPath(&quot;/files/&quot;);
File dir = new File(myfiles);
String content = request.getParameter(&quot;content&quot;);
String filename = request.getParameter(&quot;filename&quot;);
//根据用户提交的内容，以字符流写入原文件
if (content != null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; byte b[] = content.getBytes(&quot;iso-8859-1&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; content = new String(b, &quot;utf-8&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; File f = new File(myfiles, filename);
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OutputStreamWriter w = new OutputStreamWriter(new FileOutputStream(f), &quot;utf-8&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BufferedWriter bw = new BufferedWriter(w);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bw.write(content);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bw.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; w.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(IOException e) {}
}
//根据用户提交的文件名，以字符流读取文件并显示
if (filename != null &amp;amp;&amp;amp; filename != &quot;&quot; ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; File f = new File(myfiles, filename);
&amp;nbsp;&amp;nbsp;&amp;nbsp; StringBuffer mess = new StringBuffer();
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; InputStreamReader r = new InputStreamReader(new FileInputStream(f), &quot;utf-8&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; BufferedReader br = new BufferedReader(r);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; String temp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; while ((temp = br.readLine()) != null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mess.append(temp + &quot;\n&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; br.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; r.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(IOException e) {}
&amp;nbsp;&amp;nbsp;&amp;nbsp; out.print(new String(mess));
}
%&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;&lt;strong&gt;3 使用数据流读写数据&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;span style=&quot;color: #000000; font-family: arial, helvetica, clean, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 17px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; float: none; display: inline !important;&quot;&gt;本例修改上例的content.jsp文件，使用数据流类DataInputStream/DataOutputStream以Java原始数据的形式显示和保存字符串。&lt;/span&gt;&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%&amp;nbsp; 
//在线文件柜目录
String myfiles = application.getRealPath(&quot;/files/&quot;);
File dir = new File(myfiles);
String content = request.getParameter(&quot;content&quot;);
String filename = request.getParameter(&quot;filename&quot;);
//根据用户提交的内容，以数据流写入原文件
if (content != null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; byte b[] = content.getBytes(&quot;iso-8859-1&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; content = new String(b, &quot;utf-8&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; File f = new File(myfiles, filename);
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileOutputStream o = new FileOutputStream(f);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataOutputStream datao = new DataOutputStream(o);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; datao.writeUTF(content);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; datao.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; o.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(IOException e) {}
}
//根据用户提交的文件名，以数据流读取文件并显示
if (filename != null &amp;amp;&amp;amp; filename != &quot;&quot; ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; File f = new File(myfiles, filename);
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FileInputStream i = new FileInputStream(f);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; DataInputStream datai = new DataInputStream(i);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; out.print(datai.readUTF());
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; datai.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(IOException e) {}
}
%&amp;gt;
&lt;/pre&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A605_%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C</id>
        <title type="html">JSP教学05 文件操作</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A605_%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C"/>
        <published>2012-10-13T13:59:46+08:00</published>
        <updated>2012-10-17T13:49:12+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="教学" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;5.1 File类&lt;br /&gt;5.2 使用字节流读写文件&lt;br /&gt;5.3 使用字符流读写文件&lt;br /&gt;5.4 文件上传&lt;br /&gt;5.5 文件下载&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;教学目的：了解JSP中对文件操作的实现方法&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;5.1 File类&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;java.io.File类用来获取文件/目录本身的信息，如所在目录、文件长度、读写权限等。&lt;/p&gt; 
  &lt;p&gt;File类的构造方法：&lt;/p&gt; 
  &lt;p&gt;- File(String filename) &amp;nbsp;filename是文件名字或绝对路径（注意：如不加路径，则默认文件位于Tomcat安装目录下的bin目录中）&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;- File(String directoryPath, String filename) &amp;nbsp;directoryPath是文件所在目录路径，filename是文件名字&lt;/p&gt; 
  &lt;p&gt;- File(File f, String filename) &amp;nbsp;f是目录对象，filename是文件名字&lt;/p&gt; 
  &lt;p&gt;File类的常用方法：&lt;/p&gt; 
  &lt;p&gt;- String getName() &amp;nbsp;获取文件名字&lt;/p&gt; 
  &lt;p&gt;- String getAbsolutePath() &amp;nbsp;获取文件的绝对路径&lt;/p&gt; 
  &lt;p&gt;- boolean exists() &amp;nbsp;判断文件是否存在&lt;/p&gt; 
  &lt;p&gt;- long length() &amp;nbsp;获取文件的长度（以字节为单位）&lt;/p&gt; 
  &lt;p&gt;- boolean isFile() &amp;nbsp;判断文件是否为真正的文件而非目录&lt;/p&gt; 
  &lt;p&gt;- boolean isDirectory() &amp;nbsp;判断文件是否为目录&lt;/p&gt; 
  &lt;p&gt;- boolean canRead() &amp;nbsp;判断文件是否可读&lt;/p&gt; 
  &lt;p&gt;- boolean canWrite() &amp;nbsp;判断文件是否可写&lt;/p&gt; 
  &lt;p&gt;列出文件——如果File对象为目录，则可调用listFiles方法列出该目录下的文件和子目录&lt;/p&gt; 
  &lt;p&gt;- public File[] listFiles() &amp;nbsp;获取目录下的全部File对象&lt;/p&gt; 
  &lt;p&gt;例：列出指定目录下的文件&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;h3&amp;gt;在线文件柜&amp;lt;/h3&amp;gt;
&amp;lt;% &amp;nbsp;
String myfiles = application.getRealPath(&quot;/files/&quot;);
File dir = new File(myfiles);
File file[] = dir.listFiles();
for (int i = 0; i &amp;lt; file.length; i++) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if (file[i].isFile()) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;out.print(file[i].getName().toString() + &quot; - &quot; + file[i].length() + &quot;字节&amp;lt;br /&amp;gt;&quot;);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	}&lt;/span&gt;
}
%&amp;gt;&amp;nbsp;&lt;/pre&gt; 
  &lt;p&gt;创建文件——调用createNewFile方法创建文件，mkdir方法创建目录&lt;/p&gt; 
  &lt;p&gt;- boolean createNewFile() &amp;nbsp;创建文件，成功则返回true，否则返回false&amp;nbsp;&lt;/p&gt; 
  &lt;p&gt;- boolean mkdir() &amp;nbsp;创建目录，成功则返回true，否则返回false &lt;/p&gt; 
  &lt;p&gt;例：根据用户提交的名字新建文件&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;% &amp;nbsp;
String newname = request.getParameter(&quot;newname&quot;);
if (newname != null &amp;amp;&amp;amp; newname != &quot;&quot; ) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;File newFile = new File(myfiles, newname);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;newFile.createNewFile();
}
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;删除文件——调用delete方法删除对象代表的文件或目录（目录必须为空才可删除）&lt;/p&gt; 
  &lt;p&gt;- boolean delete() &amp;nbsp;删除文件或目录，成功则返回true，否则返回false&lt;/p&gt; 
  &lt;p&gt;例：根据用户提交的名字删除文件或目录&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%
String delname = request.getParameter(&quot;delname&quot;);
if (delname != null &amp;amp;&amp;amp; delname != &quot;&quot; ) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;File delFile = new File(myfiles, delname);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;delFile.delete();
}
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;5.2 使用字节流读写文件&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;Java使用输入输出流读取和写入数据，常用的输入输出流类是文件输入/输出流FileInputStream/FileOutputStream&lt;/p&gt; 
  &lt;p&gt;FileInputStream/FileOutputStream以字节为单位顺序地读取/写入文件&lt;/p&gt; 
  &lt;p&gt;FileInputStream类的构造方法： &lt;/p&gt; 
  &lt;p&gt;- FileInputStream(File file)&amp;nbsp; file是文件对象&lt;/p&gt; 
  &lt;p&gt;FileInputStream类的常用方法：&lt;/p&gt; 
  &lt;p&gt;- int read(byte[] b)&amp;nbsp; 读取输入流并存入字节数组&lt;/p&gt; 
  &lt;p&gt;- void close()&amp;nbsp; 关闭输入流&lt;/p&gt; 
  &lt;p&gt;FileOutputStream类的构造方法：&lt;/p&gt; 
  &lt;p&gt; - FileOutputStream(File file)&amp;nbsp; file是文件对象&lt;/p&gt; 
  &lt;p&gt;FileOutputStream类的常用方法：&lt;/p&gt; 
  &lt;p&gt;- void write(byte[] b)&amp;nbsp; 将字节数组写入输出流&lt;/p&gt; 
  &lt;p&gt;- void close()&amp;nbsp; 关闭输出流&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;为了提高读写效率，FileInputStream/FileOutputStream需要与缓存输入/输出流BufferedInputStream/BufferedOutputStream配合使用&lt;/p&gt; 
  &lt;p&gt;BufferedInputStream类的构造方法：&lt;/p&gt; 
  &lt;p&gt;- BufferedInputStream(InputStream in)&amp;nbsp; in是输入流对象&lt;/p&gt; 
  &lt;p&gt;BufferedInputStream类的常用方法：&lt;/p&gt; 
  &lt;p&gt;- int read(byte[] b)&amp;nbsp; 读取缓存输入流并存入字节数组&lt;/p&gt; 
  &lt;p&gt;- void close()&amp;nbsp; 关闭缓存输入流&lt;/p&gt; 
  &lt;p&gt;BufferedOutputStream类的构造方法：&lt;/p&gt; 
  &lt;p&gt;- BufferedOutputStream(OutputStream out)&amp;nbsp; out是输出流对象&lt;/p&gt; 
  &lt;p&gt;BufferedOutputStream类的常用方法：&lt;/p&gt; 
  &lt;p&gt;- void write(byte[] b)&amp;nbsp; 将字节数组写入缓存输出流&lt;/p&gt; 
  &lt;p&gt;- void flush()&amp;nbsp; 刷新缓存即把缓存内容发送到文件输出流 &lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;- void close()&amp;nbsp; 关闭缓存输出流&lt;/p&gt; 
  &lt;p&gt;例：根据用户提交的名字，使用字节流读取文件内容并显示&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%&amp;nbsp; 
String filename = request.getParameter(&quot;filename&quot;);
if (filename != null &amp;amp;&amp;amp; filename != &quot;&quot; ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; File f = new File(myfiles, filename);
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FileInputStream i = new FileInputStream(f);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; BufferedInputStream bi = new BufferedInputStream(i);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; byte b[] = new byte[100];
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; int n = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; while ((n = bi.read(b)) != -1) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; String temp = new String(b, 0, n);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; out.print(temp);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bi.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(IOException e) {}
}
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;例：根据用户提交的内容，使用字节流写入文件内容&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%&amp;nbsp; 
String content = request.getParameter(&quot;content&quot;);
if (content != null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; File f = new File(myfiles, filename);
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FileOutputStream o = new FileOutputStream(f);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; BufferedOutputStream bo = new BufferedOutputStream(o);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; byte c[] = content.getBytes();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bo.write(c);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bo.flush();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bo.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; o.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(IOException e) {}
}
%&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;&lt;b&gt;5.3 使用字符流读写文件&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;字符流类以Unicode字符为单位读写数据。在Unicode编码方式下，一个英文字母和一个汉字都是一个字符。常用的字符流类是输入/输出字符流InputStreamReader/InputStreamWriter及其子类文件字符流FileReader/FileWriter。&lt;/p&gt; 
  &lt;p&gt;（注意：FileWriter/FileReader不支持通过参数指定字符编码方式，因此无法用于utf-8字符编码的文件）&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;为了提高读写效率，字符流需要与缓存读取/写入流BufferedReader/BufferedWriter配合使用。&lt;/p&gt; 
  &lt;p&gt;例：使用字符流读取文件内容&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%  
if (filename != null &amp;amp;&amp;amp; filename != &quot;&quot; ) {
	File f = new File(myfiles, filename);
	StringBuffer mess = new StringBuffer();
	try {
		InputStreamReader r = new InputStreamReader(new FileInputStream(f), &quot;utf-8&quot;);
		BufferedReader br = new BufferedReader(r);
		String temp;
		while ((temp = br.readLine()) != null) {
			mess.append(temp + &quot;\n&quot;);
		}
		br.close();
		r.close();
	}
	catch(IOException e) {}
	out.print(new String(mess));
}
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;例：使用字符流写入文件内容&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%&amp;nbsp; 
String content = request.getParameter(&quot;content&quot;);
if (content != null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; byte b[] = content.getBytes(&quot;iso-8859-1&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; content = new String(b, &quot;utf-8&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; File f = new File(myfiles, filename);
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; OutputStreamWriter w = new OutputStreamWriter(new FileOutputStream(f), &quot;utf-8&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; BufferedWriter bw = new BufferedWriter(w);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bw.write(content);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bw.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; w.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(IOException e) {}
}
%&amp;gt;&lt;/pre&gt;&lt;b&gt;5.4 文件上传&lt;/b&gt; 
  &lt;p&gt;上传文件需要使用包含文件域的表单（表单的编码类型应为multipart/form-data），让内置对象request调用getInputStream方法即可获得一个用户上传信息的输入流并输出到指定的文件。&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;例：上传文件并保存为指定的名字&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%
try {
&amp;nbsp;&amp;nbsp;&amp;nbsp; InputStream i = request.getInputStream();
&amp;nbsp;&amp;nbsp;&amp;nbsp; File upFile = new File(myfiles, &quot;upFile.txt&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; FileOutputStream o = new FileOutputStream(upFile);
&amp;nbsp;&amp;nbsp;&amp;nbsp; byte b[] = new byte[1000];
&amp;nbsp;&amp;nbsp;&amp;nbsp; int n;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((n = i.read(b)) != -1) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; o.write(b, 0, n);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; o.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; i.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; out.print(&quot;文件上传成功！&quot;);
}
catch(IOException e) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; out.print(&quot;文件上传失败！&quot;);
}
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;注意：以上程序保存的文件不仅包含原文件，还有用户提交的其他信息（文件的前4行和末5行内容），应该去除这些内容才能得到原文件。&lt;/p&gt; 
  &lt;p&gt;例：上传文件程序修正版（本例使用更灵活的随机存取文件类RandomAccessFile进行文件读写，该类的seek方法可自由指定当前流的读写位置，getFilePointer方法可获取当前流的读写位置）&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%
try {
&amp;nbsp;&amp;nbsp;&amp;nbsp; //建立临时文件，文件名为用户会话ID
&amp;nbsp;&amp;nbsp;&amp;nbsp; String tempFile = (String)session.getId();
&amp;nbsp;&amp;nbsp;&amp;nbsp; File f1 = new File(myfiles, tempFile);
&amp;nbsp;&amp;nbsp;&amp;nbsp; FileOutputStream o = new FileOutputStream(f1);
&amp;nbsp;&amp;nbsp;&amp;nbsp; //将用户上传的全部信息存入临时文件
&amp;nbsp;&amp;nbsp;&amp;nbsp; InputStream i = request.getInputStream();
&amp;nbsp;&amp;nbsp;&amp;nbsp; byte b[] = new byte[10000];
&amp;nbsp;&amp;nbsp;&amp;nbsp; int n;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((n = i.read(b)) != -1) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; o.write(b, 0, n);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; o.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; i.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; //读取临时文件
&amp;nbsp;&amp;nbsp;&amp;nbsp; RandomAccessFile random = new RandomAccessFile(f1, &quot;r&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; //从第2行最后一个=字符之后获取原文件的名字
&amp;nbsp;&amp;nbsp;&amp;nbsp; int second = 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; String secondLine = null;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while (second &amp;lt;= 2) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; secondLine = random.readLine();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; second++;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; int position = secondLine.lastIndexOf(&apos;=&apos;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; String fileName = secondLine.substring(position + 2, secondLine.length() - 1);
&amp;nbsp;&amp;nbsp;&amp;nbsp; //确定原文件的开始：从第4行的回车符起
&amp;nbsp;&amp;nbsp;&amp;nbsp; long forthEndPosition = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int forth = 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while((n = random.readByte()) != -1 &amp;amp;&amp;amp; (forth &amp;lt;= 4)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (n == &apos;\n&apos;) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; forthEndPosition = random.getFilePointer();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; forth++;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; //保存原文件
&amp;nbsp;&amp;nbsp;&amp;nbsp; byte cc[] = fileName.getBytes(&quot;iso-8859-1&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; fileName = new String(cc, &quot;utf-8&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; File f2 = new File(myfiles, fileName);
&amp;nbsp;&amp;nbsp;&amp;nbsp; RandomAccessFile random2 = new RandomAccessFile(f2, &quot;rw&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; //确定原文件的末尾：到倒数第6行止
&amp;nbsp;&amp;nbsp;&amp;nbsp; random.seek(random.length());
&amp;nbsp;&amp;nbsp;&amp;nbsp; long endPosition = random.getFilePointer();
&amp;nbsp;&amp;nbsp;&amp;nbsp; long mark = endPosition;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int j = 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((mark &amp;gt;= 0) &amp;amp;&amp;amp; (j &amp;lt;= 6)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mark--;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; random.seek(mark);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; n = random.readByte();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (n == &apos;\n&apos;) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; endPosition = random.getFilePointer();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; j++;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; //将random流指向原文件第4行结束的位置
&amp;nbsp;&amp;nbsp;&amp;nbsp; random.seek(forthEndPosition);
&amp;nbsp;&amp;nbsp;&amp;nbsp; long startPoint = random.getFilePointer();
&amp;nbsp;&amp;nbsp;&amp;nbsp; //读取临时文件存入新文件
&amp;nbsp;&amp;nbsp;&amp;nbsp; while (startPoint &amp;lt; endPosition - 1) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; n = random.readByte();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; random2.write(n);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; startPoint = random.getFilePointer();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; random2.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; random.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; //删除临时文件
&amp;nbsp;&amp;nbsp;&amp;nbsp; f1.delete();
&amp;nbsp;&amp;nbsp;&amp;nbsp; out.print(&quot;文件上传成功！&quot;);
}
catch(IOException e) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; out.print(&quot;文件上传失败！&quot;);
}
%&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;&lt;b&gt;5.5 文件下载&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;使用response对象的setHerader方法即可向客户端发送下载文件的HTTP头信息。&lt;/p&gt; 
  &lt;p&gt;response.setHeader(&amp;quot;Content-disposition&amp;quot;,&amp;quot;attachment;filename=&amp;lt;下载文件名&amp;gt;&amp;quot;);&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;例：根据用户提交的名字下载文件&lt;/p&gt; 
  &lt;pre&gt;String down = request.getParameter(&quot;down&quot;);
if (down != null &amp;amp;&amp;amp; down != &quot;&quot; ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; byte d[] = down.getBytes(&quot;iso-8859-1&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; down = new String(d, &quot;utf-8&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; response.setHeader(&quot;Content-disposition&quot;,&quot;attachment;filename=&quot; + down);
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; File dl = new File(myfiles, down);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FileInputStream i = new FileInputStream(dl);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; OutputStream o = response.getOutputStream();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; int n = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; byte b[] = new byte[1000];
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; while((n = i.read(b)) != -1) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; o.write(b, 0, n);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; o.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i.close();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(Exception e) {}
}
&lt;/pre&gt; 
  &lt;p&gt; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C04_%E5%86%85%E7%BD%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E4%BD%BF%E7%94%A8</id>
        <title type="html">JSP实验04 内置对象的使用</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C04_%E5%86%85%E7%BD%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E4%BD%BF%E7%94%A8"/>
        <published>2012-10-05T14:48:38+08:00</published>
        <updated>2013-12-23T10:22:16+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="实验" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;1 request对象&lt;br /&gt;2 response对象&lt;br /&gt;3 session对象&lt;br /&gt;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;实验目的：掌握JSP对象对象的使用方法 &lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;1 request对象&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;运用request对象通过JSP页面和Tag文件实现四则运算 &lt;/p&gt; 
  &lt;p&gt;创建输入页面inputNumber.jsp，添加表单，在表单中添加文本域numberOne（宽度为6），选择框operator（列表值为+、-、*、/），文本域numberTwo（宽度为6）以及提交按钮，设置表单动作为receiveNumber.jsp：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/d41cfe0d-f617-4faa-8971-705625027e86&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;创建获取用户提交信息页面receiveNumber.jsp，在页顶添加代码引入标记库：&lt;/p&gt; 
  &lt;pre&gt; &amp;lt;%@ taglib tagdir=&quot;/WEB-INF/tags&quot; prefix=&quot;computer&quot; %&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在页面中添加代码，获取提交信息并作为参数传给自定义标记，输出运算结果：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%&amp;nbsp; 
String a = request.getParameter(&quot;numberOne&quot;);
String b = request.getParameter(&quot;numberTwo&quot;);
String operator = request.getParameter(&quot;operator&quot;);
if (a == null || b == null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; a = &quot;&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp; b = &quot;&quot;;
}
if (a.length() &amp;gt; 0 &amp;amp;&amp;amp; b.length() &amp;gt; 0) {
%&amp;gt;
&amp;lt;computer:Computer numberA=&quot;&amp;lt;%= a %&amp;gt;&quot; numberB=&quot;&amp;lt;%= b %&amp;gt;&quot; operator=&quot;&amp;lt;%= operator %&amp;gt;&quot; /&amp;gt;
&amp;lt;p&amp;gt;计算结果：&amp;lt;%= a %&amp;gt;&amp;lt;%= operator %&amp;gt;&amp;lt;%= b %&amp;gt;=&amp;lt;%= result %&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%&amp;nbsp; 
}
%&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;a href=&quot;inputNumber.jsp&quot;&amp;gt;返回输入数据界面&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在/WEB-INF/tags下创建自定义标记Computer.tag，添加代码获取参数进行四则运算：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ tag pageEncoding=&quot;utf-8&quot; %&amp;gt;
&amp;lt;%@ attribute name=&quot;numberA&quot; required=&quot;true&quot; %&amp;gt;
&amp;lt;%@ attribute name=&quot;numberB&quot; required=&quot;true&quot; %&amp;gt;
&amp;lt;%@ attribute name=&quot;operator&quot; required=&quot;true&quot; %&amp;gt;
&amp;lt;%@ variable name-given=&quot;result&quot; scope=&quot;AT_END&quot; %&amp;gt;
&amp;lt;%
try {
&amp;nbsp;&amp;nbsp;&amp;nbsp; double a=Double.parseDouble(numberA);
&amp;nbsp;&amp;nbsp;&amp;nbsp; double b=Double.parseDouble(numberB);
&amp;nbsp;&amp;nbsp;&amp;nbsp; double r=0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (operator.equals(&quot;+&quot;)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; r=a+b;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (operator.equals(&quot;-&quot;)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; r=a-b;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; else if(operator.equals(&quot;*&quot;)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; r=a*b;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; else if(operator.equals(&quot;/&quot;)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; r=a/b;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; jspContext.setAttribute(&quot;result&quot;,String.valueOf(r));
}
catch(Exception e) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; jspContext.setAttribute(&quot;result&quot;,&quot;发生异常:&quot;+e);
}
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;完成后在浏览器中运行inputNumber.jsp，输入数值，选择运算符，点击提交按钮即进入显示运算结果页面：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/8e6973f6-5bc4-4b57-9aa1-7a2bc77a9019&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;2 response对象&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;运用response对象绘制半径为1~100像素的圆形&lt;/p&gt; 
  &lt;p&gt; 创建输入圆的半径页面inputRadius.jsp，添加表单，在表单中添加文本域radius（宽度为6）以及提交按钮，设置表单动作为drawCircle.jsp：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/870e2c5c-c032-48d7-bcea-3318b1490fc8&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;创建绘制圆形页面drawCircle.jsp，在页顶添加代码引入所需类包：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ page import=&quot;java.awt.*&quot; %&amp;gt;
&amp;lt;%@ page import=&quot;java.io.*&quot; %&amp;gt;
&amp;lt;%@ page import=&quot;java.awt.image.*&quot; %&amp;gt;
&amp;lt;%@ page import=&quot;java.awt.geom.*&quot; %&amp;gt;
&amp;lt;%@ page import=&quot;com.sun.image.codec.jpeg.*&quot; %&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在页面中添加代码根据获取的半径参数创建圆形并以JPEG格式输出到页面中：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%&amp;nbsp; 
String r = request.getParameter(&quot;radius&quot;);
try {
&amp;nbsp;&amp;nbsp;&amp;nbsp; double number = Double.parseDouble(r);
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (number &amp;lt;=0 || number &amp;gt; 100) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //改变MIME类型
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response.setContentType(&quot;text/html;charset=utf-8&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; out.println(number + &quot;作为圆的半径不合理或超出绘制范围（1-100）。&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (number &amp;gt; 0 &amp;amp;&amp;amp; number &amp;lt;= 100) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response.setContentType(&quot;image/jpeg&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; int width = 100, height = 100;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Graphics g = image.getGraphics();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g.setColor(Color.white);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g.fillRect(0, 0, width, height);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Graphics2D g_2d = (Graphics2D)g;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Ellipse2D circle = new Ellipse2D.Double(0, 0, number, number);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g_2d.setColor(Color.blue);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g_2d.fill(circle);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g.dispose();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //获取指向用户端的输出流
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; OutputStream outClient = response.getOutputStream();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outClient);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; encoder.encode(image);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}
catch (Exception e) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; response.sendRedirect(&quot;inputRadius.jsp&quot;);
}
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;完成后在浏览器中运行inputRadius.jsp，输入半径点击提交按钮即进入显示图形页面：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/3157424d-f19a-4b2d-86f2-d3d9286618be&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;3 session对象 &lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;运用session对象存储用户数据模拟网店的购物车功能&lt;/p&gt; 
  &lt;p&gt;创建选择图书页面choiceBook.jsp，以在链接中附带参数的方式提交所选图书信息：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;h3&amp;gt;选择要购买的图书&amp;lt;/h3&amp;gt;
&amp;lt;p&amp;gt;
&amp;lt;a href=&quot;orderForm.jsp?bookMess=Java面向对象程序设计@ISBN:9876@价格：34元&quot;&amp;gt;Java面向对象程序设计(34元)&amp;lt;/a&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;a href=&quot;orderForm.jsp?bookMess=JSP程序设计@ISBN:4567@价格：29.5元&quot;&amp;gt;JSP程序设计(29.5元)&amp;lt;/a&amp;gt;
&amp;lt;br /&amp;gt; 
&amp;lt;a href=&quot;orderForm.jsp?bookMess=XML程序设计@ISBN:2356@价格：29元&quot;&amp;gt;XML程序设计(29元)&amp;lt;/a&amp;gt;
&amp;lt;/p&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/80825fef-91f2-4262-bfd6-68cfe007fe1e&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;创建显示订单页面orderForm.jsp，在页顶添加代码，引入所需类包，根据用户提交的参数将用户选择的图书信息保存为会话对象：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ page import=&quot;java.util.*&quot; %&amp;gt;
&amp;lt;%&amp;nbsp; 
String book = request.getParameter(&quot;bookMess&quot;);
byte b[] = book.getBytes(&quot;iso-8859-1&quot;);
book = new String(b, &quot;utf-8&quot;);
if (book != null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; StringTokenizer fenxi = new StringTokenizer(book, &quot;@&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; String bookName = fenxi.nextToken();
&amp;nbsp;&amp;nbsp;&amp;nbsp; String bookISBN = fenxi.nextToken();
&amp;nbsp;&amp;nbsp;&amp;nbsp; session.setAttribute(bookISBN, book);
}
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在页面中添加代码，以表格形式输出会话对象中保存的图书信息：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;h3&amp;gt;图书订单&amp;lt;/h3&amp;gt;
&amp;lt;table border=&quot;1&quot;&amp;gt;
&amp;lt;%&amp;nbsp; 
Enumeration keys = session.getAttributeNames();
while (keys.hasMoreElements()) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; String key = (String)keys.nextElement();
&amp;nbsp;&amp;nbsp;&amp;nbsp; book = (String)session.getAttribute(key);
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (book != null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; StringTokenizer fenxi = new StringTokenizer(book, &quot;@&quot;);
%&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%= fenxi.nextToken() %&amp;gt;&amp;lt;/td&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%= fenxi.nextToken() %&amp;gt;&amp;lt;/td&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%= fenxi.nextToken() %&amp;gt;&amp;lt;/td&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;
&amp;lt;%&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}
%&amp;gt;
&amp;lt;/table&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;完成后在浏览器中运行choiceBook.jsp，点击图书链接即可将其放入购物车：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/c994bd71-4da9-4365-964f-d8c2ffea5f59&quot; /&gt; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A604_%E5%86%85%E7%BD%AE%E5%AF%B9%E8%B1%A1</id>
        <title type="html">JSP教学04 内置对象</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A604_%E5%86%85%E7%BD%AE%E5%AF%B9%E8%B1%A1"/>
        <published>2012-09-29T13:21:51+08:00</published>
        <updated>2012-10-08T15:06:13+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="教学" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;4.1 request对象&lt;br /&gt; 4.2 response对象&lt;br /&gt;4.3 session对象&lt;br /&gt;4.4 out对象&lt;br /&gt;4.5 application对象&lt;br /&gt;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;教学目的：了解JSP内置对象（由JSP引擎实例化的对象，可以在JSP页面中直接使用）&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;4.1 request对象&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;request对象用于获取客户端提交的请求信息&lt;/p&gt; 
  &lt;p&gt;类型：javax.servlet.ServletRequest&lt;/p&gt; 
  &lt;p&gt;常用方法：&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;getParameter(String name)&lt;/b&gt;，获取请求信息的值（来自表单域或URL参数）。&lt;/p&gt; 
  &lt;p&gt;例：显示用户提交的名字，在表单中添加文本域username和提交按钮，在页面中添加代码段。&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%
String str = request.getParameter(&quot;username&quot;);
if (str == null)
&amp;nbsp;&amp;nbsp;&amp;nbsp; str = &quot;朋友&quot;;
%&amp;gt;
&amp;lt;h1&amp;gt;欢迎你，&amp;lt;%= str %&amp;gt;！&amp;lt;/h1&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;&lt;b&gt;getRemoteAddr()&lt;/b&gt;，获取客户端的IP地址 &lt;/p&gt; 
  &lt;p&gt;例：显示访问者的IP地址&lt;/p&gt; 
  &lt;pre&gt;你的IP地址是&amp;lt;%= request.getRemoteAddr() %&amp;gt;。
&lt;/pre&gt; 
  &lt;p&gt;&lt;b&gt;setCharacterEncoding(String env)&lt;/b&gt;，设置请求信息的字符编码（例如&amp;quot;gb2312&amp;quot;或&amp;quot;utf-8&amp;quot;）。&lt;/p&gt; 
  &lt;p&gt;例：如果你在文本域中输入中文，上面的例子将显示乱码，因为客户端提交的请求信息默认是使用西文字符编码的，添加以下代码即可解决此问题：&lt;/p&gt; 
  &lt;pre&gt;request.setCharacterEncoding(&quot;utf-8&quot;);
&lt;/pre&gt; 
  &lt;p&gt;补充：以上办法只适用于以表单提交（POST方法）的中文信息，对以在网址中附带参数提交（GET方法）的中文信息是无效的。这里补充一个麻烦些但更通用的办法：先将用getParameter方法获取的字符串以标准西文字符编码转为字节数组，再将此数组用中文编码转为字符串&lt;/p&gt; 
  &lt;pre&gt;byte b[] = str.getBytes(&quot;iso-8859-1&quot;);
str = new String(b, &quot;utf-8&quot;);
&lt;/pre&gt; 
  &lt;p&gt;&lt;b&gt;4.2 response对象&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;response对象用于向客户端发送响应信息 &lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;类型：javax.servlet.ServletResponse&lt;/p&gt; 
  &lt;p&gt;常用方法：&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;setContentType(String type)&lt;/b&gt;，设置响应信息的类型（当与JSP页面的page指令设置的类型不同时才需要设置）&lt;/p&gt; 
  &lt;p&gt;例：将当前页面内容保存为Word文档&lt;/p&gt; 
  &lt;pre&gt;将本页面保存为&amp;lt;a href=&quot;?save=yes&quot;&amp;gt;Word文档&amp;lt;/a&amp;gt;
&amp;lt;%&amp;nbsp; 
String save = request.getParameter(&quot;save&quot;);
if (save != null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (save.equals(&quot;yes&quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response.setContentType(&quot;application/msword;charset=utf-8&quot;);
}
%&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;&lt;b&gt;setHeader(String name, String value)&lt;/b&gt;，设置响应信息的HTTP头的值&lt;/p&gt; 
  &lt;p&gt;例：添加自动刷新页面的的HTTP头 ，使客户端浏览器每5秒刷新一次当前页面&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ page import=&quot;java.util.*&quot; %&amp;gt;
&amp;lt;%&amp;nbsp; 
response.setHeader(&quot;Refresh&quot;, &quot;5&quot;);
%&amp;gt;
现在时间：&amp;lt;%= new Date() %&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;&lt;b&gt;sendRedirect(String location)&lt;/b&gt;，发送重定向到新页面的地址&lt;/p&gt; 
  &lt;p&gt;例：用户输入特定的内容如“会员某某某”可进入特定的页面 &lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%&amp;nbsp; 
if (str.startsWith(&quot;会员&quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp; response.sendRedirect(&quot;ch4main.jsp&quot;);
%&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;&lt;b&gt;4.3 session对象&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;session对象即客户端与服务器的一次会话，从客户端访问服务器的一个应用程序开始，到客户端与服务器断开连接为止（用户关闭了浏览器，或者未关闭浏览器但长时间未与服务器进行交互）&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;类型：javax.servlet.http.HttpSession &lt;/p&gt; 
  &lt;p&gt;常用方法：&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;getId()&lt;/b&gt;，获取会话的ID号&lt;/p&gt; 
  &lt;p&gt;例：各页面添加显示会话的ID号，在同一会话过程中ID号将保持一致。 &lt;/p&gt; 
  &lt;pre&gt;本次会话的ID号：&amp;lt;%= session.getId() %&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;&lt;b&gt;setAttribute(String name, Object value)&lt;/b&gt;，设置属性的值（该方法为其他对象指定名称并绑定到session对象）&lt;/p&gt; 
  &lt;p&gt;例：将用户输入的名字保存为会话级属性&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%&amp;nbsp; 
session.setAttribute(&quot;username&quot;, str);
%&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;getAttribute(String name)&lt;/b&gt;，获取属性的值（该方法返回session对象所绑定的指定名称的对象）&lt;/p&gt; 
  &lt;p&gt;例：在其他页面显示用户输入的名字&lt;br /&gt;&lt;/p&gt; 
  &lt;pre&gt;当前用户：&amp;lt;%= (String)session.getAttribute(&quot;username&quot;) %&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;&lt;b&gt;4.4 out对象&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;out对象用于向客户端输出数据 &lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;类型：javax.servlet.jsp.JspWriter &lt;/p&gt; 
  &lt;p&gt;常用方法：&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;print(...)&lt;/b&gt;，输出数据&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;println(...)&lt;/b&gt;，输出单行数据&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;newLine()&lt;/b&gt;，输出换行符&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;4.5 application对象&lt;/b&gt;&lt;/p&gt; 
  &lt;p&gt;application对象由访问应用程序的所有客户端共享。从服务启动开始，到服务关闭为止&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;类型：javax.servlet.ServletContext&lt;/p&gt; 
  &lt;p&gt;常用方法：&lt;/p&gt; 
  &lt;p&gt;&lt;b&gt;getRealPath(String path)&lt;/b&gt;，获取应用程序所在的真实路径（传入参数为虚拟路径）&lt;/p&gt; 
  &lt;p&gt;例：获取网站根目录的真实路径&lt;/p&gt; 
  &lt;pre&gt;根目录真实路径：&amp;lt;%= application.getRealPath(&quot;/&quot;) %&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;&lt;b&gt;setAttribute(String name, Object value)&lt;/b&gt;，设置属性的值&lt;/p&gt; 
  &lt;p&gt;例：将用户输入的名字保存为应用程序级属性 &lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%&amp;nbsp; 
application.setAttribute(&quot;username&quot;, str);
%&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;&lt;b&gt;getAttribute(String name)&lt;/b&gt;，获取属性的值&lt;/p&gt; 
  &lt;p&gt;例：使所有访问者查看最近来访者输入的名字 &lt;/p&gt; 
  &lt;pre&gt;最近来访用户：&amp;lt;%= (String)application.getAttribute(&quot;username&quot;) %&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C03_%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%87%E8%AE%B0_tag</id>
        <title type="html">JSP实验03 使用标记文件</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C03_%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%87%E8%AE%B0_tag"/>
        <published>2012-09-24T09:53:16+08:00</published>
        <updated>2013-12-22T11:47:26+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="实验" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;1 使用标记体&lt;br /&gt;2 使用属性(Attribute)&lt;br /&gt;3 使用变量(Variable)&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;实验目的：掌握标记文件的创建和使用&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;1 使用标记体&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;编写单元格中重复显示文本的Tag文件，JSP页面通过使用标记体将要显示的文本传递给Tag文件&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;创建giveMess.jsp，引入标记库：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ taglib tagdir=&quot;/WEB-INF/tags&quot; prefix=&quot;ok&quot;%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在页面中添加表格和自定义标记：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;table border=2&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ok:handleMess&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 南非世界杯
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ok:handleMess&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ok:handleMess&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 冠军是西班牙
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ok:handleMess&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ok:handleMess&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 亚军是荷兰
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ok:handleMess&amp;gt;
&amp;lt;/table&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在/WEB-INF/tags下创建handleMess.tag&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;tr&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt; &amp;lt;jsp:doBody/&amp;gt; &amp;lt;/td&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt; &amp;lt;jsp:doBody/&amp;gt; &amp;lt;/td&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt; &amp;lt;jsp:doBody/&amp;gt; &amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在浏览器中查看giveMess.jsp&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/b4d69aa4-a734-4024-bb1e-20dfce69e7ee&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;2 使用属性(Attribute)&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;编写显示日历的Tag文件，JSP页面使用标记属性将年份和月份传递给Tag文件&lt;/p&gt; 
  &lt;p&gt;创建giveYearMonth.jsp，引入标记库：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ taglib tagdir=&quot;/WEB-INF/tags&quot; prefix=&quot;rili&quot; %&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在页面中添加日历的自定义标记：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;rili:ShowCalendar year=&quot;2012&quot; month=&quot;12&quot; /&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在/WEB-INF/tags下创建ShowCalendar.tag&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ tag pageEncoding=&quot;GB2312&quot; %&amp;gt;
&amp;lt;%@ tag import=&quot;java.util.*&quot; %&amp;gt;
&amp;lt;%@ attribute name=&quot;year&quot; required=&quot;true&quot; %&amp;gt;
&amp;lt;%@ attribute name=&quot;month&quot; required=&quot;true&quot; %&amp;gt;
&amp;lt;%&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int y=1999, m=1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; String [] day=new String[42];
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y=Integer.parseInt(year);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m=Integer.parseInt(month);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Calendar rili=Calendar.getInstance();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rili.set(y, m-1, 1);//将日历翻到year年month月1日,注意0表示一月...11表示十二月
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int 星期几=rili.get(Calendar.DAY_OF_WEEK)-1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int dayAmount=0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dayAmount=31;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(m==4||m==6||m==9||m==11)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dayAmount=30;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(m==2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; if(((y%4==0)&amp;amp;&amp;amp;(y%100!=0))||(y%400==0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dayAmount=29;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dayAmount=28;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i=0;i&amp;lt;星期几;i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; day[i]=&quot;--&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i=星期几, n=1; i&amp;lt;星期几+dayAmount; i++){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; day[i]=String.valueOf(n) ;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i=星期几+dayAmount;i&amp;lt;42;i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; day[i]=&quot;--&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(Exception exp){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.print(&quot;年份或月份不合理&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
%&amp;gt;
&amp;lt;h3&amp;gt;&amp;lt;%=year %&amp;gt;年&amp;lt;%=month %&amp;gt;月的日历:&amp;lt;/h3&amp;gt;
&amp;lt;table border=1&amp;gt;
&amp;nbsp;   &amp;lt;tr&amp;gt;
        &amp;lt;th&amp;gt;星期日&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;星期一&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;星期二&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;星期三&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;星期四&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;星期五&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;星期六&amp;lt;/th&amp;gt;
&amp;nbsp;   &amp;lt;/tr&amp;gt;
&amp;lt;%
    for(int n=0;n&amp;lt;day.length;n=n+7){
%&amp;gt;
    &amp;lt;tr&amp;gt;
&amp;lt;%
        for(int i=n;i&amp;lt;7+n;i++) {
%&amp;gt;
    &amp;lt;td&amp;gt;&amp;lt;%= day[i] %&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;%
        }
%&amp;gt; 
    &amp;lt;/tr&amp;gt;
&amp;lt;%
    }
%&amp;gt; 
&amp;lt;/table&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在浏览器中查看giveYearMonth.jsp&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/cd85da47-afdf-45f1-a3a7-9bc3dcf60d05&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;3 使用变量(Variable)&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;编写分解出字符串中单词的Tag文件，JSP页面显示Tag返回的所有单词&lt;/p&gt; 
  &lt;p&gt;创建giveString.jsp&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ taglib tagdir=&quot;/WEB-INF/tags&quot; prefix=&quot;words&quot; %&amp;gt;

&amp;lt;%
&amp;nbsp;&amp;nbsp;&amp;nbsp; String s=&quot;South Africa World Cup(Espana is champion)&quot;;
%&amp;gt;
&amp;lt;words:GetWord str=&quot;&amp;lt;%=s %&amp;gt;&quot;/&amp;gt;
字符串:&amp;lt;br&amp;gt;&amp;lt;h3&amp;gt;&amp;lt;%=s%&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/h3&amp;gt;中的全部单词：
&amp;lt;%
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i=0;i&amp;lt;wordList.size();i++){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.print(&quot;&amp;lt;br&amp;gt;&quot;+wordList.get(i));
&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在/WEB-INF/tags下创建getWord.tag&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ tag import=&quot;java.util.*&quot; %&amp;gt;
&amp;lt;%@ attribute name=&quot;str&quot; required=&quot;true&quot; %&amp;gt; &amp;nbsp;
&amp;lt;%@ variable name-given=&quot;wordList&quot; variable-class=&quot;java.util.ArrayList&quot; scope=&quot;AT_END&quot; %&amp;gt;
&amp;lt;%&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ArrayList&amp;lt;String&amp;gt; list=new ArrayList&amp;lt;String&amp;gt;();&amp;nbsp;&amp;nbsp; //返回给JSP页面的list对象 
&amp;nbsp;&amp;nbsp;&amp;nbsp; String regex=&quot;[\\s\\d\\p{Punct}]+&quot;; //空格、数字和符号(!&quot;#$%&amp;amp;&apos;()*+,-./:;&amp;lt;=&amp;gt;?@[\]^_`{|}~)组成的正则表达式
&amp;nbsp;&amp;nbsp;&amp;nbsp; String words[]=str.split(regex); 
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i=0;i&amp;lt;words.length;i++){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.add(words[i]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; jspContext.setAttribute(&quot;wordList&quot;,list); ////将list对象返回给JSP页面
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在浏览器中查看giveString.jsp&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/24adbdd3-47e7-4a5b-8634-d9d5b74fff1b&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A603_%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%87%E8%AE%B0_tag</id>
        <title type="html">JSP教学03 自定义标记</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A603_%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%87%E8%AE%B0_tag"/>
        <published>2012-09-22T13:47:54+08:00</published>
        <updated>2012-09-25T09:02:35+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="教学" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;3.1 标记文件的结构&lt;br /&gt;3.2 自定义标记的使用&lt;br /&gt;3.3 标记文件中的常用指令&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;教学目的：了解标记文件的创建和使用 &lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt; &lt;strong&gt;3.1 标记文件的结构&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;标记(Tag)是JSP实现代码复用的机制之一&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;标记文件的扩展名为.tag，结构与JSP文件类似&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;标记文件可以被JSP页面调用，但用户不能直接访问&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;标记文件必须存放在指定目录下：&lt;br /&gt;Web应用程序目录\WEB-INF\tags&lt;br /&gt;（tags目录下还可以创建子目录，名称可自定义）

  &lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;例：使用标记文件在页面中添加相同的页脚&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;在ROOT\WEB-INF\tags下创建footer.tag：&lt;br /&gt;&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ tag pageEncoding=&quot;utf-8&quot; %&amp;gt;
&amp;lt;p&amp;gt;义乌工商学院机电信息分院 联系电话：88886666&amp;lt;/p&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;在JSP页面中用taglib指令定义标记库：&lt;br /&gt;&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ taglib tagdir=&quot;/WEB-INF/tags&quot; prefix=&quot;leo&quot; %&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;在JSP页面中使用此自定义标记：&lt;br /&gt;&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;leo:footer /&amp;gt;&lt;/pre&gt;
&lt;p&gt;注意：如果在Dreamweaver中无法打开.tag文件，可以在菜单栏中选择“编辑”&amp;gt;“首选参数”&amp;gt;“文件类型/编辑器”，找到“在代码视图中打开”文本域，在其中添加.tag即可解决问题。&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;3.2 自定义标记的使用&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;引入自定义标记库：&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&amp;lt;%@ taglib tagdir=&amp;quot;/WEB-INF/tags/子目录&amp;quot; prefix=&amp;quot;前缀&amp;quot; %&amp;gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;使用自定义标记：&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&amp;lt;标记库前缀:标记名 /&amp;gt;&lt;br /&gt;&amp;lt;标记库前缀:标记名&amp;gt;标记体&amp;lt;/标记库前缀:标记名&amp;gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;在标记文件中引用标记体：&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&amp;lt;jsp:doBody /&amp;gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;例：格式化标记体&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;在ROOT\WEB-INF\tags下创建notice.tag：&lt;br /&gt;&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;font color=&quot;red&quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;jsp:doBody /&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;在JSP页面中用taglib指令定义标记库：&lt;br /&gt;&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ taglib tagdir=&quot;/WEB-INF/tags&quot; prefix=&quot;leo&quot; %&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;在JSP页面中使用此自定义标记：&lt;br /&gt;&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;leo:notice&amp;gt;热烈欢迎！&amp;lt;/leo:notice&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;&lt;strong&gt;3.3 标记文件中的常用指令&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;Tag指令：类似于JSP文件中的Page指令，用于设置字符编码、引入类等&lt;br /&gt;&amp;lt;%@ tag pageEncoding=&amp;quot;utf-8&amp;quot; import=&amp;quot;java.io.*&amp;quot; %&amp;gt;&lt;/p&gt; 
  &lt;p&gt;Taglib指令：用于在标记文件中使用其他自定义标记&lt;br /&gt;&amp;lt;%@ taglib tagdir=&amp;quot;/WEB-INF/tags/new&amp;quot; prefix=&amp;quot;new&amp;quot; %&amp;gt;&lt;/p&gt; 
  &lt;p&gt;Attribute指令：用于设置标记可用的属性&lt;br /&gt;&amp;lt;%@ attribute name=&amp;quot;属性名&amp;quot; required=&amp;quot;true或false&amp;quot; type=&amp;quot;类型&amp;quot;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;例：格式化标记体的改进&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;修改notice.tag添加字体颜色属性&lt;br /&gt;&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ attribute name=&quot;fontcolor&quot; %&amp;gt;
&amp;lt;font color=&quot;&amp;lt;%= fontcolor %&amp;gt;&quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;jsp:doBody /&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;在JSP中添加带属性设置的标记&lt;br /&gt;&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;leo:Notice fontcolor=&quot;blue&quot;&amp;gt;热烈欢迎！&amp;lt;/leo:Notice&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt;Variable指令：用于向JSP页面返回变量&lt;/p&gt; 
  &lt;p&gt;&amp;lt;%@ variable name-given=&amp;quot;变量名&amp;quot; scope=&amp;quot;AT_END或AT_BEGIN或NESTED&amp;quot; variable-class=&amp;quot;类型&amp;quot; %&amp;gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;例：页脚标记的改进&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;修改footer.tag添加开发者变量&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ variable name-given=&quot;developer&quot; scope=&quot;AT_END&quot; %&amp;gt;
&amp;lt;% jspContext.setAttribute(&quot;developer&quot;, &quot;开发者：leo&quot;); %&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;在JSP页面中输出标记返回的变量&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%= developer %&amp;gt;
&lt;/pre&gt; 
  &lt;p&gt; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C02_jsp%E9%A1%B5%E9%9D%A2%E6%8C%87%E4%BB%A4%E5%92%8C%E6%A0%87%E8%AE%B0</id>
        <title type="html">JSP实验02 页面指令和标记</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C02_jsp%E9%A1%B5%E9%9D%A2%E6%8C%87%E4%BB%A4%E5%92%8C%E6%A0%87%E8%AE%B0"/>
        <published>2012-09-17T10:47:43+08:00</published>
        <updated>2013-12-22T11:40:18+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="实验" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;1 JSP页面基本结构&lt;br /&gt;2 JSP指令&lt;br /&gt;3 JSP动作标记&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;实验目的：掌握JSP页面元素及基本语法&lt;/p&gt; 
  &lt;p&gt;（首先在Dreamweaver中建立基于JSP的站点，具体步骤略）&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;1 JSP页面基本结构&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;本实验将用户输入的单词按字典顺序排序，实现该功能需要两个页面：单词输入页inputWord.jsp和显示排序结果页showDictionary.jsp&lt;/p&gt; 
  &lt;p&gt;新建文件inputWord.jsp&lt;/p&gt; 
  &lt;p&gt;添加一个表单，动作为showDictionary.jsp；表单中添加一个文本字段，名称为word；再添加一个按钮，动作为默认的提交表单。&lt;/p&gt; 
  &lt;p&gt;注意：表单是向页面传递参数的主要方法&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/f2954f28-f44c-4d5b-aa3c-b95b89c5a774&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;新建文件showDictionary.jsp&lt;/p&gt; 
  &lt;p&gt;添加页面指令包含java.util.*类库：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ page import=&quot;java.util.*&quot; %&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;添加声明：&lt;/p&gt; 
  &lt;p&gt;&amp;lt;%!&amp;nbsp;&lt;/p&gt; 
  &lt;pre&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;WHITE-SPACE: pre&quot;&gt;	&lt;/span&gt;TreeSet&amp;lt;String&amp;gt; dictionary = new TreeSet&amp;lt;String&amp;gt;();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;WHITE-SPACE: pre&quot;&gt;	&lt;/span&gt;public void addWord(String s) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;WHITE-SPACE: pre&quot;&gt;		&lt;/span&gt;String word[] = s.split(&quot; &quot;);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;WHITE-SPACE: pre&quot;&gt;		&lt;/span&gt;for (int i=0; i&amp;lt;word.length; i++) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;WHITE-SPACE: pre&quot;&gt;			&lt;/span&gt;dictionary.add(word[i]);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;WHITE-SPACE: pre&quot;&gt;		&lt;/span&gt;}
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;WHITE-SPACE: pre&quot;&gt;	&lt;/span&gt;}
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;最后添加代码段：&lt;/p&gt; 
  &lt;p&gt;&amp;lt;%&amp;nbsp;&lt;/p&gt; 
  &lt;pre&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;WHITE-SPACE: pre&quot;&gt;	&lt;/span&gt;String str = request.getParameter(&quot;word&quot;);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;WHITE-SPACE: pre&quot;&gt;	&lt;/span&gt;addWord(str);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;WHITE-SPACE: pre&quot;&gt;	&lt;/span&gt;Iterator&amp;lt;String&amp;gt; te = dictionary.iterator();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;WHITE-SPACE: pre&quot;&gt;	&lt;/span&gt;while (te.hasNext()) {
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;WHITE-SPACE: pre&quot;&gt;		&lt;/span&gt;String word = te.next();
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;WHITE-SPACE: pre&quot;&gt;		&lt;/span&gt;out.print(&quot; &quot; + word);
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;WHITE-SPACE: pre&quot;&gt;	&lt;/span&gt;}
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;页面完成后即可在浏览器中进行测试：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/2b412a92-c232-42bf-a899-4f35d8fffbb6&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;2 JSP指令&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;本实验在每个页面中都包含相同的导航条。&lt;/p&gt; 
  &lt;p&gt;新建导航条内容文件leader.txt（注意第一行page指令设置的页面编码应与其他文件的一致，都用统一码utf-8或都用国标码gb2312）：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ page contentType=&quot;text/html; charset=utf-8&quot; %&amp;gt;
&amp;lt;a href = &quot;first.jsp&quot;&amp;gt;链接到页面1&amp;lt;/a&amp;gt;
&amp;lt;a href = &quot;second.jsp&quot;&amp;gt;链接到页面2&amp;lt;/a&amp;gt;
&amp;lt;a href = &quot;third.jsp&quot;&amp;gt;链接到页面3&amp;lt;/a&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;新建文件first.jsp，添加文本“这是页面1”，再添加包括指令：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ include file=&quot;leader.txt&quot; %&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;新建文件second.jsp和third.jsp，同样添加文本和包括指令。&lt;/p&gt; 
  &lt;p&gt;页面完成后即可在浏览器中进行测试：&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/7ba7a98d-c934-4177-b454-81edc8dcb751&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;3 JSP动作标记&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;本实验使用jsp:forword动作标记实现页面的转向，访问页面时传递一个文件名作为参数，如果该文件存在就跳转到该文件，如果该文件不存在就显示该文件不存在。&lt;/p&gt; 
  &lt;p&gt;新建文件jumpfile.jsp&lt;/p&gt; 
  &lt;p&gt;添加页面指令包含java.io.*类库：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%@ page import=&quot;java.io.*&quot; %&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;添加代码段：&lt;/p&gt; 
  &lt;pre&gt;&amp;lt;%
String name = request.getParameter(&quot;name&quot;);
String path = application.getRealPath(&quot;/&quot;) + name;
File file = new File(path);
if (file.exists()) {
%&amp;gt;
&amp;lt;jsp:forward page=&quot;&amp;lt;%= name %&amp;gt;&quot; /&amp;gt;
&amp;lt;%
}
else {
	out.print(name + &quot;不存在！&quot;);
}
%&amp;gt;&lt;/pre&gt; 
  &lt;p&gt;页面完成后即可在浏览器中进行测试，注意：本例中向页面传递参数的方法是直接在地址栏末尾添加“?参数名=参数值”&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/750b0be0-cf3d-41fd-a345-fd480743d065&quot; /&gt;&lt;br /&gt;&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A602_jsp%E9%A1%B5%E9%9D%A2%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95</id>
        <title type="html">JSP教学02 JSP基本语法</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E5%AD%A602_jsp%E9%A1%B5%E9%9D%A2%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95"/>
        <published>2012-09-14T09:13:38+08:00</published>
        <updated>2013-12-20T16:59:42+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="教学" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;2.1 JSP页面元素&lt;br /&gt;2.2 表达式&lt;br /&gt;2.3 指令&lt;br /&gt;2.4 声明&lt;br /&gt;2.5 代码段&lt;br /&gt;2.6 注释&lt;br /&gt;2.7 动作&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;&lt;font size=&quot;3&quot;&gt;教学目的：了解JSP页面元素及基本语法&amp;nbsp;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;2.1 JSP页面元素&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;一个JSP页面中除了标准HTML代码，还可以包括以下元素：&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;JSP表达式：&amp;lt;%= expression %&amp;gt; 表达式是用来输出单个数据&lt;br /&gt;&lt;/span&gt;&lt;font size=&quot;3&quot;&gt;JSP指令：&amp;lt;%@ directive %&amp;gt; 指令是用来提示引擎所要进行的操作&lt;br /&gt;JSP声明：&amp;lt;%! declaration %&amp;gt; 声明是用来定义页面级变量和方法&lt;br /&gt;JSP代码段：&amp;lt;% scriptlet %&amp;gt; 代码段完成计算过程&lt;br /&gt;JSP注释：&amp;lt;%-- comment --%&amp;gt; 注释会被引擎忽略&lt;br /&gt;JSP动作：&amp;lt;taglib:tag attribute=&amp;quot;value&amp;quot; ...&amp;gt;...&amp;lt;/taglib:tag&amp;gt; 用于扩展功能&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;2.2 表达式&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;JSP表达式（&lt;/font&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&amp;lt;%= expression %&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;）是用来输出单个数据，数据会被转换为字符串并直接显示在输出页面之内。&lt;/span&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;例：&lt;br /&gt;&amp;lt;%= 1+1 %&amp;gt;&lt;br /&gt;&amp;lt;%= &apos;A&apos; + 1 %&amp;gt;&lt;br /&gt;&amp;lt;%= &amp;quot;JSP&amp;quot; + 1 %&amp;gt;&lt;br /&gt;&amp;lt;%= Math.pow(3, 2) %&amp;gt;&lt;br /&gt;&amp;lt;%= Math.sqrt(361) %&amp;gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;2.3 指令&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;JSP指令标记（&lt;/font&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&amp;lt;%@ directive %&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;）不产生可见输出，只是设置一些属性的值，告诉引擎如何处理指定的JSP页面，主要的指令有Page和Include等。&lt;/span&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Page指令可设置页面使用的编码，引入的类以及指向的错误页面等。&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;例：使用日期时间信息，需要先用Page指令引入java.util.Date类&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;lt;%@ page import=&amp;quot;java.util.Date&amp;quot; %&amp;gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;即可在页面中输出当前的日期时间信息&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;lt;%= new Date() %&amp;gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;再引入java.text.SimpleDateFormat类&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;lt;%@ page import=&amp;quot;java.text.SimpleDateFormat&amp;quot; %&amp;gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;即可在页面中输出使用自定义格式的日期时间信息&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;lt;%= new SimpleDateFormat(&amp;quot;yyyy年MM月dd日Eahh时mm分ss秒&amp;quot;)).format(new Date() %&amp;gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Include指令在页面中引入其他文件中的内容。&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;例：让整个网站的所有页面的底端显示相同的版权信息。&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;lt;%@ include file=&amp;quot;copyright.jsp&amp;quot; %&amp;gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;如果今后需要修改版权信息，只须编辑copright.jsp文件。&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong style=&quot;font-size: medium;&quot;&gt;2.4 声明&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;JSP声明（&lt;/font&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&amp;lt;%! declaration %&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;）用来定义页面级变量和方法供页面其余部分使用，由所有访问者共享。&lt;/span&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;JSP声明应使用标准Java语句。&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;例：&lt;br /&gt;&amp;lt;%!&lt;br /&gt;&amp;nbsp; int count = 0;&lt;br /&gt;&amp;nbsp; synchronized void setCount() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; count++;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;/font&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;2.5 代码段&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;JSP代码段（&lt;/font&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&amp;lt;% scriptlet %&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;）完成主要计算过程，可以嵌入页面的任何位置。&lt;/span&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;JSP代码段应使用标准Java语句。&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;例：用循环语句显示不同的标题文本&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/228fff49-bdcc-4f4c-927c-92fd15a168f7&quot; style=&quot;font-size: medium;&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;2.6 注释&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;JSP注释（&lt;/font&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&amp;lt;%-- comment --%&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;）会被引擎忽略，浏览器用户也不会看到JSP注释。&lt;/span&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;例：&amp;lt;%-- 添加服务器端代码 --%&amp;gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;在声明和代码段区域内部则可以使用Java语言的标准注释格式//...和/*...*/等&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;2.7 动作&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;JSP动作标记用于扩展功能，写法与标准HTML标记类似&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&amp;lt;taglib:tag attribute=&amp;quot;value&amp;quot; ...&amp;gt;...&amp;lt;/taglib:tag&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&amp;lt;taglib:tag attribute=&amp;quot;value&amp;quot; ... /&amp;gt;&lt;/span&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;动作标记包括引擎提供的标记（标记库名为jsp）和自定义标记&lt;/span&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;例：用jsp:forward动作实现页面自动跳转功能&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;lt;%&lt;br /&gt;&lt;/font&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&amp;nbsp; String jump = request.getParameter(&amp;quot;jump&amp;quot;);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&amp;nbsp; if (jump = &amp;quot;yes&amp;quot;) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;%&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&amp;lt;jsp:forward page=&amp;quot;new.jsp&amp;quot; /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&amp;lt;%&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&amp;nbsp; }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C01_%E5%BB%BA%E7%AB%8Bjsp%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83</id>
        <title type="html">JSP实验01 建立JSP开发环境</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E5%AE%9E%E9%AA%8C01_%E5%BB%BA%E7%AB%8Bjsp%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83"/>
        <published>2012-09-08T12:44:20+08:00</published>
        <updated>2013-12-20T16:58:58+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="实验" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;1 安装JDK（Java开发包）&lt;br /&gt;2 安装Tomcat（JSP引擎）&lt;br /&gt;3 安装JSP_Support（Dreamweaver的JSP插件）&lt;br /&gt;4 编写和测试JSP页面&lt;br /&gt;5 创建使用JSP技术的Web应用程序&lt;br /&gt;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;&lt;font size=&quot;3&quot;&gt;实验目的：掌握在Windows系统下建立JSP开发环境的方法。&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;（注意）安装所需的软件可以在学院的&lt;a href=&quot;ftp://ftp2.ywicc.edu.cn&quot;&gt;FTP服务器&lt;/a&gt;下载，也可以到其官方网站下载&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;1 安装JDK（Java开发包）&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;JDK是开发所有Java应用的基础&lt;br /&gt;官网下载 &lt;a href=&quot;http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html&quot;&gt;http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;建议安装版本为1.6，下载安装程序，双击即可安装&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;建议安装目录改为d:\java\jdk，方便以后使用&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/8f8d6625-00cb-4ea0-b604-80749665a471&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;安装JDK时会附带安装JRE（Java运行环境），建议也更改安装目录为d:\java\jre，方便以后使用&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/2ba27b97-a58a-4f0d-aa05-1ce71b1b8f75&quot; /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;安装JDK后，需要配置系统环境变量JAVA_HOME，变量值为JDK安装目录例如d:\java\jdk&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/bb67a2b7-cdf5-449d-9f4d-9d3fa7b77623&quot; /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;2 安装Tomcat（JSP引擎）&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Tomcat是常用的JSP引擎，本身可以作为Web服务器，也可以为专门的Web服务器如Apache提供JSP支持&lt;br /&gt;官网下载 &lt;a href=&quot;http://tomcat.apache.org/&quot;&gt;http://tomcat.apache.org/&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;建议安装版本为6.0，下载ZIP包，解压缩即可&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;建议安装目录改为d:\java\tomcat，方便以后使用&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;安装Tomcat后，双击安装目录下bin\startup.bat，即可启动Tomcat&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/085f7d6b-6d93-41a0-bc7d-26b8adc1d575&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;用浏览器访问http://localhost:8080，如能打开Tomcat默认主页，说明Tomcat已正常运行&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Tomcat必须处于运行状态才能发布JSP页面，双击安装目录下的&lt;font size=&quot;3&quot;&gt;bin\shutdown.bat，即可停止Tomcat。&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;/font&gt;（&lt;font size=&quot;3&quot;&gt;注意&lt;/font&gt;：如果&lt;font size=&quot;3&quot;&gt;本机没有&lt;font size=&quot;3&quot;&gt;其他Web服务器例如&lt;/font&gt;IIS等&lt;font size=&quot;3&quot;&gt;占用默认&lt;font size=&quot;3&quot;&gt;端口号，&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;可以&lt;font size=&quot;3&quot;&gt;&lt;font size=&quot;3&quot;&gt;打开安装目录下的&lt;/font&gt;conf\server.xml将Web服务端口号由8080改为80，这样用浏览器访问时&lt;font size=&quot;3&quot;&gt;就不必指定端口号&lt;/font&gt;&lt;/font&gt;）&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;（补充：如果需要&lt;font size=&quot;3&quot;&gt;使用&lt;/font&gt;浏览器远程管理Tomcat，可以&lt;font size=&quot;3&quot;&gt;打开安装目录下的conf\tomcat-user&lt;font size=&quot;3&quot;&gt;s.xml添加&lt;font size=&quot;3&quot;&gt;角色为admin&lt;font size=&quot;3&quot;&gt;和&lt;/font&gt;manager-gui&lt;/font&gt;&lt;/font&gt;的用户&lt;font size=&quot;3&quot;&gt;，即可登录后台&lt;font size=&quot;3&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;进行管理操作）&lt;br /&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;3 安装JSP_Support（Dreamweaver的JSP插件）&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Dreamweaver是优秀的网页设计软件，可以用来更方便地编写JSP页面。JSP_Support插件则提供了预设的服务器行为，能够以所见即所得的方式自动生成JSP代码，以帮助使用者进行快速开发。&lt;br /&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;CS3本身带有JSP_Support，CS4或更高版本未启用JSP_Support，可在configuration\DisabledFeatures文件夹中找到此插件安装启用&lt;br /&gt;官网下载 &lt;a href=&quot;http://www.adobe.com/cfusion/exchange/index.cfm?event=extensionDetail&amp;amp;extid=1731022&quot;&gt;http://www.adobe.com/cfusion/exchange/index.cfm?event=extensionDetail&amp;amp;extid=1731022&lt;/a&gt;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;在安装了CS4以上版本的Dreamweaver，双击插件包JSP_Support.mxp即可安装插件，此外还要将连接数据库的JSP脚本Dreamweaver_Connections.rar解压复制到安装目录的configuration\Connections文件夹。（如为CS3及以下版本则无需执行本段操作。）&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;4 编写和测试JSP页面&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Tomcat的Web应用程序发布目录是Tomcat安装目录下的webapps文件夹，其中的ROOT文件夹就是网站根目录的内容，其他的文件夹是单独的Web应用程序，可以作为网站根目录的子目录访问。&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们可以在ROOT文件夹下使用记事本编写最简单的JSP页面test.jsp，内容如下：&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;lt;h1&amp;gt;&amp;lt;%=&amp;quot;Hello World!&amp;quot;%&amp;gt;&amp;lt;/h1&amp;gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;用浏览器访问 http://localhost:8080 的效果如下：&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/be60c244-4a5e-461e-a723-768977455638&quot; /&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;而使用浏览器的查看源代码功能看到的内容如下：&lt;/font&gt;&lt;br /&gt;&lt;span class=&quot;webkit-html-tag&quot; style=&quot;word-spacing: 0px; font-style: normal; font-variant: normal; font-weight: normal; font-size: medium; line-height: normal; font-family: monospace; text-transform: none; text-indent: 0px; letter-spacing: normal; orphans: 2; widows: 2;&quot;&gt;&lt;/span&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;span class=&quot;webkit-html-tag&quot; style=&quot;word-spacing: 0px; font-style: normal; font-variant: normal; font-weight: normal; font-size: medium; line-height: normal; font-family: monospace; text-transform: none; text-indent: 0px; letter-spacing: normal; orphans: 2; widows: 2;&quot;&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;&lt;span style=&quot;float: none; word-spacing: 0px; font-style: normal; font-variant: normal; font-weight: normal; font-size: medium; line-height: normal; font-family: monospace; text-transform: none; color: #000000; text-indent: 0px; letter-spacing: normal; orphans: 2; widows: 2; display: inline !important;&quot;&gt;Hello World!&lt;/span&gt;&lt;span class=&quot;webkit-html-tag&quot; style=&quot;word-spacing: 0px; font-style: normal; font-variant: normal; font-weight: normal; font-size: medium; line-height: normal; font-family: monospace; text-transform: none; text-indent: 0px; letter-spacing: normal; orphans: 2; widows: 2;&quot;&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;你可以发现浏览器看到的源代码和.jsp文件的源代码是不同的，&amp;lt;h1&amp;gt;是HTML标签，服务器会直接发送给客户端，而&amp;lt;%和%&amp;gt;中的内容就是Java代码段，服务器会执行该代码并将执行结果发送给客户端。（注意：&amp;lt;%=Java表达式%&amp;gt;是一种特殊的JSP代码段，称为JSP表达式，专用于单个数据输出，相当于&amp;lt;%out.print(Java表达式);%&amp;gt;）&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;5 创建使用JSP技术的Web应用程序&lt;/strong&gt;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;接下来学习如何使用Dreamweaver创建使用JSP技术的Web应用程序，实际上就是创建单独文件夹放置所有页面，并设置JSP服务器信息，这样就可以在Dreamweaver中完成编写和测试过程（注意：不同版本Dreamweaver的具体设置界面会有所不同）。&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;在Dreamweaver菜单栏中选择“站点”&amp;gt;“新建站点”，设置站点信息：&lt;br /&gt;站点名称：jsptest&lt;br /&gt;本地站点文件夹：D:\java\tomcat\webapps\jsptest\&lt;br /&gt;再点击“服务器”选项卡，点击“+”按钮添加服务器&lt;br /&gt;服务器名称：jsptest&lt;br /&gt;连接方法：本地/网络&lt;br /&gt;服务器文件夹：D:\java\tomcat\webapps\jsptest&lt;br /&gt;Web URL：http://localhost:8080/jsptest/&lt;br /&gt;在“高级”对话框中选择服务器模型：JSP&lt;br /&gt;完成添加后设置服务器类型，取消勾选“远程”，勾选“测试”&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/31255a1f-6928-4aa4-bbed-3415174448c0&quot; /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;创建默认首页文件index.jsp，Dreamweaver会自动生成页面框架代码，我们只需输入内容即可，在页面中添加文本“乘法表”，以及生成乘法表的Java代码段：&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/148e4538-0ae5-4fe7-84a0-737af4c4bc78&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;切换到设计视图并点击页面上方的“实时视图”按钮，即可在Dreamweaver内测试页面在浏览器中的输出效果了。与直接在浏览器中输入http://localhost:8080/jsptest的效果完全相同。&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/92be0cba-b8f9-4365-b9a3-3f3470ae6ca0&quot; /&gt; &lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E7%A8%8B01_jsp%E6%A6%82%E8%BF%B0</id>
        <title type="html">JSP教学01 JSP概述</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/jsp%E6%95%99%E7%A8%8B01_jsp%E6%A6%82%E8%BF%B0"/>
        <published>2012-09-07T14:51:36+08:00</published>
        <updated>2017-06-23T17:09:30+08:00</updated> 
        <category term="教程" label="教程" />
        <category term="教学" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;1.1 什么是JSP&lt;br /&gt;1.2 JSP引擎&lt;br /&gt;1.3 JSP页面文件与Web应用程序目录&lt;br /&gt;1.4 JSP运行原理&lt;br /&gt;1.5 (实验)建立JSP开发环境&lt;br /&gt;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;&lt;font size=&quot;3&quot;&gt;教学目的：了解JSP基本概念及JSP的运行原理&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;1.1 什么是JSP&lt;/strong&gt;&lt;br /&gt;JSP（Java Server Pages）是基于Java体系的Web应用程序开发技术，利用这一技术可以建立安全、跨平台、易维护的Web应用程序。&lt;br /&gt;与JSP类似的技术还包括ASP和PHP等，JSP相比类似技术具有安全性强、适应平台广、运行效率高和扩展方便等优点。&lt;br /&gt;学习JSP需要具备Java语言基础。&lt;/font&gt;&lt;/p&gt;
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;JSP是Java企业级应用平台的一个组成部份，主要负责前端的内容显示，还需要以下相关技术的配合：&lt;br /&gt;HTML：超文本标记语言，用于编写静态网页以供浏览器显示的标记语言；&lt;br /&gt;JavaBean：基于Java的可重用组件（类似于微软的COM）；&lt;br /&gt;JDBC：基于Java的数据库连接（类似于微软的ODBC）；&lt;br /&gt;JavaScript：在客户端运行的浏览器脚本程序；&lt;br /&gt;Servlet：在服务器端运行的Java程序，JSP页面是由JSP引擎先转化为Servlet再编译执行的。&lt;/font&gt;&lt;/p&gt;
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;* 什么是Web应用程序&lt;/strong&gt;&lt;br /&gt;Web应用程序是由Web服务器发布的一组静态和动态网页的集合。静态网页的内容是确定的，访问者向Web服务器请求该页时其内容不会发生更改；动态网页的内容不是确定的，访问者向Web服务器请求该页时，Web服务器根据特定的指令改变其内容再发送给访问者。&lt;/font&gt;&lt;/p&gt;&lt;font size=&quot;3&quot;&gt;
    &lt;p&gt;Web服务器处理静态页： &lt;br /&gt;A. 步骤 1 - Web浏览器请求静态页。&lt;br /&gt;B. 步骤 2 - Web服务器查找页。&lt;br /&gt;C. 步骤 3 - Web服务器将页发送到请求浏览器。&lt;br /&gt;&lt;/p&gt;&lt;/font&gt;
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/eb0cfd00-0b63-4b5f-bf1e-ba3eca62782a&quot; /&gt;&lt;/font&gt;&lt;/p&gt;
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Web服务器处理动态页：&lt;br /&gt;A. 步骤 1 - Web浏览器请求动态页。&lt;br /&gt;B. 步骤 2 - Web服务器查找该页并将其传递给应用程序服务器。&lt;br /&gt;C. 步骤 3 - 应用程序服务器查找该页中的指令并完成页。&lt;br /&gt;D. 步骤 4 - 应用程序服务器将完成的页传递回Web服务器。&lt;br /&gt;E. 步骤 5 - Web服务器将完成的页发送到请求浏览器。&lt;br /&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/ccd73ff3-a0f9-4ef9-98d9-f85e02aa17b7&quot; /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;1.2 JSP引擎&lt;/strong&gt;&lt;br /&gt;JSP引擎是管理和运行基于JSP的Web应用程序的服务器软件。&lt;br /&gt;JSP引擎可以作为支持JSP的Web服务器，也可以为其他Web服务器软件提供JSP支持。&lt;br /&gt;常见的JSP引擎有Tomcat、JRun和Resin等。&lt;br /&gt;JSP引擎运行在JVM（Java虚拟机）上，安装JSP引擎前需要先安装JDK（Java开发包）。&lt;/font&gt;&lt;/p&gt;
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;1.3 JSP页面文件与Web应用程序目录&lt;/strong&gt;&lt;br /&gt;JSP页面文件的扩展名为.jsp，除了普通的HTML标记外，还可以使用JSP标签和Java代码段。&lt;br /&gt;JSP页面中的JSP标签和Java代码段在服务器端运行并生成HTML代码供客户端浏览器查看。&lt;br /&gt;JSP页面文件需要放置于Web应用程序目录中才能供浏览器访问。&lt;/font&gt;&lt;/p&gt;
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;使用JSP开发的Web应用程序实例1：中国工商银行 &lt;a href=&quot;https://mybank.icbc.com.cn/icbc/newperbank/perbank3/frame/frame_index.jsp&quot;&gt;https://mybank.icbc.com.cn/icbc/newperbank/perbank3/frame/frame_index.jsp&lt;/a&gt;&lt;/font&gt;&lt;br /&gt;&lt;font size=&quot;3&quot;&gt;使用JSP开发的Web应用程序实例2：本博客~&lt;br /&gt;* 注意：你不一定能在使用JSP开发的网站地址中看到“.jsp”的扩展名，因为许多使用JSP开发的Web系统通常都通过转向分发技术隐藏真实的文件路径。&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;1.4 JSP运行原理&lt;/strong&gt;&lt;br /&gt;当一个JSP页面第一次被请求执行时，JSP引擎先将其转化为Servlet源码（.java），然后编译成字节码（.class），再执行字节码并响应用户请求。&lt;br /&gt;当这个JSP页面以后再被请求执行时，JSP引擎会直接执行相应的字节码来响应用户请求以提高访问速度。&lt;br /&gt;如果JSP页面被修改，JSP引擎会重新进行转化和编译过程。&lt;/font&gt;&lt;/p&gt;
  &lt;p&gt;&lt;img src=&quot;http://study.ywicc.edu.cn/roller/jsp/mediaresource/5e702af3-da19-490f-a5df-b816eb0ddb9a&quot; /&gt; &lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;1.5 (实验)建立JSP开发环境 &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;安装JDK（Java开发包）&lt;br /&gt;安装Tomcat（JSP引擎）&lt;br /&gt;安装JSP_Support（Dreamweaver的JSP插件）&lt;br /&gt;编写和测试JSP页面&lt;br /&gt;创建基于JSP技术的Web应用程序 &lt;/font&gt;&lt;/p&gt;
  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;（详见JSP实验01 建立JSP开发环境）&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://study.ywicc.edu.cn/roller/jsp/entry/%E7%AC%AC%E4%B8%80%E7%AF%87%E6%97%A5%E5%BF%97</id>
        <title type="html">JSP程序设计教学</title>
        <author><name>博主</name></author>
        <link rel="alternate" type="text/html" href="http://study.ywicc.edu.cn/roller/jsp/entry/%E7%AC%AC%E4%B8%80%E7%AF%87%E6%97%A5%E5%BF%97"/>
        <published>2012-07-22T15:47:15+08:00</published>
        <updated>2016-09-11T14:00:34+08:00</updated> 
        <category term="公告" label="公告" />
        <category term="公告" scheme="http://roller.apache.org/ns/tags/" />
        <category term="教学" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;欢迎大家访问这个博客，学习JSP网页应用程序的开发。&lt;/font&gt;&lt;/p&gt; 
  &lt;p&gt; &lt;/p&gt;</content>
    </entry>
</feed>

