JSP入门教程(DOC格式)-第7部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
小技巧,因为 onlineUserList 已经放在application 中了,将username 添加进
去后,不必再使用 setAttribute()也可以达到修改在下用户列表的效果。
因为此处用到的List 和 ArrayList 都是定义在 java。util 包内的工具类,如果
不希望写成全类名 java。util。List; java。util。ArrayList 的形式,就需要使用
做声明,当然也可以写成,具体情况就任君选择了。
登录成功后,使用 redirect 的方式跳转到result。jsp 页面,result。jsp 页面
中显示的是当前登录用户和在线用户列表的信息。
先看一下页面中使用的 jsp 指令(directive),,为了处
理中文和使用 import,可以把这两部分写在一起。
显示当前登陆名时,使用了 el 表达式:
您好:{username} '注销'
显示在线用户列表的时候使用了循环:
41 / 148
…………………………………………………………Page 42……………………………………………………………
这里的循环体可能会令人感到费解,其实它与下面的写法是等价的:
只需要理解代码的含义就可以了,从 application 里获得 onlineUserList,然
后循环输出所有的用户名。application 是公用的,所以可以看到每个登录的用
户。
点击注销的时候,会跳转到 logout。jsp,这里负责用户注销和从在线用户列表
去除已登录用户。
这次我们从 session 中获得登录名,因为请求中没有包含任何数据。
session。invalidate()这个方法给我们提供了一条销毁 session 的捷径,不需要
一条一条删除 session 中的数据,invalidate()会直接销毁 session,session
里边所有的数据也就消失了。
在线用户列表的操作很直观,从 application 中获得 onlineUserList,然后
remove(username)就可以从中去除当前登录用户。最后使用 redirect 跳转到
index。jsp 这个登录页面。整个应用的流程也就结束了。
整个应用的功能很单纯,之所以把它叫做“新手级”,是因为它只能用于演示。
等待用户去点击注销才去操作在线用户列表存在着很大的漏洞,实际使用中,用
户很可能因为个人或网络原因没有进行注销就退出系统,这样会导致用户列表不
能删除,就这样一直增长下去。
解决这个问题的方法超出了目前掌握的知识,我们将在后面的章节进行介绍。
43 / 148
…………………………………………………………Page 44……………………………………………………………
第 5 章 结合 javabean 实现 CRUD
注意
这里介绍的是在 jsp 中使用自己写的 javabean,不过这种写法也仅仅适用于小
型应用,只打算学两下 jsp 玩玩的朋友可以到此为止了,完成了这章就不必继续
下去了,此后难度会加大不少。
如果你不满足以下任一条件,请继续阅读,否则请跳过此后的部分,进入下一章:
第 6 章 贴近 servlet。
1。 了解如何在 jsp 中使用自定义的 javabean。
2。 了解一些 jsp 动作(action)。
3。 使用 jdbc 操作数据库。
5。1。 概念和命名方式
需要提及的两个名词概念:
1。 CRUD 是 Create(创建)、Read(读取)、Update(更新)和 Delete(删除)的缩
写,一般应用有这四项也就足够了。
我们这里的例子是对联系人信息进行 CRUD 操作。
2。 javabean 是把一些操作集合在一起写成一个 java 类,想要进行什么操作
直接调用这个类里的方法就行。
咱们这里使用 javabean 的地方有两处,一个是链接数据库并进行CRUD
操作,另一个把每条数据都写 成一个类。
对于 CRUD 应用,有一些大家默认的命名来表示不同的操作。
1。 list。jsp。读取所有信息并显示到页面上,这个是CRUD 中Read(读取)。
2。 create。jsp。进入添加联系信息的页面,等待用户输入信息。
save。jsp。接收用户提交的信息,添加到数据库中。
这两步对应 CRUD 中的Create(创建)。
3。 edit。jsp。进入修改联系信息的页面,等待用户修改信息。
update。jsp。接收用户提交的信息,修改数据库中对应的信息。
44 / 148
…………………………………………………………Page 45……………………………………………………………
这两步对应 CRUD 中的Update(更新)。
4。 remove。jsp。删除用户选择的信息。这步对应CRUD 中的Delete(删除)。
下面我们将按照用户浏览的顺序对这些页面进行介绍。
5。2。 Read(读取)
启动服务器,访问 http://localhost:8080/05…01/就会看到联系信息列表。
看一下 05…01 目录里边的7 个 jsp 页面,其中 6 个页面都已经介绍了,只剩
index。jsp。
index。jsp 是 tomcat 默认的索引页面,在用户访问
http://localhost:8080/05…01/的时候会自动执行 index。jsp,但我们更希望用
户能直接进入 list。jsp 页面看到所有的联系方式,所以在 index。jsp 里使用
forward 跳转到 list。jsp。
第一行是我们曾经讲过的设置中文编码。第二行叫做 jsp action (jsp 动作),
它的写法和 html 标签很相像,有了它们我们可以节省很多 java 代码。比如,这
个 jsp 动作就与下面的代码功能相同。
从长度来看,jsp 动作明显占有绝对优势,在单独使用 forward 的时候,建议大
家优先考虑的写法。
45 / 148
…………………………………………………………Page 46……………………………………………………………
现在来看 list。jsp 里的内容,我们是如何获得这些联系信息,并把这些联系信
息显示到页面上。
为了便于操作,我们将所有对数据库的操作都封装到 anni。ContactDao 中,这就
是所谓的 javabean 了。现在我们想要获得所有联系信息时,只要创建一个
ContactDao 的实例,然后调用 contactDao。getAll()获得装满联系信息的 List
列表就好了。
在创建 ContactDao 实例的时候,我们使用了另一个 jsp 动作:jsp:useBean,它
就写在 list。jsp 的第二行。
看到这里,可能有朋友提问了,既然只是创建一个对象的实例,为什么不用 new
呢,那要比这样写的代码少许多,也更容易理解,为什么我们还要执意使用
jsp:useBean?只是为了尝试新技术吗?
这里我提醒大家注意一下标签中的 scope=〃application〃,application 正是我
们介绍过的四个作用域之一,既然有了这个属性就说明事情没有 new 这么简单
了,实际上正因为 scope 的属性,这段 jsp:usebean 实际上等价于下面的代码。
它会先去 scope 定义的作用域 application 中取得 contactDao 对应的对象,这
个 contactDao 正是标签中定义的 id,转换的对象类型则是标签中 class 属性的
值。
好的,我们先从 application 中获得 contactDao 对应的对象,然后判断得到的
是否为 null,如果为 null 说明此变量还没有初始化,这时就要使用 new 创建一
个对象实例并放入 application 中。最后我们得到的就是这个 contactDao 实例。
现在我们得到了一个 contactDao 实例,并把它放到 application 作用域中,供
所有用户公用,通过使用 jsp:useBean,我们下面就可以直接使用它获得需要的
数据。
{contact。username}
{contact。sex}
{contact。email}
{contact。qq}
{contact。descn}
修改 |
删除
首先我们调用 contactDao。getAll()获得联系信息的 List 列表,然后使用 for
循环将这些信息都输出到页面。
下面的操作比较有趣,我们每获得一条信息就把它放入 pageContext 中。之所以
这样做,是为了在下面使用 el 表达式显示信息。
el 表达式的一个特点就是必须放到作用域里才能调用,如果使用 Contact
contact = (Contact) list。get(i);而不放到 pageContext 中,后面的
{contact。username}就无法找到 contact 了。
这里还要提及 el 表达式的进一步用法,{contact。username}实际上得到的是
contact。getUsername()返回的结果。这里有一个默认的转换规则,假设有一个
getUsername()方法,我们先要去掉开头的 get,然后将 get 后的那个字母小写,
得到的 user