2022-09-01 第六小组 张宁杰 request&response

HttpServletRequest // 请求

所有和请求相关的操作

当请求来的时候,request就被实例化

HttpServletResponse // 响应

所有和响应的操作

当请求来的时候,response就被实例化

服务端给出响应

// 中文处理,设置响应的字符集
// 放在获取流之前
response.setCharacterEncoding("utf-8");
// 添加响应头,告诉浏览器以html格式来解析响应字符串
response.addHeader("content-type","text/html;charset=utf-8");


PrintWriter out = response.getWriter();
out.write("a");
out.flush();
out.close();

路径匹配

路径匹配:必须有 /

扩展名匹配:不能有 /

反例:/user/*.do hello/user.do

默认匹配:<url-pattren>/</url-pattren>

路径匹配和扩展名无法同时设置

/ 和 /* 的区别

/* 属于路径匹配,可以匹配所有的请求,路径匹配优先级仅次于精确匹配 ,会覆盖所有的扩展名匹配

/ 是 servlet 中特殊的匹配模式,优先级最低,不会覆盖任何的 url-pattren ,匹配所有的请求

搜可以拦截静态资源

servlet加载时期

inti 方法什么时候执行:当第一次访问 servlet 的时候被调用,延迟加载

初始化方法只执行一次,

设置启动就加载

@WebServlet(value = "/hello.do", loadOnStartup = 1)

常见传参有2种:

get , post

浏览器地址栏直接输入是 get

超级链接:get

表单:可以是 ge t或 post

GET 和 POST 区别

GET :参数会在地址栏显示出来,不安全,请求长度限制为1 K 之内,没有请求体,无法通过 request 设置一些参数

POST :请求的参数不会在浏览器地址栏显示,相对安全,把请求的参数封装成一个数据报文(请求体),请求参数长度没有限制

获取一个key对应的多个值

//根据key获取对应value
        req.getParameter("");
        
        // 获取一个Key对应的多个值,返回值为String类型的数组
        String[] hobbies = req.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies));

        // 获取传过来的 key 值,可根据key值获取对应value值
        Enumeration<String> parameterNames = req.getParameterNames();
        while(parameterNames.hasMoreElements()){
            System.out.println(parameterNames.nextElement());
        }

        // 可以获取到请求中的所有的键值对
        // 这个map集合的key是String,value是String[]
        // name=a,pass=a,hobby=o,s,f,gender=man
        Map<String, String[]> map = req.getParameterMap();
        for (Map.Entry<String, String[]> name : map.entrySet()) {
            String key = name.getKey();
            String[] value = name.getValue();
            System.out.printf(key + "  --->  " + Arrays.toString(value));
        }

请求转发

请求转发是在服务器上完成的,跟客户端无关

req.getRequestDispatcher("zhuan1.do").forward(req,resp);
@WebServlet("/zhuan.do")
public class ZhuanFaServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * 请求转发 --- 由多个servlet来处理一个请求
         */
        String name= req.getParameter("name");

        // 要传一个参数,转发的servlet地址
        req.getRequestDispatcher("zhuan1.do").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}
@WebServlet("/zhuan1.do")
public class ZhuanFa1Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name= req.getParameter("name");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
    }
}

作用域

@WebServlet("/zuoyongyu.do")
public class ZuoYongYuServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * 作用域
         * 往request作用域中添加了属性name对应的值是zhangsan
         * 请求转发的时候是同一个request
         * 
         */
        req.setAttribute("name","zhangsan");
        // 取出
        System.out.println(req.getAttribute("name"));
        req.getRequestDispatcher("zuoyongyu1.do").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

其他方法

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 根据key删除value
        req.removeAttribute("name");

        // 获取req作用域种所有的key
        Enumeration<String> attributeNames = req.getAttributeNames();
    }

Response的方法

resp.getWriter();
resp.setCharacterEncoding("utf-8");
resp.addHeader("content-type","text/html;charset=utf-8");

// 重定向
resp.sendRedirect("a.html");

重定向和请求转发的区别

1.重定向是2次请求,请求转发是一次请求

2.重定向是客户端行为,请求转发是服务器行为

3.重定向是浏览器地址会改变,转发不会

4.重定向可以到任意地址,转发之能在项目内转发

posted @ 2022-09-08 16:54  贵妃就是贵妃  阅读(20)  评论(0编辑  收藏  举报