使用Servlet处理HTTP请求

来源:互联网 发布:某娱乐网投稿页面源码 编辑:程序博客网 时间:2024/06/06 17:24
Servlet接受请求信息

HttpServletRequest对象主要用于获取由客户端发送过来的请求头、参数、文件、数据等。Servlet存在的主要目的就是处理请求

GET/POST提交方法

浏览器向Web服务器发送HTTP请求
用户在网页上点击一个超连接
用户提交在网页上填写好的表单
用户在浏览器地址栏中输入URL地址并回车  
默认情况下都是使用HTTP协议的GET方法提交请求
定制浏览器行为


GET/POST提交方法区别

何时使用GET/POST方法:
1:请求一个静态页面或图形文件时使用GET方法,因为仅仅需要发送文件名;
2:发送大数据的时候,使用POST方法;
3:上传文件时,使用POST方法;
4:发送用户名、密码或其他保密信息的时候使用POST方法

HttpServlet处理GET/POST请求

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        ...
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

获取HTTP协议请求行

HttpServletRequest对象的如下方法访问
getMethod():获取HTTP的请求方法,例如GET、POST等
-getRequestURI():获取请求的URI资源
getRequestURL():获取请求的URL,包含协议名、服务器名或IP、端口号和请求资源但不包括查询字符串参数
getQueryString():获取请求URL后面的查询字符串
getProtocol():获取HTTP的协议名和版本号
getContextPath():获取请求URI资源的上下文路径
getServletPath():获取Servlet的映射路径

获取HTTP协议请求头

HTTP请求头用于告诉服务器客户端使用什么软件以及客户端想要服务器如何返回请求的信息
HttpServletRequest对象的如下方法访问
getHeader(name):返回指定的请求头的值
getHeaders(name) :返回一个Enumeration(枚举)包含请求头中的所有值
getHeaderNames():特定请求中接受到的所有请求头的名称
getIntHeader(name):获取特定请求头的值,并将其转化为int类型
getDateHeader(name):获取特定请求头的值,并将其转化为Date类型  

获取所有请求头

Enumeration enum = request.getHeaderNames();
      while (enum.hasMoreElements()) {
        String headerName = (String) enum.nextElement();
        String headerValue = request.getHeader(headerName);
        out.print("<b>"+headerName + "</b>: ");
        out.println(headerValue + "<br>");
      }

获取浏览器类型

String userAgent = request.getHeader("User-Agent");
if((userAgent != null) && (userAgent.indexOf("MSIE")!=-1) )
{
    message = "您正在使用MicroSoft IE浏览器";
}
else if((userAgent != null) &&
        (userAgent.indexOf("Firefox")!=-1) )
{
    message = "您正在使用FireFox火狐浏览器";
}

获取请求消息体

消息体可以是普通文本也可以是二进制数据


HttpServletRequest对象可以使用通用的方法来获取表单数据

获取表单数据

HttpServletRequest对象用下列方法以访问请求参数
getParameter(parameterName):获取表单参数的值,参数名区分大小写,与HTML表单中出现的参数名一致,GET请求还是POST请求都可以采用相同的方式
getParameterValues(parameterName):获取同一个参数名的多个参数值,返回字符串数组对象
getParameterNames():以Enumeration (枚举)的方式返回请求中所有的表单参数名列表

Enumeration enum = request.getParameterNames();
    while (enum.hasMoreElements()) {
      String pName = (String) enum.nextElement();
      String[] pValues = request.getParameterValues(pName);
      out.print("<b>"+pName + "</b>: ");
      for (int i=0;i<pValues.length;i++) {
        out.print(pValues[i]);
      }
      out.print("<br>");
    }

获取原始表单数据

POST请求不仅可以传输文本信息还可以传输二进制数据
getParameter()方法能获取二进制数据吗?
使用HttpServletRequest对象提供的getInputStream()或getReader()方法直接访问表单数据
利用输入流分析原始的输入

请求派发

每个客户的请求可以传递给很多Servlet以及Web应用程序中的其它资源
整个过程完全是在服务器端完成
不需要任何客户端浏览器的行为
不需要在客户端浏览器和服务器端之间传递特殊信息
通过javax.servlet.RequestDispatcher对象实现

请求派发的实现

调用ServletRequest对象的方法:
getRequestDispatcher(path):方法返回给定路径的RequestDispatcher对象
getNamedDispatcher(name) :返回某个名称的Servlet的RequestDispatcher对象
RequestDispatcher对象提供了两种方法:
forward(ServletRequest, ServletResponse):派发请求和响应对象到RequestDispatcher 对象所确定的新资源(Servlet、JSP或者HTML等)
include(ServletRequest, ServletResponse)该方法关键是能包含服务器端的资源

forward()方法意味着把请求和响应派发给别的资源后,就不会再去做任何处理了

include() 方法意味着请求别人帮助处理请求,但这并不是完全移交,只是暂时地把控制交给别人

request.getRequestDispatcher("/sucess.html").forward(request, response);


请求转发中的跳转示意图

请求范围

变量可以保存在请求范围中
在请求范围之外就不能进行访问了

Servlet1:
request.setAttribute("value", param);
Servlet2:
String value = (String)request.getAttribute("value");

请求范围仅仅作用在与一个请求相关的两个资源之间

总结

HttpServletRequest对象主要用于处理分析请求
默认情况下,使用HTTP协议的GET方法提交请求
HTML表单通过“method”属性使浏览器使用HTTP POST方法
GET/POST方法适用于不同场合
HttpServletRequest对象中最常用的方法是获取请求表单参数
HttpServletRequest对象也可以得到请求中参数的原始字节数据
重定向和请求派发之间最大的区别在于,重定向让客户端浏览器来完成,而请求派发是在服务器端做工作
HttpServletRequest可以把一个对象用名字绑定在请求范围内,并且进行访问和删除


0 0
原创粉丝点击