response.sendRedirect(url);getServletContext().getRequestDispatcher(url).forward(request,response);区别?

NullGate 2003-04-10 03:20:34
从servlet转向到jsp,我发现下面的问题,已经困扰我很久了

1。用response.sendRedirect(url);
在jsp中用request.getParameter(ff);得到的永远是null

2.getServletContext().getRequestDispatcher(url).forward(request,response);
虽能是转到了jsp,但这个网页的名字既能还是servlet的名字,这就导致现在的jsp中相对路径出问题了
...全文
335 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ltz 2003-06-06
  • 打赏
  • 举报
回复
mark
zez 2003-04-29
  • 打赏
  • 举报
回复
mark
13060939425 2003-04-29
  • 打赏
  • 举报
回复
ServletRequest.getRequestDispatcher 怎么写呀,
getServletRequest().getRequestDispatcher()是不对的
request.getRequestDispatcher()也是不对的

还有:
ajiao() ( )
sparkwu(吳府明)
upc_chenli(chenli)
名字不一一列举了;

你们能不能留个QQ号????
upc_chenli 2003-04-11
  • 打赏
  • 举报
回复
直观一点:
response.sendRedirect(url);
对服务器的响应进行重定向。当Server作出响应后,Client客户端的请求(Request)的生存周期就终止了。这个时候再用request.getParameter()或request.getAttribute()得到的只能是null。

getServletContext().getRequestDispatcher(url).forward(request,response);
它则可以认为是对Client的请求(request) 进行传递,在Server没有进行响应前,即没有Response一直可以进行传递--重定向。
ajiao 2003-04-10
  • 打赏
  • 举报
回复
to NullGate
你的问题是要转向的这个jsp文件与servlet不在同一个servlet上下文中吗?
getServletContext().getContext(String jspfileContext)能够取得jsp文件的servlet环境

用getServletContext().getContext(String jspfileContext)替换getServletContext()

NullGate 2003-04-10
  • 打赏
  • 举报
回复
2 有个致命的缺点,转向后的jsp还是相当于原servlet的环境下,因为jsp和servlet可能不在同一目录下,导致jsp中原来写的相对路径都出问题了
网络咖啡 2003-04-10
  • 打赏
  • 举报
回复
1.适合只是重定向,即不传递任何信息,如参数、会话对象等,效率高
2.适合所有重定向,效率低一些,可以传递参数、会话对象,还可以自己添加参数,但是速度稍微慢了一些
ajiao 2003-04-10
  • 打赏
  • 举报
回复
新页面你要是调用request.getServletPath()得到的肯定还是原servlet的名字,
要得到正确的路径你可以调用request.getAttribute("javax.servlet.include.servlet_path") 这样就可以显示你jsp页面的路径
sparkwu 2003-04-10
  • 打赏
  • 举报
回复
Hello Brother:
Reference it
服务器端进行转向的4种方法:
1. ServletContext的getRequestDispatcher()
2. ServletContext的getNamedDispatcher()
3. ServletRequest的getRequestDispatcher()
4. ServletResponse的sendRedirect()进行转向。
1.2.3 => forward() 4. sendRedirect()
使用forward方法,因为这些这样比较高效。只有在forward方法不能使用时(比如要转向到一个非本web应用),再使用ServletResponse的sendRedirect()方法。

<jsp:fordward>与 sendRedirect 方法的比较
虽然 <jsp:fordward>与 sendRedirect 方法,都可以将浏览器浏览的网页,重导至另一个网页,但是两者在原理上是不太相同。
a. <jsp:fordward> : 动作是利用伺服端,将资料输出至缓冲区的机制,在前一个网页尚未输出到客户端前,取消资料的输出,然后输出另一个网页的资料,达到重导浏览器的效果。
优点: 两网页间可以分享 request 对象内的变量。
b. sendRedirect : 动作是透过 HTTP 协议的 Header , 对浏览器下达重导指令,因此,不牵涉到服务器端缓冲区的问题。
不过由于 sendRedirect 方法作用于客户端,所以重导前后网页无法分享存在于 request 对象内的变量。
Solution: response.sendRedirect(“sendRedirect.htm?name=sparkwu&E-Mail=spark.wu@cobra-tech.com”)

