利用请求域传递对象(request域对象)
重定向和转发的区别(转发)(*****)
* 域对象
ServletContext:服务器一启动,为每个web应用创建一个ServletContext对象,所有servlet实例共享对象。
request:一次请求的范围。
* setAttribute("","");
* getAttribute("");
* removeAttribute("");
* getRequestDispatcher(String path) ,返回是RequestDispatcher:对象
* RequestDispatcher:
* forward(ServletRequest request, ServletResponse response)(经常使用) 转发的方法
* include(ServletRequest request, ServletResponse response)(了解) 包含
request利用请求域传递对象
request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理
setAttribute方法
getAttribute方法
removeAttribute方法
getAttributeNames方法
request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发,从而共享请求中的数据
请求重定向和请求转发的区别
package cn.learn.request;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 重定向和转发
* @author Administrator
*
*/
public class RequestDemo3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// request域设置内容
request.setAttribute("name", "凤姐");
// 完成重定向的工作(客户端端绝对路径)
// response.sendRedirect("/day10/request4");
// 转发(路径服务器的绝对路径)
request.getRequestDispatcher("/request4").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package cn.learn.request;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo4 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取
String value = (String) request.getAttribute("name");
// 输出中文
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("访问到了demo4... "+value);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
URL特殊字符转义规则
常用转义规则
空格换成加号(+)
+换成%2B
正斜杠(/)分隔目录和子目录 换成%2F
问号(?)分隔URL和查询 换成%3F
百分号(%)制定特殊字符 换成%25
#号指定书签 换成%23
•&号分隔参数 换成%26
java.net.URLEncoder和 java.net.URLDecoder
Request的开发细节
使用转发的方法后,response的缓冲区会被清空。
response.getWriter().write("aaa");
request.getRequestDispatcher("/demo2").forward(request, response);
response.getWriter().write("bbb");
RequestDispatcher
include方法:
RequestDispatcher.include方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程的服务器端包含功能
被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略
底层使用的是子节流,所以输出内容只能使用字节流。
include在程序执行上效果类似forward,但是使用forward只有一个程序可以生成响应,include可以由多个程序一同生成响应 ----- 常用来页面布局