中北大学软件学院javaweb实验二JSP应用开发实验报告

实验时间

2024年4月 25 日17时至 22 时

学时数

4

1.实验名称

   实验2:JSP应用开发(2学时)

2.实验目的

(1)学会编写和运行简单的JSP页面,理解其运行原理;

(2)学会使用JSP的声明、表达式、脚本和注释;

(3)理解JSP页面(page)指令和动作的语法格式,并熟练使用;

(4)理解JSP中常用的内置对象,并熟练使用。

3.实验内容

(1)编程实现在JSP页面中输出由星号“*”组成的菱形;

(2)编程实现一个实现页面计数的计数器,要求当刷新页面时不增加计数;

(3)[贯穿项目]用户登录验证(无数据库实现)。

4.实验原理或流程图

JSP有三个指令元素:page、include和taglib。这些指令元素是针对JSP引擎的,并不会产生任何看得见的输出。它们都包含在<%@和%>标签内。本实验主要学习page指令。

<%@ page %>指令作用于整个JSP页面,包括静态包含的页面,但不包括动态包含的页面。可以在一个页面中包含多个<%@ page %>指令,但其属性除import外只能在整个页面中出现一次。

<%@ page %>指令可以放在页面的任何位置,但为了JSP程序的可读性,一般将<%@ page %>指令放在页面的前面。

包含指令:静态包含:<@ include file=””>

          动态包含:<jsp:include page=””/>无参数传递

                    <jsp:include page=””>

                      <jsp:param: name=”” value=””>

                    </jsp:include/>

跳转指令:<jsp:forward page=””>

              <jsp:param: name=”” value=””>

          </jsp:forward/>

内置对象的使用

5.实验过程或源代码

(一)编程实现在JSP页面中输出由星号“*”组成的菱形;

<%

StringBuffer sb3 = new StringBuffer();

int n=10;

//前10行.上半部分

for(int i=1;i<=n;i++)//控制行数

{

    for(int k=n;k>=i;k--)//打印空格

    {

        sb3.append("&nbsp");

    }

    for(int j=1;j<=i;j++)//打印*

    {

        sb3.append("*");

    }

    sb3.append("<br>");

}

//后9行,下半部分

for(int i=n-1;i>=1;i--)

{

    for(int k=i;k<=n;k++)

    {

        sb3.append("&nbsp");

    }

    for(int j=1;j<=i;j++)

    {

        sb3.append("*");

    }

    sb3.append("<br>");

}

%>

<%=sb3.toString() %>

(二)输入并执行下面JSP页面(文件名为counter.jsp),然后回答有关问题。

(1)简单计数器实现

<%@ 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>

<%! int count = 0; %>

<% count++; %>

Welcome! You are visitor number <%= count %>

</body>

</html>

【问题1】该JSP页面包含哪些JSP语法元素。在浏览器中访问该页面,输出结果如何?多次刷新页面,结果如何?

【问题2】打开counter.jsp转换后的源文件counter_jsp.java,对应的类文件在哪里?文件名是什么?

【问题3】查看count变量是在哪里声明的?

【问题4】将上面JSP页面中的<%! int count = 0; %>一行改为<% int count = 0; %>,页面能否正常执行,它与上面页面有什么区别?

答:

【问题1】该JSP页面包含的JSP语法元素及其作用如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>:这是页面指令,用于指定页面的一些属性,如使用的脚本语言是Java,页面的内容类型以及字符编码。

<!DOCTYPE html>:这是文档类型声明,用于告诉浏览器页面是HTML5文档。

<html>、<head>、<meta charset="UTF-8">、<title>、</title>、</head>、<body>、</body>、</html>:这些是HTML标签,用于定义页面的结构。

<%! int count = 0; %>:这是JSP的声明元素,用于声明一个全局变量或方法,这里的count变量会在JSP页面的生命周期内保持其值。

<% count++; %>:这是JSP的脚本元素,用于执行Java代码,这里用于递增count变量的值。

<%= count %>:这是JSP的表达式元素,用于输出变量的值到页面上。

