Servlet编程的工作核心是处理客户端提交的信息,生成动态响应信息返回到客户端。那么如何处理请求信息 ?
一、请求参数
客户端以表单的方式向服务器提交数据,其方法有两种Post方法和Get方法。前者一般用于更新服务器上的资源,使用时提交的数据包含HTTP实体数据内。后者一般用于查询服务器上的数据,使用时提交的数据请求地址的后面。对于两种方法提交的数据,Servlet处理的方法一样,只要简单的调用HttpServletRequest的getParameter()方法,给出变量名称即可获得变量的值。
二、Header
在接收到的请求信息中,除了用户提交的参数外,还有一类重要的信息称为Header,它们相当于客户端和浏览器之间通信的控制信息,如浏览器类型、客户端操作系统等,及其对服务器返回的响应的一些特殊要求,如可以接受的内容类型、编码格式等。通过这些Header,Servlet将可以更加灵活的生成适应客户端需求的各种的响应。读取Header的值很简单,只要调用HttpServletRequest的getHeader方法,参数为Header的名称,返回值为String类型的Header内容。如果指定的Header不存在,返回null。一个Header可能对应多个值,此时可调用getHeaderNames将返回一个Enumeration,它代表指定名称的Header的所有值。
三、上传文件
HttpServletRequest提供了两个方法用于从请求中解析出上传的文件:Part getPart(String name)和Collection<Part>getParts()。前者用于获取请求中指定name(指上传的组件名而不是文件名)的文件,后者用于获取所有的上传文件。每一个文件用一个javax.servlet.http.Part实例来表示,它代表了上传的表单数据的一部分,可以有自己的数据实体、Header信息等。Part接口提供了处理文件的简易方法,比如write()、delete(),因此利用HttpServletRequest来保存上传的文件变得非常简单。
四、异步处理
对于Servlet组件接收到的每个请求,都会产生一个线程来处理请求并返回响应,如果请求处理是一项非常耗时的过程,如需要访问Web服务或者后台数据库,Web容器将产生大量的线程,导致性能急剧恶化。
在异步处理模式下,客户端请求的处理流程为:当Servlet接收到请求后,首先需要对携带的数据进行一些预处理,接着,Servelet线程将请求转交给一个异步线程来执行业务处理,线程本身返回至容器并可处理其他客户端的请求,注意此时Servlet还没有生成响应数据,异步线程处理完业务后,可以直接生成响应数据,或者将请求继续装发给其他Servlet。如此一来,Servelt线程不再是一直处于阻塞状态以等待业务逻辑的处理,而是启动异步线程之后可以立即返回。
异步处理除了应用于Servlet,还有Filter组件。