专栏首页逆回十六夜javaWeb idea学习笔记(五)ServletRequest、ServletResponse
原创

javaWeb idea学习笔记(五)ServletRequest、ServletResponse

1.tomcat会根据url的请求的资源路径,创建Servlet对象

2.tomcat会创建request和response对象传递给service方法,并调用service

service(servletRequest,servletResponse)

3.通过request对象获取请求的消息数据

通过response对象获取响应的消息数据

HttpServlet:doGet(HttpServletRequest req,HttpServlet resp),doPost(HttpServletRequest req,HttpServlet resp)

req和resp作为定义的接口没有自己定义实现类,具体的实现是由服务器来完成的,服务器实现了req和resp。

Request对象的继承体系结构:ServletRequst<---继承---HttpServletRequest<---实现---org.apache.catalina.connector.RequestFacade

Request功能:

1.获取请求消息(HTTP报文)数据

  • 获取请求行

获取请求方法:getMethod(),如GET,POST

获取虚拟路径:getContextPath(),如/XXXX,如果为"/"则为空

获取servlet路径:getServletPath(),如/demo1

获取get方式的请求参数:String getQueryString(),如name=zhangsan

获取请求的uri:String getRequestURI,如/demo1

获取请求的url:StringBuffer getRequestURL,http://localhost:8080/demo1

获取协议和版本:String getProtocol()

获取客户机的IP地址:String getRemoteAddr()

......

System.out.println(req.getMethod());
System.out.println(req.getContextPath());
System.out.println(req.getServletPath());
System.out.println(req.getQueryString());
System.out.println(req.getRequestURI());
System.out.println(req.getRequestURL());
System.out.println(req.getRemoteAddr());
  • 获取请求头
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    super.doGet(req, resp);
    System.out.println("Get访问");
    Enumeration<String> headNames=req.getHeaderNames();
    while(headNames.hasMoreElements()){
        String name=headNames.nextElement();
        System.out.println(name);
        String value=req.getHeader(name);
        System.out.println(value);
    }
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    super.doGet(req, resp);
    String agent = req.getHeader("user-agent");
    if(agent.contains("Chrome")){
        System.out.println("我这是用的谷歌浏览器。");
    }
    String referer = req.getHeader("referer");
    System.out.println(referer);
    if(referer.contains("localhost")){
        System.out.println("不错,是本机访问的");
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().write("不错,你是本机访问的。");
    }else{
        System.out.println("居然敢盗链!!!");
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().write("盗链?不行!");
    }
}
  • 获取请求体

请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数

步骤:

1.获取流对象

BufferedReader getReader():获取字符输入流,只能操作字符数据

ServletInputStream getInputStream():获取字节输入流,可以操作所有类型的数据

2.从流对象中拿数据

BufferedReader.readLine()

html样例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>
    <form action="/demo04" method="post">
        <input type="text" placeholder="请输入用户名" name="username"><br>
        <input type="password" placeholder="请输入密码" name="password"><br>
        <input type="submit" value="注册">
    </form>
</body>
</html>

demo4 doPost():

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    super.doPost(req, resp);
    //获取请求消息体
    //1.获取字符流
    BufferedReader br = req.getReader();
    //读取数据
    String line = null;
    while((line = br.readLine())!=null){
        System.out.println(line);
    }
}

其他功能:

获取请求参数的通用方式:不论get和post都可以使用以下的方法

String getParameter(String name):根据参数名称获取参数值,如username=zhangsan&password=boynextdoor,如果一个参数名对应多个参数,则仅取一个参数作为值

String[] getParameterValues(String name):根据参数名称获取参数值的数组,如hobby=sing&hobby=dance,对应组件如checkbox

Enumeration<String> getParameterNames():获得提交的所有参数名

Map<String,String[]> getParameterMap():获取所有参数的map集合

中文乱码问题:

get方式不会引起表单提交的中文乱码

post方式会乱码

解决方法:设置post字符流的编码

