JavaEE(三) ServletRequest
2022/6/2 1:20:29
本文主要是介绍JavaEE(三) ServletRequest,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
JavaEE(三) ServletRequest
根据java语法来说 ServletRequest 是一个接口 但是实际应用起来并不是 而是一个实际的类
这是因为Tomcat实现了servlet规范 所以实际上是实现了ServletRequest 接口 并做了向上转型
请求报文的封装体对应的是ServletRequset
HTTP请求报文的封装体对应则是HTTPServletRequest,HTTPServletRequest接口扩展自ServletRequest接口,提供HTTP所特有的一些功能
常用方法
1.获取HTTP报文的各个部分
获取请求行
URL = 访问协议:主机:端口号 + URI
获取请求头
获取请求体
2.获取客户机与服务器主机信息
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域一般用来存放一些不怎么频繁使用的数据。数据的使用场景仅仅在当前请求下需要用到,其他情况下很少用到。仅在转发的场景下可以用到。
这篇关于JavaEE(三) ServletRequest的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南