在浏览器中访问该页面,输出结果为:“Welcome! You are visitor number [count的当前值]”。由于count是一个全局变量,当页面第一次被访问时,count的值会从0开始,所以输出将是“Welcome! You are visitor number 1”。多次刷新页面,count的值会依次增加,因此每次刷新后,输出的数字都会比前一次多1。

【问题2】JSP页面在服务器上运行时会被转换成一个Java源文件,然后编译成Java类文件。转换后的源文件counter_jsp.java通常位于Web应用的work目录下,具体路径可能因服务器的实现和配置而异。对应的类文件会在编译后生成在work目录下的某个子目录中,文件名通常是_<%=变量名%>,但具体的文件名和路径依赖于服务器的实现。笔者的类文件名放在了C:\Users\LP\AppData\Local\JetBrains\IntelliJIdea2023.2\tomcat\98aa258a-8f8d-410e-90c5-649853011e67

\work\Catalina\localhost\javaweb2_Web_exploded\org\apache\jsp目录下,文件名index_java.java

笔者在这里介绍一个简单的方法,下载Everything,在搜索框输入【文件名】_jsp.class就可以找到,这里笔者继承(一)文件名不再创新jsp文件示例:


【问题3】在提供的代码中,count变量是在JSP的声明元素<%! int count = 0; %>中声明的。这个声明在JSP页面转换后的Java源文件中,会成为类的一个成员变量。

【问题4】如果将<%! int count = 0; %>改为<% int count = 0; %>,那么count变量将不再是一个全局变量,而是一个局部变量,它在每次页面请求时都会被重新初始化为0。这意味着每次页面被访问或刷新时,count的值都会重置为0,而不是递增。因此,页面将始终显示“Welcome! You are visitor number 1”,而不会随着刷新次数增加。这样的修改将导致页面无法正确计数访问者的数量。

图 5-1经检验count始终为1

(2)使用session实现的计数器

<%@ 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>

<%!

    static int num = 1;

%>

<%

    if(session.isNew())

num++;

%>

<%="欢迎光临! 您是第 " + num + " 位访问者!" %>

</body>

</html>

(3)使用application实现的计数器

<%@ 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>

<%

int n;

if(application.getAttribute("num") == null)

n = 1;

else

   n = Integer.valueOf(application.getAttribute("num").toString());

    if(session.isNew())

    n++;

application.setAttribute("num", n);

    out.println("欢迎光临! 您是第 " + application.getAttribute("num") + " 位访问者!");

%>

</body>

</html>

(三)编程实现用户的登录(无数据库实现)。

(1)新建项目。项目名称采用如下命名格式:proj_****www_exp2(注:用自己的学号后4位代替****,用自己姓名的汉语全拼代替其中的www)。

(2)为项目配置构建路径,添加Apache Tomcat Server(例如:Apache Tomcat 7.0或8.5)。

(3)确认项目根目录下的子目录WEB-INF中包含web.xml(如果没有该文件,可从Tomcat安装目录中复制)。

(4)编写如下页面,以实现用户登录及退出登录功能。其中用到的知识点包括:包含指令;跳转指令;request、response、session对象;cookie。

    login.jsp: 用户登录表单页面

login_check.jsp:用户登录验证页面,输入规定的ID和密码则登录成功,否则失败,要求记住用户的登录状态,下次登录时等自动填写登录ID信息。至少提供三组登录成功的ID和密码。如(changyh,123),(shiqj,456),(wangzhe,789)

 login_success.jsp: 登录成功页面

   login_failure.jsp: 登录失败页面

 logout.jsp: 退出登录页面

   header.jsp:头部文件,被包含到login.jsp页面中,自己定义效果(该案例为“登录操作”)。

    function1、function2、function3自己定义。

实现效果如图3.1~图3.5所示。

(5)实现“记住我”功能和保存登录状态功能。

1.Login.jsp

<%--
  Created by IntelliJ IDEA.
  User: LP
  Date: 2024/5/9
  Time: 21:14
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <title>登录程序之表单页面</title>
</head>
<body>
<%
    String userId = "";
    String password = "";
    Cookie[] cookies = request.getCookies();
    if(cookies != null){
        for(int i=0; i<cookies.length; i++){
            if (cookies[i].getName().equals("Cookie2019")) {
                //如果cookie对象的名称为Cookie2019
                userId = cookies[i].getValue().split("#")[0];  //获取用户名
                password = cookies[i].getValue().split("#")[1];  //获取登录时间
            }
        }
    }
