请求转发:一种在服务器内部的资源跳转方式
步骤
1、通过request对象获取请求转发器对象:RequestDispatcher getDispatcher(String path)
2、使用RequestDispatcher对象来进行转发:forward(ServletRequest request,SerbletResponse response)
特点
1、浏览器地址栏路径没有发生变化
2、只能转发到当前服务器内部资源中
3、转发是一次请求
共享数据
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
1、setAttribute(String anme,Object obj):存储数据
2、Object getAttrbute(String anme):通过键获取值
3、void removeAttrbute(String name):通过键移除键值对
获取ServletContext
- request.getServletContext();
Response 对象
- 功能:设置响应消息
1、设置相应行 - 格式:HTTP/1.1 200 ok
- 设置状态码:setStatus(int sc)
2、设置响应头:setHeader(String name,String value)
3、设置响应体: - 使用步骤
1、获取输出流 - 字符输出流:PrintWriter getWriter()
- 字节输出流:ServletOutputStream getOutPutStream()
2、使用输出流
重定向
sendRedriect(String location);
重定向特点
转发特点:
- 转发地址栏路径不变
- 转发只能访问当前服务器资源
- 转发是一次请求
重定向特点
- 地址栏发生变化
- 重定向可以访问其他站点的资源
- 重定向是两次请求
路径写法
路径分类
相对路径
:通过相对路径不可以确定唯一资源(确定访问当前资源和目标资源之间的相对位置关系)
./代表当前目录
../后退一级目录
JSP推荐使用绝对路径
绝对路径:
通过绝对路径可以确定唯一资源
- 绝对路径的规则:判断定义的路径是给谁用的
- 给客户端浏览器使用:需要加虚拟目录
- 给服务器使用:不需要加虚拟目录
服务器输出字符数据到浏览器
步骤
- 获取字符输出流
PrintWriter pw=response.getWriter() - 输出数据
pw.write("hello");
中文乱码
原因
- 编码和解码所用的码表不一样
解决方法
在获取流对象之前,设置流的默认编码:ISO-8859-1 设置为GBK
response.setCharacterEncoding("GBK")
告诉浏览器,服务器所发送的消息体数据的编码。建议浏览器使用该编码解码
response.setHeader("content-type","text/html;charset=utf-8")
最终在获取字符流之前,一定要设置编码,上述都可以不管,下面的代码要注意
- response.setContentType("text/html;charset=utf-8")
服务器输出字节数据到浏览器
- 获取字节输出流
ServletOutputStream out=response.getOutputStream(); - 输出数据
out.write("hello".getBytes()) - 也可能存在中文乱码问题,结局方法如下
- response.setContentType("text/html;charset=utf-8")
验证码
- 本质是一张图片
- 防止恶意表单注册
ServletContext对象
- 代表整个web应用,可以和程序的容器(服务器)来通信
功能
- 获取MIME类型
- 域对象:共享数据
- 获取文件的真实路径(服务器路径)
获取ServletContext
1、通过request.getServletContext();
2、通过HttpServlet获取
this.getServletContext();
获取MIME类型
- MIME:在互联网通信过程中定义的一种文件数据类型
- 格式: 大类型/小类型 例如text/html image/jpeg
- 方法: String getMimeType(String file)
域对象
1、setAttrbute(String name,Object value)
2、getAttrbute(String name)
3、removeAttrbute(String name)
- ServletContext对象范围:所有用户所有请求的数据