【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 HttpServletdoGet, doPostservice都是可以接收前端请求的方法,可以重写它们!

    区别:前端发送的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打包就相对安全呢?别人解包不就行了?

响应前端

  1. 请求转发地址栏url不会改变,能够附带数据
  2. 重定向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要数据。

步骤

  1. 获取登录信息
  2. 调用service得到能否登录的结果
  3. 响应: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存在这个问题)。

  • 乱码问题

    1. 确保mysql编码为utf-8
    2. 确保ide环境和文件的编码为utf-8
    3. 在代码中设置utf-8。
    • 如果是get方式提交,则需要修改tomcat 的编码。tomcat/conf/server.xml ,修改URIEncoding="UTF-8"
    • 如果是post方式提交,需要在请求设置下面的代码:
request.setCharacterEncoding("UTF-8");
  • 判断登录状态
    1. 引入jsp的标准标签库。
    2. 使用<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?"女":"男"}

感受:老师水平确实可以,页面简洁大气。

清风莫追-JavaWeb实训

问题1:图片的上传比较麻烦,感觉可以先存一些图片,然后提供给用户选择,而不是让他自己上传?

问题2:修改信息时,用户信息的回显如何实现?

  1. 从 session 会话中获取用户 id
  2. 根据 id 查询当前用户的信息
  3. 把对象传递给 userInfo.jsp

注释try-fianlly中,不管 try 里面怎么写,最后 finally 都会执行,即使在 try 里面写了 return。

思路:设计前端页面时,先使用硬编码填充数据。写后端时再进行替换,实现静态数据的动态化。

  • 信息未填写时,可以提示 “待完善”。

未完但完

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

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

相关文章

【Megatron-DeepSpeed】张量并行工具代码mpu详解(四):张量并行版Embedding层及交叉熵的实现及测试

相关博客 【Megatron-DeepSpeed】张量并行工具代码mpu详解(四)&#xff1a;张量并行版Embedding层及交叉熵的实现及测试 【Megatron-DeepSpeed】张量并行工具代码mpu详解(三)&#xff1a;张量并行层的实现及测试 【Megatron-DeepSpeed】张量并行工具代码mpu详解(一)&#xff1a…

安装paddleSeq2.7.0版本模块-笔记

安装paddleSeq2.7.0版本模块-笔记 先安装conda和python版本 本机安装的conda 22.9.0 python2.9.12 paddle2.4.2 paddlepaddle-gpu2.4.2 cuda10.2 安装matplotlib3.5.0版本 opencv_python-4.5.4.60-cp39-cp39-win_amd64.whl 测试采用分割模型名称&#xff1a;BiSeNetv2 #BiSe…

Android 项目导入高德SDK初次上手

文章目录 一、前置知识&#xff1a;二、学习目标三、学习资料四、操作过程1、创建空项目2、高德 SDK 环境接入2.1 获取高德 key2.2下载 SDK 并导入2.2.1、下载SDK 文件2.2.2、SDK 导入项目2.2.3、清单文件配置2.2.4、隐私权限 3、显示地图 一、前置知识&#xff1a; 1、Java 基…

Server - 文字转语音 (Text to Speech) 的在线服务 TTSMaker

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132287193 TTSMaker 是一款免费的文本转语音工具&#xff0c;提供语音合成服务&#xff0c;支持多种语言&#xff0c;包括英语、法语、德语、西班…

每日一题——对称的二叉树

题目 给定一棵二叉树&#xff0c;判断其是否是自身的镜像&#xff08;即&#xff1a;是否对称&#xff09; 例如&#xff1a; 下面这棵二叉树是对称的 下面这棵二叉树不对称。 数据范围&#xff1a;节点数满足 0≤n≤1000&#xff0c;节点上的值满足 ∣val∣≤1000 要求&…

Rust 复数运算,重载加减乘除运算

复数 基本概念 复数定义 由实数部分和虚数部分所组成的数&#xff0c;形如a&#xff0b;bi 。 其中a、b为实数&#xff0c;i 为“虚数单位”&#xff0c;i 的平方等于&#xff0d;1。 a、b分别叫做复数a&#xff0b;bi的实部和虚部。 当b&#xff1d;0时&#xff0c;a&am…

Java8函数式编程

ISBN: 978-7-115-38488-1 作者&#xff1a;【英】Richard Warburton 页数&#xff1a;132页 阅读时间&#xff1a;2023-08-05 推荐指数&#xff1a;★★★★★ 练习项目&#xff1a;https://github.com/RichardWarburton/java-8-lambdas-exercises 虽然这本书出版于2014年&…

