目录
- HttpResponse
- HttpRequest
1 HttpServletResonpse
1.1 HttpServletResonpse概述
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大。
1.2 response常用方法
1.2.1 Http状态码的设置
1.2.1.1 setStatus
- 方法说明
- 代码演示
- 测试效果
1.2.1.2 sendError
- 方法说明
- 代码演示1
- 测试效果1
- 代码演示2
- 测试效果2
1.2.2 响应头设置setHeader
1.2.2.1 302重定向
访问demo4,重定向到demo3,显示404状态.
- 代码演示
- 测试效果
- 特别说明
response.sendRedirect()底层就是使用该种方式进行重定向.
1.2.2.2 定时刷新
访问一个servlet,每隔3秒刷新页面
1.2.2.3 定时跳转页面
- 代码演示
- 测试效果
1.2.3 响应体设置
使用最多的就是设置响应体文本:getWriter.write();
getWriter方法获得字符流,通过字符流的write(String s)方法可以将字符串设置到response缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
- 代码演示
- 测试结果
1.2.4 响应乱码
1.2.4.1 乱码原因
response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过 response的setCharacterEncoding(String charset) 设置response的编码.
但我们发现客户端还是不能正常显示文字. 是因为我们将response缓冲区的编码设置成UTF-8,但浏览器的默认编码是本地系统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是GBK,我们可以在代码中指定浏览器解析页面的编码方式.
1.2.4.2 解决方案
通过response的setContentType(String type)方法指定页面解析时的编码是UTF-8
response.setContentType(“text/html;charset=UTF-8”);
上面的代码不仅可以指定浏览器解析页面时的编码,同时也包含setCharacterEncoding的功能,所以在实际开发中只要编写 response.setContentType(“text/html;charset=UTF-8”);就可以解决页面输出中文乱码问题。
2 HttpServletRequest
2.1 HttpServletRequest概述
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大.
2.2 request常用方法
2.2.1 获取客户端的IP
- 方法说明
这个方法是ServletRequest的方法
- 代码演示
如果是本机访问,注意别用localhost,否则会被转为IPV6地址.可以通过127.0.0.1或者本机的IP访问. 这里我们以封IP为例演示这个方法的作用.
- 测试效果
本机访问 127.0.0.1
其他IP访问
2.2.2 获取请求头
- 方法说明
2.2.2.1 识别用户系统及浏览器信息
当我们浏览网站的时候,有时会提示我们最好使用XX浏览器, 或者当我们下载某软件的时候,会自动根据我们的系统进行匹配.那服务器是如何知道我们的操作系统以及浏览器?其实是我们发出的请求的请求头中,出卖了我们的信息.
- 代码演示
- 测试结果
2.2.2.2 防盗链
某些网站的资源,我们只能通过该网站的链接进入,通过其他网站的连接,哪怕url地址一致,都无法获取.这是因为服务器对该资源进行了防盗链处理.
如果请求不是通过本站的超链接发出的,发送错误代码404 —Referer这个请求头,表示请求的来源.
- 测试效果
在桌面上创建一个index.html.点击链接后.
请求头中没有referer相关的信息
通过项目中的index.html页面点击
请求头中含有Referer的信息
2.2.3 获取请求URL相关信息
以这个完整的URL为例,说明一下方法
http://localhost:8080/hello/oneServlet?name=zhangSan
- String getScheme():获取协议名 —> http
- String getServerName():获取主机名 —>localhost
- String getServerPort():获取服务器端口 —>8080
- String getContextPath():获取项目名称 —> /hello
- String getServletPath():获取Servlet路径 —> /oneServlet
- String getQueryString():获取参数部分,即?之后的部分name=zhangSan
- String getRequestURI():获取请求URI,即项目名+Servlet路径:
—> /hello/oneServlet
- String getRequsetURL():获取请求的URL,即不包含参数的完整请求路径:
—> http://localhost:8080/hello/oneServlet
2.2.4 获取请求参数
2.2.4.1 单个获取
获取单个参数,返回字符串.
2.2.4.2 获取多个
获取多个参数,并将他们放置到一个Map中.
2.2.4.3 将Map转换为JavaBean
我们在Servlet中接收多个表单参数后,最常做的事情,就是将参数封装为一个对象.手动声明对象,然后挨个属性的接收和封装过于麻烦,通常情况,我们都会借助Apache Commons组件中的BeanUtils工具包,帮我们完成数据的封装.
核心方法就是BeanUtils工具类的静态方法:populate.使用该方法切记表单提交的键必须和对象的属性名一致,否则无法进行属性的封装.
- 代码演示
User实体
页面表单
Servlet
- 测试结果
2.2.5请求乱码
2.2.5.1 POST乱码
通常浏览器往服务器发送的数据,都是utf-8编码的.因此在我们使用requset.
getParameter()方法之前,调用request.setCharacterEncoding(“utf-8”)即可防止POST请求乱码.
2.2.5.2 GET乱码
但是GET请求的编码方式不让设置,所以我们只能将错就错,拿到错误字符,然后通过ISO-8859-1编码反编译回去,再使用UTF-8重新编码.
2.2.6 请求转发
- 方法说明
首先获取请求转发器,传入转发的路径.注意该路径不需要写项目名.
然后调用转发器的forword方法进行请求的转发
- 转发与重定向的区别
- 请求转发是一个请求一次响应,而重定向是两次请求两次响应
- 请求转发地址栏不会变化,而重定向会显示后一个请求的地址
- 请求转发只能转发到本项目的其他Servlet,而重定向还能定向到其他项目的Servlet
- 请求转发是服务器端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,即包含项目名
2.2.7 域对象
request对象也是一个存储数据的区域对象,所以也具有如下方法:
- setAttribute(String name, Object o)
- getAttribute(String name)
- removeAttribute(String name)
注意:request域的作用范围:一次请求中
- 代码演示
- 测试结果