%>
<center>
    <h1>登录操作</h1>
    <hr>
    <form action="login_check.jsp" method="post">
        <table border="1">
            <tr>
                <td colspan="2">用户登录</td>
            </tr>
            <tr>
                <td>登录ID:</td>
                <td><input type="text" name="id" value="<%=userId %>"></td>
            </tr>
            <tr>
                <td>登录密码:</td>
                <td><input type="password" name="password" value="<%=password %>"></td>
            </tr>
            <tr>
                <td colspan="2">
                    &nbsp;&nbsp;<input type="submit" value="登录">&nbsp;&nbsp;
                    <input type="reset" value="重置">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    <input type="checkbox" name="remenber" checked>记住我
                </td>
            </tr>
        </table>
    </form>
</center>
</body>
<html>

2.login_check.jsp

<%--
  Created by IntelliJ IDEA.
  User: LP
  Date: 2024/5/9
  Time: 21:14
  To change this template use File | Settings | File Templates.
--%>
<%@page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <title>登录程序之验证页面</title>
</head>
<body>
<%!
    public static String[] userids={"liping","xqiang","xming"};
    public static String[] usernames={"李萍","小强","小明"};
    public static String[] userpws={"123","456","789"};
    String check(String userid, String userpw){
        int i;
        for(i=0;i<userids.length; i++){
            if(userids[i].equals(userid)){
                break;
            }
        }
        if(i<userids.length){
            if(userpws[i].equals(userpw)){
                return usernames[i];
            }else{
                return "";
            }
        }else{
            return "";
        }
    }
%>
<%
    request.setCharacterEncoding("UTF-8");
    String id = request.getParameter("id");
    String password = request.getParameter("password");
    String remenber = request.getParameter("remenber");
    String name;
    Cookie[] cookies;
    if((!(name=check(id,password)).equals(""))){
        cookies = request.getCookies();
        int i;
        boolean cookies_flag = false; //表示是否创建Cookie
        if(cookies != null){
            for(i=0; i<cookies.length; i++){
                if("Cookie2019".equals(cookies[i].getName())){
                    break;
                }
            }
            if(i<cookies.length){
                cookies_flag = false;
            }else{
                cookies_flag = true;
            }
        }else{
            cookies_flag = true;
        }

        Cookie cookie;

        if(remenber != null){
            if(cookies_flag){
                cookie = new Cookie("Cookie2019", id+"#"+password);
                cookie.setMaxAge(45);
                response.addCookie(cookie);
            }
        }else{
            if(!cookies_flag){
                cookie = new Cookie("Cookie2019", id+"#"+password);
                cookie.setMaxAge(0);
                response.addCookie(cookie);
            }
        }

        session.setAttribute("username", name);
        session.setMaxInactiveInterval(60);
        response.sendRedirect("login_success.jsp");

    }else{              //登录失败,跳转到失败页
        response.sendRedirect("login_failure.jsp");
    }
%>
</body>

3.login_success.jsp

<%--
  Created by IntelliJ IDEA.
  User: LP
  Date: 2024/5/9
  Time: 21:14
  To change this template use File | Settings | File Templates.
--%>
<%
    if(session.getAttribute("username") == null)
    {
        response.sendRedirect("login.jsp");
    }
%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<center>
<h2>欢迎[<%=session.getAttribute("username")%>]</h2>
<br>
<body>
<table>
    <tr>
        <th>新闻管理系统</th>
    </tr>
    <tr>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td align="center"><a href="function1.jsp">功能1</a></td>
    </tr>
    <tr>
        <td align="center"><a href="function2.jsp">功能2</a></td>
    </tr>
    <tr>
        <td align="center"><a href="function3.jsp">功能3</a></td>
    </tr>
</table>
<hr>
<table width="200">
    <tr>
        <td align="left">&nbsp;</td>
        <td align="right"><a href="logout.jsp">登出</a></td>
    </tr>
</table>
</center>
</body>
</html>