Good Luck!
ajiao 2003-04-10
  • 打赏
  • 举报
回复
1.response.sendRedirect(url); 新的页面并不能处理旧页面的pageContext(request,response,...)对象,所以你用request.getParameter(ff)企图调用原页面
request对象的参数,得到的自然是null

2.getServletContext().getRequestDispatcher(url).forward(request,response);

forward函数已经把原页面的request,response对象传入新的页面,因此这新旧页面拥有相同的
request,response对象。request.getParameter(ff)就可以得到相应的值

3.ServletContext.getRequestDispatcher 路径必须是相对上下文的绝对路径

ServletRequest.getRequestDispatcher 可以是相对也可以是绝对

具体的参见api document
Hikaru 2003-04-10
  • 打赏
  • 举报
回复
1 从response中sendRedirect过去并不发送请求,你需要用提交的方法。不然,你直接把parameter放在session中也可以。

2 只能换种做法,你这样肯定是servlet的名字/
NullGate 2003-04-10
  • 打赏
  • 举报
回复
top
package com.bjsxt.servlet; import com.bjsxt.entity.User; import com.bjsxt.service.UserService; import com.bjsxt.service.impl.UserServiceImpl; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.*; import java.io.IOException; import java.net.URLEncoder; import java.sql.Date; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class UserServlet extends BaseServlet { // @Override // protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // //解决POST表单的中文乱码问题 // request.setCharacterEncoding("utf-8"); // //接收method属性的值 // String methodName = request.getParameter("method"); // // //根据method属性的值调用相应的方法 // if("login".equals(methodName)){ // this.login(request,response); // }else if("register".equals(methodName)){ // this.register(request,response); // }else if("logout".equals(methodName)){ // this.logout(request,response); // } // // } public void show(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取表单的数据 String userId = request.getParameter("userId"); if(userId == null){ userId = ""; } String strAge = request.getParameter("minAge"); int minAge = 0; try{ minAge = Integer.parseInt(strAge); //"12" "abc" }catch(NumberFormatException e){ e.printStackTrace(); } //调用业务层完成查询操作 UserService userService = new UserServiceImpl(); //List userList = userService.findAll(); List userList = userService.find(userId,minAge); //List userList = null; //List userList = new ArrayList(); //跳转到show.jsp显示数据 request.setAttribute("userId",userId); request.setAttribute("minAge",strAge); request.setAttribute("ulist",userList); request.getRequestDispatcher("/admin/show.jsp").forward(request,response); } public void logout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //结束当前的session request.getSession().invalidate(); //跳转回登录页面 response.sendRedirect(request.getContextPath()+"/admin/login.jsp"); } public void register(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //request.setCharacterEncoding("utf-8"); //1.接收来自视图层的表单数据 String userId = request.getParameter("userId"); String realName = request.getParameter("realName"); String pwd = request.getParameter("pwd"); String rePwd = request.getParameter("repwd"); int age = Integer.parseInt(request.getParameter("age"));// "23" String [] hobbyArr = request.getParameterValues("hobby"); String strDate = request.getParameter("enterDate");//"1999-12-23" Date enterDate = Date.valueOf(strDate); //util.Date SimpleDateFormat //判断两次密码是否相同 if(pwd == null || !pwd.equals(rePwd)){ request.setAttribute("error","两次密码必须相同"); request.getRequestDispatcher("/admin/register.jsp").forward(request,response); return; } //2.调用业务层完成注册操作并返回结果 User user = new User(userId,realName,pwd,age, Arrays.toString(hobbyArr),enterDate); UserService userService = new UserServiceImpl(); int n = userService.register(user); //3.根据结果进行页面跳转 if(n>0){ response.sendRedirect(request.getContextPath()+"/admin/login.jsp"); }else{ request.setAttribute("error","注册失败"); request.getRequestDispatcher("/admin/register.jsp").forward(request,response); } } public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解决POST表单的中文乱码问题 //request.setCharacterEncoding("utf-8"); //获取用户名和密码 request 内建对象 请求 String username = request.getParameter("username"); String password = request.getParameter("password"); String rememberme = request.getParameter("rememberme"); //调用下一层判断登录是否成功,并返回结果 //进行服务器端的表单验证 if(username ==null || "".equals(username)){ request.setAttribute("error","用户名不能为空JSP"); request.getRequestDispatcher("/admin/login.jsp").forward(request,response); return; } if (username.length()<=6){ request.setAttribute("error","用户名长度必须大于6JSP"); request.getRequestDispatcher("/admin/login.jsp").forward(request,response);//后面语句还会执行 return; //后面的语句不再执行 } // boolean flag = false;//默认失败 // if(username.indexOf("sxt")>=0 || username.contains("尚学堂")){ // flag = true; // } User user = null;//默认登录失败 // UserDao userDao = new UserDaoImpl(); // user = userDao.find(username,password); UserService userService = new UserServiceImpl(); user = userService.login(username,password); //userService.addOrder("shoppingCart"); //输出结果 if(user != null){ //登录成功才记住我 //1.办理会员卡 String username2 = URLEncoder.encode(username,"utf-8"); Cookie cookie1 = new Cookie("uname",username2); Cookie cookie2 = new Cookie("password",password); //2.指定会员卡的作用范围,默认范围是当前目录 /servlet/LoginServlet /admin/login.jsp //cookie1.setPath("/"); //当前服务器 cookie1.setPath("/myservlet2/"); //当前项目 cookie2.setPath("/myservlet2"); //3.指定会员卡的作用时间 if("yes".equals(rememberme)){ cookie1.setMaxAge(60*60*24*10); //默认的时间浏览器不关闭的时间;-1 表示一直有效 cookie2.setMaxAge(60*60*24*10); }else{ cookie1.setMaxAge(0); cookie2.setMaxAge(0); } //4.将会员卡带回家 response.addCookie(cookie1); response.addCookie(cookie2); //成功跳转到成功页面 //out.println("登录成功"); // /servlet/LoginServlet // /servlet/success.jsp // request.getRequestDispatcher("/admin/success.jsp").forward(request,response); HttpSession session = request.getSession(); // session.setAttribute("username",username); session.setAttribute("user",user); //response.sendRedirect("/myservlet2/admin/success.jsp"); //response.sendRedirect("https://www.bjsxt.com:443/news/11377.html"); //response.sendRedirect("http://localhost:8080/myservlet2/admin/success.jsp"); //response.sendRedirect("/myservlet2/admin/success.jsp"); //response.sendRedirect("/myservlet2/admin/success.jsp"); //response.sendRedirect(request.getContextPath()+"/admin/success.jsp"); //http://192.168.58.250:8080/myservlet2/servlet/LoginServlet //http://192.168.58.250:8080/myservlet2/admin/success.jsp //登录成功后,网站的访问人数+1 //1.获取当前的访问人数 ServletContext context = this.getServletContext(); Integer count2 = (Integer) context.getAttribute("count"); //2.人数+1 if(count2 == null){ //第一个用户 count2 = 1; }else{ count2++; } //3.再存放到application作用域中 context.setAttribute("count",count2); //http://192.168.58.250:8080/myservlet2/servlet/admin/success.jsp response.sendRedirect("../admin/success.jsp"); }else{ //失败跳转回登录页面 //out.println("登录失败"); request.setAttribute("error","用户名或者密码错误"); // RequestDispatcher rd = request.getRequestDispatcher("/admin/login.jsp"); // rd.forward(request,response); //RequestDispatcher rd = request.getRequestDispatcher("http://localhost:8080/myservlet2/admin/login.jsp"); //RequestDispatcher rd = request.getRequestDispatcher("/admin/login.jsp"); //http://192.168.58.250:8080/myservlet2/servlet/admin/login.jsp RequestDispatcher rd = request.getRequestDispatcher("../admin/login.jsp"); rd.forward(request,response); } } }
实现jsp页面间的跳转 public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {   response.setContentType("text/html; charset=gb2312");   ServletContext sc = getServletContext();   RequestDispatcher rd = null;   rd = sc.getRequestDispatcher("/index.jsp"); //定向的页面   rd.forward(request, response); }   通常在servlet中使用,不在jsp中使用。    2.response.sendRedirect()   是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件.   重定向后在浏览器地址栏上会出现重定向页面的URL   例:在servlet中重定向 public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {   response.setContentType("text/html; charset=gb2312");   response.sendRedirect("/index.jsp"); }   由于response是jsp页面中的隐含对象,故在jsp页面中可以用response.sendRedirect()直接实现重定位。   注意:    (1) 使用response.sendRedirect时,前面不能有HTML输出   这并不是绝对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制,一般在8K(我是说 JSP SERVER),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的HTML输出也是允许的。    (2) response.sendRedirect之后,应该紧跟一句return;   我们已经知道response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。   比较:    (1) Dispatcher.forward()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;    (2) response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。   前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法.   注:在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。    3.   它的底层部分是由RequestDispatcher来实现的,因此它带有RequestDispatcher.forward()方法的印记。   如果在之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意。   另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交    4.修改HTTP header的Location属性来重定向   通过设置直接修改地址栏来实现页面的重定向。    jsp文件代码如下:    5.JSP中实现在某页面停留若干秒后,自动重定向到另一页面   在html文件中,下面的代码:
protected void doPost HttpServletRequest request HttpServletResponse response throws ServletException IOException { String action request getParameter "action" ; Teacher t new Teacher ; t setUsername request getParameter "username" ; if "register" equals action { t setPassword MD5 generateMD5 request getParameter "password" ; if teacherDao add t >0 { request getSession setAttribute "mess" "恭喜 注册成功 " ; response sendRedirect "login jsp" ; }else{ response sendRedirect "error jsp" ; } }else if "login" equals action { t setPassword MD5 generateMD5 request getParameter "password" ; if teacherDao queryByTeacher t size >0 { Constants ONLINE COUNT++; Object oCount getServletContext getAttribute "count" ; if oCount null { getServletContext setAttribute "count" 1 ; }else{ getServletContext setAttribute "count" Integer getServletContext getAttribute "count" +1 ; } request getSession setAttribute "teacher" t ; request getSession setAttribute "students" studentDao queryStudentsByTeacher t ; if request getParameter "autoLogin" null { Cookie cookie1 new Cookie "username" t getUsername ; Cookie cookie2 new Cookie "password" t getPassword ; cookie1 setMaxAge 60 60 24 14 ; cookie2 setMaxAge 60 60 24 14 ; response addCookie cookie1 ; response addCookie cookie2 ; } response sendRedirect "index jsp" ; }else{ request setAttribute "mess" "用户名或密码错误 " ; request getRequestDispatcher "login jsp" forward request response ; } }else if "autoLogin" equals action { t setPassword request getParameter "password" ; if teacherDao queryByTeacher t size >0 { Constants ONLINE COUNT++; Object oCount getServletContext getAttribute "count" ; if oCount null { getServletContext setAttribute "count" 1 ; }else{ getServletContext setAttribute "count" Integer getServletContext getAttribute "count" +1 ; } request getSession setAttribute "teacher" t ; request getSession setAttribute "students" studentDao queryStudentsByTeacher t ; response sendRedirect "index jsp" ; }else{ request setAttribute "mess" "用户名或密码错误 " ; Cookie[] cookies request getCookies ; if cookies null { for Cookie cookie : cookies { if "username" equals cookie getName || "password" equals cookie getName { cookie setValue null ; 关键 cookie setMaxAge 0 ; response addCookie cookie ; } } } request getRequestDispatcher "login jsp" forward request response ; } }else if "loginOut" equals action { request getSession invalidate ; response sendRedirect "login jsp" ; } }">protected void doPost HttpServletRequest request HttpServletResponse response throws ServletException IOException { String action request getParameter "action" ; Teacher t new Teacher ; t setUsername request getParameter "username" ; if "register" equals ac [更多]

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