【JavaWeb】实训的长篇笔记(下)

news2024/11/24 2:38:56

文章目录

    • 八、功能实现
      • 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.coloradmin.cn/o/877020.html

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

相关文章

Threejs学习01——坐标轴展示立方体并实现来回移动

在三维坐标轴上展示立方体并实现来回移动 这是一个非常简单基础的threejs的学习应用&#xff01;创建应用先创建一个场景Scene&#xff0c;然后创建爱你一个透视相机PerspectiveCamera&#xff0c;然后创建立方体BoxGeometry&#xff0c;立方体添加一些材质&#xff0c;将立方…

SPSS多元线性回归操作入门实例

做农情反演的时候往往需要用到SPSS多元线性回归&#xff0c;这里提供一个操作案例 (一)SPSS安装 关于SPSS安装&#xff0c;请参考本人博客&#xff1a;保姆级SPSS图文安装教程_追忆苔上雪的博客-CSDN博客 (二)SPSS多元线性回归实例 在文章ArcGIS入门操作手册_追忆苔上雪的博…

Windows下升级jdk1.8小版本

1.首先下载要升级jdk最新版本&#xff0c;下载地址&#xff1a;Java Downloads | Oracle 中国 2.下载完毕之后&#xff0c;直接双击下载完毕后的文件&#xff0c;进行安装。 3.安装完毕后&#xff0c;调整环境变量至新安装的jdk位置 4.此时&#xff0c;idea启动项目有可能会出…

CCF考试:201703-1 分蛋糕(java代码)

1、【问题描述】 小明今天生日&#xff0c;他有n块蛋糕要分给朋友们吃&#xff0c;这n块蛋糕&#xff08;编号为1到n&#xff09;的重量分别为a1, a2, …, an。小明想分给每个朋友至少重量为k的蛋糕。小明的朋友们已经排好队准备领蛋糕&#xff0c;对于每个朋友&#xff0c;小明…

2023年新学期12306高铁火车学生票如何在线核验享受优惠?

2023学年优惠资质核验已开始&#xff0c;完成学生优惠资质核验后&#xff0c;您可以在线购买2022年10月1日至2023年9月30日的学生优惠票。&#xff08;注&#xff1a;非该时间段需要重新核验&#xff0c;可享受学生优惠票&#xff09;&#xff1b; 『扩展阅读』 1、美团外卖红…

日常BUG——SpringBoot关于父子工程依赖问题

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 在父子工程A和B中。A依赖于B&#xff0c;但是A中却无法引入B中的依赖&#xff0c;具体出现的…

新基建助推数字经济,CosmosAI率先布局AI超算租赁新纪元

伦敦, 8月14日 - 在英国伦敦隆重的Raffles OWO举办的欧盟数字超算新时代战略合作签约仪式&#xff0c;CosmosAI、Infinite Money Fund与Internet Research Lab三方强强联手&#xff0c;达成了历史性的合作协议&#xff0c;共同迈向超算租赁新纪元。 ​ 这次跨界的合作昭示了全球…

Docker入门指南:从零开始轻松掌握容器化技术【超级详细版】

文章目录 什么是Docker&#xff1f;平时应用部署的环境问题Docker解决依赖兼容问题Docker可以解决操作系统环境差异 Docker和虚拟机的区别Docker架构镜像容器仓库Docker的安装 Docker基本操作镜像操作容器操作数据卷&#xff08;容器数据管理&#xff09;1. 什么是数据卷2.数据…

C++初阶之一篇文章教会你stack(理解使用和模拟实现)

stack&#xff08;理解使用和模拟实现&#xff09; 什么是stackstack的使用1. stack构造函数2.empty()3.size()3.top()4.push5.emplace6.pop()7.swap 模拟实现stack的准备1.什么是容器适配器&#xff1f;2. deque的简单介绍3. deque的缺陷4. 为什么STL中stack和queue默认使用de…

抢红包系统---(java)

