首页 > 其他分享 >2022-08-30 第二小组 张鑫 学习笔记

2022-08-30 第二小组 张鑫 学习笔记

时间:2022-09-20 20:34:20浏览次数:71  
标签:do req 请求 张鑫 08 30 key resp name

实训五十二天 Servlet

学习内容

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)

常见传参

get , post

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

超级链接:get

表单:可以是 get或 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.重定向可以到任意地址,转发之能在项目内转发

标签:do,req,请求,张鑫,08,30,key,resp,name
From: https://www.cnblogs.com/zxscj/p/16712442.html

相关文章

  • Luogu T273083 新的题目 题解
    怕放洛谷有人看,就搬过来了。本题解提供一个\(O(qn)\)的做法(实际上是暴力的优化)。先考虑暴力求解。对于每个操作,要求代价\(W\times(\sum_{i\inX}^{i}w[i]\times......
  • 30.Serializers模块源码解析
    rest_framework序列化类的继承关系field类:序列化基类的基类BaseSerializer:继承field派生ListSerializer序列化类Serialize......
  • 做题记录整理dp3 P1108. 低价购买(2022/9/20)
    P1108.低价购买第一问很明显是一个最长下降子序列第二问就是一个求方案数,有点难想的就是去重感觉这题难度标的有点偏高#include<bits/stdc++.h>#definefor1(i,a,b)......
  • 第308场周赛
    这次差两分钟做出最后一道题第308场周赛2389.和有限的最长子序列我用的双重循环,时间复杂度挺高的,但是蛮有意思的哈哈哈classSolution{public:vector<int>a......
  • 2022.9.20 1005-1008
    1005#include<stdio.h>#include<stdlib.h>#include<math.h>intmain(){unsignedlonglongn;scanf("%llu",&n);unsignedlonglongm=(unsignedlonglong......
  • 2022.08.24 模拟赛小结
    2022.08.24模拟赛小结题面链接(这个链接只是为了自己方便找,页面设置权限了,不要尝试访问)更好的阅读体验戳此进入(建议您从上方链接进入我的个人网站查看此Blog,在Luo......
  • 2022.08.27 模拟赛小结
    2022.08.27模拟赛小结目录2022.08.27模拟赛小结题面更好的阅读体验戳此进入赛时思路T1T2T3T4正解T2T1T3T4UPD题面链接(这个链接只是为了自己方便找,页面设置权限了,不......
  • 2022.08.31 模拟赛小结
    2022.08.31模拟赛小结目录2022.08.31模拟赛小结题面更好的阅读体验戳此进入赛时思路T1T2T3正解UPD题面PDF链接原题题包(计蒜客)去掉了T4,其余有部分改动(这个链接只......
  • T1008: 计算(a+b)/c的值(信息学一本通C++)
    [题目描述]给定3个整数a、b、c,计算表达式(a+b)/c的的值。[输入]只有一行,包括三个整数a、b、c,数与数之间以一个空格分开。(-10,000<a,b,c<10,000)[输出]只有一行,即表......
  • JSR303数字校验
    天空和我的中间,只剩下倾盆的思念简单校验使用示例:引入对应的校验依赖<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring......