中北大学软件学院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: LPDate: 2024/5/9Time: 21:14To 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对象的名称为Cookie2019userId = 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: LPDate: 2024/5/9Time: 21:14To 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; //表示是否创建Cookieif(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: LPDate: 2024/5/9Time: 21:14To 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: LPDate: 2024/5/9Time: 21:15To 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: LPDate: 2024/5/9Time: 21:15To 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: LPDate: 2024/5/9Time: 21:15To 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运行有了新的了解

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust 适合哪些场景?

目录 二、Rust 适合哪些场景&#xff1f; 三、Rust 社区的发展趋势如何&#xff1f; 四、Rust 快速搭建一个WebServer服务器 一、Rust是什么&#xff1f; Rust是一门赋予每个人构建可靠且高效软件能力的语言。 Rust 程序设计语言 一门帮助每个人构建可靠且高效软件的语言。…

Python写了for i in range(10)却只打印一遍?

题目&#xff1a;定义一个两个参数的重复打印函数&#xff0c;第一个参数指定要打印的字符串&#xff0c;第二个参数指定要重复打印的次数&#xff0c;在主程序中调用该函数&#xff0c;打印10遍你的学号姓名。 为什么调用函数后结果只打印了一遍? 看了题目感觉就很诡异&#…

爬虫-无限debug场景 解决方式

解决无限debug 场景1 1. 鼠标右键 选择 continue to here&#xff08;此处不停留&#xff09;2. 鼠标右键 选择 edite breakpoint 设置 10 保证条件不成立 这行永远不执行3.方法置空 1. 方法调用加断点2. 控制台 setInterval function name() {}4. 替换文件 5. hoo…

Apache SeaTunnel 正式发布2.3.5版本,功能增强及多个Bug修复

经过两个月的筹备&#xff0c;我们在2.3.4版本基础上进行了新一轮的迭代&#xff0c;本次更新不仅修复了多个关键问题&#xff0c;还引入了若干重要功能增强和性能优化。 在此&#xff0c;我们先提前感谢社区成员的贡献和支持&#xff0c;如果你想升级最新的版本&#xff0c;快…

websocket最大数量的限制问题

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

安全 | 开源入侵防御系统 Snort

目录 Snort 概要 入侵预防系统模式 数据包记录器和嗅探器模式 网络安全学习路线 &#xff08;2024最新整理&#xff09; 学习资料的推荐 1.视频教程 2.SRC技术文档&PDF书籍 3.大厂面试题 特别声明&#xff1a; Snort 概要 Snort 概要 是世界上最重要的开源入…

《十日终焉》中的定律整理-向虫队学习(举例+持续更新)

1、二八定律 二八定律&#xff0c;又称帕累托法则&#xff0c;也叫巴莱多定律。 是19世纪末20世纪初意大利经济学家巴莱多发明的。其中指出&#xff0c;约仅有20%的因素影响80%的结果。也就是说&#xff1a;所有变因中&#xff0c;最重要的仅有20%&#xff0c;虽然剩余的80%占…

实习体验报告怎么写:AI产品助理实习经历

笔灵实习体验报告模版免费分享&#xff0c;更多需要可以点击使用⬇️ https://ibiling.cn/scene/inex?fromcsdnsx 一、实习背景与目的在过去的几个月里&#xff0c;我有幸在一家知名科技公司实习&#xff0c;担任AI产品助理的角色。这次实习让我有机会深入了解AI领域&#x…

JAVA 双亲委派之一

JAVA 双亲委派之一 JVM类加载流程 java语言系统内置了众多类加载器&#xff0c;从一定程度上讲&#xff0c;只存在两种不同的类加载器&#xff1a;一种是启动类加载器&#xff0c;此类加载由C实现&#xff0c;是JVM的一部分&#xff1b;另一种就是所有其他的类加载器&#xf…

ASP.NET学生成绩管理系统

摘要 本系统依据开发要求主要应用于教育系统&#xff0c;完成对日常的教育工作中学生成绩档案的数字化管理。开发本系统可使学院教职员工减轻工作压力&#xff0c;比较系统地对教务、教学上的各项服务和信息进行管理&#xff0c;同时&#xff0c;可以减少劳动力的使用&#xf…

