JavaEE--HttpServletRequest(笔记)

1.HttpServletRequest概述

客户端发送给服务器端的数据。

我们在创建Servlet时会覆盖service()⽅法,或doGet()/doPost(),这些⽅法都有两个参数,代表请求的request和代表响应response。

service⽅法中的request的类型是ServletRequest,⽽doGet/doPost⽅法的request的类型是HttpServletRequest,HttpServletRequestServletRequest的⼦接⼝,功能和⽅法更加强⼤,所以我们学习HttpServletRequest。

2.request的运⾏流程

在这里插入图片描述

3.通过request获得请求⾏

在这里插入图片描述

  • 获得客户端的请求⽅式:String getMethod()
  • 获得请求的资源:
    • String getRequestURI() – 获取请求URI
    • StringBuffer getRequestURL()
    • String getContextPath() – 获取虚拟⽬录
    • String getServletPath() – 获取Servlet路径
    • String getQueryString() – 获取get⽅式请求参数
      username=zhangsan&password=123
    • String getRemoteAddr() – 获取客户机的IP地址
package a_request;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/Demo01Request")
public class Demo01Request extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获得请求行
        String url = req.getRequestURL().toString();
        System.out.println(url);

        String uri = req.getRequestURI();
        System.out.println(uri);


        String method = req.getMethod();
        System.out.println(method);
		//ip
        String remoteAddr = req.getRemoteAddr();
        System.out.println(remoteAddr);
		//端口
        int remotePort = req.getRemotePort();
        System.out.println(remotePort);
    }

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

4.通过request获得请求头

在这里插入图片描述

  • long getDateHeader(String name)
  • String getHeader(String name)
  • int getIntHeader(String name)
  • Enumeration <string> getHeaderNames() – 获取所有的请求头名称
    常⻅的请求头:
  1. User-Agent:浏览器告诉服务器,我访问你使⽤的浏览器版本信息
    作⽤:可以在服务器端获取该头的信息,解决浏览器的兼容性问题
  2. Referer:告诉服务器,我(当前请求)从哪⾥来?
    作⽤:防盗链

4.1案例防盗链

在这里插入图片描述

package b_referer;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/Demo01Referer")
public class Demo01Referer extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String referer = req.getHeader("referer");
        if (referer == null || referer.contains("/day03_war_exploded/")){
            resp.getWriter().write("success! hi evertbody~");
        }else {
            resp.getWriter().write("fuck you mother doing");
        }

    }

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

5.通过request获得请求体

在这里插入图片描述
请求体:只有POST请求⽅式,才有请求体,在请求体中封装了POST请求的请求参数。
步骤:

  1. 获取流对象
    BufferedReader getReader():获取字符输⼊流,只能操作字符数据ServletInputStream getInputStream():获取字节输⼊流,可以操作所有类型数据
  2. 再从流对象中拿数据
package c_parameter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;

@WebServlet("/Demo02Parameter")
public class Demo02Parameter extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        //适用于一个name对应一个值的情况
        String username = req.getParameter("username");
        System.out.println(username);
       /* byte[] bytes = username.getBytes("ISO8859-1");
        username = new String(bytes, "UTF-8");*/
        /*username= new String(username.getBytes("ISO8859-1"),"UTF-8");
        System.out.println(username);*/
        String password = req.getParameter("password");
        System.out.println(password);
        System.out.println("----------------------------");

        //适用于多选,也就是一个name对应多个值的情况
        String[] hobbies = req.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies));
        System.out.println("----------------------------");


        //将所有参数封装成map格式,key就是参数名,value就是参数值[数组]
        Map<String, String[]> parameterMap = req.getParameterMap();
        Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
        for (Map.Entry<String, String[]> entry : entries) {
            System.out.print(entry.getKey()+":");
            System.out.println(Arrays.toString(entry.getValue()));
        }

    }

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

6.request的其他功能

6.1 乱码问题

在这里插入图片描述
get⽅式:tomcat 8 已经将get⽅式乱码问题解决了
post⽅式:会乱码(ISO8859-1)

  • 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);

6.2 请求转发

