美文网首页JavaWebjavaWeb学习Javaweb
Web应用开发: JSP语法编程实践(二) JSP内置对象

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

作者: Topus | 来源:发表于2018-10-26 16:53 被阅读22次

一、实验内容

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

相关文章

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

    一、实验内容 1、request内置对象的熟练使用(1)创建a.jsp页面,将一个字符串存入请求域属性temp中,...

  • 2016-10-11 内置对象

    [TOC] 内置对象及其应用场合 JSP内置对象是应用JSP进行Web开发时,通过它们可以对Web开发中的请求、响...

  • JavaWeb通关知识结构

    Web应用服务器:tomcat 表现层框架:jsp jsp基础语法,指令,内置对象,动作元素和自定义标签jstl ...

  • JSP入门及语法

    一、JSP概述 二、JSP的语法 三、JSP的指令:给JSP引擎用的(服务器用的) 四、JSP的内置对象(9个JS...

  • JSP九大内置对象(隐式对象)

    一、JSP内置对象简介 JSP内置对象是Web容器创建的一组对象,不使用new关键字就可以使用的内置对象。开发者可...

  • JavaWeb之JSP

    八、JSP 目录:什么是JSP、JSP原理、JSP基础语法、JSP指令、9大内置对象、JSP标签 JSTL标签 E...

  • 20160925------JSP内置对象

    JSP内置对象 Jsp内置对象是Web容器创建的一组对象,是不使用new关键字就可以使用的内置对象。常用的JSP九...

  • JSP九大内置对象

    JSP的内置对象 为了便于开发者的使用,在JSP引擎将JSP翻译为.java文件时,会提供9个与web开发相关的对...

  • JSP九大内置对象之out对象

    为何会有JSP内置对象 JSP引擎在调用jspServlet时,会传递或创建9个与web开发相关的对象供jspSe...

  • Web应用开发: JSP语法编程实践一

    实验目标: 掌握JSP中指令标识、脚本标识、动作标识和注释的使用。 实验内容: (1)编写两个JSP页面,在页面1...

网友评论

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

    本文链接:https://www.haomeiwen.com/subject/awvktqtx.html