java重定向并保持同一个会话_java跳转和重定向的区别:一个是浏览器请求一次;一个是浏览器请求后服务器响应后又让浏览器请求重定向的目标资源(共两次请求)。...

本文详细探讨了在Java中如何在页面跳转时保持同一个会话,包括使用request对象、session对象、隐藏域、超链接以及通过servlet传递参数的方法。同时,讲解了重定向的几种方式,如forward()、sendRedirect()以及通过修改HTTP header的Location属性。这些技术在处理用户会话和页面跳转时至关重要。
摘要由CSDN通过智能技术生成

1.从一个jsp页面跳转到另一个jsp页面时的参数传递

(1)使用request对象获取客户端提交的信息

login.jsp页面代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

    getinfo.jsp页面代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

获取文本框提交的信息:

String textContent = request.getParameter("name");

%>

String buttonName = request.getParameter("submit");

%>

0692c071804d4a878eaba19ef1003a21.png

(2)使用session对象获取从客户端提交的信息

session1.jsp页面代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

请输入您的姓名:

session2.jsp通过request对象提取session1.jsp表单中的thename值,并将其保存到session对象中,session2.jsp代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

String name = request.getParameter("thename");

session.setAttribute("thename",name);

%>

您的姓名是:

您喜欢吃什么?

session3.jsp的主要任务是显示结果,它从session对象提取thename的值并显示它,以证明在多个页面中可以通过session对象存储和维持信息,session3.jsp代码如下:

 
 

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

String food = request.getParameter("food");

String name = (String)session.getAttribute("thename");

String pwd = request.getParameter("pwd");

%>

您的姓名是:

您喜欢吃:

您的密码是:

 
 
 
 
 
 
 
 
 
 
 
 
 
 

程序运行结果如图2所示:

b1db635bb7c9122451ebe81171a8f2a0.png

(3)利用隐藏域传递数据

使用隐藏空间记录用户提交日期的hiddenindex.jsp代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

">

请输入您的姓名:

显示隐藏空间信息的hidden.jsp代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

String name = request.getParameter("name");

String date = request.getParameter("time");

%>

您的姓名是:

提交时的系统时间为:

程序运行结果如下:

e5c8abc5d7ad372080cc67656f3471c8.png

使用隐藏域的一个缺点是用户可通过查看网页源程序读到隐藏域的值。

(4)通过超链接传递数据

建立链接到其他分页的超级链接page.jsp代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

int PageCount = 15;

%>

>到第1页

>到最后一页

接收显示分页showpage.jsp代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

String toPage = request.getParameter("ToPage");

out.println("第" + toPage + "页");

%>

运行结果如下:

303c77b1a46317feb261d2de6d88f131.png

2.jsp页面传递参数给servlet

(1)使用request对象接收参数

新建名为ForwardServlet的Servlet类,代码如下:

package com.shi.servlet;

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 ForwardServlet extends HttpServlet

{

private static final long serialVersionUID = 1L;

/**

* 构造函数

*/

public ForwardServlet()

{

super();

}

/**

* 初始化

*/

public void init() throws ServletException

{}

/**

* doGet()方法

*/

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

doPost(request, response);

}

/**

* doPost()方法

*/

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

String name = request.getParameter("name");

String pwd = request.getParameter("pwd");

if((name!=null && !name.equals("")) && (pwd!=null && !pwd.equals("")))

{

if(name.equals("mr")&&pwd.equals("123"))

{

request.getRequestDispatcher("success.jsp").forward(request, response);

}

else

{

request.getRequestDispatcher("error.jsp").forward(request, response);

}

}

}

/**

* 销毁

*/

public void destroy()

{

super.destroy();

}

}

在web.xml中配置ForwardServlet类,代码如下:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

ForwardServlet

com.shi.servlet.ForwardServlet

ForwardServlet

/forward

index.jsp

    新建index.jsp,其中中的action属性值为Servlet类在web.xml中配置的url,提交方式为post,代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

用户名:
密码:

登录成功页面success.jsp,代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

欢迎,登录成功!

    程序的运行结果图5所示:

5c84d61a619b0c47ee3bdd7dabde55fa.png (2)使用session对象,url,form表单传递参数

在jsp2servlet.jsp中,分别使用request对象,session对象,url,form表单设置需要传递的参数,代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

session.setAttribute("testSession","Hello session");

request.setAttribute("testRequest","Hello request");

%>

单击此处

    在Jsp2Servlet中接收jsp页面中传递的参数并将其显示,代码如下:

package com.shi.servlet;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class Jsp2Servlet extends HttpServlet

