SSM简单项目遇到的几个问题

news2024/11/25 0:49:28

这几个问题,干扰了我很长时间。

主要因为书本的例子,是通过controller层返回到jsp层。但是,最后一个SSM项目,它用的是controller返回信息给Service层,再由Service层返回Jsp层。

实训:编写一个模糊查询姓名的项目。在另一个show.jsp页面显示查询信息。

一步一步:

先通过controller层返回到JSP层。

第一个问题:(未找到迭代器,或者不是迭代器类型)

javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>

show.jsp对应的代码信息:

<%--querylist.account是有提示的。只有list.account没有提示。(说明list不是一个可迭代器对象)--%>

<c:forEach items="${queryList}" var="user">
    ${user.account}<br>
    ${user.password}<br>
    ${user.sex}<br>
    ${user.name}<br>
</c:forEach>

这是show.jsp对应的代码,这个信息表示querylist的遍历器没有这个对象。说明,存在的问题是querylist不是一个可迭代的对象。我们返回到定义这个queryList的Controller文件,发现:

//        问题出在user这里,queryList是一个集合对象,但是user是一个类对象,是用不了c:foreach
        model.addAttribute("queryList",user);

解决方式:将user更换成一个迭代器对象。(例如,前面我们定义的service层的方法是一个list类型,这就是一个迭代器对象。)(额外:在使用 Service层作为与JSP返回的层级时,怀疑之前一直报错的原因,就是Service层的返回类型被我换成了String类型)

修改之后,可以在show.jsp显示用户查询信息。

第二个问题:未找到bean  “query2”。明明定义了query2

我尝试将用户信息查询得到的信息放在query.jsp页面下面,也就是query.jsp提供查询功能,并将信息放在query.jsp的下面。

一开始我的尝试:就是将原本返回给show的方法,改为返回未query。

在query.jsp里面,将show.jsp的代码复制过来。但是,结果出现一个很大的问题,我找了很久才发现问题:

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'query2' available as request attribute

这个错误信息表明在处理请求时,Spring无法找到名为query2的bean。

JSP原本的代码是:(这里需要将query修改为input)

<form:form method="post" action="${pageContext.request.contextPath}/user/query" modelAttribute="query2">

因为,我们将查询和显示,在Controller分别用了两个方法表示,大概流程是这样的:

首先我们在浏览器输入/input。

/input里面返回POJO的信息给query.jsp 。通过query2的属性,将POJO和query.jsp的表单信息进行绑定。

接着在query.jsp里面,提交用户信息,action 为/query 。

/query里面返回从数据库获取的信息给query.jsp。但是,此时query.jsp里面,又会读取一次表单信息,而此时表单信息的属性query2并没有定义。于是,IDEA就提示报错,:找不到bean “query2”。

 

修改之后:

大概流程:

首先浏览器输入/input 。

它返回POJO的信息给query.jsp。注意此时POJO还没有和query.jsp的name进行绑定。所以数据库返回的数据此时为null。

它也返回数据库获取的数据给query.jsp。

在用户query.jsp,它提交action 为/input。

于是和上面的信息一样。

最后返回给query.jsp。此时,jsp里面的querylist就存在信息了。

第三个问题:测试 跟踪流程去发现问题 (挺重要的)

(学习这个方式,以后就不需要先对spring和Mybatis先进行整合并测试。)我想通过一些测试方法跟踪 这个流程的输出情况。通过查找资料,得出,可以通过日志方式输出。

方法:引入`org.slf4j.Logger`类

