友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
JSP入门教程(DOC格式)-第18部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
这样我们就有十秒钟去点两个页面的提交按钮了。最后将 this。username 写入
response。
你也许在想:“这没有问题啊,第一个页面提交了数据,等待 10 秒返回,第二
个页面再提交数据,等待 10 秒返回,两者并不冲突啊。”可实际上在多线程模
型中不会有这种队列让请求一个一个执行,所有请求都是蜂拥而至。
在这个例子里,第一个请求过来将“叮咚”赋值给 this。username 后进行等待,
10 秒之内我们的第二个请求又调用了 doGet()方法,并把 this。username 修改为
“lingirl”,等到 10 秒后第一个请求结束等待后,获得的 this。username 已经
是“lingirl”了。
this。username 这种写法在 servlet 中是绝对禁用的,如果有什么信息需要保存,
可以考虑放到 session 或 ServletContext 中。
14。3。 在 jsp 中定义类变量
写在之间的代码,在转换成 servlet 之后都会 service()方法内运行,所以
我们不必担心出现上边 this。username 的问题。
但是我们可以用 (注意多出来的感叹号)定义类变量或类方法,把上一个
罪大恶极的 servlet 改造成 jsp 的话,就像这样。
注意
使用 14…03 下的例子可以测试 jsp 出错的效果,记得要在 10 秒之内点击两次。
127 / 148
…………………………………………………………Page 128……………………………………………………………
似乎是一个巨大的陷阱,如果我们使用它定义类变量就一定会出现多线程
错误。
不过凡事都有正反两面,当我们需要在 jsp 中定义一个通用方法时,就需要借助
的力量了,假设我们需要一个方法,根据用户的性别显示不同的html 内容,
如果 sex = 0 就输出红色的“男”,如果 sex = 1 就输出绿色的“女”。为实现
这个功能,我们可以定义一个 sexRenderer()方法。
14…04/index。jsp 页面显示效果如下:
index。jsp 中的代码分两部分。
第一部分定义 sexRenderer()方法和
第二部分循环显示保存了性别信息的数组,显示的时候将会调用 sexRenderer()
方法。
128 / 148
…………………………………………………………Page 129……………………………………………………………
好的,现在我们知道可以在中定义方法和变量了。但是同时也要了解的是
已经脱离了 service()方法,这就导致不能在它里边使用 request,
response 这些默认变量了,如果想要调用 request 只能写成 void
doSomething(HttpServletRequest request)的形式了,稍微注意一下即可。
14。4。 jsp 九大默认对象
分别是 request; response; out; pageContext; session; application; page;
config; exception。
让我们看看它们与 servlet 中变量的对应关系。
首先要明确的是,这九个变量都只在中有效,中是无法调用这九个对
象的。实际上最后会成为 service()方法中的代码,我们这里就看看如何在
service()方法中获得这些对象吧。
1。 request
public void service(ServletRequest req; ServletResponse res) {
HttpServletRequest request = (HttpServletRequest) req;
}
jsp 中的request 就是 service()中传入的req 参数,因为 service 中定
义的是 ServletRequest 类型,我们还需要转换成 HttpServletRequest
类型。
2。 response
public void service(ServletRequest req; ServletResponse res) {
HttpServletResponse response = (HttpServletResponse) res;
}
与上例相同,response 也是 service()中传入的res 参数。
3。 out
129 / 148
…………………………………………………………Page 130……………………………………………………………
Writer out = response。getWriter();
out 对应着从 response 中取出的writer 对象,负责向响应中输出数据。
不过 jsp 和 servlet 中的 out 还是有一点区别,虽然它们都实现了
java。io。Writer 接口,但 servlet 中实际类型是 java。io。PrintWriter,
而 jsp 中实际类型是 javax。servlet。jsp。JspWriter。
4。 pageContext
这是 jsp 独有的,servlet 里没有 page 的概念。
5。 session
HttpSession session = request。getSession();
直接从 request 中获得会话。
6。 application
ServletConext application =
getServletConfig()。getServletContext();
可以通过 servletConfig 获得 ServletContext,这是整个web 应用共享
的一个对象。
7。 page
Object page = this ;
page 就代表当前 jsp 对象,也可以直接使用 this 引用。
8。 config
ServletConfig config = getServletConfig();
这是在 servlet 初始化时由服务器传入的对象,可以通过它获得 web。xml
中定义的初始化参数。
9。 exception
想在 jsp 中使用这个对象需要满足一些条件了。
首先我们要在 14…05/index。jsp 中故意抛出一个异常。
130 / 148
…………………………………………………………Page 131……………………………………………………………
str 值是 null,直接在 null 上调用 length()方法会引发
NullPointerException,然后我们可以看到页面第一行使用 jsp 指令
(directive)设置了errorPage=〃error。jsp〃,这样在出现异常的时候
就会自动 forward 到 error。jsp 中。现在看看 error。jsp 中有些什么。
index
最主要的是在 jsp 指令(directive)中设置 isErrorPage=〃true〃,这样
我们就可以在 jsp 中使用 exception 对象了,实际上这个异常是从
request 中取出来的。
到此为止,jsp 九大默认对象已经讲解完毕,其中常用的还是四个作用域对应的
对象,其他的了解即可。
131 / 148
…………………………………………………………Page 132……………………………………………………………
第 15 章 分页
注意
实际上分页并不属于 jsp 的基础知识范畴,不过分页毕竟是非常常用的一个功
能,其中也会涉及到 jsp 的一些应用,所以还有很有价值一看的。
如果你不满足以下任一条件,请继续阅读,否则请跳过此后的部分,进入下一章:
第 16 章 Never End。。。。
1。 了解如何进行数据库分页。
2。 了解如何使用 jstl 标签替换分页的 jsp 代码。
15。1。 数据库分页
所谓的分页,就是要查询的数据太多了,一次性显示出来的话,既不容易查看也
影响性能。
就比如我们这里有 39 条数据,分 8 页显示出来,每页 5 条记录。
132 / 148
…………………………………………………………Page 133……………………………………………………………
首先说数据库,里边只有一张表 bean,三个字段 id; title 和 add_date。
…bean
create table bean(
id bigint; …主键
title varchar (100); …标题
add_date datetime …时间
);
对应的 Bean。java 咱们就不用写了,只看一看后台去数据库读取数据库的
BeanServlet。java。
package anni;
import java。io。*;
import java。sql。*;
import java。util。*;
import javax。servlet。*;
import javax。servlet。http。*;
public class BeanServlet extends HttpServlet {
public void doGet(HttpServletRequest request; HttpServletResponse
response)
throws ServletException; IOException {
Connection conn = null;
Statement state = null;
ResultSet rs = null;
133 / 148
…………………………………………………………Page 134……………………………………………………………
// 获得当前页码
int pageNo = 1;
try {
pageNo = Integer。parseInt(request。getParameter(〃pageNo〃));
} catch (Exception ex) {
}
if (pageNo 《 1) {
pageNo = 1;
}
request。setAttribute(〃pageNo〃; pageNo);
List list = new ArrayList();
int count = 0;
// 根据页码从数据库中获得对应的数据
try {
conn = DbUtils。getConn();
state = conn。createStatement();
rs = state。executeQuery(〃select limit 〃 + (pageNo * 5 5)
+ 〃 5 * from bean〃);
while (rs。next()) {
Bean bean = new Bean();
bean。setId(rs。getLong(1));
bean。setTitle(rs。getString(2));
bean。setAddDate(rs。getTimestamp(3));
list。add(bean);
}
rs。close();
rs = state。executeQuery(〃select count(*) from bean〃);
if (rs。next()) {
count = rs。getInt(1);
}
} catch (Exception ex) {
ex。printStackTrace();
} finally {
DbUtils。close(rs; state; conn);
}
request。setAttribute(〃count〃; count);
request。setAttribute(〃list〃; list);
134 / 148
…………………………………………………………Page 135……………………………………………………………
request。getRequestDispatcher(〃/query。jsp〃)。forward(request;
response);
}
}
代码长了,分三段来看:
// 获得当前页码
int pageNo = 1;
try {
pageNo = Integer。parseInt(request。getParameter(〃pageNo〃));
} catch (Exception ex) {
}
if (pageNo 《 1) {
pageNo = 1;
}
request。setA
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!