4.login_failure.jsp

<%--
  Created by IntelliJ IDEA.
  User: LP
  Date: 2024/5/9
  Time: 21:15
  To change this template use File | Settings | File Templates.
--%>
<%@ 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>
<center>用户名或密码错误,请重新<a href=login.jsp>登录</a></center>
</body>
</html>

5.logout.jsp

<%--
  Created by IntelliJ IDEA.
  User: LP
  Date: 2024/5/9
  Time: 21:15
  To change this template use File | Settings | File Templates.
--%>
<%@ 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>
<%session.invalidate(); %>
<jsp:forward page="login.jsp"/>
</body>
</html>

6.header.jsp

<%--
  Created by IntelliJ IDEA.
  User: LP
  Date: 2024/5/9
  Time: 21:15
  To change this template use File | Settings | File Templates.
--%>
<%@ 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>
<center><h1>登录操作</h1></center></body>
<hr>
</html>

图 5-2login.jsp
图 5-3login_success.jsp
图 5-4login_failure.jsp

6.实验结论及心得

对JSP运行有了新的了解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/611649.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中国211大学全部排名一览表

211大学是指中国教育部实施的名为“211工程”的高等教育发展战略中被选为重点支持的高等院校。这个名称来源于项目的启动背景和目标&#xff1a;“211”中的“21”代表21世纪&#xff0c;意味着该项目面向21世纪的中国高等教育发展&#xff1b;“1”则意指要重点建设大约100所左…

126.删除链表的倒数第N个节点(力扣)

题目描述 代码解决&#xff08;双指针&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, Li…

C语言实现扫雷游戏完整版

游戏介绍&#xff1a; 目录 游戏介绍&#xff1a; 游戏框架&#xff1a; 游戏具体功能实现&#xff1a; 棋盘的定义&#xff1a; 棋盘初始化&#xff1a; 棋盘打印&#xff1a; 棋盘布置雷&#xff1a; 棋盘扫雷&#xff1a; 爆炸展开一片&#xff1a; 获取周围八个…

画出入学管理系统的顶层图和1层图

&#xff08;学校作业&#xff09; 题目如下&#xff1a; 某培训机构入学管理系统有报名、交费和就读等多项功能&#xff0c;下面是对其各项功能的说明&#xff1a; 1、报名&#xff1a;由报名处负责&#xff0c;需要在学员登记表上进行报名登记&#xff0c;需要查询课…

Kettle连接Mysql数据库时报错——Driver class ‘org.gjt.mm.mysql.Driver‘ could not be found

一、问题描述 当我们使用ETL工具Kettle需要连接Mysql数据库进行数据清洗操作,在配置好Mysql的连接串内容后,点击【测试】按钮时报错【错误连接数据库 [MysqlTestConnection] : org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying to conne…

记一次DNS故障导致用户无法充值的问题(下)

上一篇说到DNS故障导致无法充值&#xff0c;后来我们通过拨测发现业务域名的解析目标地址被解析到了【127.0.0.1】IP。 1、联系阿里云厂商&#xff0c;通过沟通&#xff0c;阿里云反馈我们的域名被XX省通管单位封禁了&#xff0c;导致解析到了不正确的地址。 2、为了解决用户问…

idea运行SpringBoot项目爆红提示出现:Java HotSpot(TM) 64-Bit Server VM warning...让我来看看~

在运行SpringBoot项目的时候&#xff0c;发现总有这个警告提示出现&#xff0c;有点强迫症真的每次运行项目都很难受啊&#xff01;那么今天便来解决这个问题&#xff01; 先来看一下提示内容&#xff1a;Java HotSpot(TM) 64-Bit Server VM warning: Options -Xverify:none an…

多目标跟踪入门介绍

多目标跟踪算法 我们也可以称之为 Multi-Target-Tracking &#xff08;MTT&#xff09;。 那么多目标跟踪是什么&#xff1f; 不难看出&#xff0c;跟踪算法同时会为每个目标分配一个特定的 id 。 由此得出了目标跟踪与目标检测的区别&#xff08;似乎都是用方框来框出目标捏…

树与二叉树之间的转换

