Request对象

本文详细介绍了Request对象,包括HttpServletRequest接口的作用、获取请求行、请求头、请求参数的方法,以及如何解决中文乱码问题。还探讨了Request域对象的使用,转发的实现步骤,并对比了转发与重定向的区别。最后,文章提到了用户注册功能的开发流程,特别是用户登录的jsp页面在三层架构中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Request对象

1.1 Request对象概述

Request对象获取客户端的请求数据, 接口ServletRequest,子接口HttpServletRequest继承ServletRequest.

HttpServletRequest接口的实现类是Tomcat引擎提供.

1.2 Request对象获取请求行

  • String getMethod() 获取提交的方式 (GET,POST)
  • String getRequestURI() 获取请求的参数,请求服务器路径
  • StringBuffer getRequestURL() 获取请求的参数,请求服务器路径
  • String getQueryString()获取请求行 问号后面的参数 (GET)
  • String getContextPath() 获取WEB应用名称
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //request对象方法 getMethod()获取客户端的请求方式
    String method = request.getMethod();
    System.out.println(method);
    //方法 String getRequestURI() 获取请求服务器路径
    //方法 StringBuffer getRequestURL() 获取请求服务器路径
    String URI = request.getRequestURI();
    StringBuffer URL = request.getRequestURL();
    System.out.println("URI=="+URI);//   /WEB04/line
    System.out.println("URL=="+URL);//  http://localhost:8080/WEB04/line

    //方法 String getQueryString()获取请求行,?后面的所有参数
    String query = request.getQueryString();
    System.out.println(query);//username=kjhgf&pass=32erg&hobby=on&hobby=on

    //获取WEB应用名称  String getContextPath()
    String path = request.getContextPath();
    System.out.println(path);//   /WEB04
  //response.sendRedirect(request.getContextPath()+"/ddd");
}

1.3 Request对象获取请求头

​ 请求头数据格式键值对, k:v

​ 指导性信息,指导服务器

  • String getHeader(String key)返回对应键的值
  • Enumeration getHeaderNames()
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    /*
     * request获取请求头
     */
     //方法  String getHeader(String key)
    String key = request.getHeader("Referer");
    System.out.println(key);
    /*
     * Enumeration getHeaderNames() 获取所有的请求头的键
     * 返回值Enumeration接口 (向量枚举)
     * 集合:1.0-1.1 Enumeration    集合1.2  迭代器
     * Iterator迭代器接口:  hasNext()   next()
     * Enumeration接口:  hasMoreElement()  nextElement()
     */
    Enumeration<String> enums  = request.getHeaderNames();
    while (enums.hasMoreElements()){
         key = enums.nextElement();
         String value = request.getHeader(key);
        System.out.println(key+"=="+value);
    }
}

防盗链(了解)

在这里插入图片描述

1.4 Request获取请求参数

  • String getParameter(“表单中的name值”)获取指定的请求参数
  • String[] getParameterValues(“表单中的name值”)获取参数中的一键多值
  • Map<String,String[]> getParameterMap()获取提交的所有参数
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    /*
     * request 获取客户端提交数据
     */
    //方法getParameter(String key)指定表单中的参数
    String username = request.getParameter("username");
    String password = request.getParameter("pass");
    System.out.println(username+"=="+password);

    //方法getParameterValues()获取一键多值  checkbox  radio
    String[] hobby = request.getParameterValues("hobby");
    System.out.println(Arrays.toString(hobby));
    System.out.println("=============");
    //方法 getParameterMap()获取提交的所有参数
    Map<String,String[]> map = request.getParameterMap();
    for (String key : map.keySet()){
        String[] value = map.get(key);
        System.out.println(key+"="+Arrays.toString(value));
    }
}

1.5 Request解决中文乱码

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(urlPatterns = "/china")
public class ChinaServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
         * request获取提交的参数,出现中文乱码
         * 编码和解码不一致
         */
        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        System.out.println(username);

        /**
         *   补充点:
         *      以前处理中文乱码,考虑GET和POST不同
         *      Tomcat8.5后....
         *
         *   setCharacterEncoding对POST请求有效
         *   对GET请求无效
         *
         *   username字符串转成ISO8859-1编码的字节
         *
         *   byte[] bytes = username.getBytes("iso8859-1")
         *
         *   字节转成字符串,使用utf-8
         *
         *   new String(bytes,"utf-8")
         */
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }


}

在这里插入图片描述
我们可以看到,在控制台输出的内容为乱码这是因为获取参数时采用了ISO8859的编码方法,所以要想解决问题我们就需要将现在的乱码转为乱码前的二进制位。再使用UTF-8的编码方式在之前的基础上我们增添增添代码,最后再次在控制台输出一次编码后的参数再次运行,输入与之前相同的数据,在控制台中查看结果

