您的位置:首页 > 其它

forward转发和redirect重定向详解

2015-08-27 10:55 429 查看
forward:

是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程实在服务器实现的,并不是在客户端实现的所以客户端并不知道这个跳转动作,所以通过forward方式,它的地址栏还是原来的地址.例如:(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是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以通过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' onclick='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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: