HTTPServletRequest的介绍和特点:
一个服务器在接收到请求后,会给此次请求创建一个request对象,此对象中封存了此次请求相关的数据。
作用:存储请求数据。
注意:每次请求都会创建新的request对象存储请求数据。
特点:
request对象由服务器创建;
一次请求创建一个request对象;
生命周期为一次请求内,请求结束即销毁此次请求的request对象。
request获取请求行数据和根据键名获取请求头数据
request对象获取请求行的方法及其作用
getMethod(); 返回请求方式
getRequestUrl(); 返回请求url
getRequestUri(); 返回请求uri
getQueryString(); 返回get请求中的URL中的用户数据 注意:post请求中没有此方法。
getSchema(); 返回协议
请求头:
getHeader(String name) :根据键名获取请求头信息;注意:如果获取的请求头信息不存在返回null。
使用getheader()指明键名的方法去获取请求头的数据的时候,如果请求头不存在该指定数据的话则会返回“null”,而不会报错。不知道上面需要的键名时,可以先获取请求头中所有的键名;
getHeaderNames() 返回存储了请求头键名的枚举集合。
(Enumeration(枚举)接口的作用和Iterator类似,只提供了遍历Vector和HashTable类型集合元素的功能,不支持元素的移除操作。)
Object nextElement( ):如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。
request获取请求头键名枚举和根据键名获取实体数据和获取同名不同值数据
获取请求实体数据的方法及区别:
getParameter(String name) 根据键名获取数据;根据键名获取数据,但存在同键不同值的情况,会漏值。
getParameterValues(String name) 根据键名获取同名不同值的值,返回数组;
getParameterNames() 获得实体数据中键名的枚举;
request获取请求行数据和根据键名获取请求头数据 :
最需要的就是网页上的用户相关数据;
实体数据获得的也是键值对;
这里的getParemeter中的键名要与请求数据提交的键名保持一致,否则不对应的将会返回null。
如果这里键名不一致,在接下来的依赖于键名的逻辑代码运行时将会报空指针异常。
总的来说就是当返回的null参与代码其他逻辑代码运行时很容易报空指针异常,所以在一开始加上相应的条件限制或者添加捕获异常会一定程度避免这种情况的发生。
列举获取网络信息的方法及其作用:
getRemoteAddr()——获取客户端的IP地址
getRemotePort()——获取客户端端口号
getLocalAddr()——获取服务器端的ip
getLocalPort()——获取服务器端的端口号
response设置响应行和设置响应头
addHeader和setHeader的方法的作用和区别:
addHeader:添加响应头信息,重复的会给相同的值,不会覆盖。
setHeader:设置响应头信息,原来不存在的会新增;对于已有的会进行修改,通过setHeader修改的只能有一个。
sendError的作用:
可以自主的响应状态给浏览器;
response设置响应实体:
resp.getWriter().write("实体内容"); 实体内容可以分开进行响应。
注意:一旦使用resp对象作出了请求响应,则意味着此次请求处理完毕。服务器在响应后会将此次请求相关的req对象和resp对象销毁。
乱码问题:
编码方式和解码方式不一致产生乱码。
需要在获取请求数据之前,设置请求编码格式;
get和post请求乱码的解决方案
post请求方式乱码:
req.setCharacterEncoding("utf-8");
get请求方式乱码解决:
get请求实体在url里
方式一:每个数据都要单独的进行转换
String uname=req.getParameter("uname");
String uname2=new String(uname.getBytes("iso-8859-1"), "utf-8");
方式二:
req.setCharacterEncoding("utf-8");
在tomcat的server.xml文件中的Connector标签中增加属性: useBodyEncodingForURI="true"
service代码编写流程:
设置请求编码格式
设置响应编码格式
获取请求信息
处理请求信息
响应处理结果
响应乱码问题:浏览器中显示的服务器响应数据乱码;
resp.setContentType("text/html;charset=utf-8");
请求转发:
一次请求的处理需要多个Servlet的联动操作,第一个Servlet需要用到其他的Servlet已经声明的逻辑处理代码时就需要用到请求转发。
在A方法中调用B方法,当被调用的B方法执行完之后,原有的A方法会继续执行。 但是A继续执行已经无意义,因为结果已经被拿到,继续执行的内容已经于用户不相关。所有后面加上return 结束即可。
转发的本质:就是在一个Servlet中调用其他的Servlet。
请求转发的特点:
降低Servle之间的代码冗余;
一次请求转发内的Servlet共享此次请求的request和response对象;并且将request对象作为数据流转的载体。
浏览器地址栏信息不会改变,请求转发只一次请求;
request作用域的特点
作用域是一次请求转发内的servlet。 request对象可作为数据流转的载体。
使用request对象作为请求转发的数据的载体的方法:
req.setAttribute();
req.getAttribute();
如果被请求转发的Servlet有很多种访问方式,有可能被直接访问到或者被servlet请求转发而访问的。所以要判断这个通过request数据载体进来的值是否为null,若是null,一定是被直接访问的,不是的话则是被servlet请求转发过来的。进而按照对应的方式进行处理。
采用三目运算符参与判断:
但 请求转发 存在的一个严重问题是:请求转发因为地址栏不改变,所以每次刷新,数据会被重复提交。
解决方法:重定向;
作用:保护第一次的请求,避免因为用户的刷新操作频繁的触发A的执行。
特点:两次请求,地址栏改变。