前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >javaWeb idea学习笔记(五)ServletRequest、ServletResponse

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

原创
作者头像
逆回十六夜
修改2020-02-11 10:06:49
7030
修改2020-02-11 10:06:49
举报
文章被收录于专栏:逆回十六夜逆回十六夜

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()

......

代码语言:javascript
复制
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());
  • 获取请求头
代码语言:javascript
复制
@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);
    }
}
代码语言:javascript
复制
@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样例

代码语言:javascript
复制
<!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():

代码语言:javascript
复制
@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字符流的编码

代码语言:javascript
复制
req.setCharacterEncoding("utf-8");

则解决乱码问题

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

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

代码语言:javascript
复制
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);
    }

}

请求转发功能

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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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()

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 请求转发功能
  • 数据共享
  • 获取ServletContext
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档