友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
JSP入门教程(DOC格式)-第5部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 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 后的那个字母小写,
得到的 username 就是与 el 表达式中对应的部分。
有趣的是{contact。username}仅仅与 getUsername()方法对应,无论 contact
有没有 String username 这个变量。如果我们想使用{contact。nameAndSex},
只要写一个 public String getNameAndSex()方法返回我们想要的数据即可,不
需要添加 String nameAndSex;变量。
另一个放到 pageContext 中的row 就很直观了,我们根据行数的奇偶来决定当前
行使用的 css 样式,这样就可以显示出斑马线的效果了,这项功能并非必要,只
是为了娱乐。
47 / 148
…………………………………………………………Page 48……………………………………………………………
5。3。 Create(创建)
选择 list。jsp 中的“添加联系信息”,即进入 create。jsp 添加信息页面。
create。jsp 中没有包含 java,它提供给用户一个输入信息的表单,用户填写过
信息后就能点击提交按钮,将数据提交给 save。jsp 处理。
save。jsp 中与 create。jsp 相反,里边只有处理数据的 java 代码,没有显示的
内容。
jsp:useBean 的用处我们已经了解了,先从application 中取出 contactDao,再
创建一个 contact。在创建 contact 的时候没有指定 scope,默认情况下只会使
用 new 创建这个局部变量,不会对任何作用域产生影响。
jsp:setProperty 是新事物了,它的作用就是为某个 javabean 设置数据。之前
我们已经使用 jsp:useBean 创建了一个 contact 实例,现在我们通过
name=〃contact〃设置这个实例的数据,property 可以指定一个属性,比如
property=〃username〃,也可以使用星号(* )批量设置所有可以找到的属性,这
个 jsp 动作实际上与下面的代码等价。
contact。setUsername(request。getParameter(〃username〃));
contact。setSex(request。getParameter(〃sex〃));
contact。setEmail(request。getParameter(〃email〃));
contact。setQq(request。getParameter(〃qq〃));
contact。setDescn(request。getParameter(〃descn〃));
这些数据都是由 create。jsp 提交过来的,只要它们的名称与 contact 中的方法
对应(这次是 set 开头的方法了),jsp:setProperty 就可以自动为它们进行赋
值,转换的规则与 get 的方法名是类似的。
通过这一系列的 jsp 动作,我们得到的 contact 中已经设置好了用户刚刚填写的
数据,现在只要进行保存就好了。
contactDao。save(contact);
response。sendRedirect(〃list。jsp〃);
contactDao。save()也已经封装好了,直接调用便完成添加功能。操作完成后记
得要调用 sendRedirect,将页面重定向到 list。jsp,查看添加后的结果。
49 / 148
…………………………………………………………Page 50……………………………………………………………
5。4。 Update(更新)
点击列表右侧的“修改”,对这一行显示的联系信息进行修改。
虽然页面的布局与 create。jsp 基本相同,但为了预先显示需要修改的数据,我
们需要根据请求中的 id 值,去数据库中查找对应的联系信息,再显示到 jsp 中。
点击“修改”的时候,id 便附加到 url 后了。
修改
edit。jsp 中获得 id 的值,根据 id 从 contactDao 获得对应的联系信息 contact,
再将 contact 放到 pageContext 供后面的 el 表达式使用。
在 html 中显示信息的时候,直接使用 el 表达式,如果属性值不存在,el 也会
自动输出空字符串〃〃,这对我们来说都是非常便捷的。
50 / 148
…………………………………………………………Page 51……………………………………………………………
edit。jsp 中还有一点儿隐藏的玄机,表单中定义了一个名叫 id 的隐藏属性,这
样服务器才能知道我们需要修改那一条数据。
既然是隐藏的,我们便不能在页面上看到它,但在提交的时候它还会与其他数据
一起发送到服务器。
修改信息之后,点击提交发送请求。
update。jsp 中与 save。jsp 相似,唯一不同的是这次我们调用的是
contactDao。update()而不是 contactDao。save()。
contactDao。update(contact);
upd
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!