黑马程序员---Servlet之间的跳转方式
来源:互联网 发布:淘宝鹊桥app 编辑:程序博客网 时间:2024/05/16 19:17
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
现在的MVC框架中都使用了Servlet跳转。MVC框架把程序分成三个独立模块:业务处理系统(Model),试图模块(View),控制模块(Control)。在Struts框架中这三部分分别为三个Servlet,程序在3个Servlet之间跳转。
转向Forward
转向是通过RequestDispatcher对象的forward(HttpServletRequest req,HttpServletResponse resp)方法实现的。The pathname specified may be relative, although it cannot extend outside the current servlet context. If the path begins with a "/" it is interpreted as relative to the current context root.(虽然它不能包含当前servlet项目以为的的资源,但是路径名可以被定义为相对路径。如果路径以‘/’开始,表示本应用程序的根目录。)代码如下:
RequestDispatcher dispatcher =req.getRequestDispacher("/servlet/LifeCycleServlet");
dispatcher.forward(request,response);
ForwadServlet代码
package com.helloweenvsfei.servlet;
import java.io.IOException;
import java.util.Date;
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 ForwardServlet extends HttpServlet {
private static final long serialVersionUID = -291840563095094360L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String destination = request.getParameter("destination");
// 跳转到 /WEB-INF/web.xml。通过地址栏输入网址是不能访问到该文件的,但是 forward 可以
if("file".equals(destination)){
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/web.xml");
dispatcher.forward(request, response);
}
// 跳转到 /forward.jsp
else if("jsp".equals(destination)){
// 通过 setAttribute 方法传递一个 Date 对象给 JSP 页面
Date date = new Date();
request.setAttribute("date", date);
RequestDispatcher dispatcher = request.getRequestDispatcher("/forward.jsp");
dispatcher.forward(request, response);
}
// 跳转到另一个 Servlet
else if("servlet".equals(destination)){
RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet/LifeCycleServlet");
dispatcher.forward(request, response);
}
else{
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
response.getWriter().println("缺少参数。用法:" + request.getRequestURL() + "?destination=jsp 或者 file 或者 servlet ");
}
}
public void doPut(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
本程序用到一个jsp文件,forward.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<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 class='leftDiv' style='width:250px; '>
从 ForwardServlet 中取到的 Date 为
</div>
<div align='left' class='rightDiv'>
<%=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")
.format(date)%>
</div>
</div>
<br />
<div style='line'>
<div align="center">
<input type='button'
onclick='location="<%=request.getContextPath()%>/servlet/ForwardServlet?destination=servlet"; '
onmouseover="window.status='<%=request.getContextPath()%>/servlet/ForwardServlet?destination=servlet'"
value='跳转到 Servlet' class=button>
<input type='button'
onclick='location="<%=request.getContextPath()%>/servlet/ForwardServlet?destination=file"; '
onmouseover="window.status='<%=request.getContextPath()%>/servlet/ForwardServlet?destination=file'"
value='跳转到 web.xml' class=button>
<input type='button'
onclick='location="<%=request.getContextPath()%>/servlet/ForwardServlet?destination=jsp"; '
onmouseover="window.status='<%=request.getContextPath()%>/servlet/ForwardServlet?destination=jsp'"
value='跳转到 JSP' class=button>
</div>
</div>
</BODY>
</HTML>
当使用forward形式跳转Servlet是,地址栏会显示跳转前的Servlet访问地址。因为该跳转是在服务器端实现的,客户端浏览器并不知道该跳转的动作。也就是说forward跳转对于客户端浏览器是透明的。
在Struts 、webWork的MVC框架中,都是用Servlet来处理用户的请求,把结果通过request.setAttribute放到request中,然后forward到JSP当中。
Redirect重定向
重定向是利用服务器返回的状态码实现的。客户端浏览器请求服务器的时候,服务器端会返回一个状态码。服务器端通过HttpServletResponse的setStatus(int status)方法设置状态码。
利用Servlet统计下载文件的下载次数。
package com.helloweenvsfei.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RedirectServlet extends HttpServlet {
private static final long serialVersionUID = 4442189888545647793L;
Map<String, Integer> map = new HashMap<String, Integer>();
@Override
public void init() throws ServletException {
map.put("/download/setup.exe", 0);
map.put("/download/application.zip", 0);
map.put("/download/01.mp3", 0);
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filename = request.getParameter("filename");
if(filename != null){
// 取下载次数
int hit = map.get(filename);
// 下载次数 + 1 后保存
map.put(filename, ++ hit);
// 重定向到文件
response.sendRedirect(request.getContextPath() + filename);
}
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>");
}
out.println("</table>");
out.println(" </legend>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
@Override
public void destroy() {
map = null;
}
}
当使用Redirect跳转Servlet时,跳转在客户端实现。也就是说客户端浏览器实际上请求了两次服务器,第一次获取重定向状态吗与重定向的网址,第2次访问真实地址。
自动刷新Refresh
response.setHeader("Refresh","1000;URL=http://localhost:8080/servlet/exapmle.html").
某些情况下自动刷新很有用处。例如实时显示股市走势,或定时检查是否有新邮件到达。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
- 黑马程序员---Servlet之间的跳转方式
- 黑马程序员——Servlet生命周期和Servlet之间的跳转
- Servlet之间的跳转
- Servlet之间的跳转
- Servlet之间的跳转
- Servlet之间的跳转
- Servlet之间的跳转
- Servlet之间的跳转
- Servlet之间的跳转
- Servlet的跳转方式
- servlet的跳转方式
- Java servlet 之间的跳转
- Servlet的页面跳转方式
- jsp与servlet之间的跳转
- Java开发之Servlet之间的跳转
- Java开发之Servlet之间的跳转
- JSP跳转方式与Servlet跳转方式的区别
- Servlet之间跳转
- 对于arcgis分类“... classified,出现Unique histogram does not exist“问题的解决
- 20121025 - 20121026(Every day English.)
- php运算符优先级
- <每日一句英语> 2012-10-25
- 一位码农的人生自述(五十二)------技交(csdn)
- 黑马程序员---Servlet之间的跳转方式
- 递归~放苹果
- 计算机应用技术学习方法的一点心得!
- 算法设计:从一个很大很大的数组里找前N个最大数的思路之一
- 《micro2440开发》第六章:micro2440 ADS单步调试总结
- 前行在移动开发的路途中
- arcgis server manger页面打不开,问题形如”...无法生成临时类(result=1)。 ”的解决
- php list()
- Android开发——自动连接指定SSID的wifi热点(不加密/加密)