SSM框架训练 实现各个功能时遇到的常见问题

快速复制当前代码到下一行:ctrl+D

格式化代码(快速整理代码):ctril+alt+L

一步一步来,后续会不停添加功能。

先创建项目结构:搭建框架

(36条消息) SSM框架模板(高配:一次性配完所有需要的配置文件)_one day321的博客-CSDN博客

登录与注册 功能实现 的问题:

登录很简单,这里就不详述了。可以参考上一个博客的内容,里面有关登录的介绍。

主要看注册的问题:

第一个问题:没有进行 判断数据是否为空,就插入数据到数据库里面了,这个时候插入的数据都是null。

原因:通过logger.ingo("user")  。我们可以发现。原来我们的判断语句是:

if(user ==null)   。但是日志输出的user 是一个 po.user类型,里面各个数据存放的是null。但不是user为null。

修改:  改为user.getAccount() ==null

第二个问题:插入了三次

在插入语句里面,插入了三次。是因为,这个里面,使用了三次插入 (userDao.register(user)尽管 ) 

修改:将userDao.register语句只保存一个就可以了。

第三个问题:从表单提交给Controller的数据。需要有model的属性指定。

在浏览器输入/register 的时候,它的modelAttribute是user。表示,它提交的表单,其中会有一个user的model属性。所以这里要像下面一样修改。

第四个问题:从service层提交给view层的数据。也需要有相应的model属性指定

 像下面,service层返回给login.jsp。然后login.jsp存在modelAttribute("login")。所以这里必须也要指定login的model属性。

第三个和第四个问题,分别是 从两个方向提交数据,如果缺少上述属性的指定,就会造成,浏览器500,并提示,找不到bean标签。

第五个问题:是有关数据库的属性指定。

比如,这里指定id 不能为空,所以。在Mapper.xml文件里面,需要首先对sql语句里面的id进行赋值,否则,就会报错。

 比如这里,就必须先进行赋值null。

第二个功能:实现 商品类型的展现 和商品类型的添加。

第一个问题:404

商品类型和商品类型的添加都属于一个商品类型的表。  然后我在做的时候,把SQL语句放在了UserMapper.xml文件里面(UserMapper.xml 文件的映射是dao.userDao。)不符合我们属于商品类型的表。

修改:需要创建一个商品类型的Mapper.xml。需要创建 一个POJO类型的商品类型。在mybatis-config.xml文件里面添加 对商品类型的映射。

修改完后,就不会出现404的问题了。

第二个问题:代码层不建议多写。一个表对应一类代码层。比如:这次的商品类型。那么就写GoodsType。(dao层就是TypeGoodsDao、service层就是TypeService、controller层就是TypeController)

关于代码层,我一开始的作法是分了两个模块,一个添加,一个展示。但是书上要求是在同一个页面展示,最后越做越乱。直到我把代码层的代码全部删除,重新放在一个模块来思考,问题得到解决。

第三个问题:我想知道,数据是如何在这个里面进行传输和储存的。

小结自己的感悟:

1.Controller层 的方法参数要和 Service层 一一对应。

2.像SQL语句这些。若没有从view层传送数据过来,那么controller层的POJO类型始终为空,当然Service层也始终为空。例如:查询所有语句。没有view层传递数据。只需要在view层使用dao层的方法就能获取到数据。但POJO数据始终为空。

3.从view层传递数据过来了(view层数据绑定POJO的属性),那么POJO始终 有这么一条数据。也仅有这一条数据。

4.有一点需要重视,像多个功能放在同一个页面下,那么view层就会存在多个model属性。那么对应功能的方法也会有对应几个的model.add属性。

(并不是对应一个功能,那么在一个方法里面就只写一个model属性。因为最终返回的界面有多个model属性,那么尽管是一个功能的方法,它也要写上所有 和返回界面 里面有的所有model.add属性。否则,只写一个model属性,它最后返回到界面里面会因为发现不了其它model属性而导致报错。并提示,此bean未找到。)

第三个功能:实现商品类型的展现 和 删除。(在每一个类型后边加一个删除)

第一个问题:我发现,我好像不知道,怎么删除商品。(主要商品的删除,应该怎么把数据提交给控制器,然后由控制器进行删除)

删除商品的 sql语句我知道写:delete from goodstype where id = #{id} 

但是,这个id,应该怎么从view层获取过来。

解决:通过JavasScript 函数 提交id给控制器。

 然后在下面编写: 通过使用函数的方法,提交id数据。

在控制器有两种方式 可以获取到这个数据:

第一种,通过Integer 获取。(第一次浏览器输入/delete界面,此时没有点击删除,ID为null。)

第二种,通过 POJO 使用 goodsTypeDao方法使用Mapper.xml文件的SQL映射文件。使用这个方法之后,goodsType的存放的数据就发生改变了。

 

