【JavaWeb程序设计】JSP编程II

目录

一、输入并运行下面的import_test.jsp页面

1.1 代码运行结果

1.2 修改编码之后的运行结果

二、errorPage属性和isErrorPage属性的使用

2.1 下面的hello.jsp页面执行时将抛出一个异常,它指定了错误处理页面为errorHandler.jsp。

2.1.2 运行截图

2.2 下面的errorHandler.jsp是错误处理页面。

2.2.1 运行截图

2.3 按下面方法修改hello.jsp页面,将请求参数值编码转换为汉字编码。

三、表单处理

3.1 编写表单页面regUser.jsp

3.2 表单提交到页面UserInfo.jsp,显示注册信息。

3.3 要求页面提交时使用javascript脚本对表单元素进行检查,如必填字段、邮件、电话的格式检查以及字段长度的检查等。注意中文的处理。

3.1.1 运行截图

3.1.2 regUser.jsp

(1)JS代码

(2) CSS代码

(3) HTML代码 

3.1.3 UserInfo.jsp

(1)CSS代码

(2)HTML代码 


一、输入并运行下面的import_test.jsp页面

<%@ page import="java.util.Date,java.text.DateFormat" %><html><head><title>page指令示例</title></head><body><h3 align="center">使用page指令导入java.util.Date类</h3><% Date date = new Date();String s = DateFormat.getDateInstance().format(date);String s2 = DateFormat.getDateInstance(DateFormat.FULL).format(date);%><p align="center">现在的时间是:<%=s%><p align="center">现在的时间是:<%=s2%></body></html>

访问上述JSP页面,输出结果如下图所示

图1 import_test.jsp页面的运行结果

可以看到页面中最后一行的中文显示为乱码,将下面代码加到JSP页面中:

<%@ page contentType="text/html;charset=UTF-8" %>

重新访问页面,中文显示正常。这说明可以使用page指令的contentType属性指定页面输出使用的字符编码。默认情况下,JSP页面使用的字符集是iso-8859-1编码,如使用汉字编码应指定为 UTF-8  其他支持中文的字符集 

1.1 代码运行结果

1.2 修改编码之后的运行结果

二、errorPage属性和isErrorPage属性的使用

2.1 下面的hello.jsp页面执行时将抛出一个异常,它指定了错误处理页面为errorHandler.jsp。

<%@ page contentType="text/html;charset=gb2312" %><%@ page errorPage="errorHandler.jsp" %><html><body><%String name = request.getParameter("name");if (name == null){throw new RuntimeException("没有指定name 属性。");}%>Hello, <%= name %></body></html>

2.1.2 运行截图

2.2 下面的errorHandler.jsp是错误处理页面。

<%@ page contentType="text/html; charset=gb2312" %><%@ page isErrorPage="true" %><html><body>请求不能被处理:<%=exception.getMessage()%><br>请重试!</body></html>

用下面的URL访问hello.jsp页面,就会产生下面结果:

  http://localhost:8080/bookstore/hello.jsp

图6.3 errorHandler.jsp页面的运行结果

这说明没有提供name参数,hello.jsp页面中抛出RuntimeException异常,所以调用错误页面。

如果使用下面URL访问hello.jsp页面,将产生下面正常的页面:

  http://localhost:8080/bookstore/hello.jsp?name=Mary

图6.4 hello.jsp页面的运行结果

2.2.1 运行截图

注意:如果请求参数值使用汉字,仍然产生乱码,例如:

  http://localhost:8080/bookstore/hello.jsp?name=欧阳清风

这是因为请求参数默认使用iso-8859-1编码传递,如果要正确显示中文,应将请求参数编码转换为gb2312编码

由于我的Tomcat服务器是在8.0以上编码为UTF-8,所以我这边显示中文的时候并不会出现乱码。

2.3 按下面方法修改hello.jsp页面,将请求参数值编码转换为汉字编码。

<%@ page contentType="text/html;charset=gb2312" %><%@ page errorPage="errorHandler.jsp" %><html><body><%String name = request.getParameter("name");if (name==null){throw new RuntimeException("没有指定name 属性。");}else{// 将字符串name的字符编码转换为汉字编码name = new String(name.getBytes("iso-8859-1"),"gb2312");}%>Hello, <%=name %></body></html>

此时,还会出现中文乱码吗,应如何处理?

由于浏览器对中文编码,所以依旧会出现中文乱码。(这里看不懂可以看我上一篇博客)

解决办法:添加下列代码

修改之后再次运行,成功显示中文。 

三、表单处理

3.1 编写表单页面regUser.jsp

3.2 表单提交到页面UserInfo.jsp,显示注册信息。

3.3 要求页面提交时使用javascript脚本对表单元素进行检查,如必填字段、邮件、电话的格式检查以及字段长度的检查等。注意中文的处理。

3.1.1 运行截图

由于保护个人隐私,部分信息会打马赛克

(1)*必填未填写完整提交表单

(2)密码格式错误

(3)两次输入的密码不一致

(4)*必填填完提交表单

        成功提交表单 

(5)邮箱格式/手机格式错误

无法提交表单

 (6)正确输入

提交的表单信息:没有获取密码!!

【备注】代码中引用的jquery:

3.1.2 regUser.jsp

(1)JS代码
<script type="text/javascript" src="../../JS/jquery-3.4.1.min.js"></script><script>/*************************格式检查*******************************/// 密码:6-12位var passwordPattern = /^[A-Za-z0-9]{6,12}$/;// 邮箱var emailPattern = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;// 手机号:11位数字var phonePattern = /^\d{11}$/;//自定义函数:设置错误信息元素的文本内容和样式类function setErrorElement(errorElement, text, removeClass, addClass) {errorElement.text(text); //要设置的文本内容errorElement.removeClass(removeClass); // 要移除的样式类errorElement.addClass(addClass); // 要添加的样式类}//获取输入框的值并设置错误信息的相关元素function validateField(input, isRequired, isSubmit) {var value = input.value.trim(); //获取了输入框的值,并使用trim()方法去除前后的空白字符var errorId = input.id + "-errorMessage";//根据输入框的id生成对应的错误信息元素的idvar errorElement = $("#" + errorId);//使用jQuery选择器通过错误信息元素的id获取对应的元素,并将其赋值给变量errorElement//清除之前的错误信息errorElement.text("");//对输入框的值进行判空处理if (value === "") {//如果是必填字段if (isRequired === true) {//在表单提交时验证if (isSubmit) {setErrorElement(errorElement, "该字段不能为空!!", "success-message", "error-message");return false; //验证不通过,阻止表单提交} else {//失去焦点时验证setErrorElement(errorElement, "*必填", "success-message", "error-message");return true; //验证通过,可以稍后再填}} else {//如果不是必填字段,则验证通过return true;}}//格式检查,如果没有按要求输入,则给出相应的提示switch (input.id) {case "password": //1. 密码if (!passwordPattern.test(value)) {setErrorElement(errorElement, "请输入6-12位数字或字母!", "success-message", "error-message");return false;}break;case "confirmPwd": //2. 第二次输入的密码// 判断两次输入的密码是否一致var password = $("#password").val();if (value !== password) {setErrorElement(errorElement, "两次输入的密码不一致!", "success-message", "error-message");return false;}break;case "phone":   //3. 手机if (!phonePattern.test(value)) {setErrorElement(errorElement, "请输入11位数字!", "success-message", "error-message");return false;}break;case "email":  //4. 邮箱if (!emailPattern.test(value)) {setErrorElement(errorElement, "邮箱格式错误!", "success-message", "error-message");return false;}break;}//按要求输入的话,输入框后打√setErrorElement(errorElement, "✔", "error-message", "success-message")return true;}/*************************最终验证****************************/function validateForm() {//验证输入框的值:先获取各字段的id,再判断该输入框是否必填,最后是表单提交的验证。var flag0 = validateField(document.getElementById("username"), true, true);// var flag0 = validateField($("#username").object, true);var flag1 = validateField(document.getElementById("password"), true, true);var flag2 = validateField(document.getElementById("confirmPwd"), true, true);var flag3 = validateField(document.getElementById("realName"), true, true);var flag4 = validateField(document.getElementById("email"), false, true);var flag5 = validateField(document.getElementById("phone"), false, true);if (flag0 === true && flag1 === true && flag2 === true && flag3 === true && flag4 === true && flag5 === true) {return true;} else {return false;}}$(document).ready(function () {$('#regForm').submit(function () {return validateForm();});});</script>
(2) CSS代码
  <style>body {display: flex;justify-content: center;}#form-container {display: flex;justify-content: center;}.redText {color: red;}.pinkTest {color: deeppink;}.error-message {color: red;}.success-message {color: green;}.address-contain {width: 250px;height: 80px;}</style>
(3) HTML代码 
<%--Created by IntelliJ IDEA.User: 86189Date: 2023/10/9在必填字段和有格式要求字段的输入框旁边有一个红色文本用于显示输入错误信息。当字段失去焦点时,会触发相应的验证函数进行格式检查,并在错误信息文本中显示相应的提示。表单提交时调用validateForm()函数进行最终验证,如果所有字段都通过了格式检查,则允许表单提交。
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><meta charset="UTF-8"><title>新用户注册</title></head>
<body>
<div id="form-container"><form action="UserInfo.jsp" onsubmit="return validateForm()" method="post"><table width="600px"><h1 align="center" class="pinkTest">新用户注册</h1>
<%--------------------------输入用户名------------------------------%><tr><td align="left" width="150px">用户名:</td><td align="left"><input type="text" id="username" name="username" onblur="validateField(this,true,false)"><span class="redText" id="username-errorMessage">*必填</span></td></tr>
<%---------------------------输入密码-------------------------------%><tr><td>用户密码:</td><td><input type="password" id="password" name="password" onblur="validateField(this,true,false)"><span class="redText" id="password-errorMessage">*必填</span></td></tr>
<%--------------------------再次输入密码----------------------------%><tr><td>确认密码:</td><td><input type="password" id="confirmPwd" name="confirmPwd" onblur="validateField(this,true,false)"><span class="redText" id="confirmPwd-errorMessage">*必填</span></td></tr>
<%------------------------输入姓名-------------------------------%><tr><td>真实姓名:</td><td><input type="text" id="realName" name="realName" onblur="validateField(this,true,false)"><span class="redText" id="realName-errorMessage">*必填</span></td></tr>
<%--------------------------选择性别-----------------------------%><tr><td style="height: 60px">性别:</td><td><input type="radio" id="male" name="gender" value="男"> 男<input type="radio" id="female" name="gender" value="女"> 女</td></tr>
<%-----------------------选择出生日期-------------------------%><tr><td>出生日期:</td><td><input type="date" id="birthDate" name="birthDate" onblur="validateField(this,false,false)"></td></tr>
<%--------------------------输入邮件-------------------------%><tr><td>电子邮件:</td><td><input type="email" id="email" name="email" style="width: 300px;"onblur="validateField(this,false,false)"><span class="redText" id="email-errorMessage"></span></td></tr>
<%-------------------------输入联系电话-----------------------------%><tr><td>联系电话:</td><td><input type="tel" id="phone" name="phone" style="width: 300px;"onblur="validateField(this,false,false)"><span class="redText" id="phone-errorMessage"></span></td></tr>
<%-------------------------输入联系地址-----------------------------%><tr><td>联系地址:</td><td><textarea id="address" name="address" class="address-contain"onblur="validateField(this,false,false)"></textarea></td></tr>
<%--------------------------两个按钮------------------------------%><tr><td align="center"><input type="submit" value="提交"></td><td align="center"><input type="reset" value="重置"></td></tr></table></form>
</div>
</body>
</html>

3.1.3 UserInfo.jsp

(1)CSS代码
 <style>table {display: flex;justify-content: center;/*border: 1px black solid;*/}</style>
(2)HTML代码 
<%--Created by IntelliJ IDEA.User: 86189Date: 2023/10/9Time: 11:10显示注册信息
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 获取从注册页面传递过来的参数,除了密码 --%>
<%request.setCharacterEncoding("utf-8");String UN_WRITE = "未填写";String UN_CHOOSE = "未选择";String username = request.getParameter("username"); //必填String realName = request.getParameter("realName"); //必填String gender = request.getParameter("gender") == null ? UN_CHOOSE : request.getParameter("gender");String birthDate = request.getParameter("birthDate").equals("") ? UN_WRITE : request.getParameter("birthDate");String email = request.getParameter("email").equals("") ? UN_WRITE : request.getParameter("email");String phone = request.getParameter("phone").equals("") ? UN_WRITE : request.getParameter("phone");String address = request.getParameter("address").equals("") ? UN_WRITE : request.getParameter("address");
%>
<html>
<head><meta charset="UTF-8"><title>注册信息</title></head>
<body>
<div><h1 align="center">注册信息</h1></div>
<div><table><tr><td>用户名:</td><td><%= username %></td></tr><tr><td>真实姓名:</td><td><%= realName %></td></tr><tr><td>性别:</td><td><%= gender %></td></tr><tr><td>出生日期:</td><td><%= birthDate %></td></tr><tr><td>电子邮件:</td><td><%= email %></td></tr><tr><td>联系电话:</td><td><%= phone %></td></tr><tr><td>联系地址:</td><td><%= address %></td></tr></table>
</div>
</body>
</html>

四、心得体会

1. 除了学习掌握基本的语法和表单处理,我还学会了JSP的指令和动作,特别是page指令的属性。通过设置<%@ page contentType="..." %>和<%@ page pageEncoding="..." %>属性,我可以指定响应的内容类型和页面的字符编码,确保正确的数据传输和显示。此外,我还学习了如何处理错误页面和设置当前页面为错误页面,以及如何使用其他指令和动作来增强JSP页面的功能。

2. 学会用JS进行表单验证,如:

(1)对输入框进行格式检查:在输入框失去焦点时,会触发相应的验证函数进行格式检查,并在错误信息文本中显示相应的提示。例如,密码必须是6-12位的数字或字母,手机号码必须是11位数字等。

(2)设置错误信息元素的文本内容和样式类:自定义了一个函数setErrorElement,用于设置错误信息元素的文本内容和样式类。

(3)尝试使用jQuery库,以便简化DOM操作。

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

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

相关文章

VBA初学:零件成本统计之一(任务汇总)

经过前期一年多对金蝶K3生产任务流程和操作的改造和优化&#xff0c;现在总算可以将零件加工各个环节的成本进行归集了。 原本想写存储过程&#xff0c;通过直接SQL报表做到K3中去的&#xff0c;但财务原本就是用EXCEL&#xff0c;可以方便调整和保存&#xff0c;加上还有一部分…

mybatis-plus参数绑定异常

前言 最近要搞个发票保存的需求&#xff0c;当发票数据有id时说明是发票已经保存只需更新发票数据即可&#xff0c;没有id时说明没有发票数据需要新增发票&#xff1b;于是将原有的发票提交接口改造了下&#xff0c;将调用mybatis-plus的save方法改为saveOrUpdate方法&#xff…

芯片基识 | 掰开揉碎讲 FIFO(同步FIFO和异步FIFO)

文章目录 一、什么是FIFO二、为什么要用FIFO三、什么时候用FIFO四、FIFO分类五、同步FIFO1. 同步FIFO电路框图2. 同步FIFO空满判断3. 同步FIFO设计代码4. 同步FIFO仿真结果 六、异步FIFO1、异步FIFO的电路框图2 、亚稳态3、打两拍4、格雷码5、如何判断异步FIFO的空满&#xff0…

Spring boot 更改启动LOGO

在resources目录下创建banner.txt文件&#xff0c;然后编辑对应的图案即可 注释工具 Spring Boot Version: ${spring-boot.version},-.___,---.__ /|\ __,---,___,- \ -.____,- | -.____,- // -., | ~\ /~ | …

Go语言--工程管理、临时/永久设置GOPATH、main函数以及init函数

工作区 Go 代码必须放在工作区中。工作区其实就是一个对应于特定工程的目录&#xff0c;它应包含3个子目录:src 目录、pkg目录和bin 目录。 src 目录:用于以代码包的形式组织并保存 Go源码文件。(比如:.go.chs等)pkg 目录:用于存放经由 go install 命令构建安装后的代码包(包…

1119 胖达与盆盆奶

solution 递推&#xff1a;序列的每一位所需要计算的值都可以通过该位左右两侧的结果计算得到&#xff0c;就可以考虑所谓的“左右两侧的结果”是否能通过递推进行预处理来得到&#xff0c;以避免后续使用中的反复求解。 #include<iostream> using namespace std; cons…

Xilinx FPGA:vivado关于fifo的一些零碎知识

一、FIFO概念 先进先出&#xff0c;是一种组织和操作数据结构的方法。在硬件应用中&#xff0c;FIFO一般由一些读写指针&#xff0c;存储和控制的逻辑组成。 二、xilinx中生成的FIFO的存储类型 &#xff08;1&#xff09;shift register FIFO : 移位寄存器FIFO&#xff0c;这…

java Web 优秀本科毕业论文系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 优秀本科毕业论文系统是一套完善的web设计系统&#xff0c;对理解JSP java serlvet 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&a…

CTF常用sql注入(三)无列名注入

0x06 无列名 适用于无法正确的查出结果&#xff0c;比如把information_schema给过滤了 join 联合 select * from users;select 1,2,3 union select * from users;列名被替换成了1,2,3&#xff0c; 我们再利用子查询和别名查 select 2 from (select 1,2,3 union select * f…

笔记12:if语句编程练习(打印输出三个数据中的最小值)

输入三个数&#xff0c;分别放入变量x&#xff0c;y&#xff0c;z中 打印输入数据中最小的那一个数 解决方案1 定义中间变量 t 1.比较x和y的大小关系&#xff0c;将较小的值赋值给t 2.比较t和z的大小关系&#xff0c;将较小的值赋值给t 3.t 中保存的就是3个数中的较小值 &am…

【数据结构】常见四类排序算法

1. 插入排序 1.1基本思想&#xff1a; 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。实际中我们…

十大排序:插入/希尔/选择/堆/冒泡/快速/归并/计数/基数/桶排序 汇总(C语言)

目录 前言非线性时间比较类插入排序(1) 直接插入排序(2) 希尔排序 选择排序(3) 选择排序优化版(4) 堆排序 交换排序(5) 冒泡排序(6) 快速排序hoare版本挖坑版前后指针版非递归版 归并排序(7) 归并排序递归版非递归版 线性时间比较类(8) 计数排序基数排序与桶排序 总结 前言 在计…

Redis哨兵和集群模式

特性哨兵模式集群模式高可用性是是数据分片否是水平扩展否是配置复杂度低高管理复杂度低高多键操作支持是否&#xff08;有限制&#xff09; 哨兵模式 原理&#xff1a; Redis 哨兵模式是一种高可用性解决方案&#xff0c;它通过监控 Redis 主从架构&#xff0c;自动执行故障…

STM32第十五课:LCD屏幕及应用

文章目录 需求一、LCD显示屏二、全屏图片三、数据显示1.显示欢迎词2.显示温湿度3.显示当前时间 四、需求实现代码 需求 1.在LCD屏上显示一张全屏图片。 2.在LCD屏上显示当前时间&#xff0c;温度&#xff0c;湿度。 一、LCD显示屏 液晶显示器&#xff0c;简称 LCD(Liquid Cry…

vulhub靶场之DEVGURU:1

1 信息收集 1.1 主机发现 arp-scan -l 发现主机IP地址为“192.168.1.11 1.2 端口发现 nmap -sS -sV -A -T5 -p- 192.168.1.11 发现端口为&#xff1a;22&#xff0c;80&#xff0c;8585 1.3 目录扫描 dirsearch -u 192.168.1.11 发现存在git泄露 2 文件和端口访问 2…

【JavaEE精炼宝库】文件操作(1)——基本知识 | 操作文件——打开实用性编程的大门

目录 一、文件的基本知识1.1 文件的基本概念&#xff1a;1.2 树型结构组织和目录&#xff1a;1.3 文件路径&#xff08;Path&#xff09;&#xff1a;1.4 二进制文件 VS 文本文件&#xff1a;1.5 其它&#xff1a; 二、Java 操作文件2.1 方法说明&#xff1a;2.2 使用演示&…

Python学习笔记29:进阶篇(十八)常见标准库使用之质量控制中的数据清洗

前言 本文是根据python官方教程中标准库模块的介绍&#xff0c;自己查询资料并整理&#xff0c;编写代码示例做出的学习笔记。 根据模块知识&#xff0c;一次讲解单个或者多个模块的内容。 教程链接&#xff1a;https://docs.python.org/zh-cn/3/tutorial/index.html 质量控制…

绿色金融相关数据合集(2007-2024年 具体看数据类型)

数据类型&#xff1a; 1.绿色债券数据&#xff1a;2014-2023 2.绿色信贷相关数据&#xff1a;2007-2022 3.全国各省及地级市绿色金融指数&#xff1a;1990-2022 4.碳排放权交易明细数据&#xff1a;2013-2024 5.绿色金融试点DID数据&#xff1a;2010-2023 数据来源&#…

基于图像处理的滑块验证码匹配技术

滑块验证码是一种常见的验证码形式&#xff0c;通过拖动滑块与背景图像中的缺口进行匹配&#xff0c;验证用户是否为真人。本文将详细介绍基于图像处理的滑块验证码匹配技术&#xff0c;并提供优化代码以提高滑块位置偏移量的准确度&#xff0c;尤其是在背景图滑块阴影较浅的情…

ES6模块化学习

1. 回顾&#xff1a;node.js 中如何实现模块化 node.js 遵循了 CommonJS 的模块化规范。其中&#xff1a; 导入其它模块使用 require() 方法 模块对外共享成员使用 module.exports 对象 模块化的好处&#xff1a; 大家都遵守同样的模块化规范写代码&#xff…