{

/**

* 自动生成

*/

private static final long serialVersionUID = 1L;

/**

* 构造函数

*/

public Jsp2Servlet()

{

super();

}

/**

* 初始化

*/

public void init()

{}

/**

* doGet()

*/

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

doPost(request, response);

}

/**

* doPost()

*/

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

String strSession = (String)request.getSession().getAttribute("testSession");

String strRequest = (String)request.getAttribute("testRequest");

String strHref = request.getParameter("hrefAction");

String strForm = request.getParameter("action");

String username = request.getParameter("username");

PrintWriter out = response.getWriter();

out.println("HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");

out.println("");

out.println("

");

out.println("保存到session中的内容: " + strSession + "
");

out.println("保存到request中的内容:" + strRequest + "
");

out.println("超链接中传递的参数值为:" + strHref + "
");

out.println("form表单中传递的action值为:" + strForm + "
");

out.println("form表单内input标签中username的值: " + username + "
");

out.println("");

out.println("");

}

/**

* 销毁

*/

public void destroy()

{

super.destroy();

}

}    程序运行结果如图6所示:

f43350ec194362265924495900c35c5c.png

servlet无法获取request.setAttribute()中的内容,因为在jsp2servlet.jsp中提交时,生成的一个新的request,因此无法取到jsp页面中request.setAttribute()中设置的值。

3.从servlet到jsp页面中传递参数

从servlet到jsp页面传递参数,可以使用URL,request对象,session对象,新建Servlet2Jsp.java,代码如下:

package com.shi.servlet;

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 Servlet2Jsp extends HttpServlet

{

/**

* 自动生成

*/

private static final long serialVersionUID = 1L;

/**

* 构造函数

*/

public Servlet2Jsp()

{

super();

}

/**

* 初始化

*/

public void init()

{}

/**

* doGet()

*/

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

doPost(request, response);

}

/**

* doPost()

*/

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

String url = "result.jsp?first=传递第一个参数&second=传递第二个参数";

String strRequest = "request传值";

String strSession = "session传值";

request.setAttribute("strRequest", strRequest);

request.getSession().setAttribute("strSession", strSession);

/**

* 客户端跳转:效率低

* session范围属性,url中的参数会传递下去,request范围属性不传递

*/

//response.sendRedirect(url);

/**

* 服务器端跳转:常用,效率高

* request范围属性,session范围属性,url中的参数会传递

*/

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

}

/**

* 销毁

*/

public void destroy()

{

super.destroy();

}

}

在web.xml中配置该servlet后,新建参数接收页result.jsp,代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

String strURL = request.getParameter("first");

String strRequest = (String)request.getAttribute("strRequest");

String strSession = (String)request.getSession().getAttribute("strSession");

%>

URL中取得的属性值为:

request中取得的属性值为:

session中取得的属性值为:

    程序的运行结果如图7所示:

ce0d3e03d76821385672bb3902de8ca9.png

4.从一个servlet到另一个servlet时的参数传递

(1)通过超链接和表单传递数据

通过超链接后面给定要传递参数的值,但长度有限制,通过超链接和表单传递数据,使用request.getParamter()方法,代码如下:

package com.shi.servlet;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class ServletA extends HttpServlet

{

/**

* 自动生成

*/

private static final long serialVersionUID = 1L;

/**

* 构造函数

*/

public ServletA()

{

super();

}

/**

* 初始化

*/

public void init()

{}

/**

* doGet()

*/

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

doPost(request, response);

}

/**

* doPost()

*/

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

response.setContentType("text/html");

PrintWriter out = response.getWriter();

String name = "hello, servlet";

out.println("");

out.println("

");

/**

* 超链接

*/

out.println("this is a test");

/**

* 表单

*/

out.println("

");

out.println("用户名:");

out.println("");

out.println("");

out.println("

");

out.println("");

out.println("");

out.flush();

}

/**

* 销毁

*/

public void destroy()

{

super.destroy();

}

}    接收servlet中传递参数的代码如下:

package com.shi.servlet;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class ServletB extends HttpServlet

{

/**

* 自动生成

*/

private static final long serialVersionUID = 1L;

/**

* 构造函数

*/

public ServletB()

{

super();

}

/**

* 初始化

*/

public void init()

{}

/**

* doGet()

*/

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

doPost(request, response);

}

/**

* doPost()

*/

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

String name = request.getParameter("name");

String username = request.getParameter("username");

response.setContentType("text/html;charset=gb2312");

PrintWriter out = response.getWriter();

out.println("");

out.println("

");

out.println("超链接传递的参数值为:" + name);

out.println("form表单中提交的用户名为:" + username);

out.println("");

out.println("");

out.flush();

}

/**

* 销毁

*/

public void destroy()

{

super.destroy();

}

}

程序运行结果如图8所示:

7c700d92ec17442299465f59e5f3906e.png (2)使用setAttribute()和getAttribute()方法传递参数

设置参数的ServletA代码如下:

package com.shi.servlet;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class ServletA extends HttpServlet

{

/**

* 自动生成

*/

private static final long serialVersionUID = 1L;

/**

* 构造函数

*/

public ServletA()

{

super();

}

/**

* 初始化

*/

public void init()

{}

/**

* doGet()

*/

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

doPost(request, response);

}

/**

* doPost()

*/

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

/**

* setAttribute()和getAttribute()

*/

String data = "This is a test, we need more test for this";

request.setAttribute("strAtt", data);

request.getRequestDispatcher("/ServletB").forward(request, response);

}

/**

* 销毁

*/

public void destroy()

{

super.destroy();

}

}    获取参数的ServletB代码如下:

package com.shi.servlet;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class ServletB extends HttpServlet

{

/**

* 自动生成

*/

private static final long serialVersionUID = 1L;

/**

* 构造函数

*/

public ServletB()

{

super();

}

/**

* 初始化

*/

public void init()

{}

/**

* doGet()

*/

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

doPost(request, response);

}

/**

* doPost()

*/

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

String strAtt = (String)request.getAttribute("strAtt");

response.setContentType("text/html;charset=gb2312");

PrintWriter out = response.getWriter();

out.println("");

out.println("

");

out.println("getAttribute()得到的数据值为:" + strAtt);

out.println("");

out.println("");

out.flush();

}

/**

* 销毁

*/

public void destroy()

{

super.destroy();

}

}    程序的运行结果如图9所示:

99a8c9da9ea859e987f3d66db99e880d.png

5.JSP页面跳转方法

(1)RequestDispatcher.forward()

在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP或普通HTML文件,即你的form提交至a.jsp,在a.jsp用到了forward()重定向到b.jsp,此时form提交的所有信息在b.jsp都可以获得,参数自动传递。但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法再后面带参数传递,比如servlet?name=tom,这样不行,可以程序内通过response.setAttribute("name",name)来传至下一个页面。

重定向后浏览器地址栏URL不变。

通常在Servlet中使用,不在jsp中使用。

(2)response.sendRedirect()

在用户的浏览器端工作,sengRedirect()可以带参数传递,比如servlet?name=tom传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向至有frame的jsp文件。

重定向后在浏览器地址栏上会出现重定向页面的URL。

上述两种方式代码见图7。

由于response是jsp页面中的隐含对象,故在jsp页面中可以用response.sendRedirect()直接实现重定位。

注意:

①.使用response.sendRedirect()时,前面不能有HTML输出

这并不是绝对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的Server都有cache机制,一般在8K(JSP SERVER),这意味着,除非你关闭了cache,或者你用out.flush()强制刷新,那么在使用sendRedirect之前,有少量的HTML输出也是允许的。

②.response.sendRedirect()之后,应该紧跟一句return

我们已经知道response.sendRedirect()是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后面的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。

比较:

①.Dispatcher.forward()是容器中控制权的转向,在客户端浏览器地址栏中不会出现转向后的地址

②.response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。

前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法。

注:在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRedirect()方法。

(3)

它的底层部分是由RequestDispatcher来实现的,因此它带有RequestDispatcher.forward()方法的印记。

如果在之前有很多输出,前面的输出已使缓冲区满,将自动输出至客户端,那么该语句将不起作用,这一点应该特别注意。

另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交。

测试代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

    程序运行结果如图10所示:

cd182a09f8b5b09b1ad606ebe0aa542a.png

(4)修改HTTP header的Location属性来重定向

通过设置直接修改地址栏来实现页面的重定向。

索引页1.jsp代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);

String newLocn = "2.jsp";

response.setHeader("Location",newLocn);

%>

    转向页2.jsp代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

从1.jsp跳转至此页

    程序运行结果如图11所示:

ddb8c73cc3726b910559a555cca04c2c.png

(5)JSP中实现在某页面停留若干秒后,自动重定向到另一页面

在jsp文件中,下面的代码:

含义是:在5秒后正在浏览的页面将会自动变为target.jsp页。代码中5为刷新的延迟时间,以秒为单位。target.jsp为你想转向的目标页,若为本页则自动刷新本页。

由上可知,可以通过setHeader来实现某页面停留若干秒后,自动重定向到另一页面。

索引页5_1.jsp代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

String content = "5; url=5_2.jsp";

response.setHeader("REFRESH",content);

%>

5_1.jsp页面,5秒后转向5_2.jsp页面。

转向页5_2.jsp代码如下:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

从5_1.jsp转到的页面

    程序运行结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值