编程语言
首页 > 编程语言> > JavaEE(三) ServletRequest

JavaEE(三) ServletRequest

作者:互联网

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