一、实验内容
1、request内置对象的熟练使用
(1)创建a.jsp页面,将一个字符串存入请求域属性temp中,转发请求到b.jsp;
(2)在b.jsp中获取并显示temp的值;
(3)将步骤1中 的请求转发到b.jsp改为重定向到b.jsp,观察是否能获取temp的值。
2、session和application内置对象的熟练使用
(1)充分利用session和application的特点,实现一个禁止用户使用同一用户名同时在不同客户端登录的功能程序。
3、exception内置对象的熟练使用
(1)创建exceptionTest.jsp页面,模拟一个空指针异常,指定异常处理页面为error.jsp;
(2)使用exception内置对象在异常处理页面error.jsp中输出异常信息。
二、实验代码:
· 做实验之前要记忆一张图,厘清JSP内置对象的类别
实验1:
这里直接a.jsp和b.jsp一组讨论第一种情况,c.jsp和d.jsp一组讨论第二种情况:
·情况一:
a.jsp用form表单来传入一个值 这样跳转起来更直观,
在b.jsp中用getParameter接收之后,再setAttribute和getAttribute完成实验要求的内容
//a.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 1.请求转发版本,利用表单输入更直观 -->
<form name="regForm" action="b.jsp" method="get">
<table>
<tr>
<td>输入一串字符串:</td>
<td><input type="text" name="string" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交" /></td>
</tr>
</table>
</form>
</body>
</html>
//b.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>request内置对象</h1>
字符串:
<%
request.setCharacterEncoding("UTF-8");
String str = request.getParameter("string");
request.setAttribute("temp", str);//set在服务器内
%>
<!-- getParameter()获取的是客户端设置的数据。
getAttribute()获取的是服务器设置的数据。
所以这里用getAttribute -->
<!-- 将一个字符串存入请求域属性temp中,转发请求到b.jsp -->
<%= request.getAttribute("temp") %>
</body>
</html>
·情况二:
主要是利用sendRedirect方法完成重定向,同时也可以利用其方法拼接字符串完成传参任务,比如:sendRedirect("d.jsp?str="+str+"&pwd="+pwd);中str和pwd就是两个参数,然后用getParameter接收即可
//c.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
/*2.重定向版本*/
String str = "Topus";
%>
<br/>
<%
String pwd = "1234567";
response.sendRedirect("d.jsp?str="+str+"&pwd="+pwd);
%>
</body>
</html>
//d.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 2.改为重定向到b.jsp,观察是否能获取值。 -->
<!--
getParameter()获取的是客户端设置的数据。
getAttribute()获取的是服务器设置的数据。
所以这里用getParameter
-->
<%= request.getParameter("str") %>
<%= request.getParameter("pwd") %>
</body>
</html>
实验2:
大致思路是:建立一个map表,把userid和sessionid一一对应起来,若有新用户登录时,利用其sessionID查找map表,若有则说明已经登陆过,若没有查到则代表是第一次登陆即显示登陆成功,若在map表中查找到则说明已经登陆过。
~注意:
1.JAVA的字符串比较有时候必须得用.equals ,而且if判断语句逻辑必须规范,不然会error500(不知道为啥)
2.userid和userSessionMap都可以通过application存储起来,方便刷新网路之后使用
3.在JSP页面中模拟按钮调用函数可以利用form传参数到自己的页面,刷新后利用if判断语句接收按钮参数然后执行if语句内的代码
👇下面直接上代码:
//login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form name="regForm" action="solution.jsp" method="get">
<table>
<tr>
<td> 输入您的用户ID:</td>
<td><input type="text" name="userid" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交" /></td>
</tr>
</table>
</form>
</body>
</html>
//solution.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
/*需要在JSP指令中加入import="java.util.*" */
//建立一个map表,把userid和sessionid一一对应起来
Map<String,String> userSessionMap = (Map)application.getAttribute("userSessionMap");
String nameStr = request.getParameter("button");//用request得到
String userid = request.getParameter("userid");
if( "yes".equals(nameStr)){
//out.println(userid);
String useridr = (String)application.getAttribute("userid");
out.println(useridr);
//执行你的代码
Map<String,String> tempMap = (Map)application.getAttribute("userSessionMap");
tempMap.remove(useridr);//把userid和sessionid键值对清除出map
application.setAttribute("userSessionMap",tempMap);
//application.removeAttribute("userSessionMap");
//application.setAttribute("userSessionMap",userSessionMap2);
response.sendRedirect("login.jsp");
}else{
//若表单传入数据为空的话
if(userid.isEmpty()){
out.println("数据为空");
}else{
//若为map为空的话
if(userSessionMap==null){
out.println("map为空");
userSessionMap = new HashMap<String,String>();
userSessionMap.put("userid",session.getId());//把userid和sessionid一一对应起来
//session.setMaxInactiveInterval(10);//session的失效时间为十秒
application.setAttribute("userSessionMap" ,userSessionMap);
}else{
//利用userid取出sessionid
String sessionid = userSessionMap.get(userid);
//如果此时这个用户还未登录,即表中还没有该用户的sessionid
if(sessionid == null)
{
out.println(userid+"登陆成功");
application.setAttribute("userid",userid);
userSessionMap.put(userid, session.getId());
}else{
if(sessionid.equals(session.getId())){
out.println(userid+"已经登陆过,不能再登,请退出登录后再登");
}
}
}
}
}
%>
<form action="solution.jsp">
<button name="button" value="yes">直接退出登录</button>
</form>
<input type = "button" value = "返回登录页面" onclick = "window.location.href = 'login.jsp'">
</html>
实验3:
利用JSP指令已经认为制造的异常来模拟异常页面跳转
//error.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 输出异常信息 -->
<h1>这里是异常页面</h1>
<%= exception.getMessage() %>
</body>
</html>
//exceptionTest.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 指定异常之后跳转的页面 -->
<%@page errorPage="/error.jsp"%>
<%
int result=1/0;//人为模拟的异常
%>
</body>
</html>
三、MARK-:
1️⃣既然parameter和attribute都是传递参数,为什么不直接使用parameter呢?
服务器端不能通过setParameter(key, value)来添加参数,因为没有这个函数
所以如果需要在服务器端进行跳转,并需要想下个页面发送新的参数时,则没法实现。但是Attribute可以,可以通过setAttribute(),将值放入到request对象,然后在其他页面使用getAttribute获取对应的值,这样就达到一次请求可以在多个页面共享一些对象信息
②parameter返回值是字符串,意味着不能传递其他的对象,如Map,List,但是attribute则可以存放任意类型的Java对象
2️⃣重定向与转发的比较:
转发是在服务器端发挥作用,通过forward方法将提交信息在多个页面间进行传递。
转发是在服务器内部控制权的转移,客户端浏览器的地址栏不会显示出转向后的地址。
重定向是在客户端发挥作用,通过请求新的地址实现页面转向。
重定向是通过浏览器重新请求地址,在地址栏中可以显示转向后的地址。