【JavaWeb】实训的长篇笔记(下)
文章目录
- 八、功能实现
- 1、注册功能
- 2、登录功能
- 3、问题说明
- 4、首页数据显示
- 5、后台管理
八、功能实现
1、注册功能
-
jsp:能够在页面中把数据动态化,jsp和html在元素标签上是无区别的,区别是html中写上java代码就成了jsp文件。
filename.jsp
。需要把html文件转换成jsp文件,以达到动态显示数据的目的。
<!-- jsp的文件头 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!-- 嵌入的java代码 -->
<% int i = 0;
%>
-
让类可以接收请求:
extends HttpServlet
;doGet
,doPost
,service
都是可以接收前端请求的方法,可以重写它们!区别:前端发送的GET请求,则调用doGet方法;前端发送POST请求,则调用doPost方法。而service可以接收所有请求。
- servlet2.x:以配置的方式来对应请求映射(更能理解原理)
- servlet3.x:以注解的方式来对应请求映射
-
java查看源码?
问题:怎么找到java类的源代码?
- 表单中的action和method,与方法及其注解相对应。
<form class="form-horizontal" action="register" method="post"></form>
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {System.out.println("----dopost()----");
}
问题:试了好多次,后端好像一直收不到请求。后面又突然可以了,真是奇怪。
感受:到了Servlet,又给人一种强烈的黑盒感,你根本不知道它在干什么。也许我从来就没有很理解过Web。
问题:为什么要在doGet中调用doPost?前端用Get方法能正常将参数传递过来吗?
如何取得请求中的参数:
-
在前端,input的文本输入框(
type="text"
)需要设置name
属性,相当于变量名。传输到后端之后,可以据此取出数据。input单选框(
type="ratio"
)需要设置value
属性。 -
在后端,使用request对象。
String nickName = request.getParameter("nickName"); // 参数均为String
int _sex = Integer.parseInt(sex); // String --> int
GET与POST:
- get:表单参数以明文方式,通过附加在ur后面l进行传递(不安全,有大小限制)。
- post:表单参数会隐藏,以打包的方式传递,相对安全,无大小限制。
问题:为什么post打包就相对安全呢?别人解包不就行了?
响应前端:
- 请求转发:地址栏url不会改变,能够附带数据。
- 重定向:url会变,不能附带数据。先根据form表单的action,到
/register
,然后再重定向到另一个页面。
// 请求转发,并附带两个参数
request.getRequestDispatcher("index.html").forward(request,response);
// 重定向(注册失败 --> 跳转到注册页面重新注册)
response.sendRedirect("register.jsp");
问题:在html的form表单中,如果使用post请求,则中文字符串无法正常得到;但改用get请求时是正常的。
----dopost()---- // 使用post请求
Users [id=0, nickname=??????, password=123456, sex=1]
----dopost()---- // 使用get请求
Users [id=0, nickname=hello, password=123456, sex=2]
问题(踩大坑一个):在普通java代码中,可以注册成功;但是改成web项目运行,就会报错:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
。web项目的代码是在Tomcat服务器中运行的,所以还需要将jdbc的jar包添加到磁盘tomcat服务器的lib目录下。
参考:servlet中调用JDBC报错:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver_啥也不会的小学生的博客
显示错误消息:
- 传递信息:重定向不能附带数据,因此使用请求转发。
<span></span>
:分块标签。${info}
: 取request中的信息(一种快捷的方法)。
request.setAttribute("info", "网络原因,注册失败,请重新注册!");
记录:在前端提交空表单时,程序会寄。
2、登录功能
思路(一定要细化):点击登录,进入登录页面,输入用户名和密码,点击登录按钮,把数据提交到servlet中,servlet中获取输入的用户名和密码,只需指定能否登录。控制器调用service要结果,service调用dao要数据。
步骤:
- 获取登录信息
- 调用service得到能否登录的结果
- 响应:1)能登录,跳转到index.jsp;2)不能登录,跳转到login.jsp
- 在开发过程中,构造方法可以增加(重写),不要修改、删除(以防连锁反应)。
-- 只能提示“用户名或密码错误”,能查到数据就说明用户名密码正确。
select uid from users where nickName = 'zhangsan' and password = '123456';
- 注册时用户名也不能重复(暂时不处理)
问题:若登录窗口是弹出的新标签页,那登录后如何回到原来的页面,并显示成功登录的状态?
登录后显示用户名:
-
request对象:作用域只是在当前请求中有效。
-
会话:当打开一个浏览器,就创建了一次会话。当浏览器关闭时,当前会话就结束了。
会话对象:session ,作用域是整个会话。
request.getSession().setAttrivute("nickname", nickname);
<!-- 在index.jsp中取变量值 -->
${nickname}
问题:会话没有效果,在我的尝试中,它的作用域就和
request.setAttribute()
相同。使用重定向,或者打开新页面时,都无法显示用户名。只有使用请求得到的那个页面中才能显示用户名。发现:存在浏览器的影响,当我从Edge更换为小白浏览器后,一切正常(尝试了各种qq、谷歌、华为等各种浏览器后,发现只有Edge存在这个问题)。
-
乱码问题:
- 确保mysql编码为utf-8
- 确保ide环境和文件的编码为utf-8
- 在代码中设置utf-8。
- 如果是get方式提交,则需要修改tomcat 的编码。
tomcat/conf/server.xml
,修改URIEncoding="UTF-8"
- 如果是post方式提交,需要在请求设置下面的代码:
request.setCharacterEncoding("UTF-8");
- 判断登录状态:
- 引入jsp的标准标签库。
- 使用
<c:if>
标签进行判断。
<%@ taglib uri="http://java.sun.com/jsp.jstl/core" prefix="c" %><c:if test="${null == nickname}">...
</c:if>
问题(open):引入标签库报错:
Can not find the tag library descriptor for "http://java.sun.com/jsp.jstl/core"
。使用中说“ 将tomcat引入进去,才会有这个标签库 ”,如何引入?
公共页面的抽取:
- 创建
header.jsp
,将导航栏放入其中。然后在其它需要的页面引入。
<jsp:include page="header.jsp"></jsp:include>
感受:jsp的调用页面,与flask中的模板块方式还是有所不同。模板块是有一个
base.html
作为一个整体的统一结构,其它页面继承它并覆盖其中的一些块。
注销:
- 思路:把 nickname 从 session 会话中移除,移除后再导航栏中就不会再显示用户名,而是显示登录和注册。
- 创建类 LoginOutServlet。1)移除session中的nickname; 2)重定向到首页 index.jsp。
- 错误类型:1)404:请求或响应的路径错误;2)500:服务器代码错误。
<li><a href="logout">注销</a></li>
3、问题说明
1、启动服务器之后,项目访问不了
- 记得将项目部署到服务器里面。
- 项目部署路径:双击 tomcat --> Server Locations,可以查看、修改项目的部署路径。部署之后,即使你将原来的项目代码删掉,项目仍然可以运行。
WEB-INF/
(类路径)下是编译好的字节码。 - 访问路径:Properties for … --> Web Project Setting --> Context root。这里才是在浏览器访问项目所使用的名称,如
localhost:8080/friends/index.jsp
。如果修改项目名称,而这里没变的话,使用新名称是访问不了的。
2、其它一些问题
- 数值格式化异常:尝试将非数字字符串转换为数字类型。
- 找不到主类:项目配置问题(jdk,版本)。
- jstl找不到:将jar包导进去就行。
- 找不到页面(404):避免中文路径。有时会将中文编码、转码,比如有些网站中看到了
%
啥的。 - 代码错误(500)
- 数据库连接异常:根据自己的情况修改连接参数,正确导入依赖(jar包)
- 代码布局问题:多用 F12
- dao层的空指针异常:对 null 对象就无法调用相应的方法。
- 前端提交的数据,后端获取不到:注意表单控件名称。
4、首页数据显示
一进首页,就要能拿到数据,直接访问index.jsp
是拿不到的。
思路:发送请求到 control,在 control 中获得推荐朋友的集合数据,再响应 index.jsp,然后 index.jsp 遍历数据。
(图片上传比较复杂,可以先直接在本地放两张用一下)
- 创建一个首页控制层,
indexServlet.java
,路径为/index
。 - 服务层:
getUsersByIndex(Users user)
方法,根据用户的性别和状态进行查询。
-- 查询推荐朋友
select uid,nickname,photo,words from users where indexstatus=2 and sex=1 limit 8;
前端遍历数据: 使用 jsp 的标准标签库
<c:forEach items="${listboy}" var="user"><img src="img/${user.photo}" alt="..."><p>宣言:${user.words}</p>
</c:forEach>
注:${user.words} 相当于调用了 Users 类的 get 方法
老师说:许多人缺少独立思考的能力,不告诉一步步怎么做,就不会做。
- bug:uri 打错了
<!-- 错误的 -->
<%@ taglib uri="http://java.sun.com/jsp.jstl/core" prefix="c"%>
<!-- 正确的 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
问题:我在 blog_java 项目中是由 jstl 包的,但是在 myfriends 项目中不知道为啥没有。不过,把包贴过去之后就好了。
-- 全部设置为不推荐(2)
update users set indexstatus=1;
老师杂谈:了解北京,可以去上地,95%是IT;八王坟地铁站,非常挤;天通苑,一个小区400万人。这样的芸芸人海,害。
没有推荐数据时,提示系统暂无推荐:EL表达式如何判断集合是否为空
<c:if test="${empty list_friend}">集合为空
</c:if>
5、后台管理
后台登录:
-
思路:首页中点击导航栏中的“后台管理”,进入后台管理登录,登录后进入后台管理,进行用户信息管理。可以复用普通用户登录模块,减少冗余代码。
-
可以在数据库中指定 admin 账号,然后根据 uid、用户名来判断。作用是不用单独写管理员登录的control、service、dao代码。
<!-- 前端在不同的登录页面传递key相同但值不同的参数 -->
<!-- hidden表示不会在前端显示表单 -->
<input type="hidden" name="flag" value="1">
显示用户列表:与首页数据显示的思路类似。
注:response.sendRedirect 中的
index.jsp
都应该换成index
。
- 获取所有用户列表:在
services/IUsersServices
普通用户 - 个人中心:
- 显示性别:在数据库中,性别使用的是 int 类型。在前端可以使用
${user.sex==1?"女":"男"}
。
感受:老师水平确实可以,页面简洁大气。
问题1:图片的上传比较麻烦,感觉可以先存一些图片,然后提供给用户选择,而不是让他自己上传?
问题2:修改信息时,用户信息的回显如何实现?
- 从 session 会话中获取用户 id
- 根据 id 查询当前用户的信息
- 把对象传递给 userInfo.jsp
注释:
try-fianlly
中,不管 try 里面怎么写,最后 finally 都会执行,即使在 try 里面写了 return。思路:设计前端页面时,先使用硬编码填充数据。写后端时再进行替换,实现静态数据的动态化。
- 信息未填写时,可以提示 “待完善”。
未完但完
相关文章:

【JavaWeb】实训的长篇笔记(下)
文章目录 八、功能实现1、注册功能2、登录功能3、问题说明4、首页数据显示5、后台管理 八、功能实现 1、注册功能 jsp:能够在页面中把数据动态化,jsp和html在元素标签上是无区别的,区别是html中写上java代码就成了jsp文件。filename.jsp。 需…...
linux bash快捷键
1、^abc-^-123: 这个命令用于运行上一个命令,并将其中的"abc"替换为"123"。 示例:如果上一个命令是echo abc,则运行^abc-^-123后会执行命令echo 123。 2、!!: 这个命令用于重复执行上一条命令。 示例:如果上…...

KCC@广州开源读书会广州开源建设讨论会
亲爱的开源读书会朋友们, 在下个周末我们将举办一场令人激动的线下读书会,探讨两本引人入胜的新书《只是为了好玩》和《开源之迷》。作为一个致力于推广开源精神和技术创新的社区,这次我们还邀请了圈内大咖前来参与,会给大家提供一…...

搜文本搜位置搜图片,1小时玩转阿里云 Elasticsearch
作者:朱杰、奚悦、黄宇 AI 和搜索的整合已成为下一代搜索引擎的发展趋势,技术革新的浪潮下,你是否想抓住搜索领域的新机会,增强 AI 产品力与技术竞争力? 想学习搜索引擎技术的你,是否面临这样的困惑&…...

从三个主要需求市场分析,VR全景创业的潜力发展
VR全景,5G时代朝阳产业,其实拍摄制作很简单,就是利用一套专业的相机设备去给商家拍摄,结合后期专业的3DVR全景展示拍摄制作平台,打造3D立体环绕的效果,将线下商家真实环境1:1还原到线上…...

k8s 自身原理 2
前面我们说到 K8S 的基本原理和涉及的四大组件,分享了前两个组件 etcd 和 ApiServer 这一次我们接着分享一波: 调度器 scheduler控制器管理器 controller manager 调度器 scheduler 调度器,见名知意,用于调度 k8s 资源的&…...

解决hbase节点已下线,但在status中显示为dead问题
工作中需要下线4台hbase小节点,下线完成后使用status 命令查看,有一台为dead状态: 使用status detailed 查看,发现“hd-03"这台节点是dead。 检查各节点配置文件无误,并使用 /opt/hbase/bin/hbase-daemon.sh restart master 重启两个…...

深入理解Python装饰器:解析高阶函数与代码美学
文章目录 🍀引言🍀什么是装饰器?🍀装饰器的基本用法🍀带参数的装饰器🍀类装饰器🍀总结 🍀引言 当谈到Python编程中的高级特性时,装饰器(decorators࿰…...

构建之法 - 软件工程实践教学:每天都向前推进一点点
作者:福州⼤学 汪璟玢⽼师 汪老师:每次都向前推进一点点,哪怕只有一点点,也好过什么都不做。 邹老师:对,几个学期下来,就已经超过那些“空想”的团队很远了。坚持下去! 汪老师&…...
CSS transform:rotate;无效问题
CSS设置旋转 transform:rotate无效。 今天遇到一个奇怪的问题,CSS给 icon图标设置一个hover 旋转180deg的效果,不生效。 一度任务样式被覆盖了,样式不生效没选中元素的class。但是设置hover改变大小是生效的。奇怪了? 为什么会无…...

华为新版ENSP PRO模拟器测评:性能表现与功能扩展一览
一、引言 在网络领域不断涌现的新技术和复杂的网络拓扑要求,推动了网络设备模拟器的持续发展和创新。华为作为一家领先的通信技术解决方案提供商,不断致力于为网络工程师和技术从业人员提供更优秀的仿真环境。最近,华为推出了ensp pro模拟器的…...

BBS-个人博客项目完整搭建、BBS多人博客项目基本功能和需求、项目程序设计、BBS数据库表结构设计、创建BBS表模型
一、BBS-个人博客项目完整搭建 项目开发流程 一、项目分类 现在互联网公司需要开发的主流web项目一般分为两类:面向互联网用户,和公司内部管理。面向互联网用户: C(consumer)端项目 公司内部管理:B(business)端项目还有一类web应用ÿ…...

智能设备管理系统对企业设备管理效果有作用吗?
智能设备管理系统对企业设备管理效果具有显著的作用和积极的影响。它可以提高设备管理的效率、准确性和可靠性,帮助企业降低运营成本、提高生产效率,并为企业提供更好的决策支持。以下是智能设备管理系统对企业设备管理效果的几个方面影响: …...

取证--实操
2022年美亚杯个人赛 运用软件DB Browser for SQLite (一款用于查看SQLlite数据库文件的浏览器工具) 火眼,盘古石手机取证系统等 案件详情 于2022年10月,有市民因接获伪冒快递公司的电邮,不慎地于匪徒架设的假网站提…...
react组件化开发详解
React是一个流行的JavaScript库,用于构建用户界面,并且以组件化的方式进行开发。下面将详解React组件化开发的概念和步骤: 组件化思维: 组件化开发是将复杂的用户界面划分为独立、可重用的小部件(组件)。…...

【JVM】对String::intern()方法深入详解(JDK7及以上)
文章目录 1、什么是intern?2、经典例题解释例1例2例3 1、什么是intern? String::intern()是一个本地方法,它的作用是如果字符串常量池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象的引用&#…...
7.1 C/C++ 实现动态数组
动态数组相比于静态数组具有更大的灵活性,因为其大小可以在运行时根据程序的需要动态地进行分配和调整,而不需要在编译时就确定数组的大小。这使得动态数组非常适合于需要动态添加或删除元素的情况,因为它们可以在不浪费空间的情况下根据需要…...

iOS问题记录 - Xcode 15安装低版本iOS模拟器(持续更新)
文章目录 前言开发环境问题描述问题分析1. 定位问题2. 逆向分析2.1. IDA Free2.2. Hopper Disassembler Demo 3. 模拟器日志4. supportedArchs 解决方案最后 前言 最近新需求很多,项目改动很大,开发完成后想测一遍在低版本iOS系统上的兼容性,…...

高端百度地图开发2:自定义水滴头像(鼠标事件、API封装对接)
高端百度地图开发系列 高端百度地图开发1:自定义水滴头像(自定义标注覆盖物、Overlay覆盖类) 自定义水滴头像之鼠标事件、API封装对接 高端百度地图开发系列一、添加自定义覆盖物的方法二、对接API数据1.获取API数据(模拟)2.遍历数据3.添加自…...

R语言生存分析(机器学习)(2)——Enet(弹性网络)
弹性网络(Elastic Net):是一种用于回归分析的统计方法,它是岭回归(Ridge Regression)和lasso回归(Lasso Regression)的结合,旨在克服它们各自的一些限制。弹性网络能够同时考虑L1正则…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...