Request与Respons

Servlet之Request:

常用方法:

  • getRequestURL:获取客户端的完整URL
  • getRequesURI:获取请求行中的资源名部分
  • getQueryString:获取请求行的参数部分
  • getMethod:获取请求方式
  • getSchema:获取请求的协议
  • getRemoteAddr:获取客户端的ip地址
  • getRemoteHost:获取客户端的完整主机名
  • getRemotePort:获取客户端的网络端口号
package com.wp;/*
 *@author wupeng
 *@time 2021/6/21-11:55
HttpServler用来存放客户端请求的参数
请求行
请求头
请求体
 */

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/request")
public class RequestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost");
        this.doGet(req,resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get请求");
       /*
       获取请求行数据
        */
        //获取请求方式
        String  method = req.getMethod();
        System.out.println(method);
        //获取请求的完整地址
        StringBuffer url = req.getRequestURL();
        System.out.println(url);
        //获取资源路径
        String requestURI = req.getRequestURI();
        System.out.println(requestURI);

        String schema = req.getScheme();
        System.out.println(schema);

        /*
        获取请求头数据
        根据Key获取value
         */
        String header = req.getHeader("User-Agent");
        System.out.println(header);
        //获取请求头信息中的所有key的枚举对象
        Enumeration<String> headerNames = req.getHeaderNames();
        while(headerNames.hasMoreElements()) {
            String key = headerNames.nextElement();
            String value = req.getHeader(key);
//            System.out.println(headerNames.nextElement());
            System.out.println(key+" "+value);
        }

        /*获取用户请求
        无论请求方式是Post还是Get,获取用户数据的方式不变
         */
        String name = req.getParameter("name");
        String pwd = req.getParameter("pwd");
        System.out.println(name);
        System.out.println("pwd");
        //获取用户数据中的所有key
        Enumeration<String> parameterNames = req.getParameterNames();
        while(parameterNames.hasMoreElements()) {
            System.out.println(parameterNames.nextElement());
        }

        //获取相同key的多个数据值,例如checkbox
        String[] favs = req.getParameterValues("fav");

        for(String f:favs) {
            System.out.println(f);
        }
        //其他常用方法
        //获取请求行参数
        String queryString = req.getQueryString();
        System.out.println(queryString);
//        - getSchema:获取请求的协议
        String scheme = req.getScheme();
        System.out.println(schema);
//                - getRemoteAddr:获取客户端的ip地址
        String remoteAddr = req.getRemoteAddr();
        System.out.println(remoteAddr);
//                - getRemoteHost:获取客户端的完整主机名
        String remoteHost = req.getRemoteHost();
        System.out.println(remoteHost);
//                - getRemotePort:获取客户端的网络端口号
        int remotePort = req.getRemotePort();
        System.out.println(remotePort);
    }
}

Servlet之Respons:

HttpServletResponse对象是服务器的响应对象,这个对象中封装了向客户端发送数据,发送响应头,发送响应状态码的方法

服务器的一个响应对象,

  • 设置响应头
    • setHeader(String key,String value)添加响应信息,key重复会覆盖
    • addHeader(String key,String value)添加响应信息,key重复不会覆盖
  • 设置响应状态
    • sendError(int num,String msg)添加响应状态
  • 设置响应实体
    • getWriter().write(msg)响应具体的数据给浏览器

代码:

package com.wp;/*
 *@author wupeng
 *@time 2021/6/21-20:26
response:表示服务端返回数据的响应对象,
响应头:
响应行:
响应体:

 */

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/response")
public class ResponseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("this is get");
        /*设置响应头,按照key-value键值对的方式来设置
        如果存在相同的key两者都可以添加,set会进行覆盖,add不会进行覆盖
         */
        resp.setHeader("hehe","haha");
        resp.addHeader("beijing","shanghai");
//        添加响应状态
        resp.sendError(404,"not found");
//        响应具体的数据给浏览器
        resp.getWriter().write("写入");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("this is post");
        this.doGet(req, resp);
    }
}

实现小项目实现:

登录小项目流程:

1.使用原生的方式生成页面

2.客户端先发送请求

3.用户填写相应的用户数据,发送请求给服务器

4.服务端将收到的请求后进行逻辑处理

5.服务端将处理之后的结果返回给客户端

乱码问题解决:

1、使用String重新进行编码
String name = new String(name.getBytes("ios-8859-1"),"utf-8")

2、get请求乱码

  • request.setCharacterEncoding("utf-8");
  • 在server.xml中添加属性useBodyEncodingForURl=true

3.post请求乱码

request.setCharacterEncoding("utf-8");

4.response乱码
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8")

Servlet请求转发和重定向:

登录失败之后重新定位到登录页面,

重定向和请求转发的区别?

Servet request作用域:

不同Servlet之间如何实现数据共享?

request.setAttribute(Object key,Object value)

request.getAttribute(Object key)

重定向:

①浏览器发送两次请求

②浏览器的地址发生变化

③请求过程产生两个request对象和两个response对象

④两个servlet不能共享同一个request和response对象

posted @ 2021-06-23 22:15  IT小五  阅读(136)  评论(0)    收藏  举报