不是`org.apache.commons.logging.Log`类`。Log`类的`info`方法只接受一个参数,不能使用占位符`{}`来格式化消息。(在前面,我学过使用org.apache.commons.logging.Log`类,使用打印像logger.info("登录成功")   这样的信息)如果想要使用占位符来格式化消息,您可以将`Log`类更改为`org.slf4j.Logger`类,并使用`org.slf4j.LoggerFactory`来获取日志记录器(logger)对象。例如,您可以将代码修改为以下内容:
 

其实就是在controller类里面添加两句:

private static final Logger logger = LoggerFactory.getLogger(Query2Controller.class);

logger.info("User info: {}", user);  //测试user对象是否获取到数据。

//如果还想测试queryList是否获取数据,也可以这样写。

package controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import po.User;
import service.Query2;

@Controller
@RequestMapping("/user")
public class Query2Controller {

    private static final Logger logger = LoggerFactory.getLogger(Query2Controller.class);
    @Autowired
    private Query2 query2;

    @RequestMapping("/input")
    public String input(Model model, User user){
        logger.info("User info: {}", user);
        model.addAttribute("query2",user);
        model.addAttribute("queryList",query2.query2list(user));
        return "query";
    }
}

在添加方法之前,需要把有关依赖包导入进来。

又因为我们的项目是通过log4j的那个配置,文件输出日志信息,所以,需要对SLF4J和log4j进行绑定。

就两个依赖包:一个SLF4j的依赖包,和前面的输出日志信息搭配。

一个是绑定log4j的依赖包。实现在log4j的配置文件里面输出日志信息。

使用`log4j`作为日志记录实现,您需要在应用程序的类路径中添加`SLF4J`到`log4j`的绑定库。您可以通过添加以下依赖项来实现这一点:
<!-- for Maven -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.32</version>
</dependency>

此外,您还需要在应用程序的类路径中添加`log4j`库。您可以通过添加以下依赖项来实现这一点:
<!-- for Maven -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

最后,配置log4j的配置文件,

不过,这个文件,其实在创建项目的时候,在mybatis的学习里面,我们已经添加过了。

添加完依赖项后,您需要配置`log4j`以指定日志记录行为。您可以在应用程序的类路径中创建一个名为`log4j.properties`的文件,并在其中指定日志记录配置。例如,您可以在配置文件中添加以下内容:
# Global logging configuration
log4j.rootLogger=DEBUG, stdout

# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

在上面的示例中,我们配置了一个名为`stdout`的控制台日志记录器(appender),它将日志信息输出到控制台。您可以根据需要更改配置。

结果如下:

user info 这个的信息,就是我们获取的user对象信息。

通过控制台信息,我们再来分析:

这整个流程:

首先浏览器输入:/user/input   。进入input界面。

返回POJO信息

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

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

相关文章

前端(三)——MVC与MVVM模式的battle

&#x1f604;博主&#xff1a;小猫娃来啦 &#x1f604;文章核心&#xff1a;mvc模式mvvm模式的battle 文章目录 mvc模式是什么mvc模式的优缺点优化mvc模式致命的缺点mvvm是什么&#xff0c;和mvc有什么关系&#xff1f;细看mvvm和mvc的不同 mvvm的缺点简化视图层开发 mvc模式…

E类逆变器Ltspice仿真

1 参数计算&#xff08;待续&#xff09; &#xff08;1&#xff09;确定振荡频率&#xff1a; &#xff08;2&#xff09;计算各器件参数&#xff1b; 2 电路仿真 &#xff08;1&#xff09;电路图 &#xff08;2&#xff09;电路分析 3 结果 &#xff08;1&#xff09;…

vue项目业务实现,视频监控-文件流,大屏适配方案(v-scale-screen),websocket前端

最近把以前的业务场景及解决方案整理了一下&#xff0c;具体实现的工具如下&#xff1a; 监控-视频文件流>video.js videojs-contrib-hls 大屏适配方案> v-scale-screen websocket>sockjs-client webstomp-client 视频监控-文件流 使用方法 下载video插件&#xf…

数字IC基础:状态化简与等价状态

相关阅读 数字IC基础知识&#xff1a;著名EDA公司与工具介绍 如果时序机的两个状态对于所有可能的输入序列都具有相同的输出序列&#xff08;和相同的下一状态&#xff09;&#xff0c;则称这两个状态是等价的。时序机的等价状态无法通过观察输出序列的异同对其加以区分&#…

【Web3】认识以太坊钱包

目录 区块链钱包概念 密码 私钥 Private Key 公钥Public Key Keystore 助记词 Mnemonic 如何解锁账户 区块链钱包概念 钱包用来存钱的&#xff0c;在区块链中&#xff0c;我们的数字资产都会对应到一个账户地址上&#xff0c; 只有拥 有账户的钥匙&#xff08;私钥&…

【网络进阶】Posix API与网络协议栈(五)

文章目录 1. ARP协议1.1 ARP协议的定义1.2 ARP协议的工作过程1.3 ARP协议的数据结构1.4 ARP欺骗1.5 ARP协议的局限性1.6 ARP协议与Posix API的关系 2. ARP协议例子3. ICMP协议3.1 ICMP协议的定义3.2 ICMP协议的类型3.3 ICMP协议的工作原理3.4 ICMP协议的应用3.5 ICMP协议的局限…

软考:中级软件设计师:操作系统,进程管理,前趋图,进程同步互斥,PV操作,

软考&#xff1a;中级软件设计师:操作系统 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &…

Openlayers实战:地图上显示经纬度坐标

Openlayers地图中,鼠标移动,其位置的经纬度坐会经常显示在页面中。 在我们的实战课程里,详细讲一下其做法,成为一个主力的应用。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代码版权归大剑师兰特所有,可供学习或商业项目…

vue中如何引入插件并使用

Vue中的插件类型 vue中有大致有三种类型的插件&#xff0c;第三方插件、基于vue开发的插件及基于vue开发的组件 第三方插件 如&#xff1a;jquery、moment.js、aixos、Highcharts等 注意&#xff1a;Highcharts也有基于vue开发的插件版本&#xff0c;具体使用方法参见下文 …

C++中的类

1、类和对象 C中通过class定义类 class A {int a; }; // 定义一个A类型的类通过类来定义对象 A a; // 定义一个A类型的对象类是一张蓝图&#xff0c;是抽象的。而对象是根据蓝图真正建造出来的建筑&#xff0c;是具象的。 对象是类的实体化 2、类的限制修饰符 类有三种修…

xmrig病毒删除

删除病毒 [rootnode101 .mint-xmr]# top | headPID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND 15870 root 20 0 4597844 2.0g 4 S 1017 3.3 52:05.95 xmrig[rootnode101 .mint-xmr]# ll /proc/15870/exe lrwxrwxrwx. 1 root ro…

【C#】SqlBulkCopy批量添加注意DataTable必须与表列顺序一致,否则报错,以及关闭自增列

前篇文章在测试一个批量添加的操作&#xff0c;发现一致添加不成功&#xff0c;最后分析是字段列顺序不一致的问题 目录 1、列名不一致1.1、错误信息1.2、解决方法 2、关闭自增列2.1、不包含列2.2、特性关闭 1、列名不一致 1.1、错误信息 在调试时&#xff0c;一致提示如下错…

基于 Flink SQL CDC的实时数据同步方案

基于 Flink SQL CDC的实时数据同步方案http://www.dreamwu.com/post-1594.html

iframe编码为utf-8.嵌入页面为gb2312 ,word导出默认为gb2312 格式

使用记事本打开html&#xff0c;另存为&#xff0c;保存类型选择&#xff1a;"所有文件"、编码选择&#xff1a;“UTF-8”打开保存后文件编码类型改成utf-8 第一个步骤是为了把内容改成utf-8&#xff0c;然后直接执行第二步改编码可能会报乱码

解决printJS打印问题汇总

目录 一、打印预览表格列不全&#xff08;Element的el-table组件&#xff09; 1、打印设置“打印缩放” 2、修改el——table的底层代码&#xff08;如果页面上有多个表格慎用&#xff09; 一、打印预览表格列不全&#xff08;Element的el-table组件&#xff09; 问题描述&a…

简单的手机记事本app怎么查看提醒列表?

很多人平时都有随手记事的习惯&#xff0c;在记录事情的时候使用手机上的记事本app是一个不错的选择。有的记事本功能比较完善&#xff0c;不但能记事还能设置提醒&#xff0c;当有多条提醒内容存在时&#xff0c;简单的手机记事本app怎么查看提醒列表呢&#xff1f;以iPhone手…

Easyexcel 导出数据 一对多关系导出数据集合

客户要求 要求导出的表格如图 实现这样表格 很多人会想到动态表头&#xff0c;easypoi可以直接实现&#xff0c;但是我用的是easyexcel,而easyexcel自身并没有提供自动合并的功能所以还是需要自己来合并。 代码如下 首先我们来看下将嵌套数据平铺&#xff0c;不进行合并导出…

解决github打不开的方法(亲测有效)

网上提供了很多针对github打开慢的解决方案&#xff0c;什么又是改host文件&#xff0c;又是下载杂七杂八的加速器等等&#xff0c;其实效果并不好&#xff0c;微软商城已有对应的软件可以解决该问题&#xff0c;获取路径更为安全。 目录 安装Watt Toolkit找不到Microsoft Stor…

Aduc7126的PLA模块

PLA 一、PLA结构讲解 PLA是Aduc7126内部的可编辑逻辑阵列&#xff0c;Aduc7126总共有16个element&#xff0c;分为两组&#xff0c;如下图所示。 下图是PLA的其中一个element结构图&#xff0c;按照由左至右进行讲解&#xff1a; 左边MUX0、MUX1、MUX2、MUX3都是选择器&#…

将 InputStream 流转成 MultipartFile

MultipartFile是一个接口, 有一个MockMultipartFile实现类,里面有构造方法可以直接将输入流转为MutipartFile对象: MultipartFile File new MockMultipartFile(filename, file.getName(), file.getContentType(), fileStream); 使用MockMultipartFile类, 项目需要导入org.sp…