JSP开发2(案例)

学习目标

  • 理解 JSP 及 JSP 原理
  • 能在 JSP中使用 EL表达式JSTL标签
  • 理解 MVC模式三层架构
  • 能完成品牌数据的增删改查功能

学习内容

  • 能完成品牌数据的增删改查功能

学习产出

上一篇我们讲过了JSP开发的基本要求,并且对JSP进行了一个非常详细的介绍~
跳转链接:
JSP开发详细介绍
下面我们就对上篇文章的知识进行一个项目的练习和总结~

1 环境准备

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

  • 创建新的模块 brand_demo,引入坐标

  • 创建三层架构的包结构

  • 数据库表 tb_brand

  • 实体类 Brand

  • MyBatis 基础环境

    • Mybatis-config.xml

    • BrandMapper.xml

    • BrandMapper接口

1.1 创建工程

创建好工程,在pom.xml文件中,导入各种jar包。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>brand-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>war</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <!--mybatis-->
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.34</version>
        </dependency>
        <!--Servlet-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--jsp-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
        <!--jstl-->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
           <!--tomcat-->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
            </plugin>
        </plugins>
    </build>
</project>

1.2 创建包

根据结构创建不同的包
显示

1.3 创建表

-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand
(
    -- id 主键
    id           int primary key auto_increment,
    -- 品牌名称
    brand_name   varchar(20),
    -- 企业名称
    company_name varchar(20),
    -- 排序字段
    ordered      int,
    -- 描述信息
    description  varchar(100),
    -- 状态:0:禁用  1:启用
    status       int
);
-- 添加数据
insert into tb_brand (brand_name, company_name, ordered, description, status)
values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
       ('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),
       ('小米', '小米科技有限公司', 50, 'are you ok', 1);

1.4 创建实体类

pojo 包下创建名为 Brand 的类。

public class Brand {
    // id 主键
    private Integer id;
    // 品牌名称
    private String brandName;
    // 企业名称
    private String companyName;
    // 排序字段
    private Integer ordered;
    // 描述信息
    private String description;
    // 状态:0:禁用  1:启用
    private Integer status;
    
    public Brand() {
    }

    public Brand(Integer id, String brandName, String companyName, String description) {
        this.id = id;
        this.brandName = brandName;
        this.companyName = companyName;
        this.description = description;
    }

    public Brand(Integer id, String brandName, String companyName, Integer ordered, String description, Integer status) {
        this.id = id;
        this.brandName = brandName;
        this.companyName = companyName;
        this.ordered = ordered;
        this.description = description;
        this.status = status;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getBrandName() {
        return brandName;
    }

    public void setBrandName(String brandName) {
        this.brandName = brandName;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public Integer getOrdered() {
        return ordered;
    }

    public void setOrdered(Integer ordered) {
        this.ordered = ordered;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return "Brand{" +
                "id=" + id +
                ", brandName='" + brandName + '\'' +
                ", companyName='" + companyName + '\'' +
                ", ordered=" + ordered +
                ", description='" + description + '\'' +
                ", status=" + status +
                '}';
    }
}

1.5 准备mybatis环境

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

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--起别名-->
    <typeAliases>
        <package name="com.zpd.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///db1?useSSL=false&amp;useServerPrepStmts=true"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--扫描mapper-->
        <package name="com.zpd.mapper"/>
    </mappers>
</configuration>

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

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.BrandMapper">
    
</mapper>

2 查询所有

当我们点击页面中的 查询所有 这个超链接时,就能查询到数据库中的所有数据。
显示

2.1 编写BrandMapper

在mapper包下编写BrandMapper接口

 /**
     * 查询所有
     * @return
     */
    @Select("select * from tb_brand")
    List<Brand> selectAll();

2.2编写SqlSessionFactoryUtils工具类

package com.zpd.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class SqlSessionFactoryUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        //静态代码块会随着类的加载而自动执行,且只执行一次

        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }
}

2.3 编写BrandService

service 包下创建 BrandService

Service层中调用brandMapper

public class BrandService {
    SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();

    /**
     * 查询所有
     * @return
     */
    public List<Brand> selectAll(){
        //调用BrandMapper.selectAll()

        //2. 获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //3. 获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

        //4. 调用方法
        List<Brand> brands = mapper.selectAll();

        sqlSession.close();

        return brands;
    }
}

2.4 编写Servlet

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

  • 调用 BrandServiceselectAll() 方法进行业务逻辑处理,并接收返回的结果
  • 将上一步返回的结果存储到 request 域对象中
  • 跳转到 brand.jsp 页面进行数据的展示

作用:接受html中的数据,并转发给jsp中

具体的代码如下:

@WebServlet("/selectAllServlet")
public class SelectAllServlet extends HttpServlet {
    private  BrandService service = new BrandService();

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1. 调用BrandService完成查询
        List<Brand> brands = service.selectAll();
        //2. 存入request域中
        request.setAttribute("brands",brands);
        //3. 转发到brand.jsp
        request.getRequestDispatcher("/brand.jsp").forward(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

2.5 编写JSP页面

创建brand.jsp文件,将资料中的brand.html中的代码粘贴到webapp中
brand.jsp

<%--
  Created by IntelliJ IDEA.
  User: zpd
  Date: 2022/5/18
  Time: 14:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>zpd</title>
</head>
<body>
<input type="button" value="新增"><br>
<hr>
<table border="1" cellspacing="0" width="80%">
    <tr>
        <th>序号</th>
        <th>品牌名称</th>
        <th>企业名称</th>
        <th>排序</th>
        <th>品牌介绍</th>
        <th>状态</th>
        <th>操作</th>

        </tr>
    <c:forEach items="${brand}" var="b" varStatus="num">
        <tr align="center">
            <td>${num.count}</td>
            <td>${b.brandName}</td>
            <td>${b.companyName}</td>
            <td>${b.ordered}</td>
            <td>${b.description}</td>
            <c:if test="${b.status == 1}">
                <td>启用</td>
            </c:if>
            <c:if test="${b.status != 1}">
                <td>禁用</td>
            </c:if>

            <td><a href="#">修改</a> <a href="#">删除</a></td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

启动服务器,并在浏览器输入 http://localhost:8080/brand-demo/index.html,看到如下 查询所有 的超链接,点击该链接就可以查询出所有的品牌数据
显示
会发现两个问题,表格的大小不合适,品牌名称和企业名称没有,这是因为查询到的字段名和实体类对象的属性名没有一一对应,在映射配置文件中使用resultmap标签定义映射关系。
brandMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zpd.mapper.BrandMapper">

    
    <resultMap id="brandResultMap" type="brand">
        <result column="brand_name" property="brandName"></result>
        <result column="company_name" property="companyName"></result>
    </resultMap>
</mapper>

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

/**
  * 查询所有
  * @return
  */
@Select("select * from tb_brand")
@ResultMap("brandResultMap")
List<Brand> selectAll();

将brand.jsp中的table标签中width改为1100
重新启动服务器,选择 查询所有,就会出现
显示

3 添加

显示
点击新增按钮后会跳转到addBrand.jsp,在对应的文本框输入内容,选择对应的按钮,点击提交,需要将数据提交到后端,而后端进行数据添加操作,并重新将所有的数据查询出来。

3.1 编写BrandMapper方法

@Insert("insert into tb_brand values(NULL,#{brandName},#{companyName},#{ordered},#{description},#{status})")
void add(Brand brand);

3.2 编写BrandService

添加add方法,将最后封装成的Brand对象提交到数据库中

    /**
     *添加
     * @param brand
     */
    public void add(Brand brand){
        //2.获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //3.获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //4.调用方法
        mapper.add(brand);
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();

3.3 编写brand.jsp

在brand.jsp文件中的新增标签中添加add的id

<input type="button" value="新增" id="add"><br>

在下面编写Javascript语言,当点击新增按钮时,可以进行跳转页面,跳转到,addBrabd.jsp页面(资料中有addBrand.html)

<script>
    document.getElementById("add").onclick = function (){
        window.location.href = "/brand-demo/addBrand.jsp";
    }
</script>

3.4 编写addBrand.jsp

在addBrand.jsp其中的包含有form标签,将表单中填写的数据提交到addServlet中

<%--
  Created by IntelliJ IDEA.
  User: zpd
  Date: 2022/5/18
  Time: 14:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>zpd</title>

</head>
<body>
<input type="button" value="新增" id="add"><br>
<hr>
<table border="1" cellspacing="0" width="1100">
    <tr>
        <th>序号</th>
        <th>品牌名称</th>
        <th>企业名称</th>
        <th>排序</th>
        <th>品牌介绍</th>
        <th>状态</th>
        <th>操作</th>

        </tr>
    <c:forEach items="${brand}" var="b" varStatus="num">
        <tr align="center">
            <td>${num.count}</td>
            <td>${b.brandName}</td>
            <td>${b.companyName}</td>
            <td>${b.ordered}</td>
            <td>${b.description}</td>
            <c:if test="${b.status == 1}">
                <td>启用</td>
            </c:if>
            <c:if test="${b.status != 1}">
                <td>禁用</td>
            </c:if>

            <td><a href="#">修改</a> <a href="#">删除</a></td>
        </tr>
    </c:forEach>
</table>
<script>
    document.getElementById("add").onclick = function (){
        window.location.href = "/brand-demo/addBrand.jsp";
    }

</script>
</body>
</html>

3.5 编写addServlet

addServlet是对addBrand.jsp表单中的数据进行封装处理,先根据getParameter方法对表单中的各项内容进行获取,然后封装成Brand对象
调用Servlet方法进行添加

package com.zpd.web;

import com.zpd.pojo.Brand;
import com.zpd.service.BrandService;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/addServlet")
public class AddServlet extends HttpServlet {
    private BrandService service = new BrandService();

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        //接受表单的数据,封装成一个brand对象
        String brandName = request.getParameter("brandName");
        String companyName = request.getParameter("companyName");
        String ordered = request.getParameter("ordered");
        String description = request.getParameter("description");
        String status = request.getParameter("status");
        //封装成一个brand对象
        Brand brand = new Brand();
        brand.setBrandName(brandName);
        brand.setCompanyName(companyName);
        brand.setOrdered(Integer.parseInt(ordered));
        brand.setDescription(description);
        brand.setStatus(Integer.parseInt(status));

        //2.调用Service  完成添加
        service.add(brand);

        //3.转发到查询所有的Servlet
        request.getRequestDispatcher("/selectAllServlet").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

3.6 测试

重启服务器,进入到浏览器中,显示
显示
点击查询所有
显示
点击新增,进入到addBrand.jsp
 显示
点击提交会自动跳转到查询所有的界面
显示

这里出现的是乱码,是因为表单采用的是post提交的方法,需要进行字符集的转换,在addBrand中添加

显示
将数据库中的乱码数据删除并提交
显示
重启服务器并重新进行添加,最后在界面会正常显示

显示
在数据库中也会显示出新添加的数据
在这里插入图片描述

4 修改

当点击查询所有界面中的修改按钮后跳转到update.jsp界面,在界面中会回显出对应id的所有内容,然后可以根据数据进 行修改,点击提交后,修改的数据会进行修改。后端将修改成功的数据提交到数据库中。

在brand.jsp中,对对应的标签进行修改,修改里面包含本条数据对应的id,通过SelectByIdServlet来获取,并在SelectByIdServlet中将得到的id数据转发到update.jsp中。

<td>
<a href="/brand-demo/selectByIdServlet?id=${b.id}">修改</a>
<a href="#">删除</a>
</td>

4.1 回显

那当点击 修改 按钮时不能直接跳转到 update.jsp 页面,而是需要先带着当前行数据的 id 请求后端程序,后端程序根据 id 查询数据,将数据存储到域对象中跳转到 update.jsp 页面进行数据展示。

依旧按照上面的正常的思路来写,先编写BrandMapper,然后BrandService来调用方法,

4.1.1 编写BrandMapper方法

按照正常的思路来写,在 BrandMapper 接口,在接口中定义 selectById(int id) 方法

    /**
     * 根据id查询
     * @param id
     * @return
     */
    @Select("select * from tb_brand where id = #{id}")
    Brand selectById(int id);

4.1.2 编写BrandService

    public Brand selectById(int id){
        //2.获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //3.获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //4.调用方法
        Brand brand = mapper.selectById(id);
        sqlSession.close();
        return brand;
    }

4.1.3 编写SelectByIdServlet

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

  • 获取请求数据 id
  • 调用 BrandServiceselectById() 方法进行数据查询的业务逻辑
  • 将查询到的数据存储到 request 域对象中
  • 跳转到 update.jsp 页面进行数据真实
package com.zpd.web;

import com.zpd.pojo.Brand;
import com.zpd.service.BrandService;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.List;

@WebServlet("/selectByIdServlet")
public class SelectByIdServlet extends HttpServlet {
    private BrandService service = new BrandService();
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //1.接受id
        String id = request.getParameter("id");
        //2.调用service查询
        Brand brand = service.selectById(Integer.parseInt(id));
        //3.存储到request中
        request.setAttribute("brand",brand);
        //4.转发到update.jsp中
        request.getRequestDispatcher("/update.jsp").forward(request,response);


    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

4.1.4 编写update.jsp页面

内容和addBrand.jsp中的代码差不多,但是需要点击修改就需要根据id来查询数据库,将内容回显到addBrand.jsp中

  • input 标签要进行数据回显,需要设置 value 属性
  • textarea 标签要进行数据回显,需要在标签体中使用 EL表达式
  • 单选框使用 if 标签需要判断 brand.status 的值是 1 还是 0 在指定的单选框上使用 checked 属性,表示被选中状态
    总体代码:
<%--
  Created by IntelliJ IDEA.
  User: zpd
  Date: 2022/5/25
  Time: 16:53
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>update</title>
</head>
<body>
<h3>修改品牌</h3>
<form action="/brand-demo/addServlet" method="post">
    品牌名称:<input name="brandName" value="${brand.brandName}"><br>
    企业名称:<input name="companyName" value="${brand.companyName}"><br>
    排序:<input name="ordered" value="${brand.ordered}"><br>
    描述信息:<textarea rows="5" cols="20" name="description">${brand.description}</textarea><br>
    状态:
    <c:if test="${brand.status == 0}">
        <input type="radio" name="status" value="0" checked>禁用
        <input type="radio" name="status" value="1">启用<br>
    </c:if>
    <c:if test="${brand.status == 1}">
        <input type="radio" name="status" value="0" >禁用
        <input type="radio" name="status" value="1" checked>启用<br>
    </c:if>
    <input type="submit" value="提交">
</form>
</body>
</html>

4.1.5 回显测试

按照正常的步骤进入修改,发现brandName和companyName没有回显出
在这里插入图片描述
看上方的地址栏可以看出,在跳转页面的同时,将对应的id也会显示出
在这里插入图片描述

4.1.6 改进

brandName和companyName没有回显出,是因为查询到的字段名和实体类对象的属性名没有一一对应,在映射配置文件中使用resultmap标签定义映射关系。
在上面编写查询所有的方法时已经编写过对应的标签,直接在BrandMapper中selectById上方添加@ResultMap注解

    @Select("select * from tb_brand where id = #{id}")
    @ResultMap("brandResultMap")
    Brand selectById(int id);

重启服务器,重新进行测试
显示
显示

4.2 修改数据

显示

4.2.1 编写BrandMapper

在BrandMapper中添加update方法,根据id值进行set修改,

    /**
     * 修改
     * @param brand
     */
    @Update("update tb_brand set brand_name = #{brandName},company_name = #{companyName},ordered=#{ordered},description=#{description},status=#{status} where id=#{id}")
    void update(Brand brand);

4.2.2 编写BrandService

在BrandService中调用BrandMapper中的update方法,和添加区别不大,依旧需要提交事务。

    /**
     * 修改
     * @param brand
     */
    public void update(Brand brand){
        //2.获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //3.获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //4.调用方法
        mapper.update(brand);
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();

    }

4.2.3 编写Servlet

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

  • 设置处理post请求乱码的字符集
  • 接收客户端提交的数据
  • 将接收到的数据封装到 Brand 对象中
  • 调用 BrandServiceupdate() 方法进行添加的业务逻辑处理
  • 跳转到 selectAllServlet 资源重新查询数据

这次修改的代码比新增的代码中多获取了一个id,并将id封装成brand对象, 在BrandMapper中根据id进行修改。

package com.zpd.web;

import com.zpd.pojo.Brand;
import com.zpd.service.BrandService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/updateServlet")
public class UpdateServlet extends HttpServlet {
    private BrandService service = new BrandService();

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 解决post乱码的问题
        request.setCharacterEncoding("utf-8");
        //接受表单的数据,封装成一个brand对象
        String id = request.getParameter("id");
        String brandName = request.getParameter("brandName");
        String companyName = request.getParameter("companyName");
        String ordered = request.getParameter("ordered");
        String description = request.getParameter("description");
        String status = request.getParameter("status");
        //封装成一个brand对象
        Brand brand = new Brand();
        brand.setId(Integer.parseInt(id));
        brand.setBrandName(brandName);
        brand.setCompanyName(companyName);
        brand.setOrdered(Integer.parseInt(ordered));
        brand.setDescription(description);
        brand.setStatus(Integer.parseInt(status));

        //2.调用Service  完成修改
        service.update(brand);

        //3.转发到查询所有的Servlet
        request.getRequestDispatcher("/selectAllServlet").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

存在问题:update.jsp 页面提交数据时是没有携带主键数据的,而后台修改数据需要根据主键进行修改。
我们不希望id的数据展现给用户观看,所以在update.jsp中添加一个隐藏域

<%--隐藏域,提交id--%>
<input type="hidden" name="id" value="${brand.id}">

update.jsp的最终代码为

<%--
  Created by IntelliJ IDEA.
  User: zpd
  Date: 2022/5/25
  Time: 16:53
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>update</title>
</head>
<body>
<h3>修改品牌</h3>
<form action="/brand-demo/updateServlet" method="post">
    <%--
        隐藏域,提交id
    --%>
    <input type="hidden" name="id" value="${brand.id}">

    品牌名称:<input name="brandName" value="${brand.brandName}"><br>
    企业名称:<input name="companyName" value="${brand.companyName}"><br>
    排序:<input name="ordered" value="${brand.ordered}"><br>
    描述信息:<textarea rows="5" cols="20" name="description">${brand.description}</textarea><br>
    状态:
    <c:if test="${brand.status == 0}">
        <input type="radio" name="status" value="0" checked>禁用
        <input type="radio" name="status" value="1">启用<br>
    </c:if>
    <c:if test="${brand.status == 1}">
        <input type="radio" name="status" value="0" >禁用
        <input type="radio" name="status" value="1" checked>启用<br>
    </c:if>
    <input type="submit" value="提交">
</form>
</body>
</html>

4.2.4 测试

重启服务器,进行修改的测试
显示
显示
显示
根图可以看出修改成功。

5 删除

删除的功能非常简单,也是根据id进行删除的
在brand.jsp中删除对应的标签,需要在点击删除时对id进行获取,并通过sql语句删除对应的数据。

  <a href="/brand-demo/deleteServlet?id=${b.id}">删除</a>

5.1 编写BrandMapper

在BrandMapper中添加delete方法

    @Delete("delete from tb_brand where id = #{id}")
    void delete(int id);

5.2 编写BrandService

在BrandService中调用delete方法,进行删除


    /**
     * 删除
     * @param id
     */
    public void delete(int id){
        //获取sqlSession
        SqlSession sqlSession = factory.openSession();
        //获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //调用方法
        mapper.delete(id);
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

5.3 编写DeleteServlet

跟SelectByIdServlet差不多,都需要根据id

  • 一个是根据id来查询,这个是根据id来删除。
  • 并且不需要返回任何对象
  • 直接调用方法执行,执行完后返回selectAllServlet
package com.zpd.web;

import com.zpd.pojo.Brand;
import com.zpd.service.BrandService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/deleteServlet")
public class DeleteServlet extends HttpServlet {
    private BrandService service = new BrandService();
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.接受id
        String id = request.getParameter("id");
        //2.调用service删除
        service.delete(Integer.parseInt(id));
        //3.转发到查询所有的Servlet
        request.getRequestDispatcher("/selectAllServlet").forward(request, response);


    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

上一篇我们讲过了JSP开发的基本要求,并且对JSP进行了一个非常详细的介绍~
跳转链接:
JSP开发详细介绍