Java Web请求与响应实例详解

  Servlet最主要作用就是处理客户端请求并作出回应,为此,针对每次请求,Web容器在调用service()之前都会创建两个对象,分别是HttpServletRequest和HttpServletResponse。其中HttpServletRequest封装HTTP请求消息,HttpServletResponse封装HTTP响应消息。需要注意的是,Web服务器运行过程中,每个Servlet都会只创建一个实例对象,不过每次请求都会调用Servlet实例的service(ServletRequest req, ServletResponse res)方法,这里HttpServletRequest是ServletRequest的子类,HttpServletResponse是ServletResponse的子类。

  HttpServletRequest和HttpServletResponse接口继承关系图如下所示:

1、HttpServletResponse

  HttpServletResponse接口继承自ServletResponse接口,由于HTTP响应消息分为状态行、响应消息体、消息体三部分,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。虽然HttpServletResponse接口中的方法较多,但是我们常用的也就是那么几个,如果用到其他的方法了可以阅读响应的源码或者相关资料就行了。

发送状态码相关函数

方法 说明
public void setStatus(int sc) 设置响应消息状态码,Web服务器默认产生一个状态码为200的状态行
public void sendError(int sc) 发送表示错误信息的状态码,第二个方法还增加了一个用于提示说明的文本信息
public void sendError(int sc, String msg)

发送响应消息头相关函数

方法 说明
public void addHeader(String name, String value) 设置HTTP响应头字段,name指定字段名称,value指定字段值。addHeader可以增加同名的响应头字段,setHeader则会覆盖同名的头字段
public void setHeader(String name, String value)
public void setContentLength(int len) 设置响应消息的实体内容的大小,单位为字节,即设置Content-Length字段的值
public void setContentType(String type) 设置Servlet输出内容的MIME类型,即设置Content-Type字段的值
public void setCharacterEncoding(String charset) 设置输出内容字符编码,即设置Content-Type字段的值,注意,该方法优先级比setContentType的高
public void sendRedirect(String location) Servlet请求重定向

发送响应消息体相关函数

方法 说明
public ServletOutputStream getOutputStream() 获取HttpServletResponse的字节输出流ServletOutputStram类型
public PrintWriter getWriter() 获取HttpServletResponse的字符输出流ServletWriter类型

中文输出乱码问题

  计算机中的数据都是以二进制形式存储的,因此,传输文本时,就会发生字符的字节之间的转换。字符与字节之间的转换时通过查码表完成的,字符转换为字节的过程称为编码,字节转换为字符的过程称为解码,如果编码和解码使用的码表不一样,则会出现乱码问题。

  注意:HttpServletResponse对象的字符输出流在编码时,默认采用的是ISO 8859-1编码,该编码方式不兼容中文,比如会将"中国"编码为"63 63"(在ISO 8959-1的码表中查不到的字符会显示63)。当浏览器对接收到的数据进行解码时,会默认采用GB2312,将"63"解码为"?",浏览器就将"中国"两个字符解码为"??"。

HttpServletResponse程序示例

package zzz;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Hello extends HttpServlet {
  @Override
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    // 设置响应消息编码,注释后"中国"会显示"??"乱码
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    out.println("hello 中国");
  }
  @Override
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    this.doGet(request, response);
  }
}

  有时会遇到定时跳转页面的问题,HTTP中Refresh头字段可以通知浏览器在指定的时间内自动刷新并跳转到其他页面,网页定时刷新并跳转到指定页面。

package zzz;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Hello extends HttpServlet {
  @Override
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    // 设置响应消息编码
    response.setContentType("text/html;charset=utf-8");
    response.setHeader("Refresh", "2;url=http://www.baidu.com");
    PrintWriter out = response.getWriter();
    out.println("hello 中国,2秒后跳转到百度...");
  }
  @Override
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    this.doGet(request, response);
  }
}

 2、HttpServletRequest

  HttpServletRequest接口继承ServletRequest接口,专门用于封状HTTP请求消息。由于HTTP请求信息包括请求行、请求头和请求体三部分,所以HttpServletRequest接口定义了获取请求行、请求头和请求体的相关方法。

获取请求行的相关方法

方法 说明
public String getMethod() 获取HTTP请求方式,POST、GET等
public String getRequestURI() 获取请求行中资源名称部分
public String getQueryString() 获取请求行中的参数部分
public String getProtocol() 获取请求行中协议名称和版本,如HTTP 1.1
public String getContextPath() 获取请求URL中属于Web应用程序的路径

  其实关于请求行的方法从方法名中就可以看出其作用,这里就不一一贴出来了。

获取请求消息头的相关方法

方法 说明
public String getHeader(String name) 获取指定字段的值,如果没有返回null,如果有多个返回第一个值
public Enumeration<String> getHeaders(String name) 返回一个指定字段的Enumeration集合对象
public Enumeration<String> getHeaderNames() 返回一个包含所有字段的Enumeration集合对象
public String getContentType() 获取Content-Type字段的值

打印请求消息头字段的所有值

package zzz;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Hello extends HttpServlet {
  @Override
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    // 设置响应消息编码
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    Enumeration<String> names = request.getHeaderNames();
    while (names.hasMoreElements()) {
      String name = names.nextElement();
      String value = request.getHeader(name);
      out.println(name + ": " + value + "</br>");
    }
  }
  @Override
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    this.doGet(request, response);
  }
}

获取请求体的相关方法

方法 说明
public ServletInputStream getInputStream() 获取请求的ServletInputStream对象,如果实体内容为非文本,只能通过getInputStream方法获取请求体消息体
public BufferedReader getReader() 获取请求的BufferedReader对象,该对象会将实体内容字节数据转换为指定字符集编码的文本字符串

获取请求参数

方法 说明
public String getParameter(String name) 获取指定的参数值,没有该参数返回null
public Enumeration<String> getParameterNames() 返回一个包含所有参数名的Enumeration对象
public String[] getParameterValues(String name) HTTP请求中可能有多个相同的参数,获取同一个参数名对应的所有参数值

3、RequestDispatcher接口

  当一个Web资源受到客户端请求后,如果希望服务器通知另外一个资源如处理请求,除了使用功能sendRedirect()实现重定向外,还可以通过RequestDispatcher接口的实例对象来实现,在ServletRequest接口中定义了一个获取RequestDispatcher对象的方法--getRequestDispatcher(String path),它返回某个路径所指定资源的RequestDispatcher对象,参数path必须以"/"开头,用于表示当前Web应用的根目录,也就是path路径必须是在本Web程序中,否则会出现异常。

RequestDispatcher接口中方法

方法 功能
public void forward(ServletRequest request, ServletResponse response) 将一个Servlet传递给另外一个Web资源,将请求传递给其他资源进行响应
public void include(ServletRequest request, ServletResponse response) 用于将其他资源作为当前响应内容包含进来

以上所述是小编给大家介绍的Java Web请求与响应实例详解的相关内容,希望对大家有所帮助!

(0)

相关推荐

  • Android中通过RxJava进行响应式程序设计的入门指南

    错误处理 到目前为止,我们都没怎么介绍onComplete()和onError()函数.这两个函数用来通知订阅者,被观察的对象将停止发送数据以及为什么停止(成功的完成或者出错了). 下面的代码展示了怎么使用这两个函数: Observable.just("Hello, world!") .map(s -> potentialException(s)) .map(s -> anotherPotentialException(s)) .subscribe(new Subscrib

  • 为Java应用程序添加退出事件响应

    一个完整的Java应用程序,通常至少要有一个应用程序的结束点.对于一般程序来说,系统开发者根据需要和个人的偏好,会在程序结束位置,通过添加System.exit(0),或System.out(-1),来结束程序,或不加这些指令,让程序自然运行到结束. 如:下列典型代码 package untitled14; /** * This application is to demo how an applcation end */ public class Test { public Test() {}

  • javasciprt下jquery函数$.post执行无响应的解决方法

    在编写javascirpt程序过程中,用$.post方法发送数据,若数据中字符含有'<',将导致$.post无法成功执行. 复制代码 代码如下: var jsonstr='{"value":"abcd<efg"}'; $.post( url, { "jsonstr": jsonstr }, function (data, status) { }); 需要将其转义后再使用,使用下面的transferredChars函数转义后,再传递数据

  • java常见事件响应方法实例汇总

    本文实例汇总了java中常见的事件响应方法,包括容器类监听.监听器类.AbstractAction.反射等.以方便大家参考.具体方法如下: 首先,在Java图形用户界面中,处理事件时所必须的步骤是: 1.创建接受响应的组件(控件) 2.实现相关事件监听接口 3.注册事件源的动作监听器 4.事件触发时的事件处理 相应的可以通过以下的集中方式来作出事件响应. 一.容器类监听    效果:单击窗体中的三个按钮,实现相应的相应时间. import java.awt.*; import java.awt.

  • js前台分页显示后端JAVA数据响应

    好久没有写过代码了,手有些痒了,正好底下小弟们某些功能的实现着实影响工程进度,便自己动手给写了一段. 功能:js前台分页显示 + 后台数据响应(JAVA Servlet即可) 框架:jquery1.8.7 此文目的:给那些刚入行软件开发,喜欢这也看看,那也看看,这儿copy一下,那儿copy一下初级小菜鸟们做一个表帅; 1 为程序者需认真踏实坐下来; 2 程序需要有投入才有收获; 3 有收获才有鼓舞,才有动力一步一步往下走! 下面上代码,具体会有小注释 1.web页面的逻辑处理(js代码写到页面

  • JAVA发送HTTP请求,返回HTTP响应内容,应用及实例代码

    JDK 中提供了一些对无状态协议请求(HTTP )的支持,下面我就将我所写的一个小例子(组件)进行描述:首先让我们先构建一个请求类(HttpRequester ).该类封装了 JAVA 实现简单请求的代码,如下: 复制代码 代码如下: import java.io.BufferedReader;  import java.io.IOException;  import java.io.InputStream;  import java.io.InputStreamReader;  import

  • javaweb servlet中使用请求转发乱码的实现

    乱码的方式有很多,这里指出一种不容易想到的 *请确保您的页面单独访问正常,经过servlet请求转发时,有PrintWriter out = response.getWriter()不正常,没有正常 解决方式是在执行PrintWriter out = response.getWriter();前加上 response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8&

  • javaweb如何实现请求和响应

    先来看一个流程图: 服务器处理请求的流程: (1)服务器每次收到请求时,都会为这个请求开辟一个新的线程.   (2)服务器会把客户端的请求数据封装到request对象中,request就是请求数据的载体!   (3)服务器还会创建response对象,这个对象与客户端连接在一起,它可以用来向客户端发送响应. 由流程图可以看出,在JavaWeb的请求与响应中,最重要的两个参数为request以及response,这两参数在Servlet的service( )方法中. 1.response概念: r

  • Java中HttpServletResponse响应中文出现乱码问题

    以字符串的形式输出. 1.response.getWriter().write("您好中国hello"); 如果这样输出的话.则浏览器结果为: 2.加上代码 response.setCharacterEncoding("UTF-8"); response.getWriter().write("您好中国hello"); 则浏览器结果为: 这是因为浏览器解析问题. 加上代码: response.setHeader("Content-type

  • 使用CORS实现JavaWeb跨域请求问题的方法

    之前用jsonp 解决跨域问题,现在用CORS实现跨域请求解决java 跨域问题: 主要代码如下 package com.hy.fliter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.

随机推荐