req.setCharacterEncoding("utf-8");

则解决乱码问题

super.doGet(),super.doPost()未删除报错

选中方法,ctrl+alt+H查看源码:

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String protocol = req.getProtocol();
    String msg = lStrings.getString("http.method_post_not_supported");
    if (protocol.endsWith("1.1")) {
        resp.sendError(405, msg);
    } else {
        resp.sendError(400, msg);
    }

}

请求转发功能

一种在服务器内部资源跳转的方式

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    RequestDispatcher requestDispatcher = req.getRequestDispatcher("/demo05");
    requestDispatcher.forward(req,resp);
}

1.请求转发功能不会引起浏览器地址路径的改变

2.服务器内部资源跳转的方式,不能访问服务器外部资源

3.转发是一次请求(浏览器抓包仅1个包),请求为当前地址路径的请求

数据共享

1.域对象:一个有作用范围的对象,可以在范围内共享数据

request域:代表一次请求

方法:

1>setAttribute(String name,Object obj):存储数据

2>Object getAttribute(String name):通过键获取值

3>removeAttribute(String name):通过键移除键值对

这个功能一般用于请求转发中多个资源的共享

示例:

demo07

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //存储数据到request域中
    req.setAttribute("msg","hello");
    System.out.println("demo07被访问了");
    RequestDispatcher requestDispatcher = req.getRequestDispatcher("/demo05");
    requestDispatcher.forward(req,resp);
}

demo05

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("demo05被访问了");
    req.setCharacterEncoding("utf-8");
    String msg = (String) req.getAttribute("msg");
    System.out.println(msg);
}

获取ServletContext

ServletContext getServletContext()

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • javaWeb idea学习笔记(七)Jsp极速入门

    contentType,用来指定Jsp页面所采用的编码方式,默认值:text/html,ISO-8859-1

    逆回十六夜
  • JAVA JVM类加载过程的学习

    学习资料链接:https://www.bilibili.com/video/av30023103/

    逆回十六夜
  • javaWeb idea学习笔记(三)Servlet的配置

    当服务器接收到客户端浏览器的请求后,会解析请求的URL路径,获取访问的servlet资源路径

    逆回十六夜
  • flink教程-详解flink 1.11 中的JDBC Catalog

    1.11.0 之前,用户如果依赖 Flink 的 source/sink 读写关系型数据库或读取 changelog 时,必须要手动创建对应的 schema。但...

    大数据技术与应用实战
  • 深度长文:中国产业大迁移全景图

    中国产业大迁移并没有发生在传统产业,而是发生在新兴产业。传统制造在出清过程中向低成本、高效率地区集聚。新兴制造向地理纵深发展的过程中,中部核心二线城市群逐渐崛起...

    钱塘数据
  • Docker 大势已去,Podman 万岁

    Podman 原来是 CRI-O 项目的一部分,后来被分离成一个单独的项目叫 libpod。Podman 的使用体验和 Docker 类似,不同的是 Podma...

    米开朗基杨
  • Podman的崛起,可能正在加速Docker的消亡!!!

    Podman 原来是 CRI-O 项目的一部分,后来被分离成一个单独的项目叫 libpod。Podman 的使用体验和 Docker 类似,不同的是 Podma...

    架构师修行之路
  • 跨端方案的三大困境

    2018 年,Airbnb 放弃了继续使用 React Native,个中原因主要有两方面:

    ayqy贾杰
  • python线程池(threadpool)

    第二行是调用makeRequests创建了要开启多线程的函数,以及函数相关参数和回调函数,其中回调函数可以不写,default是无,也就是说makeReques...

    周小董
  • 撮合引擎开发:完结篇

    本小节是该系列文章的最后一篇了,将讲解剩下的一些东西,包括交易委托账本中订单队列的实现逻辑、更多订单类型的实现逻辑。另外,不少朋友在问,完结后所有代码是否会开源...

    Keegan小钢

扫码关注云+社区

领取腾讯云代金券