forward:
是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程实在服务器实现的,并不是在客户端实现的所以客户端并不知道这个跳转动作,所以它的地址栏还是原来的地址.例如:(forwardservelt向forward.jsp跳转:
public class forwardservelt extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String destination = request.getParameter("destination");
if("file".equals(destination)){ // 跳转到 /WEB-INF/web.xml
RequestDispatcher d = request.getRequestDispatcher("/WEB-INF/web.xml");
d.forward(request, response);
}
else if("jsp".equals(destination)){ // 跳转到 /forward.jsp
request.setAttribute("date", new Date()); //向JSP页面传递一个Date 对象
RequestDispatcher dispatcher = request.getRequestDispatcher("/forward.jsp");
dispatcher.forward(request, response);
}
else{
response.setCharacterEncoding("GBK");
response.getWriter().println("缺少参数。用法:" + request.getRequestURL() + "?destination=jsp 或者 file 或者 servlet ");
}
}
}
forward.jsp页面代码
<%@ page language="java" contentType="text/html; charset=GBK" %>
<jsp:directive.page import="java.util.Date"/>
<jsp:directive.page import="java.text.SimpleDateFormat"/>
<%
Date date = (Date)request.getAttribute("date");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Forward 跳转</TITLE>
<link rel='stylesheet' type='text/css' href='<%= request.getContextPath() %>/css/style.css'>
</HEAD>
<BODY>
<div align='center'><br/><fieldset style=width:90%><legend>Forward 跳转</legend><br/>
<div style='line'>
<div>从 ForwardServlet 中取到的 Date 为</div>
<div><%= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(date) %></div>
</div>
<br/>
</div>
</BODY>
</HTML>
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.例如:
Map<String, Integer> map = new HashMap<String, Integer>();
@Override
public void init() throws ServletException {
map.put("/download/1.txt", 0);
map.put("/download/2.txt", 0);
map.put("/download/3.txt", 0);
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filename = request.getParameter("filename");
if(filename != null){ // 设置统计下载次数
int hit = map.get(filename); // 取得已经下载次数
map.put(filename, ++ hit); // 已经下载的次数+1,并保存
response.sendRedirect(request.getContextPath() + filename); // 重定向到文件
System.out.println("dizhi"+request.getContextPath());
}
else{ // 显示下载的次数
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>文件下载</TITLE></HEAD>");
out.println(" <link rel='stylesheet' type='text/css' href='../css/style.css'>");
out.println(" <BODY><br/>");
out.println("<fieldset align=center style=width:90%><legend>文件下载</legend>");
out.println("<table width=100%>");
out.println(" <tr>");
out.println(" <td><b>文件名</b></td>");
out.println(" <td><b>下载次数</b></td>");
out.println(" <td><b>下载</b></td>");
out.println(" </tr>");
for(Entry <String, Integer> entry : map.entrySet()){
out.println("<tr>");
out.println(" <td>" + entry.getKey() + "</td>");
out.println(" <td>" + entry.getValue() + "</td>");
out.println(" <td><a href='" + request.getRequestURI() + "?filename=" + entry.getKey() + "' target='_blank' οnclick='location=location; '>下载</a></td>");
out.println("</tr>");
}
System.out.println( "地址为:"+request.getRequestURI());
out.println("</table>");
out.println(" </legend>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
@Override
public void destroy() {
map = null;
}
forward转发 和 和 redirect重定向 的区别
最新推荐文章于 2020-12-19 08:57:10 发布