JavaWeb:Servlet之二

HTTP协议

  • 什么是协议
  • 协议是指双方或多方,相互约定好的,都需要遵守的规则,叫协议
  • 所谓HTTP协议,就是指,客户端和服务器发送的数据需要遵守的协议
  • HTTP协议中的数据又称报文
  1. 客户端给服务器发送数据叫请求
  2. 服务器给客户端回传数据叫响应

请求行

  1. 请求方式(GET/POST)
  2. 请求的资源路径
  3. 请求的协议(HTTP/1.1)

请求头(GET)

  1. Accept:告诉服务器,客户端可以接受什么类型的数据
  2. Accept-Language:告诉服务器,客户端可以接受的语言类型(zh_CN/en_US)
  3. User-Agent:用户的代理(浏览器的信息)
  4. Accept-Encording:告诉服务器,客户端可以接受的数据编码
  5. Host:表示请求的服务器的ip和端口号
  6. Connection:告诉服务器链接如何处理
    1. Keep-Alive:告诉服务器回传完数据不要立即断开连接保存一小段时间
    2. Closed:告诉服务器回传完数据马上关闭

请求头(POST)

大部分的请求头是一样的

  1. Referer:表示请求发起时,浏览器中的地址
  2. Content-Type:表示发送的数据的类型
    1. application/x-www.form-urlencoded:表示通过键值对的方式进行提交,然后对其进行url编码
      1. url编码是将非英文的内容转换为%xx%xx的形式
    2. multipart./form-data:表示以多段的形式提交给服务器(通过流的方式)
  3. Content-Length:表示发送数据的长度
  4. Cashe-Control:表示如何控制缓存
    1. no-cashe不缓存

HTTPServletRequest

每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法( doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所有请求的信息。

常用方法

  • getRequestURI:获取资源路径

    request.getRequestURI();
    //返回值为/W1_3/servletapi
    
  • getRequestURL:获取资源的统一资源定位符(绝对路径)

    request.getRequestURL();
    //返回值为http://localhost:8080/W1_3/servletapi
    
  • getRemoteHost:获取客户端的ip

    System.out.println(request.getRemoteHost());
    //返回值为127.0.0.1
    
  • getHeader:获取请求头

    System.out.println(request.getHeader("Accept"));
    
  • getParameter:获取请求的参数

  • getParameterValues:获取请求的参数(多个)

  • getMethod:获取请求的方式(GET或POST)

     System.out.println(request.getMethod());
    
  • setAttribute(key,value):设置域数据

    request.setAttribute("key1","value1");
    
  • getAttribute(key):获取域数据

    request.getAttribute("key1");
    
  • getRequestDispatcher:获取请求转发对象

  • setCharacterEncoding("UTF-8"):设置字符集,必须放在最前面

    request.setCharacterEncoding("UTF-8");
    String username = request.getParameter("username");
    String pwd = request.getParameter("pwd");
    System.out.println("用户名:"+username);
    System.out.println("密码:"+pwd);
    

请求的转发

request.getRequestDispatcher(url).forward(request,response)

请求转发的特点

  • 浏览器的地址栏没有变
  • 他们是一次请求
  • 他们共享Request域中的数据
  • 可以转发到WEB-INFO目录下
  • 无法访问工程以外的资源

在跳转时,浏览器的地址栏不变,在a标签使用../../..的形式时,可能会出错

使用base标签可以设置当前页面中所有相对路径工作时,参照哪个路径进行跳转。

<base href="xxxx">

相对路径和绝对路径

相对路径

  • . 表示当前木库
  • .. 表示上一级目录
  • 资源名:表示当前目录/资源名

绝对路径

http://ip:port/工程名路径/资源路径

斜杠

"/"被浏览器解析为http://ip/port

"/"被服务器解析为http://ip/port/工程路径

特殊的情况:response.sendRediect("/")指将斜杠发送给浏览器解析

HttpServletResponse

与HttpServletResquest类似,每次请求进来,Tomcat都会创建一个Response对象。


使用两个流,一个字符流、一个字节流。两个流只能同时使用一个,不能一起使用。

getOutPutStream() 字节流 常用于下载(传递二进制文件)

getWrite() 字符流 常用于回传字符串(常用)

//谷歌使用GBK字符集,因此想要在谷歌浏览器中输出内容,需将服务器的字符集改为GBK
response.setCharacterEncoding("GBK");
PrintWriter writer = response.getWriter();
writer.println("喵喵喵");

或者

response.setCharacterEncoding("UTF-8");
//或者通过响应流修改浏览器的字符集
response.setHeader("Content-Type","text/html; charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.println("喵喵喵");
response.setContentType("text/html; charset=UTF-8");
//如上方法可以修改服务器和客户端的编码表
//此方法必须在获取流对象之前才有效。

请求重定向

随着时间的推移和项目的不断更新、升级,Response1这个接口慢慢被废弃,由新的接口Response所取代。客户端请求时需进行响应,响应代码为302(我已搬迁)然后在location响应头上给出新的地址,客户端解析地址后重新进行请求。

//---------Response1-----------
System.out.println("快被淘汰了!");
response.setStatus(302);
response.setHeader("Location","http://localhost:8080/W1_3/response2");

//---------Response2-----------
System.out.println("已经代替它了!");

请求重定向的特点

  1. 浏览器地址栏会产生变化
  2. 发送了两次请求
  3. 不共享Request里的数据
  4. 不能访问WEB-INF下的资源
  5. 可以访问工程外的资源

请求重定向的第二种方法

response.sendRedirect("http://localhost:8080/W1_3/Response2");

JAVAEE的三层模式

image

posted @ 2022-01-03 22:08  Boerk  阅读(50)  评论(0)    收藏  举报