欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Request、Request中文乱码、注册和登录案例

程序员文章站 2022-06-11 16:55:22
...

一.Request

Request的定义

Request是请求的意思,包含了客户端带给服务器端的请求信息。

组成:

请求行:协议版本、请求方式、URL地址

请求头:都是由键值对构成的

  • user-agent: 用户信息

  • Content-Type: 请求体的内容的类型

请求参数:如果是get请求就在url地址上携带请求参数,如果是post请求就在请求体中携带请求参数

Request的作用

    1. 获取请求行信息(请求行中包含请求方式、url地址、协议版本)

    • requset.getMethod();获取请求方式(掌握)

    • request.getRemoteAddr();获取客户端的IP地址(了解)

    • request.getContextPath();获取项目路径(掌握)

    • request.getRequestUrl();获取请求的url地址

    1. 获取请求头(掌握)

    • request.getHeader("name");参数是请求头的名称,获取某个请求头的信息

    • request.getHeaderNames();获取所有请求头的名称

  • 3.获取请求参数 【重点】

    • request.getParameter("name");根据请求参数的name获取参数的值。

    • Map<String, String[]> parameterMap = request.getParameterMap();获取所有参数,并且返回一个Map键值对 集合 ,key 是我们传递上来的名称 , value 是名称对应的值。

    • request.getParameterNames(); 获取所有参数名称

    • request.getParameterValues(name): 获取某一个参数的值 ,这里返回的是一个String [] 表示一个参数可以对应多个值(最典型的就是多选框的时候)

  • 4:作为域对象存数据和取数据(重要)

    • request.setAttribute("name",object),作为域对象存数据

      • request.getAtribute("name");​

Request中文乱码问题 【重点】

解决request中文乱码问题,要分成两种情况:get请求和post请求

  • 1.Get请求 //这里取到的值是iso编码过后的值, 是乱码。因为Tomcat中默认使用的是iso8859-1编码 String username = request.getParameter("username");

    //这里使用ISO的编码, 先逆转回去,变成字节数据,然后在用U8的编码转成中文 byte [] bytes = username .getBytes("ISO-8859-1"); username = new String(bytes, "utf-8");

  • 2.Post //如果是Post方式提交的数据上来,解决乱码,一句话就可以了。 request.setCharacterEncoding("UTF-8");这句话是设置请求体重内容的编码方式,因为get请求没有请求体,所以该方式不适合get请求。

二、注册的案例

 

Request、Request中文乱码、注册和登录案例

  1. 搭建环境

    1. 编写html网页

    2. 拷贝jar包

    3. 创建数据库(创建一张表,包含注册填写的信息字段)

  2. 创建Servletpublic class RegisterServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	//处理请求中的中文乱码问题,由于是post请求,则非常简单
    	request.setCharacterEncoding("UTF-8");
    	//BeanUtils的功能,就是将请求到的所有参数封装到Bean对象中
    		User user = new User();
    		Map<String, String[]> parameterMap = request.getParameterMap();
    		try {
    			BeanUtils.populate(user, parameterMap);
    		} catch (Exception e) {
    			e.printStackTrace();
    		} 
    		
    		//3.调用业务层的方法,来存储用户信息
    		UserService service = new UserService();
    		boolean flag = service.saveUser(user);
    		if (flag) {
    			//注册成功,跳转到登录页面
    			//重定向跳转到登录页面
    			response.sendRedirect("login.jsp");
    		}else {
    			//注册失败
    			response.getWriter().println("failed");
    		}
    }
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	doGet(request, response);
    }
    }
  3. 创建Dao

Request、Request中文乱码、注册和登录案例

 

  • BeanUtils框架的使用

这个是Apache组织开发的一个工具jar, 能够让我们在接收页面的零散数据后,快速的打包成一个Bean对象 。 它里面默认支持 基本数据类型的转化 , 对于其他的数据类型如 Date类型,就必须注册一个转化器 。

	Map<String, String[]> parameterMap = request.getParameterMap();
		User user = new User();
		//把map里面的数据,封装到user对象里面。
		BeanUtils.populate(user, parameterMap);

注意事项: 要想让BeanUtils成功转化数据,要求页面提交过来的name的属性值,必须和Bean的属性值一样。

有兴趣的同学可以自定义BeanUtils,实现原理跟自定义DBUtils基本相同

登录案例

 

Request、Request中文乱码、注册和登录案例

重定向 & 请求转发(重点,难点)

Request、Request中文乱码、注册和登录案例

  • 重定向

    1. 发了两次请求(会发起一次新的请求) 重点

    2. 地址栏会变成第二次发出的请求地址

    3. 效率稍低一点(因为它会发起两次请求)

    4. request的存值不能在重定向跳转到的页面中获取 重点

    5. 可以跳转任何项目 (重定向是在客户端发起的请求) 重点

  • 请求转发(request.getRequestDispatcher("index.html").forward(request, response);)

    1. 发一次请求(将原来的请求转发到目标页面) 重点

    2. 地址栏不变,还是之前请求的地址

    3. 效率更高

    4. request里面存值,可以在后面转发的页面中使用

    5. 只能跳转本项目内部资源(因为是服务器直接转发的)注意 重点

Request的作用范围-----在一次客户端的请求当中

1、request里面存值的时候,只针对一次请求有效。 在这个请求存的数据,只能在这个请求里面获取。

2、如果在request里面存值了,那么跳转之后,想获取里面的值,必须使用请求转发来跳转。

两个域对象:Request和ServletContext的对比

  • 作用域(重要)

    • request作用域是:一次请求,也就是说存值和取值在一次请求中是可用的。

    • ServletContext作用域是:整个项目中。(所有用户共享!!!!)

  • 存值的位置(不重要,不知道没关系)

    • ServletContext的值存放在ServletContext的一个名为ApplicationServletContext的实现类的attributes成员变量中(该成员变量是map类型)

    • Request的值存是通过HttpServletRequest的一个名为RequestFacade的实现类的setAttribute()方法,然后再调用一个名为Request的类的setAttribute()方法,将值存放在Request类的attribute成员变量中。

  • request和ServletContext的优劣势对比,及各自的使用场景,如果需要所有用户共享----就使用ServletContext,其它的时候不要ServletContext!!!!

  • 生命周期

    • 创建:ServletContext在服务器启动的时候创建,request服务器接收到请求的时候创建

    • 销毁:ServletContext在服务器关闭或者项目移除的时候销毁,request在服务器对该次请求做出响应的时候销毁。

相对路径和绝对路径

相对路径(相对的是当前发起请求的路径)

格式

	不以"/"开头的路径写法, 这种路径称之为相对路径 ,相对的是当前的请求路径。
	在相对路径下,请求转发和重定向的路径写法都是一样的。
	例如:当前发起重定向或者请求转发的是http://localhost:8080/项目名/login    这个Servlet。
	那么相对路径,相对的就是"http://localhost:8080/项目名/",所以写相对路径时写的那个路径例如"login.jsp"就是拼接在"http://localhost:8080/项目名/"后面,形成了最终路径。
	最终路径:"http://localhost:8080/项目名/login.jsp"

绝对路径

以"/"开头的写法是绝对路径写法,绝对路径的写法分为两种情况

  • 1.请求转发:在全路径的基础上,省略掉项目路径部分

  • 2.其它情况:在全路径的基础上,省略掉服务器路径部分

 

相关标签: request