5.5.7 内置对象应用简单示例
本小节给出一个应用JSP内置对象实现的简单留言板的例子。该应用不涉及登录会话,为所有访客提供向服务器提交留言信息以及查看留言的功能。
1.页面设计
为实现留言板功能,本例设计了3个页面,它们之间的关系如图5-34所示。
图5-34 留言板各页面的关系
各页面实现的主要功能如下。
·input Messages.jsp:主要负责用户输入,用户可以通过该页面提供的表单输入留言信息,也可以通过该页面向服务器提交查看留言的请求。当输入留言后,可以向服务器提交留言进入处理留言页面process Messages.jsp,或者通过提交查看留言的请求进入查看留言页面output Messages.jsp查看留言。
·processMessages.jsp:主要负责留言处理,接收来自客户端的留言信息输入,对留言进行处理并保存至服务器端,处理完毕后自动跳转至查看留言页面output Messages.jsp。
·output Messages.jsp:主要负责留言显示,将存储在服务器的留言内容以特定外观显示出来,用户浏览完毕可以返回留言板页面input Messages.jsp。
2.代码设计及运行效果
留言板页面input Messages.jsp的代码如下。
上述代码中设计了一个name属性为form的表单用于输入留言,以及一个button按钮用于提交查看留言请求。
form表单中包括两个input元素用作文本输入、一个textarea元素提供多行文本输入,还有一个类型为submit的input元素用作提交留言按钮。当单击该按钮时,触发click事件,调用事件处理程序check Input()函数对表单内容进行校验。事件处理程序由JavaScript实现,其中使用了document对象提供的get ElementById()方法提取表单的用户名和留言内容。当留言内容为空时,输入警示信息,返回false,阻止浏览器提交表单。当用户名为空时,提示用户以匿名方式提交留言。
点击button按钮时,将进入查看留言页面output Messages.jsp显示留言。
该页面的显示效果如图5-35所示。
图5-35 留言输入页面
当留言内容为空时,运行效果如图5-36所示。
当用户名为空时,运行效果如图5-37所示。
图5-36 留言内容为空时的运行效果
图5-37 用户名为空时的运行效果
处理留言页面process Messages.jsp的代码如下。
该页面中留言信息以Vector String类型的矢量队列形式被处理,由于需要对所有访客可见,留言信息存储在application对象的“Messages”属性中。
上述代码首先使用了request对象的getParameter()方法提取来自客户端的用户名、留言标题、留言内容。当用户名为空时,使用匿名用户+随机数的形式代表留言者;当留言标题为空时,则使用“无”替代。接着将标题、留言者姓名、留言时间和留言内容拼接成字符串,各部分用“#”分隔。然后调用提交留言信息的函数submit Messages(),将留言字符串作为参数传入。函数submit Messages()在定义时使用了synchronized这一关键字,其目的是使多线程在操作application对象时保持同步。因为所有访客都可以对application对象的“Messages”属性进行修改,该属性即是多线程通信时的临界资源,需要实现互斥访问。在函数中使用了Vector提供的add()方法向队列末尾追加留言信息,其中还包含了留言序号。保存留言信息则使用了application对象的set Attribute()方法将对象添加到application对象中。最后使用了response对象的set Header()方法实现自动跳转至查看留言页面。
留言处理完毕后的显示效果如图5-38所示。
查看留言页面output Messages.jsp的代码如下。
图5-38 留言处理完毕后的显示效果
上述代码中,使用了application对象的get Attribute()方法提取“Messages”属性,获取留言信息。若该属性为空,则输出“暂时还没有留言!”。否则调用element At()方法依次取出各个留言信息,针对每条留言信息字符串,调用split()方法将字符串按“#”进行分割,各部分作为数组元素存入str[]。然后使用out对象的print方法显示留言次序、留言标题、留言者、留言时间和留言内容。此外该页面还设计了一个button元素,点击后可返回留言板页面,并将该元素设置为一个锚点,页面开始位置设计了跳转至该锚点的超链接,方便在留言较多的时候跳至页尾。
该页面的运行效果如图5-39所示。
图5-39 查看留言页面的运行效果
当点击页面开始位置的超链接时,将跳转至页尾,显示效果如图5-40所示。
图5-40 跳转至页尾的显示效果