Request、Request中文乱码、注册和登录案例
一.Request
Request的定义
Request是请求的意思,包含了客户端带给服务器端的请求信息。
组成:
请求行:协议版本、请求方式、URL地址
请求头:都是由键值对构成的
-
user-agent: 用户信息
-
Content-Type: 请求体的内容的类型
请求参数:如果是get请求就在url地址上携带请求参数,如果是post请求就在请求体中携带请求参数
Request的作用
-
-
获取请求行信息(请求行中包含请求方式、url地址、协议版本)
-
requset.getMethod();获取请求方式(掌握)
-
request.getRemoteAddr();获取客户端的IP地址(了解)
-
request.getContextPath();获取项目路径(掌握)
-
request.getRequestUrl();获取请求的url地址
-
-
-
获取请求头(掌握)
-
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请求。
二、注册的案例
-
搭建环境
-
编写html网页
-
拷贝jar包
-
创建数据库(创建一张表,包含注册填写的信息字段)
-
-
创建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); } }
-
创建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基本相同
登录案例
重定向 & 请求转发(重点,难点)
-
重定向
-
发了两次请求(会发起一次新的请求) 重点
-
地址栏会变成第二次发出的请求地址
-
效率稍低一点(因为它会发起两次请求)
-
request的存值不能在重定向跳转到的页面中获取 重点
-
可以跳转任何项目 (重定向是在客户端发起的请求) 重点
-
-
请求转发(request.getRequestDispatcher("index.html").forward(request, response);)
-
发一次请求(将原来的请求转发到目标页面) 重点
-
地址栏不变,还是之前请求的地址
-
效率更高
-
request里面存值,可以在后面转发的页面中使用
-
只能跳转本项目内部资源(因为是服务器直接转发的)注意 重点
-
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.其它情况:在全路径的基础上,省略掉服务器路径部分
上一篇: 在树莓派4上编译运行orbslam2
下一篇: Harris角点检测