这里需要注意一下,就是,只通过第二种方式,删除数据可以吗?

答案是当然不行:

  因为我们在SQL映射语句是 通过where id = {#id} .

也就是,在Dao层,使用的是delet(Integer id) 的方式 进行删除数据。所以必须需要第一种方式获取传输过来的id .

比较:前面我们使用查询语句 ,插入语句 。它们的类型是POJO类型。

查询、插入的方式:它们是通过表单的形式和POJO的类型进行绑定的,所以只要提交action按钮。就会改变POJO的类型。这和我们使用删除的方式有点不一样。

这里我们点击删除的方式 是传入一个id的数据。然后传给Service层。

总结:写到这个例子,我才差不多理解,在这些代码层里面,数据是如何进行数据的传输的。

例如:删除,是通过传递id编号。使用service层的映射。

           查询、添加 是通过 和POJO的绑定,当点击按钮,就改变POJO的数据,在传递给Service层,使用dao层的映射。

第二个问题:点击删除按钮,页面没有变化,但是数据库显示,数据已被删除。

总结:从《JavaEE 框架整合开发入门到实战》这本书开始学习。

到现在学习到第20章,最后一个电子商务平台的设计与实现。沿途碰见了许多困难,直到现在,或许我应该 转换思路学习了。这本书,不是很好。因为最后一个项目,在我看来,很多地方都没有解释清楚,比如,它们的数据是怎么传递的,以及怎么突然,一个界面就获得了另外一个数据。而且缺少很多数据和属性。

我只搞明白了,对应view层获得或者传入数据,都是通过一个model属性进行传递的。还有很多地方,我并没有搞明白。比如,在实现第三个功能,进行上传图片的操作的时候,我就碰到了困难。看书上的例子,我真的觉得有点莫名其妙。

最后只能实现一个简单的添加商品类,但是做不了上传这个界面。所以此书到此为止了。

当然,此书给我的收获还是很大的,我至少学会了SSM项目的基本搭建,以及学会使用IDEA这个应用。

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

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

相关文章

vue 多环境打包指令配置及编译

1.创建多环境: 在根目录创建.env.xxx文件,如下为例(我创建了两个) 文件内容主要包括: # 页面标题 VUE_APP_TITLE "标题"# 生产环境配置 ENV production# DNA检测仓储管理系统/生产环境 VUE_APP_BASE_API https://xxxxxx 2.设置: 修改根目录下的package…

freemark生成pdf

freemark生成pdf 字体库 simsun.ttc 解决中文问题 /*** 生成pdf* param params* param templPath* param ftlName* param htmlPath* param pdfPath* param fontPath* return*/public String processPdf(Map<String, Object> params, String templPath, String ftlName,…

SSM+Shiro安全框架整合(完成安全认证--登录+权限授权)+ssm整合shiro前后端分离

目录 1.搭建SSM框架 1.1.引入相关的依赖 1.2. spring配置文件 1.3. web.xml配置文件 1.4.配置Tomcat并启动 2.ssm整合shiro---认证功能 (1).引入依赖 (2).修改spring配置文件 (3).修改web.xml文件 (4).新建login.jsp(登录页面) (5).新建success.jsp(登录成功后跳转到此…

监听DOM尺寸变化 - ResizeObserver

一、与 MutationObserver Api的区别 MutationObserver 主要用来监听 DOM 元素的属性和节点变化的&#xff0c;非 DOM 样式尺寸&#xff0c;可查看之前一篇 blog - DOM规范 - MutationObserver接口观察DOM元素的属性和节点变化ResizeObserver 主要用来监听 DOM 元素的 内容区域…

系统运维和网络运维有什么区别吗?

跟着互联网以及科技的高速开展&#xff0c;衍生出了许多的新奇职业&#xff0c;比方网络运维、网络安全运维。 从字面意思了解&#xff0c;两者之间没有什么太大区别&#xff0c;因而很多人很容易将两者混杂。 系统和网络运维有什么区别? 一个偏系统&#xff08;linux、doc…

23款奔驰GLS450更换迈巴赫GLS600外观套件,尽显奢华

在外观上不要过分的张扬&#xff0c;低调的同时还要彰显强大的气场&#xff0c;换装迈巴赫专属套件&#xff0c;迈巴赫专属踏板&#xff0c;还有迈巴赫的醒目M标志&#xff0c;车身轮廓和线条方面&#xff0c;奔驰GLS450和迈巴赫GLS600尺寸及其契合&#xff0c;只需通过增加一些…

网络安全(黑客)学习路线

前言&#xff1a; 学基础花费很长时间&#xff0c;光语言都有几门&#xff0c;有些人会倒在学习 linux 系统及命令的路上&#xff0c;更多的人会倒在学习语言上&#xff1b;1、打基础时间太长 对于网络安全基础内容&#xff0c;很多人不清楚需要学到什么程度&#xff0c;囫囵…

Spark-用IDEA编写wordcount demo

配置 Spark版本&#xff1a;3.2.0 Scala版本&#xff1a;2.12.12 JDK&#xff1a;1.8 Maven&#xff1a;3.6.3 pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&quo…

【Redis】—— Redis的AOF持久化机制

&#x1f4a7; 【 R e d i s 】—— R e d i s 的 A O F 持久化机制 \color{#FF1493}{【Redis】 —— Redis的AOF持久化机制} 【Redis】——Redis的AOF持久化机制&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞…

基于单片机语音识别智能家居系统的设计与实现

功能介绍 以STM32单片机作为主控系统&#xff1b;液晶显示当前环境温湿度&#xff0c;用电器开关状态通过语音模块识别设定的语音&#xff1b;DHT11进行环境温湿度采集&#xff1b;通过语音播报模块报当前温湿度&#xff0c;智能回复通过语音识别可以打开灯&#xff0c;窗帘&am…

折叠屏手机再添新功能?OPPOColorOS14发布,打通 App 和终端互联

近年来&#xff0c;多终端互联互通已经成为数码产品的发展趋势&#xff0c;各家手机品牌也在不断提升相关功能。 根据数码博主 数码闲聊站的爆料&#xff0c;OPPO即将发布ColorOS 14&#xff0c;并特别提供了针对折叠屏手机的Fold系统。该系统在横屏模式下对自带应用进行了更好…

mac android studio设置跟mac系统一样的快捷键

mac版的android studio 跟mac系统的快捷键不一样,主要修改了下面几组操作,为了跟mac系统快捷键相同 setting->Keymap 搜索bottom 修改3个快捷键: cmd↓ 设置让鼠标移动到屏幕最后面 shiftcmd↓ 选中从当前位置到屏幕最下面 option↓. 或者 end 滚动到屏幕最下方 // 因为默认…

基于 Arduino 库实现 ESP32 TCP Server 应用例程

实现步骤&#xff1a; ESP32 开启 WiFi Station 模式连接路由器连上路由器后将获取到分配的 IP 地址基于分配的 IP 地址创建 TCP Server 测试代码如下&#xff1a; #include <WiFi.h> #include <WiFiClient.h>const char* ssid "cc2.4"; const char*…

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

文章目录 1. 实验节点规划表2. 安装Prometheus3. 安装node_exporter4. 配置prometheus.yml文件5. 安装Grafana6. 安装Altermanager监控告警 采用 "PrometheusGrafana"的开源监控系统&#xff0c;安装部署K8S集群监控平台。 并使用Altermanager告警插件&#xff0c;配…

【计算机组成原理总结】

第一章计算机系统概述 第二章数据的表示与运算 第三章存储系统 第四章 指令系统 第五章 中央处理器 第六章 总线 第七章 输入输出设备

hadoop -Unable to start failover controller. Parent znode does not exist

Unable to start failover controller. Parent znode does not exist 问题描述 今天使用星环的TDH集群时&#xff0c;HDFS服务宕掉&#xff0c;在后台查看namenode 始终起不来 kubectl get pod -o wide | grep hdfs 如上图&#xff0c;k8s pod 起来又crash 掉&#xff0c;然后…

Kafka入门,分区的分配再平衡(二十)

分区的分配以及再平衡 1、kafka有四种主流的分区策略&#xff1a;Range,RoundRobin,Sticky,CooperativeSticky。可以通过配置参数partition.assignment.strategy,修改分区的分配策略。默认策略是RanageCooperativeSticky。Kafka可以同事使用多个分区分配策略。 参数描述heartb…

【*1900倍数遍历】CF1627 D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; 在枚举数列子集的gcd时&#xff0c;通常可以枚举倍数 对于这道题要注意&#xff0c;j/i的gcd要为1&#xff0c;这样才能保证i是这个子集的最大公约数 Code&#xff1a; #include <bits/stdc.h>//#define…

决策树(Decision Tree)

文章目录 一、决策树 一、决策树 决策树在机器学习中也是比较常见的一种算法&#xff0c;属于监督学习中的一种。看字面意思应该也比较容易理解&#xff0c;相比其他算法比如支持向量机(SVM)或神经网络&#xff0c;似乎决策树感觉“亲切”许多。 优点&#xff1a;计算复杂度不…

Java 查找二叉树中某一结点的前驱结点以及后继结点

文章目录 前言什么是后继结点什么是前驱结点 代码实现查找某一结点的后继结点思路代码实现图解 查找某一结点的前驱结点思路代码实现图解 测试用例运行结果 结语 前言 给定二叉树结点定义Node结构如下&#xff0c;其中parent结点指向当前Node结点的父结点,根结点指向null&…