前几天面试,面试官问的题目:两个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") %>