利用隐藏域来保持状态,与采用网址重写技术类似。但它不是将值添加到url后面,而是将它们放在html表单的隐藏域中。当用户提交表单时,隐藏域中的值也传送到服务器。只有当页面包含表单,或者可以在页面中添加表单时,才适合使用隐藏域。这种技术胜过网址重写技术的地方在于,可以将更多的字符传到服务器,并且不需要进行字符编码。但是像网址重写一样,也只有当要传递的信息不需要跨越多个页面时,才适合使用这种技术。
customer类构建了一个客户模型,如代码清单2-2所示。代码清单2-3中的servlet展示了如何利用隐藏域来更新客户信息。
customerservlet类继承htppservlet,并映射到三个url模式:/customer、/editcustomer及/updatecustomer。前两个模式会调用servlet的doget方法,/updatecustomer调用dopost方法。
/customer是这个小应用程序的入口点。它列出了init方法填入的类级customers list的客户。(在现实的应用程序中,可能是从数据库中获得客户信息)。详情见图2-4。
如图2-4所示,每个客户都有一个edit链接。/editcustomer?id=customerid指向每个链接的href属性。一旦收到/editcustomer,servlet就会发送一个如图2-5所示的客户编辑表单。
如果单击第一个客户,servlet就会发送这个包含了隐藏域的form标签:
注意表单中的隐藏域没有?它包含了customer id,因此当提交表单时,服务器就会知道正在编辑哪个客户的信息。
值得一提的是,这个表单使用了post方法,因此当提交它时,浏览器就会采用http post方法,并调用servlet的dopost方法。