ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JavaEE(三) ServletRequest

2022-06-01 20:35:42  阅读:178  来源: 互联网

标签:请求 request JavaEE 获取 参数 key ServletRequest String


JavaEE(三) ServletRequest

根据java语法来说 ServletRequest 是一个接口 但是实际应用起来并不是 而是一个实际的类
这是因为Tomcat实现了servlet规范 所以实际上是实现了ServletRequest 接口 并做了向上转型

请求报文的封装体对应的是ServletRequset
HTTP请求报文的封装体对应则是HTTPServletRequest,HTTPServletRequest接口扩展自ServletRequest接口,提供HTTP所特有的一些功能

常用方法

1.获取HTTP报文的各个部分

获取请求行

image
URL = 访问协议:主机:端口号 + URI

获取请求头

image

获取请求体

image

2.获取客户机与服务器主机信息

image

3.获取请求参数

那么请求报文中哪部分带有请求参数呢?
如果使用form表单进行数据提交,请求参数可能附着在请求请求资源后或者请求体内
使用form表单,不论是get还是post请求方式,请求资源都会按照key=value&key=value的形式进行提交
HTTP请求报文传输到服务器后,服务器会将其解析封装成Request对象,请求参数也会封装进Request对象中

@WebServlet("/form1")
public class FormServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //注意事项:
        //1.只可以获取key=value&key=value类型的数据
        //2.参数中传入key,(其实该key就是form表单input的name属性)可以获取到value值 username=admin&password=admin123
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String gender = request.getParameter("gender");
        //note:需要注意的是该方法只可以获取单个值,如果提交的是类似于chekcbox这种多个值
//        String course = request.getParameter("course");
        String[] courses = request.getParameterValues("course");
        System.out.println(username);
        System.out.println(password);
        System.out.println(gender);
        System.out.println(Arrays.toString(courses));
    }

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

    }
}

获取请求参数进阶

@WebServlet("/form2")
public class FormServlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求参数的代码可以更加健壮一些
        //获取请求参数一系列的方法,你都可以理解为服务器解析这些请求参数之后,将其封装到了一个类似于map的数据结构中
        //给我们开发者提供了如下这几个方法来获取这些请求参数的键值对
        //username=admin&password=admin123&gender=female&course=java
        //另外一个注意事项:要记得和request.getHeaderNames作区分,两者获取的部位是不一样的
        //本API获取的是请求参数;getHeaderNames获取的是请求头的所有的key值
        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()){
            String key = parameterNames.nextElement();
            String[] value = request.getParameterValues(key);
            System.out.println(key + "=" + Arrays.toString(value));
        }
    }

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

    }
}

通过工具类beanuitls把请求参数封装进入对象中

通过反射把获取到的请求参数封装进对象中

4.中文乱码问题

当我们使用post方法提交参数,如果有中文,会产生乱码的问题
解决办法:request.setCharacterEncoding("utf-8")
note:
1.只可以作用于请求体的中文乱码
2.该方法必须要在读取请求参数之前调用
表单提交时,默认的编码格式是utf-8就不会有乱码问题

5.转发

转发了解即可 方法中参数填写新的servlet的网络路径

@WebServlet("/getProducts")
public class GetProductsServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //先执行JDBC程序,查询数据库,得到结果
        System.out.println("查询了数据库,拿到了商品的信息");
        //进一步去调用显示的代码  需要去调用另外一个servlet
        //TODO  共享给另外一个servlet组件 context域  list<Product>
        //输入的 参数为调用的另外一个组件的网络路径,forward表示的是将请求转发到另外这个组件中
        request.getRequestDispatcher("/viewProducts").forward(request,response);
    }
}

6.Request域

Requset对象中有一个类似于map的结构,只要拿到同一个request对象,那么不同的servlet也可以进行数据的共享
requset的应用范围只应用于转发的情况下 因为每一个请求都会生成一个新的request对象。

Context域和Request域的区别

context域:比较大。context对象持续时间比较久。也就是在程序运行的期间,当前应用下的任何servlet都可以共享该数据。
request域:比较小。因为一个请求只要响应发出去之后,request对象就会被销毁,随即request域里面的数据也就失效了
context域一般用来存放一些全局性的配置信息等。项目的初始化配置,当前项目所在的主机名、端口号;当前商城的商品的分类
request域一般用来存放一些不怎么频繁使用的数据。数据的使用场景仅仅在当前请求下需要用到,其他情况下很少用到。仅在转发的场景下可以用到。

标签:请求,request,JavaEE,获取,参数,key,ServletRequest,String
来源: https://www.cnblogs.com/likangnianxinbaiwan/p/16335517.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有