重定向和转发的区别:
(1)request是一个域对象
request对象也是一个存储数据的区域对象,所以也具有如下方法:
setAttribute(String name,Object o)
getAttribute(String name)
removeAttribute(String name)
注意:request域的作用范围:一次请求中
(2)request完成请求转发
1.获得请求转发器----path是转发的地址
RequestDispatcher.getRequestDispatcher(String path)
2.通过转发器对象转发
requestDispathcer.forward(ServletRequest request,ServletResponse response)
如上,转发分两个步骤。第一步,得到一个requestDispatcher, 然后调用它的forward方法。
实例:
package com.ken.forward;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet1 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// servlet1将请求转发给servlet2
RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");
// 执行转发的方法
dispatcher.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
运行结果:
地址栏的地址没变,返回的内容其实是servlet2返回的。这就是转发。
明白了转发,我们在来说request的域。
request和response每次访问都是新的。所以,它们的范围是在一次请求之内。
往request域中存数据
package com.ken.forward;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet1 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 向request域中存数据
request.setAttribute("name", "tom");
// servlet1将请求转发给servlet2
RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");
// 执行转发的方法
dispatcher.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package com.ken.forward;
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 Servlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 从request域中取出数据
String name = (String) request.getAttribute("name");
response.getWriter().write("hello world..." + name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
运行效果:
注意:ServletContext域与Request域的生命周期比较?
ServletContext:
创建:服务器启动
销毁:服务器关闭
域的作用范围:整个web应用
request:
创建:访问时创建request
销毁:响应结束request销毁
域的作用范围:一次请求中
注意:转发与重定向的
1)重定向两次请求,转发一次
2)重定向地址栏的地址变化,转发地址不变
3)重新定向可以访问外部网站,转发只能访问内部
4)转发的性能要优于重定向
注意:客户端地址与服务器端地址的
客户端:
是客户端去访问服务器的地址,服务器外部的地址,特点:写上web应用名
直接输入地址:
重定向
服务器端地址:
服务器内部资源的跳转的地址,特点:不需要写web应用的名称
转发
request总结:
request获得行的内容
request.getMethod()
request.getRequestURI()
request.getRequestURL()
request.getContextPath()
request.getRemoteAddr()
request获得头的内容
request.getHeader(name)
request获得体(请求参数)
String request.getParameter(name)
Map<String,String[]>request.getParameterMap();
String[] request.getParameterValues(name);
注意:客户端发送的参数到服务器端都是字符串
获得中文乱码的解决:
post:
request.setCharacterEncoding(“UTF-8”);
get:
parameter= new String(parameter.getBytes(“iso8859-1”),”UTF-8”);
request转发和域
request.getRequestDispatcher(转发的地址).forward(req,resp);
request.setAttribute(name,value)
request.getAttribute(name)