请求转发:⼀种在服务器内部的资源跳转⽅式

  1. 步骤:
    1. 通过request对象获取请求转发器对象:RequestDispatcher
      getRequestDispatcher(String path)
    2. 使⽤RequestDispatcher对象来进⾏转发:forward(ServletRequest request,ServletResponse response)
  2. 特点:
    1. 浏览器地址栏路径不发⽣变化
    2. 只能转发到当前服务器内部资源中
    3. 转发是⼀次请求
package e_servlet;

import JDBCutil.DruidUtils;
import JDBCutil.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/Demo06Servlet")
public class Demo06Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getContextPath();
        req.setAttribute("user","张三");
        System.out.println("Demo06存进去了数据");
        //请求转发 - Demo07Servlet
        req.getRequestDispatcher("/Demo07Servlet").forward(req,resp);
        //下面不要写代码
    }


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




package e_servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/Demo07Servlet")
public class Demo07Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object user = req.getAttribute("user");
        System.out.println(user);
    }


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

6.3 共享数据

域对象:⼀个有作⽤范围的对象,可以在范围内共享数据
request域:代表⼀次请求的范围,⼀般⽤于请求转发的多个资源中共享数据
⽅法:

  1. void setAttribute(String name,Object obj):存储数据
  2. Object getAttitude(String name):通过键获取值
  3. void removeAttribute(String name):通过键移除键值对

注意:ServletContext域与Request域的⽣命周期⽐较?

  • ServletContext
    创建:服务器启动
    销毁:服务器关闭
    域的作⽤范围:整个web应⽤
  • request
    创建:访问时创建request
    销毁:响应结束request销毁
    域的作⽤范围:⼀次请求中

6.4 注册登陆跳转案例

loginServlet

package D_loginServlet;

import JDBCutil.DruidUtils;
import JDBCutil.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        JdbcTemplate template = new JdbcTemplate(DruidUtils.getDataSource());
        String sql = "select * from user1 where username = ? and password = ?";
        List<User> list = template.query(sql, new BeanPropertyRowMapper<User>(User.class),username,password);
        if (list.size() == 0 ){
            System.out.println("登陆失败");
        }else {
            System.out.println("登陆成功,欢迎" +list.get(0).getUsername());
        }
    }

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

regServlet

package D_loginServlet;

import JDBCutil.DruidUtils;
import JDBCutil.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;

@WebServlet("/regServlet")
public class regServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        JdbcTemplate template = new JdbcTemplate(DruidUtils.getDataSource());
        String sql = "insert into user1(username, password) values(?, ?)";
        String sql1 = "select * from user1 where username = ?";
        Map<String, Object> map = template.queryForMap(sql1, username);
        if(map==null){
            template.update(sql, username, password);
            System.out.println("注册成功");
            resp.sendRedirect(req.getContextPath()+"/login.html");
        }else {
            System.out.println("注册失败");
        }


    }

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

reg.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>注册</title>

</head>
<body>
<h1>注册</h1>
    <form method="GET" action="regServlet" enctype="">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        <input type="submit">
    </form>

</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登陆</title>

</head>
<body>
<h1>登陆</h1>
    <form method="GET" action="loginServlet" enctype="">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        <input type="submit">
    </form>

</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaEE-图书管理系统通常需要包含以下数据库表: 1. 用户表(user):包括用户ID、用户名、密码、邮箱等字段。 2. 图书表(book):包括图书ID、图书名称、作者、出版社、ISBN号等字段。 3. 借阅记录表(borrow_record):包括借阅记录ID、用户ID、图书ID、借阅时间、归还时间等字段。 4. 管理员表(admin):包括管理员ID、管理员名称、密码等字段。 以下是JavaEE-图书管理系统数据库代码示例: ```sql -- 用户表 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(50) NOT NULL, `email` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 图书表 CREATE TABLE `book` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `author` varchar(50) NOT NULL, `publisher` varchar(50) NOT NULL, `isbn` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 借阅记录表 CREATE TABLE `borrow_record` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `book_id` int(11) NOT NULL, `borrow_time` datetime NOT NULL, `return_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_user_id_idx` (`user_id`), KEY `fk_book_id_idx` (`book_id`), CONSTRAINT `fk_book_id` FOREIGN KEY (`book_id`) REFERENCES `book` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 管理员表 CREATE TABLE `admin` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` -- 相关问题--: 1. 如何创建数据库表? 2. 如何在JavaEE中连接数据库? 3. 数据库中的什么是外键?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值