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

版权声明:非经本人允许,禁止转载 https://blog.csdn.net/Kfie66/article/details/82346937

一.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请求。

二、注册的案例

  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

  • 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基本相同

登录案例

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

  • 重定向

    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.其它情况:在全路径的基础上,省略掉服务器路径部分

猜你喜欢

转载自blog.csdn.net/Kfie66/article/details/82346937