Java Web程序设计中,Servlet充当控制层角色,它的作用类似于调度员:所有用户请求都发送给Servlet,Servlet调用业务层来处理用户请求,并调用JSP页面来呈现处理结果;或者Servlet直接调用JSP页面将应用的状态数据呈现给用户。下面演示如何创建一个Servlet程序。
在chapter13项目的src目录下,创建cn.linaw.chapter13.servlet包,在包上点击鼠标右键,选择【New】选项,在子菜单里选择【Other】选项,选择创建Servlet向导,如图13-22所示。
图13-22 选择创建Servlet向导
点击【Next】按钮,填写Servlet类文件的位置信息,在【Class name】中指定Servlet类名称,其他采用默认设置即可,如图13-23所示。
图13-23 填写新建Servlet类的文件名和位置
点击【Next】按钮,完成Servlet在web.xml中的配置信息。【Name】值用来指定web.xml文件中<servlet-name>元素的内容,【URL mappings】用来指定web.xml文件中<urlpattern>元素的内容。本项目不做修改,保持默认设置即可,如图13-24所示。
图13-24 设置该Servlet在web.xml中的配置信息
点击【Next】按钮,选择该Servlet需要创建的方法。这里只选择“Inherited abstract methods”、“doPost”方法(如果JSP页面是GET请求,则需要选择“doGet”),如图13-25所示。
图13-25 勾选Servlet需要创建的方法
点击【Finish】按钮完成Servlet的创建。QueryServlet类创建后的初始内容如图13-26所示。
图13-26 QueryServlet类创建后的初始内容
程序第19、20行重写doPost方法,里面有2个重要的参数request和response。下面对它们做详细介绍。
在Servlet API中,Servlet Request接口的唯一子接口是HttpServletRequest,HttpServletRequest接口的唯一实现类是HttpServletRequest Wrapper,request对象是HttpServlet Request Wrapper类的实例。Servlet/JSP中大量使用了接口而不是实现类,体现了面向接口编程。
request内置对象是由Tomcat创建的,其重要的三个功能是封装HTTP请求参数信息、进行属性值的传递以及完成服务端跳转。
(1)一旦HTTP请求报文发送到Tomcat中,Tomcat对数据进行解析,立即创建request对象,并对参数赋值,然后将其传递给对应的JSP/Servlet。一旦请求结束,request对象就会被立即销毁。当服务端跳转时,由于仍然是同一次请求,因此这些页面会共享一个request对象。
(2)request对象的内存模型可以简单地划分为参数区和属性区。参数区存放的是Tomcat解析HTTP请求报文后提取出来的请求参数名和参数值。对于单值参数,只有String get Parameter(String name)方法,得到对应的字符串对象的地址引用。对于多值参数,比如表单中的复选框,因为可以选择多个参数,所以同一个参数名会对应多个参数值,request对象通过String[]getParameter Values(String name)方法可以得到这个多值参数的数组对象地址引用。(www.xing528.com)
属性区存放的是JSP/Servlet中使用set Attribute(String name,Object o)方法设定的属性名和属性值,然后可以通过Object get Attribute(String name)方法得到属性值对象,需要Object类型对象进行向下转型。设定属性的目的是利用request对象在不同JSP/Servlet中传递数据。void removeAttribute(String name)方法用于删除ServletRequest对象中指定名称的属性。
(3)request对象提供了一种服务端跳转的方法。Servlet Request接口通过Request Dispatcher get Request Dispatcher(String path)方法获取一个Request Dispatcher对象,该对象封装的参数path为想要跳转的目标路径。path必须以“/”开头,表示当前Web应用的根目录。
在Servlet API中HttpServletResponse接口继承了ServletResponse接口,并提供了与HTTP协议有关的方法,这些方法的主要功能是设置HTTP状态码和管理Cookie。HttpServlet Response对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头、发送响应状态码的方法。
查看web.xml文件,可以看到通过向导已经将QueryServlet类的相关配置添加进去了,如图13-27所示。
图13-27 web.xml配置
url-pattern标签中的值是要在浏览器地址栏中输入的url,可以自己命名,这个url访问名为servlet-name中值的servlet,两个servlet-name标签的值必须相同(参考程序第21~23行),再通过servlet标签中的servlet-name标签映射到servlet-class标签中的值,最终访问servlet-class标签中的具体类(参考程序第15~20行)。
对创建好的QueryServlet类书写doPost方法内容。最终代码如图13-28所示。
图13-28 QueryServlet类
(1)程序第21行等价于下面两行代码的功能,用于解决HTTP响应在浏览器中输出时显示乱码问题。
(2)通常向服务器发送请求数据都需要先请求一个页面,然后用户在页面中输入数据。因为页面是服务器响应给客户端浏览器的,因此这个页面本身的编码由服务器决定。用户在页面中输入的数据也是由页面本身的编码决定的。因此,客户端以UTF-8字符编码的形式将表单数据传输到服务器端。根据POST方式或GET方式提交,服务器端分别处理如下:
程序第20行,当客户端通过POST请求发送数据给服务器时,可以先通过request.setCharacter Encoding方法指定编码,然后再使用reuqest.getParameter方法来获取请求参数,这样就会用指定的编码来读取request对象。因此,对于POST请求,服务器可以指定编码,如果没有指定编码,服务器默认使用ISO-8859-1解读。
但是,对于通过GET方式提交请求数据给服务器时,服务器即使使用request.setCharacter Encoding方法指定编码解读也是无效的,依旧使用默认的ISO-8859-1来读取request对象。解决方法是:在使用request.get Parameter获取字符串数据后,将字符串按照ISO-8859-1编码转换回字节数组,再对该字节数组重新指定编码构建字符串,解决乱码问题。代码如下:
(3)程序第22行,利用request对象的get Parameter方法获取JSP页面提交上来的username参数值。
(4)程序第23、24行,创建一个Bank AccountService业务对象,并调用该对象的query方法进行查询业务,同时将从客户端获取的username参数传递到业务层,按照分层思想,由业务层完成相关业务逻辑。
(5)程序第25行,利用request对象增加了一个属性名为bankaccount、属性值为bank Account的对象,用于存放业务层返回的结果,目的是传递属性。
(6)程序第26行,利用request对象得到了RequestDispatcher对象,调用forward方法完成服务端跳转到下一个JSP页面处理,前后页面共享request对象和response对象,request对象中也包含程序第25行新增的属性对象,传递到下一个页面处理。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。