Day17-request

Request

请求部分:HttpServletRequest


1)请求行:
格式:请求方式 请求的资源地址 协议版本
GET /Day16_0623_02DownloadDemo/file1?name=file1.doc HTTP/1.1
重要api:
request.getContextPath()获取当前工程名称/路径
request.getRemoteAddr()获取请求者的ip地址
request.getMethod() 获取请求方式,返回String
常用api:
request.getRequestURI()获取请求的uri
只定位到工程
request.getProtocol() 获取请求协议版本
request.getContextPath()
request.getQueryString(),获取查询参数字符串
获取了一长串String,没什么意义


2)请求头:
格式: key:value(value可能有多个)
重要api:
getHeader(key) 获取一个请求头
了解的api:
getDateHeader(key)
getIntHeader(key)
Enumeration getHeaders(key)
常用的请求头:
user-agent:获取请求者浏览器的心底
referer:获取当前请求是从哪里跳转过来的
如果不是从其他页面条转过来的话就获取null

3)请求体:
只有是post方式才会出现
格式:username=zs&password=123;

以下api可以操作get和post方式都可以。
request.getParameter(“”)
获取单个提交参数
request.getParameterValues(“”) 返回String数组
获取一个key对应多个value的参数
这里写图片描述
request.getParameterMap();
获取所有的参数,返回的是一个map结合
这里写图片描述


中文乱码问题:

get和post的中文乱码的处理方式不一样

post中:
设置请求体中所使用的编码
因为参数都是在请求体中,很好操作,只需要设置请求体中所使用的编码即可:request.setCharacterEncoding(“utf-8”);(setCharacterEncoding方法只能够设置请求正文中使用的字符编码)
设置编码的语句要在获取参数之前进行设定。如果不指定,tomcat会默认使用iso-8859-1进行解析
//post请求方式中的处理方式:

      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           request.setCharacterEncoding("utf-8");
           String username = request.getParameter("username");
           String password = request.getParameter("password");
           System.out.println(username);
           System.out.println(password);
      }

get方式:
特征:参数不是在请求体中,是在请求行之中的。不能够通过setCharacterEncodiing方法设置了,因为它不能够设置请求行中的编码。
request.getParameter(“username”);
(这种get的方式可以解决post和get两种的编码问题)
浏览器默认使用utf-8编码,tomcat默认使用iso-8859-1解码;编码规则和解码规则不一致导致了乱码;
解决方法:将传递过来的参数重新通过iso-8859-1进行编码,然后再通过utf-8进行解码。
如果以后用get提交参数。里面存在中文的话,不好意思,需要把每个参数都用下述的方式先编码再解码,十分麻烦,所以以后尽量使用post方式提交参数,能够方便设置请求体的编码格式,不用挨个设置参数的编码。

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

           String username = request.getParameter("username");
           String password = request.getParameter("password");
           username = new String(username.getBytes("iso-8859-1"),"utf-8");
           System.out.println(username);
           System.out.println(password);
      }

工具类:url编码的实用工具类
URLDecoder(字符串,要解码成的格式) 返回String
URLEncoder (字符串,要编码的格式) 返回String
String encode = URLEncoder.encode(str,”UTF-8”);
下述例子前面模拟乱码实现过程,浏览器编码和tomcat解码过程是不可操控的。
这里写图片描述
简便写法:
这里写图片描述


案例:注册案例
分析:
不要相信前端表单校验的东西,可以用程序跳过页面的校验,就是直接将网址路径结合要提交的参数提交到接收路径,直接将参数提交到我们的接收地址。
1)servlet封装参数步骤是为了提高程序的可扩展性。如果参数过多也方便操作,后期方便添加
2)service层可以进行校验:先查询是否已经有这种客户,保证了用户名唯一性,先查询,在判断,如果唯一,再存入即可了。
request.getParameterMap();
这里写图片描述


beanutils工具类

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

           //设置编码,防止中文乱码
           request.setCharacterEncoding("utf-8");
           response.setContentType("text/html;charset=utf-8");
           //获取所有参数。返回一个map集合,键值对形式存在。
           Map<String, String[]> map = request.getParameterMap();
           User user = new User();
           try {
                 BeanUtils.populate(user, map);
                 System.out.println(user);

                 UserService us = new UserService();
                 boolean result = us.register(user);
                 if(result){
                      response.getWriter().println("注册成功");
                 }else{
                      response.getWriter().println("注册失败");
                 }
           } catch (Exception e) {
                 e.printStackTrace();
                 response.getWriter().println("服务器繁忙");
           }
      }

案例:
完善登录案例:
需要利用jsp
jsp本质上就是一个servlet
请求转发:
RequestDispatcher
定义接收来自客户端的请求并将它们发送到服务器上的任何资源(比如 servlet、HTML 文件或 JSP 文件)的对象。servlet 容器可创建 RequestDispatcher 对象,该对象被用作包装位于特定路径上的服务器资源或通过特定名称给定的服务器资源的包装器。

request的生命周期
创建:请求到达服务器的时候
销毁:响应生成时候

RequestDispatcher请求转发的流程:
这里写图片描述
请求转发默认只能够转发服务器内部的工程,所以不需要写工程名了
可以转发到别的工程吗?好像不行啊。

和请求重定向的区别:
1)请求重定向是两次请求,请求转发是一次请求
2)重定向地址栏变化,请求转发地址栏不变
3)重定向不能够使用request属性操作,请求转发可以使用request属性操作
4)重定向是响应发起的,请求转发是请求发起的。
5)重定向的路径是绝对路径,请求转发的路径是内部路径,不需要写工程路径
6)重定向可以跳转到任意资源,请求转发只能够在项目内部跳转
7)请求转发可以传递参数。第一个servlet接收到request后,可以调用setAttribute(“”,”“)向其中设置参数;简单来说,请求转发中使用的是同一个request对象。
注意:打印数据,重定向,请求转发不要用在同一个逻辑里面

什么时候用请求转发:
1)如果要携带数据,就用请求转发;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值