需求&#xff1a;直播抽奖活动&#xff0c;分别有【2,588,888,1000,10000】五个奖金&#xff0c;模拟抽奖。打印每个奖项&#xff0c;奖项的出现顺序随机但不重复。package demo;import java.util.Random;/* * 案例;抢红包 * 需求&#xff1a;直播抽奖活动&#xff0c;分别有【…

shell脚本循环语句

shell脚本循环语句 一.echo命令二.查看当前系统的时间--date命令三.循环语句for四.while循环语句结构五.while循环语句结构&#xff08;迭代&#xff09;六.continue和break 一.echo命令 echo -n 表示不换行输出 echo -e输出转义符&#xff0c;将转义后的内容输出到屏幕上 常…

抖音小程序排名代发需要提供什么资料

抖音小程序排名代发需要提供什么资料 抖音小程序如何做搜索排名&#xff0c;排名提升方法#小程序搭建#小程序建设#小程序排名# 营业执照&#xff0c;注册抖音的手机号&#xff0c;对公账户&#xff0c;关键词以及对应的图片 提供以上资料就可以 小程序包括两大功能&#xff0…

springboot 数据库版本升级管理常用解决方案

目录 一、前言 1.1 单独执行初始化sql 1.2 程序自动执行 二、数据库版本升级管理问题 三、spring 框架sql自动管理机制 3.1 jdbcTemplate 方式 3.1.1 创建数据库 3.1.2 创建 springboot 工程 3.1.3 初始化sql脚本 3.1.4 核心配置类 3.1.5 执行sql初始化 3.2 配置文…

Spark 学习记录

基础 SparkContext是什么&#xff1f;有什么作用&#xff1f; https://blog.csdn.net/Shockang/article/details/118344357 SparkContext 是什么&#xff1f; SparkContext 是通往 Spark 集群的唯一入口&#xff0c;可以用来在 Spark 集群中创建 RDDs 、累加和广播变量( Br…

股票指数——RSI指数

RSI指数的计算非常简单&#xff0c;就是使用一段时间内的平均上涨除以平均上涨加平均下跌&#xff08;取正值&#xff09;。也就意味着RSI指数的取值是[0,100]之间&#xff0c;其中0表示周期内没有上涨的&#xff0c;100表示周期内没有下跌的。RSI的直观意义是它表示了一段周期…

[保研/考研机试] KY43 全排列 北京大学复试上机题 C++实现

题目链接&#xff1a; 全排列https://www.nowcoder.com/share/jump/437195121692001512368 描述 给定一个由不同的小写字母组成的字符串&#xff0c;输出这个字符串的所有全排列。 我们假设对于小写字母有a < b < ... < y < z&#xff0c;而且给定的字符串中的字…

Vulnhub: MoneyBox: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.194 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.194 ftp匿名登录发现trytofind.jpg 目录爆破发现blogs目录 gobuster dir -u http://192.168.111.194 -w /usr/share/word…

【MongoDB基础】

目录 一、概述 1.概念 2.相关 2.1 实例 2.2 库 2.3 集合 2.4 文档 2.5 主键 3.特性 4&#xff0c;应用场景 二、安装 1.RPM安装 2.启动数据库 三、目录结构 1.rpm -ql mongodb-org-server 2.rpm -ql mongodb-org-shell 3.rpm -ql mongodb-org-tools 四、默…

CSS 写个清除浮动,怎么还蹦出个 hasLayout? *zoom?

&#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; &#x1f5a5;️ Node专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ TS知识总结&#xff1a;十万字TS知识点总结 &#x1f449; 你的一键三连是我更新的最大动力❤️&#xff01;…

【LeetCode】《LeetCode 101》第十一章:妙用数据结构

文章目录 11.1 C STL11.2 数组448. 找到所有数组中消失的数字&#xff08;简单&#xff09;48. 旋转图像&#xff08;中等&#xff09;74. 搜索二维矩阵&#xff08;中等&#xff09;240. 搜索二维矩阵 II&#xff08;中等&#xff09;769. 最多能完成排序的块&#xff08;中等…