【网络】gateway 可以提供的一些功能之三 “ 支持Eureka服务发现 ”

一、Eureka是干什么的 Eureka就像是一个电话簿&#xff0c;但是用来存储和管理各种微服务的地址信息。它帮助微服务之间相互发现和交流&#xff0c;就像你想找某人电话号码一样&#xff0c;只需查看电话簿就能找到他们的联系方式。Eureka也可以帮助系统在服务出现问题时自动发现…

STM32CubeMX软件使用(超详细)

1、Cube启动页介绍 2、芯片选择页面介绍 3、输入自己的芯片型号&#xff0c;这里以STM32U575RIT6举例 4、芯片配置页码介绍 5、芯片外设配置栏详细说明 6、点击ClockConfiguration进行时钟树的配置&#xff0c;选择时钟树后可以选择自己想使用的时钟源&#xff0c;也可以直接输…

unreal engine4 创建动画蒙太奇

UE4系列文章目录 文章目录 UE4系列文章目录前言一、创建动画蒙太奇 前言 动画蒙太奇的官方解释&#xff1a;Animation Montages are animation assets that enable you to combine animations in a single asset and control playback using Blueprints.You can use Animation…

与Apollo共创生态:助力自动驾驶迈向新台阶

引言Apollo七周年大会企业协同工具链携手伙伴共创生态未来展望与总结 引言 2024年4月19日&#xff0c;一场智能汽车未来的盛宴正朝我们走来——Apollo开放平台的七周年大会。 此次大会主题为“破晓•拥抱智变时刻”其中“破晓”象征着新时代的曙光&#xff0c;意味着智能汽车技…

最新版在线客服系统源码

源码介绍 首发最新在线客服系统源码&#xff0c;优化更好并且重构源码布局UI 性能不吃cpu并发快,普通1H2G都能带动最新版只要是服务器都能带动 搭建即可使用,操作简单,易懂 修复了老版本bug 内附有搭建教程 gofly.v1kf.com 运行环境 Nginx 1.20 MySQL 5.7 演示截图

Spring IoCDI(3)—DI详解

目录 一、属性注入 二、构造方法注入 小结&#xff1a;构造函数的注入 三、Setter注入 四、三种注入的优缺点分析&#xff08;面试题&#xff09; 1、属性注入 优点&#xff1a; 缺点&#xff1a; 2、构造方法注入&#xff08;Spring4.X推荐&#xff09; 优点&#x…

netty配置SSL、netty配置https(开发)

netty配置SSL、netty配置https&#xff08;开发&#xff09; 我们在开发下使用ssl&#xff0c;所用的证书将不被客户端信任。 方案一 快速。使用netty提供的临时签发证书 private static SslContext sslContext null;public ServerChannelHandler(RouterConfig config) {th…

使用Python在PowerPoint演示文稿之间复制样式(复制幻灯片母版)

在专业演示文稿设计与制作领域&#xff0c;多场演示间保持一致性至关重要。在PowerPoint演示文稿之间复制幻灯片母版成为了一项关键技巧&#xff0c;用以维持统一的视觉风格&#xff0c;确保品牌形象的一致性&#xff0c;并提升观众的参与度。这一做法不仅能节省宝贵的时间&…

TCP 连接,一端断电和进程崩溃有什么区别?

TCP 连接&#xff0c;一端断电和进程崩溃有什么区别&#xff1f; 前言主机崩溃进程崩溃有数据传输的场景客户端主机宕机&#xff0c;又迅速重启客户端主机宕机&#xff0c;一直没有重启 总结 前言 有的小伙伴在面试腾讯的时候&#xff0c;遇到了这么个问题&#xff1a; 这个属…

Java入门基础学习笔记11——关键字和标识符

1、关键字 关键字是java中已经被赋予特定意义的&#xff0c;有特殊作用的一些单词&#xff0c;不可以把这些单词作为标识符来使用。 注意&#xff1a;关键字是java用了的&#xff0c;我们就不能用来作为&#xff1a;类名、变量名、否则会报错。 标识符&#xff1a; 标识符就是…