1.6 Request域对象

作用域: Request域对象的作用域比较小,范围是一次请求有效

再一次请求无效

  • 域对象存储数据: setArratibute(String key, Object value)
  • 取出域对象数据: Object getAttribute(String key)
  • 移除域对象数据: removeAttribute(String key)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //向域对象 ,request 存储数据
    request.setAttribute("heima","java");
    //取出域对象数据
    Object value = request.getAttribute("heima");
    System.out.println("servlet1="+value);
}

1.7 转发

在这里插入图片描述

1.8 转发的实现步骤

  • request对象方法获取转发器 RequestDispatcher getRequestDispatcher(“转发地址”)返回值就是转发器
  • 使用转发器对象的方法 forward
//获取转发器对象,传递转发的路径
RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");
//转发器方法
dispatcher.forward(request,response);

1.9 转发和重定向区别

在这里插入图片描述

2.0 用户注册功能

在这里插入图片描述

2.1 开发步骤

  • 创建数据库数据表
  • 创建新Module
  • 复制页面
  • 创建包
    • 添加需要jar
    • 配置文件
  • 功能,编写服务器程序
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    /*
     * 获取客户端提交的数据 Map
     * 数据封装到JavaBean对象中 (User)
     * 调用业务层的方法,传递User
     * 页面重定向到登录页面
     */
    request.setCharacterEncoding("utf-8");
    //获取客户端提交的数据 Map
    Map<String,String[]> map = request.getParameterMap();
    //集合中数据封装到User中
    User user = new User();
    //apache 开发工具类,简化JavaBean开发
    //BeanUtils类,静态方法 populate(JavaBean,map集合)
    try {
        BeanUtils.populate(user, map);
    }catch (Exception ex){ex.printStackTrace();}
    //调用业务层方法,传递JavaBean,完成注册
    UserService service = new UserService();
    service.register(user);
    //注册完成,页面到达登录页面,cdx
    response.sendRedirect( request.getContextPath()+"/login.jsp" );
}
/**
 *  注册方法
 *  接收web层传递JavaBean对象
 *  将JavaBean传递dao层
 */
public void register(User user){
    UserDao dao = new UserDao();
    try {
        dao.register(user);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
/**
 *  注册方法
 *  接收service传递JavaBean
 *  取出JavaBean数据,写入数据表
 */
public void register(User user) throws SQLException {
    QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    //拼写添加数据SQL语句
    String sql = "insert into user values(?,?,?,?,?,?,?)";
    //创建数组,存储User对象的数据
    Object[] params = {null,user.getUsername(),user.getPassword(),user.getEmail(),
                      user.getName(),user.getGender(),user.getBirthday()};
    //执行SQL
    qr.update(sql,params);
}

2.2 用户登录

在这里插入图片描述

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    /*
     * 实现登录Servlet
     * 接收客户端提交用户名密码
     * 提交参数传递业务层
     * 接收业务层返回结果 (boolean)
     * 判断结果: true 登录成功
     *    页面重定向到首页
     *
     * 判断结果: false 登录失败
     *   错误数据存储到request域中
     *   转发回原有的登录页面
     */
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    //调用业务层方法,获取返回值,传递用户名密码
    UserService service = new UserService();
    boolean flag = service.login(username, password);
    //判断flag值,是true,登录成功,重定向首页
    if(flag){
        response.sendRedirect( request.getContextPath() );
    }else{
        //flag值是false,登录失败,错误信息存储到request域
        request.setAttribute("msg","用户名或密码错误");
        //转发回登录页面
        request.getRequestDispatcher("/login.jsp").forward(request,response);
    }
}
/**
 * 登录方法
 * 接收Web层传递用户名和密码
 * 参数传递dao层(数据验证)
 * 获取dao返回值,User
 * 结果,返回web层boolean
 */
public boolean login(String username,String password){
    UserDao dao = new UserDao();
    User user = null;
    try {
       user =  dao.login(username,password);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    //判断user对象,是null,登录失败返回false
    if(user==null)
        return false;
    return true;
}
/**
 * 登录方法
 * 接收service层传递用户名和密码
 * 查询数据表,获取结果集
 * 结果集封装User对象,返回业务层
 */
public User login(String username,String password) throws SQLException {
    QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    //拼写登录查询语句
    String sql = "select * from user where username=? and password=?";
    User user = qr.query(sql,new BeanHandler<User>(User.class),username,password);
    return user;
}

login.jsp

<div style="color: red">
						<!--
						  显示服务器中存储数据
						  数据存储到request域中
						  写Java代码
						  标记:  < %   任意Java代码   %>
						  需要,在页面中显示数据

						  域取出数据,没有数据,显示null
						-->
						<%=  request.getAttribute("msg")==null?"":request.getAttribute("msg")   %>
					</div>

三层架构
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值