首页 > 其他分享 >2022-08-30 day38 第一小组 王鸣赫

2022-08-30 day38 第一小组 王鸣赫

时间:2022-09-05 18:45:42浏览次数:70  
标签:req 请求 day38 08 30 key 转发 resp name

目录

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

标签:req,请求,day38,08,30,key,转发,resp,name
From: https://www.cnblogs.com/wmh19990109/p/16659181.html

相关文章

  • 2022-08-29 day37 第一小组 王鸣赫
    目录JAVAweb一,软件架构二,资源分类三,常见的wed服务器四,常见的服务器软件动态服务器静态服务器TomcatTomcat的启动Tomcat的关闭访问五,Tomcat部署项目六,ServletServlet创建Se......
  • 2022-08-26 day36 第一小组 王鸣赫
    目录JS库JQuery选择器层级选择器过滤选择器内容选择器属性选择器事件window.onload和JQuery文档就绪函数的区别?分别什么时候触发?事件的操作添加事件jQueryHTML/CSS方法......
  • 【The connection to the server localhost:8080 was refused - did you specify the
    问题k8s报错$kubectlgetnodeTheconnectiontotheserverlocalhost:8080wasrefused-didyouspecifytherighthostorport?解决方法将master节点中的/......
  • Day38注解和反射
    注解Annotation的作用:不是程序本身,可以对程序作出解释(这一点和注释(comment)没什么区别)。可以被其他程序(如:编译器等)读取。Annotation的格式:注解是以"@注释名"在代......
  • papamelon 305. 求和方案 Sumsets
    https://www.papamelon.com/problem/305给你一个数N,只能用2的幂次求和组成,问总共有多少种方案.输入包含多组测试数据,输入以EOF作为结束标志.每组测试数据包含一个......
  • 2022-08-27 田龙跃 web前端(JS)
    原生JS数据类型Number-数字String-字符串Boolean-布尔型null-空undefined-未定义变量(同var功能相同)letnum1=“das”(let会自己检查变量是否重复定义)constnum......
  • 20201330马榕辰第一,二章学习笔记
    第一章: 一.知识点归纳:第一章前半部分重在介绍课程和书本的基本情况,包括Unix / Linux的历史,其各种发行版,我了解到了一些基本情况。后半部分主要是 Linux的使用,Lin......
  • 20201306吴龙灿学习笔记
    一、知识点归纳:第一章:引言主要内容:第一章是本书的引子,因为本书意在让我们学会Unix以及Linux相关只是,在高级语言的基础上进一步学习创造编程平台的基本语言,让我们学会硬......
  • 【django学习-08】视图之HttpResponse文件下载
    一:前言:响应内容除了返回网页信息外,还可以实现文件下载功能,是网站常用的功能之一。Django提供三种方式实现文件下载功能,分别是HttpResponse,StreamingHttpResponse和FileRe......
  • 20201305学习笔记1
    第一章引言总述:在第一章刚开始这本书引入了Linux系统,告诉了我们Linux系统的发展历程和它的一些运行模式,他的版本,其中最主要讲的就是unbuntuLinux版本,讲了他的一些常用......