Servlet--HTTP请求、响应处理
1.HttpServletRequest
当HTTP转发给Web容器处理时,Web容器会收集相关信息,并产生HttpServletRequest对象,使用这个对象可以取得所有HTTP请求中的信息。
处理请求时最基本的就是取得请求参数,可以使用getQueryString()取得请求的查询字符串,使用getParameter()取得请求参数的值。
String username = request.getParameter("name");(获取请求参数name的值)。getParameter()方法返回的是String对象,如果传来的是如“123”这样的字符串值,而需要处理的是基本数据类型,可以使用Integer.parseInt()方法转换。其他常用方法有getParameterValues()和getParameterNames()。
String[] values = request.getParameterValues("param");(param参数有多个值)。
如果想知道请求中有多少个请求参数,可以使用getParameterNames()方法:
Enumeration e = request.getParameterNames();
while(e.hasMoreElements()) {
String param = (String)e.nextElement();
out.println(param + "<br>");
}
getHeaderNames()方法可以取得浏览器所发出的所有标头值。
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ShowHeader extends HttpServlet {
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet ShowHeader</title>");
out.println("</head>");
out.println("<body>");
Enumeration e = request.getHeaderNames();
while (e.hasMoreElements()) {
String param = (String) e.nextElement();
out.println(param + ": " + request.getHeader(param) + "<br>");
}
out.println("</body>");
out.close();
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
如果想要将请求转发给其他的Servlet,可以使用HttpServletRequest的getRequestDispatcher()方法取得RequestDIspatcher对象。之后执行foward()方法转发请求。
RequestDispatcher dispatcher = request.getRequestDispatcher("some.do");
dispatcher.foward(request, response);
执行foward()之前不能对浏览器有确认(commit)的回应(也就是真正的HTTP回应给浏览器)。
在请求转发的过程中,如果有需要共享的数据或对象,可以将之设置为请求范围属性(Request Scope Attribute)。
List books = bookDAO.query("some books");
request.setAttribute("books", books);
request.getRequestDispatcher("result.view").foward(request, response);
则在负责响应的servlet中可以使用getAttribute()取得查询结果:
List books = (List)request.getAttribute("books");
2.HttpServletResponse
多数情况下,setContentType()和getWriter()是在编写响应servlet时要使用的方法。setContentType()必须在任何响应确认之前执行。
sendRedirect()可以要求浏览器重新请求另一个URL,这个方法会在回应中设置HTTP状态码301以及Location标头,浏览器接收到这个标头后会使用GET方法请求指定的URL,这个方法必须在响应未确认之前执行。
大部分情况下,我们会从HttpServletResponse对象取得PrinterWriter对象,使用println()对浏览器进行字符输出,有时需要直接对浏览器进行字节输出,可以利用getOutputStream()方法取得ServletOutputStream对象。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Ebook extends HttpServlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String passwd = request.getParameter("passwd");
if("123456".equals(passwd)) {
response.setContentType("application/pdf");
InputStream in = this.getServletContext()
.getResourceAsStream("/WEB-INF/jdbc.pdf");
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int length = -1;
while((length = in.read(buffer)) != -1) {
out.write(buffer, 0, length);
}
in.close();
out.close();
}
}
}