Web应用开发: JSP语法编程实践(二) JSP内置对象

一、实验内容

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内置对象的类别
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>
实验1情况1
实验1情况1

 ·情况二:
   主要是利用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>
实验1情况2

实验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>
实验2截图
实验2截图
实验2截图
实验2截图

实验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方法将提交信息在多个页面间进行传递。
转发是在服务器内部控制权的转移,客户端浏览器的地址栏不会显示出转向后的地址。
重定向是在客户端发挥作用,通过请求新的地址实现页面转向。
重定向是通过浏览器重新请求地址,在地址栏中可以显示转向后的地址。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容