树转化成二叉树&#xff1a;兄弟相连留长子 1.加线&#xff1a;在兄弟之间加一条线 2.抹线&#xff1a;对每个结点&#xff0c;除了其左孩子外&#xff0c;去除其与其余孩子之间的关系 3.旋转&#xff1a;以树的根结点为轴心&#xff0c;将整树顺时针转45 二叉树转化成为树…

云衔科技成为卓豪Zoho中国区代理商,开启智能化企业管理新篇章

每一家企业数字化转型&#xff0c;都在寻求通过技术创新实现业务的飞跃。为了更好地服务于中国企业的数字化转型需求&#xff0c;云衔科技荣幸宣布正式成为卓豪Zoho中国区代理商&#xff0c;这一强强联合将为市场带来全新的数字化解决方案与服务体验&#xff0c;共同开启中国企…

Oracle -在线回缩表

conn scott/tiger DROP TABLE EMP1 PURGE; CREATE TABLE EMP1 AS SELECT * FROM EMP; alter table emp1 enable row movement; -- 启动回缩特性 insert into emp1 select * from emp1; / / commit; -- 增加到14000行 -- 分析表的结构 analyze table emp1 comput…

20240510每日后端---聊聊文件预览,doc,image,ppt转PDF预览

一、引入依赖 <dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>15.8</version></dependency><dependency><groupId>com.aspose</groupId><artifactId>crac…

关于JAVA-JSP电子政务网实现参考论文(论文 + 源码)

【免费】关于JAVA-JSP电子政务网.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89292355关于JAVA-JSP电子政务网 摘 要 当前阶段&#xff0c;伴随着社会信息技术的快速发展&#xff0c;使得电子政务能够成为我国政府职能部门进行办公管理的一个重要内容&#x…

代码随想录算法训练营第36期DAY24

DAY24 235二叉搜索树的最近公共祖先 迭代法&#xff1a; /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solutio…

ssrf(第二弹)

四&#xff0c;post请求 1.打开环境&#xff0c;提示说发一个HTTP POST请求&#xff0c;ssrf是用php的curl实现的.并且会跟踪302跳转。 2.用dirsearch扫一下常见的端口&#xff0c;看到有三个可以访问的页面 3.构造伪协议&#xff0c;因为要通过172.0.0.1访问&#xff0c;我们…

在centos7中运行向量数据库PostgreSQL连接不上如何排查?

1. 检查 PostgreSQL 服务状态 首先&#xff0c;您需要确认 PostgreSQL 服务是否正在运行。您可以使用以下命令来检查服务状态&#xff1a; sudo systemctl status postgresql如果服务没有运行&#xff0c;您需要启动它&#xff1a; sudo systemctl start postgresql2. 确认 …

锚索测力计在岩土工程中的应用

随着现代工程建设的快速发展&#xff0c;岩土工程安全问题日益受到人们的关注。岩土工程中的锚索结构&#xff0c;作为保证工程稳定和安全的关键部分&#xff0c;其性能监测和评估显得尤为重要。近年来&#xff0c;锚索测力计作为一种先进的监测工具&#xff0c;在岩土工程安全…

粗俗理解多层感知器

一、前言 参考资料和图片均来自以下链接&#xff1a;https://www.youtube.com/watch?vaircAruvnKk&listPLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pihttps://www.youtube.com/watch?vbfmFfD2RIcghttps://www.youtube.com/watch?vKuXjwB4LzSAhttps://www.youtube.com/watch?vIl…

2024数维杯数学建模竞赛A题完整代码和思路论文解析

2024数维杯数学建模完整代码和成品论文已更新&#xff0c;获取↓↓↓↓↓ https://www.yuque.com/u42168770/qv6z0d/bgic2nbxs2h41pvt?singleDoc# 2024数维杯数学建模A题34页论文已完成&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&…

linux下使用jexus部署aspnet站点

1.运行环境 Centos 7 安装dos2unix工具 yum install dos2unix 安装jexus curl https://jexus.org/release/x64/install.sh|sudo sh2.网站部署 2.1. 将windows下的网站发布包Msc_qingdao_admin.zip上传到linux中&#xff0c; 然后解压后放入/var/www(没有则创建)目录下 r…