前端食堂技术周刊第 93 期:7 月登陆 Web 平台的新功能、Node.js 工具箱、Nuxt3 开发技巧、MF 重构方案

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;橙橙冰萃美式 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来…

SQLyog中导入CSV文件入库到MySQL中

1.在数据库中新建一个表&#xff0c;设置列名&#xff08;与待导入文件一致&#xff09;&#xff0c;字段可以多出几个都可以 2.右键表名&#xff0c;导入- - >导入使用本地加载的CSV数据 选择使用加载本地CVS数据 3.指定好转义字符&#xff0c;将终止设置为,号(英文状态下…

2023牛客暑期多校训练营9-Non-Puzzle: Segment Pair

2023牛客暑期多校训练营9-Non-Puzzle: Segment Pair https://ac.nowcoder.com/acm/contest/57363/I 文章目录 2023牛客暑期多校训练营9-Non-Puzzle: Segment Pair题目大意解题思路代码 题目大意 解题思路 对于每一对 [ l i , r i ] [l_i,r_i] [li​,ri​]和 [ l i ′ , r i …

cmake-ibmtpm1682编译

1、error Ossl library is using different radix 异常解决 RADIX_BITS由 64改成32 --whole-archive CMakeFiles\ibm-tpm-my.dir/objects.a -Wl, --no-whole-archive CMakeFiles\ibm-tpm-my.dir\linklibs.rsp CMake中的 --whole-archive以及–no-whole-archive两者都是编译器…

AppStream下载元数据失败

错误&#xff1a;为仓库 AppStream 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist 目录 一、域名解析 二、CentOS-AppStream.repo 三、CentOS-Base.repo 四、CentOS-Extras.repo 五、rpm更新 一、域名解析 先验证 ping www.baidu.com 不…

基于C#UI Automation自动化测试

步骤 UI Automation 只适用于&#xff0c;标准的win32和 WPF程序 需要添加对UIAutomationClient、 UIAutomationProvider、 UIAutomationTypes的引用 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.D…

【ARM 调试】如何从 crash 信息找出问题原因

一、问题背景 粉丝在进行 ARM-A 系列软件编程时遇到以下问题&#xff0c;串口打印这段日志后就重启了&#xff0c;粉丝求助问是什么原因&#xff1f; Unhandled Exception in EL3. x30 0x0000000000b99b84 x0 0x00000000179a25b0 x1 …

Prometheus技术文档-基本使用-配置文件全解!!!!!

简介&#xff1a; Prometheus是一个开源的系统监控和告警系统&#xff0c;由Google的BorgMon监控系统发展而来。它主要用于监控和度量各种时间序列数据&#xff0c;比如系统性能、网络延迟、应用程序错误等。Prometheus通过采集监控数据并存储在时间序列数据库中&#xff0c;…

【apifox】如何写一份合格的 API 文档?

要想弄清楚如何开始写出一份合格的 API 文档&#xff0c;我们需要首先了解什么是 API&#xff0c;它的使用场景有哪些&#xff0c;应该具备什么样的能力。 什么是 API&#xff1f; 想象一下&#xff0c;当小 A 购入了一台新的电脑后&#xff0c;希望将显示画面投射至一块色准…

对比学习论文综述总结

第一阶段:百花齐放(18-19中) 有InstDisc(Instance Discrimination)、CPC、CMC代表工作。在这个阶段方法模型都还没有统一,目标函数也没有统一,代理任务也没有统一,所以说是一个百花齐放的时代 1 判别式代理任务---个体判别任务 1.1 Inst Dict---一个编码器+一个memory…

Redis_主从复制

8. 主从复制 8.1 简介 主从库采用读写分离的方式 读操作&#xff1a;主库、从库都可以处理写操作&#xff1a;首先写到主库执行&#xff0c;然后再将主库同步给从库。 实现读写分离&#xff0c;性能扩展 容灾快速恢复 8.2 主从复制步骤 创建一个目录 ,在root下创建一个m…

2009年下半年 软件设计师 上午试卷

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

RedisDesktopManage

RDM 简介下载安装 简介 RedisDesktopManager&#xff08;RDM&#xff09;是一个开源的跨平台图形界面工具&#xff0c;用于管理和操作 Redis 数据库。它提供了一个用户友好的界面&#xff0c;使用户能够轻松地连接、浏览、查询和修改 Redis 数据&#xff0c;而无需使用命令行界…