前几天面试,面试官问的题目:两个jsp之间传递值的方法有哪些?

我根据自己的理解总结一下:
在HTTP协议中一共有4种方法:1.URL传值;2.表单传值;3.Cookie方法;3.Session方法;

1、URL传值

url传值主要是静态传递数值。
例如将页面1中的值传给页面2:
1.  index1.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>页面1</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0"> 
</head>
<body>
<%
String str="123";
int number=Integer.parseInt(str);
%>
该数的和为:<%=number+number %> <hr>
<a href="index2.jsp?number=<%=number %>">传值</a> 
</body>
</html>

2.  index2.jsp页面
 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
    <title>页面2</title> 
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head> 
  <body>
    <%
        //获得number
        String str=request.getParameter("number");
        int number=Integer.parseInt(str);
     %>
         该数字的三倍为:<%=number*3 %> <hr>
  </body>
</html>

2.表单传值

url传值的最大缺点就是传递的值可以被看到,而表单传值正好改正了这一缺点。

例如表单将页面1中的变量传给页面2:
1.  index1.jsp:
 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>页面1</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head>
  <body>
  <%
      String str="123";
      int number=Integer.parseInt(str);
   %>
       该数的两倍为:<%=number*2 %>  <hr>
       <form action="index2.jsp" method="post">
           <input type="text" name="number" value="<%=number %>">
           <input type="submit" value="到达index2">
       </form>    
  </body>
</html>

2. index2.jsp:
 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
    <title>页面2</title> 
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head> 
  <body>
    <%
        //获得number
        String str=request.getParameter("number");
        int number=Integer.parseInt(str);
     %>
         该数字的三倍为:<%=number*3 %> <hr>
  </body>
</html>

3.Cookie方法

cookie传值方法保密性比表单传值更强

cookie的含义:
Cookie是一个小的文本数据,由服务器端生成,发送给客户端浏览器,客户端浏览器如果设置为启用 cookie,则会将这个小文本数据保存到其目录下的文本文件内。
客户端下次登录同一网站,浏览器则会自动将 Cookie 读入之后,传给服务器端。服务器端可以对该 Cookie 进行读取并验证(当然也可以不读取)。

cookie传值过程:

在第一个页面中,将要共享的变量值保存在客户端 Cookie 文件内,在客户端访问第二个页面时,由于浏览器自动将 Cookie读入之后,传给服务器端,因此只需要第二个页面中,由服务器端页面读取这个 Cookie 值即可。
1. index1.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>index1</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    

  </head>
  <body>
  <h3>成功</h3>
  <h3>欢迎</h3>
    <%
          String uri = request.getRequestURI();//返回请求行中的资源名称
           String url = request.getRequestURL().toString();//获得客户端发送请求的完整url
           String ip = request.getRemoteAddr();//返回发出请求的IP地址
           String params = request.getQueryString();//返回请求行中的参数部分
           String host=request.getRemoteHost();//返回发出请求的客户机的主机名
           int port =request.getRemotePort();//返回发出请求的客户机的端口号。
    %>
    <%
        Cookie c=new Cookie("get_ip",ip);
        c.setMaxAge(600);
        response.addCookie(c);
     %>
  </body>
</html>

2. index2.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>  
    <title>index2</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head>
  <body>
    <h3>获取页面1传来的数据</h3>      
    <%
        String ip=null;
           Cookie[] cookies=request.getCookies();
           for(int i=0;i<cookies.length;i++) {
               if(cookies[i].getName().equals("get_ip")) {
                   ip=cookies[i].getValue();
                   break;
               }
           }
     %>
     ip:<%=ip %>
  </body>
</html>

 

4.Session方法

1、区别:
前几种方法在传递数据时,有一个共同的问题就是内容保存在客户端里。因此,具有泄露的危险性。如果在不考虑服务器负载的情况下,将数据保存在服务端里,是一个比较好的方法,这就是session方法。
通过session.setAttribute("num",str);将str存到session中,通过session.getAttribute("num");从session中获取num
具体的session机制,可以查看该文章。点击查看session机制

2、session的应用:
session 经常用于保存用户登录状态。比如用户登录成功之后要访问好几个页面,但是每个页面都需要知道是哪个用户在登录,此时就可以将用户的用户名保存在 session 内。
login.jsp:

<%@ page language="java" import="java.util.*"%>
登录
<form action="login.jsp" method="post">
	账号:<input name="account" type="text">
	密码:<input name="password" type="password">
	<input type="submit" value="登录">
</form>
<%
	
	String account = request.getParameter("account");//获取账号
	String password = request.getParameter("password");//获取密码
	if(account!=null)
	{
		//验证账号密码,比如登录成功的条件是账号和密码相同
		if(account.equals(password))
		{
			//放入 session
			session.setAttribute("account",account);
			//跳转到下一个页面
            response.sendRedirect("loginResult.jsp");
		}
		else
		{
			out.println("登录不成功");
		}
	}
%>

index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
    if(session.getAttribute("account")==null)
    {
        response.sendRedirect("login.jsp");
    }
%>
欢迎<%=session.getAttribute("account") %>