
本文共 3134 字,大约阅读时间需要 10 分钟。
请求转发forward
【建议记住图像】红圈代表域对象的范围
请求转发:一种在服务器内部的资源跳转方式
步骤:
-
通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
-
使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
request.getRequestDispatcher("/requestDemo2").forward(request, response);
请求转发特点:
-
浏览器地址栏路径不发生变化
-
只能转发到当前服务器内部资源中。
-
转发是只发出一次请求,收到一次响应。可以使用requset对象来共享数据
-
共享数据
共享数据:
域对象:一个有作用范围的对象,可以在范围内共享数据
requset域:代表一次请求的范范围,一般用于请求转发的多个资源中共享数据
方法:
-
void setAttribute(String name , Object obj):存储数据
-
Object getAttitude(String name):通过键获或值
-
void removeAttribute(String name):通过键移除键值对
//在Demo1里:requset.setAttribute("msg", hello);//在Demo2里:获取Object msg = requset.getAttribute("msg");//可以获取hello
响应消息
重定向
response.sendRedirect("/day15/responseDemo2");
防止虚拟目录发生改变:(动态获取虚拟目录)【推荐】
response.sendRedirect(requset.getContextPath()+"/responseDemo2");
注意
- 使用forward方法的Servlet,其标准输出流还未开启;
- 使用include方法的Servlet,其标准输出流已经开启;
- 对客户端的响应是include的Servlet给出的
重定向的特点
- 地址栏发生变化(是服务器外跳转)。地址栏中显示的是重定向的请求路径,而非用户提交请求的路径。因此,重定向可以防止表单的重复提交。
- 重定向可以访问其他站点(服务器、应用)的资源(例如在Servlet里跳转到百度)
- 重定向是两次请求===>因此不可以使用requset对象来共享数据(即无法用setAttribute与getAttribute来获取数据)也不能直接获取用户提交请求中所携带的数据
- 两次请求,两次响应。
路径写法:
1.相对路径:通过相对路径不可以确定唯一资源
- 如: ./index.html
- 不以/开头,以.开头路径
**规则:**找到当前资源与目标资源的关系:例如:
目标资源: http://localhost/day15/responseDemo2
当前资源1: location.html http://localhost/day15/location.html
<a href="./responseDemo2"> ./可以省略:即 : < a href="responseDemo2"> (当前目录)
当前资源2: http://localhost/day15/htmls/location.html
<a href="../responseDemo2"> ../向上退一级目录: < a href="responseDemo2">
2.*绝对路径:通过绝对路径可以确定唯一资源
-
如:http://localhost/day15/responseDemo2 即/day15/responseDemo2
-
以/开头的路径
规则:
判断定义的路径是给谁用的?判断请求将来从哪儿发出
- 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
<a> ,<form> , 重定向......
-
给服务器使用:不需要加虚拟目录(转发路径)
- 建议虚拟目录动态获取:requset.getContextPath()
例如:
①给客户端用:在页面浏览器(html里)
<a href="/day15/responseDemo2">
重定向是客户端路径(上面的图,是浏览器主动第二次发给B)==>因此重定向需要加虚拟目录:
response.sendRedirect("/day15/demo2");
②给服务器:例如请求转发(不必写虚拟目录day15或getContentPath()):【因为是在同一个服务器】
request.getRequestDispatcher("/requestDemo2").forward(request, response);
服务器输出字符数据到浏览器
response.setContentType("text/html;charset=utf-8");Printwriter pw = response. getWriter();pw.write("hello");
步骤:
-
获取字符输出流
-
输出数据
乱码问题:
-
Printwriter pw = response. getWriter();获取的流的默认编玛是ISO-8859-1
-
设置该流的默认编码
-
告诉浏览器响应体使用的编码
简单的形式,设置编玛,是在获取流之前设置
response.setContentType("text/html;charset=utf-8");
服务器输出字节数据到浏览器
response.setContentType("text/html;charset=utf-8");//获取字节输出流ServletOutputStream sos = response.getOutputStream();sos.write("你好".getBytes());
ServletConText对象
获取方式:
//1.通过request对象获取ServletContext contex1 = request.getServletContext();//2.通过HttpServlet获取ServletContext context2 = this.getServletContext();System.out.printin(contextl == context2);//true
-
概念:代表整个web应用,可以和程序的容器(服务器)来通信
-
功能:
-
获取MIME类型:(text/html)
String filename = "a.jpg";context.getMimeType(filename);//image/jpeg域对象:共享数据(用的少)
-
获取MIME类型:(text/html)
void setAttribute(String name , Object obj)//存储数据Object getAttitude(String name)//通过键获或值void removeAttribute(String name)//通过键移除键值对
-
ServletConText对象 作用范围:所有用户所用请求的数据
-
所有用户可以操纵,不太安全;(声明周期长)驻留时间长
-
-
获取文件服务器路径
最后还是再添加几张图吧:
-
这里还是推荐黑马的JavaWeb视频,确实可以,b站链接:
自己算是得到了个惨痛教训:以后看视频尽量看最新版的,并且尽量看IDEA版本的😊
发表评论
最新留言
关于作者
