JSP入门教程(DOC格式)-第9部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
contact。setQq(rs。getString(〃qq〃));
contact。setDescn(rs。getString(〃descn〃));
54 / 148
…………………………………………………………Page 55……………………………………………………………
list。add(contact);
}
} finally {
DbUtils。close(rs; state; conn);
}
return list;
}
第一步,使用 DbUtils。getConn()建立与数据库的连接 Connection。
第二步,从 Connection 创建一个 Statement。
第三步,使用 Statement 执行 sql 查询语句,返回查询结果集 ResultSet。
第四步,将 ResultSet 中的数据转换成Contact 队列。
第五步,关闭数据库的连接,并返回 Contact 队列作为结果。
Connection …》 Statement …》 ResultSet …》 close()是一个查询功能的
基本结构。
这里使用的 sql 语句会获得数据库中所有的联系信息,所以我们循环读取
ResultSet 最后得到一个 Contact 队列。另一个方法public Contact
get(Long id)中会根据指定的主键获得一条对应记录,虽然依然返回
ResultSet,但这次 ResultSet 中只包含一条数据,所以最终只会获得一
个 Contact 对象。
2。 Create(创建)
/**
* 向数据库插入一条数据。
*
* @param contact 联系信息
*/
public void save(Contact contact) throws Exception {
Connection conn = null;
PreparedStatement state = null;
try {
conn = DbUtils。getConn();
state = conn。prepareStatement(〃insert into
contact(username;sex;email;qq;descn) values(?;?;?;?;?)〃);
state。setString(1; contact。getUsername());
state。setString(2; contact。getSex());
55 / 148
…………………………………………………………Page 56……………………………………………………………
state。setString(3; contact。getEmail());
state。setString(4; contact。getQq());
state。setString(5; contact。getDescn());
state。executeUpdate();
} finally {
DbUtils。close(null; state; conn);
}
}
第一步,使用 DbUtils。getConn()建立与数据库的连接 Connection。
第二步,从 Connection 创建一个 PreparedStatement。
第三步,向 PreparedStatement 中设置参数。
第四步,使用 PreparedStatement 执行更新。
第五步,关闭数据库的连接,并返回 Contact 队列作为结果。
Connection …》 PreparedStatement …》 设置数据,执行更新 …》 close()
是一个更新数据库的基本结构,更新不需要返回数据,所以没有
ResultSet。
PreparedStatement 可以帮助我们免受拼接字符串之苦,如果依旧使用
Statement,会产生下面这种代码。
state = conn。createStatement(〃insert into
contact(username;sex;email;qq;descn) values('〃 +
contact。getUsername() + 〃';'〃 +
contact。getSex() + 〃';'〃 +
contact。getEmail() + 〃';'〃 +
contact。getQq() + 〃';'〃 +
contact。getDescn() + 〃')〃);
代码又臭又长,容易出错外加难以维护,你少写一个单引号不会引起编译
错误,但是运行的时候会给你一大堆错误,最后连问题在哪里都找不到,
推荐大家在需要设置参数的时候尽量使用 PreparedStatement。
另外 PreparedStatement 也能防止系统被“注入攻击”。
3。 Update(更新)
56 / 148
…………………………………………………………Page 57……………………………………………………………
update contact set username=?;sex=?;email=?;qq=?;descn=? where
id=?
4。 Delete(删除)
delete from contact where id=?
anni。ContactDao 的代码在WEB…INF/src/ContactDao。java 中。有关 jdbc 的操
作既枯燥又无聊,实际上只需要记住几条 sql 语句就足够我们进行 CRUD 这种常
用操作了,对于普通开发者来讲,我们也不需要再去了解更多深入的功能。
我们提供了批处理文件编译这些 java 代码,双击 WEB…INF/src/pile。bat 即
可对这三个 java 文件进行编译,编译后的 class 文件自动输出到
WEB…INF/classes/对应的目录下。
注意
hsqldb 的数据库文件我们已经准备妥当,但我们也提供为数据库重新导入数据
的脚本,执行WEB…INF/sql/run。bat 会执行 import。sql 中的 sql 脚本,
sqltool。rc 中是连接数据库的配置。
。java; 。sql; 。bat; 。rc 文件都可以用记事本打开查看,修改内容后直接保存
即可。
57 / 148
…………………………………………………………Page 58……………………………………………………………
第 6 章 贴近 servlet
注意
仅仅使用 jsp 做项目是难以想像的。难以维护,难以调试,难以分层设计,难以
统一管理。现在我们要从 jsp 跨入 servlet 领域,从而得到更多的功能。因为从
这里开始将进入中级部分,只想随便玩玩 jsp 的朋友可以到此为止了,期望以此
为生的朋友请继续。
如果你不满足以下任一条件,请继续阅读,否则请跳过此后的部分,进入下一章:
第 7 章 使用 filter 过滤请求。
1。 了解 servlet。
2。 了解 servlet 与 jsp 的关系。
6。1。 servlet 是什么
sun 公司给自己产品定的名称都十分诡异,最早听说有 applet,是Application
let (小应用程序)的意思。在jsp 中写的 java 代码叫做 scriptlet,Script let
(小脚本程序)。现在又有servlet,Server let (小服务程序)。
简单来说,servlet 就是运行在服务器上的小程序。
让我们通过一个简单示例来了解 servlet 是如何开发和运作的,把
lingo…sample/06…01 目录复制到tomcat 的webapps 目录下,启动服务器并访问
http://localhost:8080/06…01/,会看到如下效果。
页面效果非常简单,只是显示“hello”这个单词。为了让 servlet 实现这个效
果,我们需要进行以下步骤。
1。 写一个名叫 HelloServlet。java 的类,编译成 class 放到
WEB…INF/classes 下。
记得要建立与包名对应的目录结构,比如 package anni;就对应着
WEB…INF/classes/anni/,因为需要引用 javax。servlet 包下的类,编译
58 / 148
…………………………………………………………Page 59……………………………………………………………
时要将tomcat 的mon/lib 目录下的servlet…api。jar 加入 classpath,
具体编译命令可参考 lingo…sample/06…01/WEB…INF/src/pile。bat。
package anni;
import java。io。IOException;
import java。io。PrintWriter;
import javax。servlet。ServletException;
import javax。servlet。http。HttpServlet;
import javax。servlet。http。HttpServletRequest;
import javax。servlet。http。HttpServletResponse;
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request;
HttpServletResponse response)
throws ServletException; IOException {
PrintWriter out = response。getWriter();
out。println(〃hello〃);
}
}
HelloServlet 中实现的功能很简单,在 doGet()方法中先取得 response
(响应)的输出流,再向里面写入“hello”。
2。 修改 WEB…INF 目录下web。xml,添加HelloServlet 的配置,让它负责处
理路径是 http://localhost:8080/06…01/的请求。
HelloServlet
anni。HelloServlet
59 / 148
…………………………………………………………Page 60……………………………………………………………
HelloServlet
/
只要注意 servlet 和 servlet…mapping 两部分就可以了。
a。 servlet 标签中定义一个了名字叫做 HelloServlet 的 servlet。
这个 HelloServlet 对应的 class 是 anni。HelloServlet,请注意
这里的 class 要写全名。
b。 servlet…mapping 标签则是把刚刚定义的HelloServlet 映射到“/”
这个请求路径上。
请回忆我们之前讲过的 第 3。4。1 节 “绝对路径与相对路径” 中
的部分,这里的“/”就代表当前应用的根路径,既
http://localhost:8080/06…01/,凡是有客户对此路径发出请求,
就会交由 HelloServlet 处理。
例子在 lingo…sample/06…01 目录下,将整个目录放入tomcat 的webapps 即可使
用。对应的源代码放在 lingo…sample/06…01/WEB…INF/src 目录下,要放到tomcat
的webapps 目录下,才能使用pile。bat 脚本进行编译。
6。2。 jsp 与 servlet 的关系
通过上面的例子,我们可以看到 servlet 与 jsp 的功能差不多,都是处理请求并
返回响应。甚至在操作时使用到的变量都极为相似,request,response,out
这些在我们使用 jsp 的时候也遇到过。不同的时是,jsp 中这些变量拿来即用,
servlet 中还要通过参数来获得。
jsp 和 servlet 如此相似,它们之间难道有什么联系吗?为什么 sun 创造了两种
功能相似的东西呢?
其实 jsp 就是 servlet,你所写的 jsp 页面最终都会被服务器转换成 servlet。
为了验证这一说法,我们编写一个效果与 HelloServlet 完全一样的 hello。jsp,
它的内容就只有这么点儿。
hello
访问 http://localhost:8080/06…01/hello。jsp,会看到与刚刚一样的效果。
60 / 148
…………………………………………………………Page 61……………………………………………………………
现在打开 tomcat 的work 目录。
在 Catalina/localhost/06…01/org/apache/jsp 目录下,可以看到两个文件,分
别是 hello_jsp。class 和 hello_jsp。