JSP

今日目标:

8,案例

需求:完成品牌数据的增删改查操作

image-20210818171702401

这个功能我们之前一直在做,而这个案例是将今天学习的所有的内容(包含 MVC模式 和 三层架构)进行应用,并将整个流程贯穿起来。

8.1 环境准备

环境准备工作,我们分以下步骤实现:

8.1.1 创建工程

创建新的模块 brand_demo,引入坐标。我们只要分析出要用到哪儿些技术,那么需要哪儿些坐标也就明确了

pom.xml 内容如下:

8.1.2 创建包

创建不同的包结构,用来存储不同的类。包结构如下

image-20210818173155335

8.1.3 创建表

8.1.4 创建实体类

pojo 包下创建名为 Brand 的类。

8.1.5 准备mybatis环境

定义核心配置文件 Mybatis-config.xml ,并将该文件放置在 resources

resources 下创建放置映射配置文件的目录结构 com/itheima/mapper,并在该目录下创建映射配置文件 BrandMapper.xml

8.2 查询所有

image-20210818174441917

当我们点击 index.html 页面中的 查询所有 这个超链接时,就能查询到上图右半部分的数据。

对于上述的功能,点击 查询所有 超链接是需要先请后端的 servlet ,由 servlet 跳转到对应的页面进行数据的动态展示。而整个流程如下图:

image-20210818174800783

8.2.1 编写BrandMapper

mapper 包下创建创建 BrandMapper 接口,在接口中定义 selectAll() 方法

8.2.2 编写工具类

com.itheima 包下创建 utils 包,并在该包下创建名为 SqlSessionFactoryUtils 工具类

8.2.3 编写BrandService

service 包下创建 BrandService

8.2.4 编写Servlet

web 包下创建名为 SelectAllServletservlet,该 servlet 的逻辑如下:

具体的代码如下:

8.2.5 编写brand.jsp页面

将资料 资料\2. 品牌增删改查案例\静态页面 下的 brand.html 页面拷贝到项目的 webapp 目录下,并将该页面改成 brand.jsp 页面,而 brand.jsp 页面在表格中使用 JSTLEL表达式 从request域对象中获取名为 brands 的集合数据并展示出来。页面内容如下:

8.2.6 测试

启动服务器,并在浏览器输入 http://localhost:8080/brand-demo/index.html,看到如下 查询所有 的超链接,点击该链接就可以查询出所有的品牌数据

image-20210818182952394

为什么出现这个问题呢?是因为查询到的字段名和实体类对象的属性名没有一一对应。相比看到这大家一定会解决了,就是在映射配置文件中使用 resultMap 标签定义映射关系。映射配置文件内容如下:

并且在 BrandMapper 接口中的 selectAll() 上使用 @ResuleMap 注解指定使用该映射

重启服务器,再次访问就能看到我们想要的数据了

image-20210819190221889

8.3 添加

image-20210819192049571

上图是做 添加 功能流程。点击 新增 按钮后,会先跳转到 addBrand.jsp 新增页面,在该页面输入要添加的数据,输入完毕后点击 提交 按钮,需要将数据提交到后端,而后端进行数据添加操作,并重新将所有的数据查询出来。整个流程如下:

image-20210819192737982

接下来我们根据流程来实现功能:

8.3.1 编写BrandMapper方法

BrandMapper 接口,在接口中定义 add(Brand brand) 方法

8.3.2 编写BrandService方法

BrandService 类中定义添加品牌数据方法 add(Brand brand)

8.3.3 改进brand.jsp页面

我们需要在该页面表格的上面添加 新增 按钮

并给该按钮绑定单击事件,当点击了该按钮需要跳转到 brand.jsp 添加品牌数据的页面

==注意:==该 script 标签建议放在 body 结束标签前面。

8.3.4 编写addBrand.jsp页面

从资料 资料\2. 品牌增删改查案例\静态页面 中将 addBrand.html 页面拷贝到项目的 webapp 下,并改成 addBrand.jsp 动态页面

8.3.5 编写servlet

web 包下创建 AddServletservlet,该 servlet 的逻辑如下:

具体的代码如下:

8.3.6 测试

点击 brand.jsp 页面的 新增 按钮,会跳转到 addBrand.jsp页面

image-20210819220701121

点击 提交 按钮,就能看到如下页面,里面就包含我们刚添加的数据

image-20210819220738074

8.4 修改

image-20210819223202473

点击每条数据后面的 编辑 按钮会跳转到修改页面,如下图:

image-20210819223314230

在该修改页面我们可以看到将 编辑 按钮所在行的数据 ==回显== 到表单,然后需要修改那个数据在表单中进行修改,然后点击 提交 的按钮将数据提交到后端,后端再将数据存储到数据库中。

从上面的例子我们知道 修改 功能需要从两方面进行实现,数据回显和修改操作。

8.4.1 回显数据

image-20210819223830713

上图就是回显数据的效果。要实现这个效果,那当点击 修改 按钮时不能直接跳转到 update.jsp 页面,而是需要先带着当前行数据的 id 请求后端程序,后端程序根据 id 查询数据,将数据存储到域对象中跳转到 update.jsp 页面进行数据展示。整体流程如下

image-20210819224243778

8.4.1.1 编写BrandMapper方法

BrandMapper 接口,在接口中定义 selectById(int id) 方法

8.4.1.2 编写BrandService方法

BrandService 类中定义根据id查询数据方法 selectById(int id)

8.4.1.3 编写servlet

web 包下创建 SelectByIdServletservlet,该 servlet 的逻辑如下:

具体代码如下:

8.4.1.4 编写update.jsp页面

拷贝 addBrand.jsp 页面,改名为 update.jsp 并做出以下修改:

综上,update.jsp 代码如下:

8.4.2 修改数据

做完回显数据后,接下来我们要做修改数据了,而下图是修改数据的效果:

image-20210819225948187

在修改页面进行数据修改,点击 提交 按钮,会将数据提交到后端程序,后端程序会对表中的数据进行修改操作,然后重新进行数据的查询操作。整体流程如下:

image-20210819230242938

8.4.2.1 编写BrandMapper方法

BrandMapper 接口,在接口中定义 update(Brand brand) 方法

8.4.2.2 编写BrandService方法

BrandService 类中定义根据id查询数据方法 update(Brand brand)

8.4.2.3 编写servlet

web 包下创建 AddServletservlet,该 servlet 的逻辑如下:

具体的代码如下:

==存在问题:update.jsp 页面提交数据时是没有携带主键数据的,而后台修改数据需要根据主键进行修改。==

针对这个问题,我们不希望页面将主键id展示给用户看,但是又希望在提交数据时能将主键id提交到后端。此时我们就想到了在学习 HTML 时学习的隐藏域,在 update.jsp 页面的表单中添加如下代码:

update.jsp 页面的最终代码如下: