request&response

服务器与客户端交流

Request

  • request的继承体系
    
    ServletRequest被HttpServletRequest继承,再由org.apache.catalina.connector.RequestFacade实现.
    

    request方法(以下方法通过request调用)

  • 获取请求行数据
    • 获取请求方式 :GET
      • String getMethod()
    • (*)获取虚拟目录:/day14
      • String getContextPath()
    • 获取Servlet路径: /demo1
      • String getServletPath()
    • 获取get方式请求参数:name=zhangsan
      • String getQueryString()
    • (*)获取请求URI:/day14/demo1
    • 获取协议及版本:HTTP/1.1
      • String getProtocol()
    • 获取客户机的IP地址:
      • String getRemoteAddr()
1
2
3
4
5
String method = request.getMethod();
String contextPath = request.getContextPath();
String servletPath = request.getServletPath();
String protocol = request.getProtocol();
String remoteAddr = request.getRemoteAddr();

URL与URI的区别

1
2
URL:统一资源定位符 : http://localhost/day14/demo1
URI:统一资源标识符 : /day14/demo1
  • 获取请求头数据
    • 通过请求头的名称来获取请求头的数据值.返回一个字符串String
      • getHeader(String name)
    • 获取所有的请求头名称,返回一个String类型的集合
      • getHeaderNames()
1
2
3
4
5
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String value = request.getHeader(name);
System.out.println(name+"---"+value);
  • 获取请求体数据(只有post方式才有请求体,post方式将数据封装)
    
    步骤:
      1. 获取流对象
      *  BufferedReader getReader():获取字符输入流,只能操作字符数据
      *  ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
  1. 再从流对象中拿数据
1
2
3
4
5
6
BufferedReader reader = request.getReader();
String line=null;
while((line=reader.readLine())!=null)
{
System.out.println(line);
}

获取请求参数的通用方式

  • 以下方法不论get还是post请求方式都可以使用下列方法来获取请求参数

    • String getParameter(String name):根据参数名称获取参数值
    • String[] getParameterValues(String name):根据参数名称获取参数值的数组
    • Enumeration getParameterNames():获取所有请求的参数名称
    • Map<String,String[]> getParameterMap():获取所有参数的map集合
  • 中文乱码问题:

    • get方式:tomcat 8 已经将get方式乱码问题解决了
    • post方式:会乱码
      • 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);

请求转发

在一个项目内,访问其他资源

  • 转发请求
    • getRequestDispatcher(目标请求地址):获取转发请求对象.
      • forward(request,response):传入request和response对象完成转发请求
1
2
3
4
5
6
7
8
9
10
@WebServlet("/BrowserReq")
public class BrowserReq extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/Request").forward(request,response);
}
}
  • 方法特点:
    1. 浏览器地址栏地址不会变化
    2. 转发目的地址只能是服务器内部资源
    3. 转发是一次请求

      共享数据:

  • 域对象:一个有作用范围的对象,可以在范围内共享数据
  • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
    • 方法:
      1. void setAttribute(String name,Object obj):存储数据
      2. Object getAttitude(String name):通过键获取值
      3. void removeAttribute(String name):通过键移除键值对

共享数据,在一边存储,另一边取出.

获取ServletContext:

  • ServletContext getServletContext()

    HTTP协议

  1. 请求消息:客户端发送给服务器端的数据
  • 数据格式:
    1. 请求行
    2. 请求头
    3. 请求空行
    4. 请求体
  1. 响应消息:服务器端发送给客户端的数据
  • 数据格式:

    • 响应行
      1. 组成:协议/版本 响应状态码 状态码描述
      2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。都是三位数字
        1. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
        2. 2xx:成功。代表:200
        3. 3xx:重定向。代表:302(重定向),304(访问缓存)
        4. 4xx:客户端错误。
          • 代表:
            • 404(请求路径没有对应的资源)
            • 405:请求方式没有对应的doXxx方法
        5. 5xx:服务器端错误。代表:500(服务器内部出现异常)
    • 响应头:
      1. 格式:头名称: 值
      2. 常见的响应头:
        1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
        2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
          • 值:
            • in-line:默认值,在当前页面内打开
            • attachment;filename=xxx:以附件形式打开响应体。文件下载
    • 响应空行
    • 响应体:传输的数据

      Response对象

      设置响应消息
  • 设置响应行

  • 设置响应头

  • 设置响应体

    重定向

    一种定义资源跳转的方式,它可以访问其他服务器的资源.

  • 重定向的步骤

    • 设置状态码

    • 设置响应头的location参数

      1
      2
      response.setStatus(int num)
      response.setHeader("location","资源路径")

简化重定向:

1
response.setRedirect("资源路径")

特点:

  1. 地址栏发生变化
  2. 重定向可以访问其他服务器的资源
  3. 重定向是两次请求,无法使用request来共享数据.

转发的特点:

  1. 地址栏不变.
  2. 只能访问当前服务器的资源
  3. 一次请求,可以共享数据

服务器输出数据到浏览器

输出字符数据

步骤1. 获取字符输出流

步骤2. 输出数据.

1
2
PrintWriter pw=response.getWriter();
pw.write();

解决输出乱码问题,在获取输出流之前设置浏览器的默认编码.

1
response.setContentType("text/html;charset=utf-8");

输出字节数据

步骤1. 获取字节输出流

步骤2. 输出数据.

1
2
ServletOutputStream os = response.getOutputStream();
os.write();

ServletContext

代表整个web应用,可以和程序的容器(服务器)来通信

  • 获取:

    • 通过request对象获取
      • request.getServletContext();
    • 通过HttpServlet获取
      • this.getServletContext();
  • 功能:

    • 获取MIME类型:String getMimeType(String file)

      • MIME类型:在互联网通信过程中定义的一种文件数据类型
        • 格式: 大类型/小类型 text/html image/jpeg
    • 域对象:共享数据

      • setAttribute(String name,Object value)
      • getAttribute(String name)
      • removeAttribute(String name)
    • ServletContext对象范围:所有用户所有请求的数据

  • 获取文件的真实(服务器)路径

    1. 方法:String getRealPath(String path)

      String b = context.getRealPath(“/b.txt”);//web目录下资源访问
      System.out.println(b);

      String c = context.getRealPath(“/WEB-INF/c.txt”);//WEB-INF目录下的资源访问
      System.out.println(c);

      String a = context.getRealPath(“/WEB-INF/classes/a.txt”);//src目录下的资源访问
      System.out.println(a);