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域一般用来存放一些不怎么频繁使用的数据。数据的使用场景仅仅在当前请求下需要用到,其他情况下很少用到。仅在转发的场景下可以用到。
标签:请求,request,JavaEE,获取,参数,key,ServletRequest,String 来源: https://www.cnblogs.com/likangnianxinbaiwan/p/16335517.html