Jsp 学习笔记

news2024/11/16 3:30:43

代码可参考: Demo地址

1 入门

1.1 环境搭建

创建moven项目目录结构如下
在这里插入图片描述

1.2 依赖配置

<!-- 依赖 -->
<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

<!-- 插件 -->
<plugins>
   <plugin>
       <groupId>org.apache.tomcat.maven</groupId>
       <artifactId>tomcat7-maven-plugin</artifactId>
       <version>2.2</version>
   </plugin>
</plugins>

1.3 创建页面

在webapp下创建 hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
	<h1>hello jsp</h1>
    <%
        System.out.println("hello, jso~");
    %>
</body>
</html>

1.4 测试

启动tomcat
访问 http://localhost:8080/Jsp-Demo/hello.jsp后
控制台输出

hello, jso~

2 原理

hello.jsp是Servlet
访问hello.jsp会生成如下的类
在这里插入图片描述
继承关系

class HttpJspBase extends HttpServlet implements HttpJspPage
public final class hello_jsp extends HttpJspBase implements JspSourceDependent {
    private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
    private static Map<String, Long> _jspx_dependants;
    private ExpressionFactory _el_expressionfactory;
    private InstanceManager _jsp_instancemanager;

    public hello_jsp() {
    }

    public Map<String, Long> getDependants() {
        return _jspx_dependants;
    }

    public void _jspInit() {
        this._el_expressionfactory = _jspxFactory.getJspApplicationContext(this.getServletConfig().getServletContext()).getExpressionFactory();
        this._jsp_instancemanager = InstanceManagerFactory.getInstanceManager(this.getServletConfig());
    }

    public void _jspDestroy() {
    }

    public void _jspService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        JspWriter out = null;
        JspWriter _jspx_out = null;
        PageContext _jspx_page_context = null;

        try {
            response.setContentType("text/html;charset=UTF-8");
            PageContext pageContext = _jspxFactory.getPageContext(this, request, response, (String)null, true, 8192, true);
            _jspx_page_context = pageContext;
            pageContext.getServletContext();
            pageContext.getServletConfig();
            pageContext.getSession();
            out = pageContext.getOut();
            out.write("\n");
            out.write("<html>\n");
            out.write("<head>\n");
            out.write("    <title>Title</title>\n");
            out.write("</head>\n");
            out.write("<body>\n");
            out.write("    <h1>hello jsp</h1>\n");
            out.write("    ");
            System.out.println("hello, jso~");
            out.write("\n");
            out.write("</body>\n");
            out.write("</html>\n");
        } catch (Throwable var13) {
            if (!(var13 instanceof SkipPageException)) {
                out = (JspWriter)_jspx_out;
                if (_jspx_out != null && ((JspWriter)_jspx_out).getBufferSize() != 0) {
                    try {
                        out.clearBuffer();
                    } catch (IOException var12) {
                    }
                }

                if (_jspx_page_context == null) {
                    throw new ServletException(var13);
                }

                _jspx_page_context.handlePageException(var13);
            }
        } finally {
            _jspxFactory.releasePageContext(_jspx_page_context);
        }

    }
}

在_jspService()方法中,会将html标签写入到JspWritter中返回给浏览器

3 jsp实践

3.1 jsp类型

3.1.1 <%…%>

内容会被放到_jspService()中

3.1.2 <%=…%>

内容会放到out.println()中,作为out.print()函数

3.1.3 <%!..%>

内容会被放到_jspService()方法之外,被类直接包含

下面是示例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>hello jsp</h1>
    <%
        System.out.println("hello, jso~");
        int i = 5;
    %>

    <%="hello"%>
    <%=i%>

    <%!
        void show() {}
        String name = "zhangsan";
    %>
</body>
</html>
public final class hello_jsp extends HttpJspBase implements JspSourceDependent {
	//<%!void show() {} String name = "zhangsan"; %>
    String name = "zhangsan";
    void show() {}
    public void _jspService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        	...
            System.out.println("hello, jso~"); //<%System.out.println("hello, jso~");%>
            int i = 5; //<% int i = 5%>
            out.write("\n");
            out.write("\n");
            out.write("    ");
            out.print("hello"); //<%="hello"%>
            out.write("\n");
            out.write("    ");
            out.print(i);	// <%=i%>
            ...
        }
    }
}

3.2 示例

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="com.jsp.Brand" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    List<Brand> brandList = new ArrayList();
    brandList.add(new Brand(1, "华为", "华为", 200, "5G厂商", 1));
    brandList.add(new Brand(2, "比亚迪", "比亚迪", 300, "国产电车", 1));
    brandList.add(new Brand(3, "茅台", "茅台", 400, "白酒酱香", 1));
%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<input type="button" value="新郑"><br>
<hr>
<table border="1" cellspacing="0" width="800">
    <tr>
        <th>序号</th>
        <th>品牌名称</th>
        <th>企业名称</th>
        <th>排序</th>
        <th>品牌介绍</th>
        <th>状态</th>
        <th>操作</th>
    </tr>

    <%
        for (int i = 0; i < brandList.size(); i++) {
            Brand brand = brandList.get(i);
    %>

    <tr align="center">
        <td><%=brand.getId()%></td>
        <td><%=brand.getBrandName()%></td>
        <td><%=brand.getCompanyName()%></td>
        <td><%=brand.getOrdered()%></td>
        <td><%=brand.getDescription()%></td>
        <td><%=brand.getStatus() == 1 ? "启用" : "禁用"%></td>
        <td><a href="#">修改</a> <a href="#">删除</a> </td>
    </tr>

    <%
        }
    %>
</table>

</body>
</html>

在浏览器地址栏输入

http://localhost:8080/Jsp-Demo/brand.jsp

效果展示
在这里插入图片描述

遇到报错

Only a type can be imported. * resolves to a package

解决方式: 在Avaliable Elements 这里选择对应的项目后,右键,选择 Put into Output Root
在这里插入图片描述

4 EL表达式

EL(全称Expression Language) 表达式语言,用于简化jsp页面的Java代码
主要作用是获取数据,然后展示在页面上
语法$ {expression},如${brands}就是获取域中存储的key为brands的数据

4.1 案例

<%@ page contentType="text/html;charset=UTF-8"  isELIgnored="false" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${brands}
</body>
</html>
@WebServlet("/demo1")
public class ServletDemo1 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("ServletDemo1 doGet");
        List<Brand> brandList = new ArrayList();
        brandList.add(new Brand(1, "华为", "华为", 200, "5G厂商", 1));
        brandList.add(new Brand(2, "比亚迪", "比亚迪", 300, "国产电车", 1));
        brandList.add(new Brand(3, "茅台", "茅台", 400, "白酒酱香", 1));

        req.setAttribute("brands", brandList);
        req.setAttribute("status", 111);

        System.out.println(req.getAttribute("brands"));

        req.getRequestDispatcher("/el-demo.jsp").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

访问http://localhost:8080/Jsp-Demo/demo1
后将会输出brands中的内容

如果el表达式获取不到值,则可能是WEB-INF包下的web.xml中的版本过低
修改成

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
        version="3.1">
</web-app>

另外jsp中添加 isELIgnored=“false”

<%@ page contentType="text/html;charset=UTF-8"  isELIgnored="false" language="java" %>

4.2 域对象

page: 当前页面有效
request: 当前请求有效
session: 当前会话有效
applicaton: 当前应用有效

6 JSTL标签

jsp标准标签库(jsp Standarded Tab Library), 使用标签替代jsp页面上的代码
使用:
导入依赖

<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>

使用标签

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

使用示例:
jstp.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
    <title>Title</title>
</head>
<body>
    <%-- <c:if>标签 --%>
    <c:if test="${status == 1}">
        开启
    </c:if>

    <c:if test="${status == 0}">
        关闭
    </c:if>
    <br>

    <%-- <c:forEach>标签 --%>
    <c:forEach items="${brands}" var="brand">
        <tr align="center">
            <td>${brand.id}</td>
            <td>${brand.brandName}</td>
            <td>${brand.companyName}</td>
            <td>${brand.description}</td>
        </tr>
        <br>
    </c:forEach>
    <br>

    <%-- <c:forEach>标签 --%>
    <c:forEach begin="0" end="10" step="1" var="i">
        ${i}
    </c:forEach>

</body>
</html>

ServletDemo2.java

@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //将数据存储到request域中
        req.setAttribute("status", 1);

        List<Brand> brandList = new ArrayList<>();
        brandList.add(new Brand(1, "华为", "华为", 200, "5G厂商", 1));
        brandList.add(new Brand(2, "比亚迪", "比亚迪", 300, "国产电车", 1));
        brandList.add(new Brand(3, "茅台", "茅台", 400, "白酒酱香", 1));

        req.setAttribute("brands", brandList);

        //转发到jstl-if.jsp中
        req.getRequestDispatcher("/jstl.jsp").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

使用浏览器访问

http://localhost:8080/Jsp-Demo/demo2

浏览器中输出内容

开启
1 华为 华为 5G厂商
2 比亚迪 比亚迪 国产电车
3 茅台 茅台 白酒酱香

0 1 2 3 4 5 6 7 8 9 10

7 示例

7.1 环境准备

1 创建web工程
2 创建数据库,添加数据

-- 创建tb_brand表
create table tb_brand(
	id int primary key auto_increment,
	brand_name varchar(20),
	company_name varchar(20),
	ordered int,
	description varchar(100),
	status int
);

-- 添加数据
insert into tb_brand (brand_name, company_name, ordered, description, status)
values('比亚迪', '比亚迪汽车有限公司', 100, '高科技专业电动汽车', 0),
	  ('宁德时代', '宁德时代科技公司', 200, '高科技锂电池', 1),
	  ('小米', '小米科技有限公司', 300, '让每个人享受科技带来的美好生活', 1)

7.2 查询所有

1 配置web-app的版本,否则jsp中获取不到el表达式的值
WEB-INFO/web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
</web-app>

2 实体类 Brand

package com.test.pojo;

public class Brand {
    private Integer id;
    private String brandName;
    private String companyName;
    private Integer ordered;
    private String description;
    private Integer 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 +
                '}';
    }
}

3 定义公共的查询工具类

package com.test.utils;

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 rescource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(rescource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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

4 定义查询的Mapper类和xml
BrandMapper.java

public interface BrandMapper {
    List<Brand> selectAll();
}

BrandMapper.xml

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

<mapper namespace="com.test.mapper.BrandMapper">
    <resultMap id="brandResultMap" type="brand">
        <result column="brand_name" property="brandName"></result>
        <result column="company_name" property="companyName"></result>
    </resultMap>

    <select id="selectAll" resultType="com.test.pojo.Brand" resultMap="brandResultMap">
        select * from tb_brand;
    </select>
</mapper>

5 定义查询的方法

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

    public List<Brand> selectAll() {
        SqlSession sqlSession = factory.openSession();
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

        List<Brand> brands = mapper.selectAll();
        System.out.println("brands = " + brands);
        sqlSession.close();
        return brands;
    }
}

6 定义服务接口Servlet

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

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<Brand> brands = service.selectAll();
        req.setAttribute("brands", brands);
        req.getRequestDispatcher("/brand.jsp").forward(req, resp);
    }

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

7 jsp页面

<%--
  Created by IntelliJ IDEA.
  User: yl
  Date: 2022/11/30
  Time: 5:11 PM
  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>Title</title>
</head>
<body>
  <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="${brands}" var="brand" varStatus="status">
          <tr align="center">
              <td>${status.count}</td>
              <td>${brand.brandName}</td>
              <td>${brand.companyName}</td>
              <td>${brand.ordered}</td>
              <td>${brand.description}</td>
              <c:if test="${brand.status == 1}">
                  <td>启用</td>
              </c:if>

               <c:if test="${brand.status != 1}">
                  <td>禁用</td>
              </c:if>
              <td>
                  <a href="/Mvc-Demo/selectByIdServlet?id=${brand.id}">修改

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

访问http://localhost:8080/Mvc-Demo/selectAllServlet地址后,
浏览器页面效果
在这里插入图片描述

7.3 添加

具体代码可参考顶部Demo中
1 Mapper方法

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

2 Service中的方法

public void add(Brand brand) {
   SqlSession sqlSession = factory.openSession();
    BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

    mapper.add(brand);
    sqlSession.commit();
    sqlSession.close();
}

3 添加页面jsp

<%--
  Created by IntelliJ IDEA.
  User: yl
  Date: 2022/11/30
  Time: 9:16 PM
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>添加品牌</title>
</head>
<body>
    <h3>添加品牌</h3>
    <form action="/Mvc-Demo/addServlet" method="post">
        品牌名称: <input name="brandName"><br> <br>
        企业名称: <input name="companyName"><br> <br>
        品牌排序: <input name="ordered"><br> <br>
        描述信息: <textarea rows="5" cols="20" name="description"></textarea> <br> <br>
        状态:
        <input type="radio" name="status" value="0">禁用
        <input type="radio" name="status" value="1">启用 <br><br>

        <input type="submit" value="提交">
    </form>
</body>
</html>

4 Servlet接口

package com.test.web;

import com.test.pojo.Brand;
import com.test.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;
import java.util.List;

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

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<Brand> brands = service.selectAll();
        req.setAttribute("brands", brands);
        req.getRequestDispatcher("/brand.jsp").forward(req, resp);
    }

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

5 列表页面新增

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

<script>
    document.getElementById("add").onclick = function () {
        location.href = "/Mvc-Demo/addBrand.jsp"
    }
</script>

请求地址: http://localhost:8080/Mvc-Demo/addBrand.jsp
效果展示
在这里插入图片描述
提交后,商品列表中多了一项
在这里插入图片描述

7.4 查询并展示单条数据

1 BrandMapper中添加查询语句

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

2 BrandService添加查询Mapper逻辑

public Brand selectById(int id) {
    SqlSession sqlSession = factory.openSession();
    BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

    Brand brand = mapper.selectById(id);
    sqlSession.commit();
    sqlSession.close();

    return brand;
}

3 添加查询的Servlet

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

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String id = req.getParameter("id");
        Brand brand = service.selectById(Integer.parseInt(id));
        req.setAttribute("brand", brand);

        req.getRequestDispatcher("/update.jsp").forward(req, resp);
    }

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

4 添加update.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
    <title>修改品牌信息</title>
</head>
<body>
    <h3>修改品牌信息</h3>
    <form action="/Mvc-Demo/updateServlet" method="post">
        品牌名称: <input name="brandName" value="${brand.brandName}"><br> <br>
        企业名称: <input name="companyName" value="${brand.companyName}"><br> <br>
        品牌排序: <input name="ordered" value="${brand.ordered}"><br> <br>
        描述信息: <textarea rows="5" cols="20" name="description"> ${brand.description} </textarea> <br> <br>
        状态:
        <c:if test="${brand.status == 0}">
            <input type="radio" name="status" value="0" checked>禁用
            <input type="radio" name="status" value="1">启用 <br><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><br>
        </c:if>


        <input type="submit" value="提交">
    </form>
</body>
</html>

5 访问http://localhost:8080/Mvc-Demo/selectAllServlet 后,选择任意一项品牌,然后点修改
展示效果:
在这里插入图片描述

7.5 修改

1 添加update sql 语句方法
BrandMapper.java

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

2 添加业务方法

public void update(Brand brand) {
    SqlSession sqlSession = factory.openSession();
    BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

    System.out.println("update brand = " + brand);
    mapper.update(brand);
    sqlSession.commit();
    sqlSession.close();
}

3 updateServlet

WebServlet("/updateServlet")
public class UpdateServlet extends HttpServlet {
	private BrandService service = new BrandService();
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	   req.setCharacterEncoding("utf-8");
	
	   String id = req.getParameter("id");
	   String brandName = req.getParameter("brandName");
	   String companyName = req.getParameter("companyName");
	   String ordered = req.getParameter("ordered");
	   String description = req.getParameter("description");
	   String status = req.getParameter("status");
	
	   Brand brand = new Brand();
	   brand.setBrandName(brandName);
	   brand.setCompanyName(companyName);
	   brand.setOrdered(Integer.parseInt(ordered));
	   brand.setDescription(description);
	   brand.setStatus(Integer.parseInt(status));
	   brand.setId(Integer.parseInt(id));
	
	   service.update(brand);
	
	   req.getRequestDispatcher("/selectAllServlet").forward(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	    this.doGet(req, resp);
	}
}

4 隐藏id选项,id不可编辑

<input type="hidden" name="id" value="${brand.id}"><br>

在update.jsp页面中,修改内容,提交后,可看到内容被修改了

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

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

相关文章

PyQt5可视化编程-图形界面开发工具QtDesigner和PyUIC

一、概述 Qt库是跨平台的 C库的集合&#xff0c;是最强大的 GUI库之一&#xff0c;可以实现高级 API来访问桌面和移动系统的各种服务。PyQt5是一套 Python绑定 Digia QT5应用的框架。PyQt5实现了一个 Python模块集&#xff0c;有 620个类&#xff0c;6000个函数和方法。PyQt5的…

【Oracle篇】Oracle集群-rac模式

Oracle rac模式 RAC(real application clusters) 整个集群系统又分为 oracle Clusterware (集群就绪软件)和 Real Application(RA) 两大部分组成。 基本架构 rac 是 Oracle 数据库的高可用集群。传统数据库一个实例一个数据库&#xff0c; RAC 是多个实例&#xff0c;一个数…

四、值类型 和 引用类型

文章目录1、值类型 和 引用类型2、栈 和 堆3、特殊的引用类型 string4、通过 Debug调试 验证 string 的特殊1、值类型 和 引用类型 引用类型&#xff1a;string、数组、类 - 堆 值类型&#xff1a;其他的都是值类型 - 栈 2、栈 和 堆 栈空间&#xff1a;系统分配&#xff0…

Bootstrap5 教程

Bootstrap5 教程 Bootstrap 是全球最受欢迎的前端组件库&#xff0c;用于开发响应式布局、移动设备优先的 WEB 项目。 Bootstrap5 目前是 Bootstrap 的最新版本&#xff0c;是一套用于 HTML、CSS 和 JS 开发的开源工具集。它支持 Sass 变量和 mixins、响应式网格系统、大量的预…

HTML+CSS+JS鲜花商城网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Java项目:ssm开发的Java快递代拿系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 使用技术 采用 Spring SpringMVC MyBatisPlus&#xff0c;连接池采用 Druid&#xff0c;安全框架使用 Shiro&#xff0c;前端采用 Bootstrap layer 实…

浅谈推荐系统之内容推荐

推荐系统概念相关 维基百科定义&#xff1a; 推荐系统是一种信息过滤系统&#xff0c;用于预测用户对物品的“评分”或“偏好”。 推荐系统近年来非常流行&#xff0c;应用于各行各业。推荐的对象包括&#xff1a;电影、音乐、新闻、书籍、学术论文、搜索查询、分众分类、以及…

vmware: 磁盘加载问题导致,emergency mode: login incorrect 滚动打印

文章目录问题调试&解释异常日志为什么进入Emergency shell 呢为什么local-fs.target 失败为什么storage.mount 超时服务单元的依赖关系那最后进入emergency mode 为什么会滚Login Incorrect 日志呢plymouthsystemd-sulogin-shellsulogin解决问题 VM虚拟机启动不正常。正常…

[附源码]计算机毕业设计作业查重系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计疫情管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

JS高级:Git

目录 集中式版本控制 ​编辑 分布式版本控制 Git 安装 bash-cmd-gui 基本使用 文件状态 git忽略文件 版本回退 远程仓库 gitee 凭证 SSH秘钥 管理远程仓库 开源协议 github git标签 git 分支 master 分支 分支操作 集中式版本控制 分布式版本控制 Git 安装 G…

景联文科技:一文读懂火爆全网的AIGC和背后的数据标注技术!

“在过去的几个月中&#xff0c;AIGC发展速度惊人&#xff0c;DALL-E、Midjourney和Stable Diffusion等技术的快速发展&#xff0c;创作出了许多由AI生成的艺术品。本文中&#xff0c;我们将为您阐述AIGC技术和背后所涉及的数据标注技术。" 今年八月&#xff0c;美国的一位…

计算机网络学习笔记(I)——概述

文章目录第一章—概述1.1、什么是Internet&#xff1f;从具体构成角度&#xff1a;什么是协议&#xff1f;从服务角度&#xff1a;1.2、网络边缘网络结构&#xff1a;网络边缘&#xff1a;网络边缘&#xff1a;采用网络设施的面向连接服务网络边缘&#xff1a;采用基础设施的无…

GIS工具maptalks开发手册(四)01——渲染地图信息框之添加绘制工具、获取点的坐标数据信息框进行展示

GIS工具maptalks开发手册(四)01——渲染地图信息框之添加绘制工具、获取点的坐标数据信息框进行展示 1、官网示例 官网示例-地图信息框——https://maptalks.org/examples/cn/ui-control/ui-map-infownd/#ui-control_ui-map-infownd 效果 代码 index.html <!DOCTYPE ht…

Vue 官方文档2.x教程学习笔记 1 基础 1.3 Vue 实例 1.3.1 创建一个Vue 实例 1.3.2 数据与方法

Vue 官方文档2.x教程学习笔记 文章目录Vue 官方文档2.x教程学习笔记1 基础1.3 Vue 实例1.3.1 创建一个Vue 实例1.3.2 数据与方法1 基础 1.3 Vue 实例 1.3.1 创建一个Vue 实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的&#xff1a; var vm new Vue({/…

阿里云ACP云计算的实验考的是什么?

目前阿里云ACP云计算实验共计四个 1 使用负载均衡实现https与http的混合访问 本实验使用负载均衡配置监听&#xff0c;利用Nginx实现HTTP请求向HTTPS请求的转化&#xff0c;从而完成HTTP和HTTPS的混合访问。 实验概述 互联网巨头雅虎官方对外发布消息&#xff0c;承认在201…

Yolo算法检测之NMS(非极大值抑制)原理详解

刚开始学习算法的时候&#xff0c;nms非极大值一直学不明白&#xff0c;今天终于搞明白了&#xff0c;大致总结一下。 首先我们简单看一下NMS使用的这个背景 按照yolo目标检测算法的初步思想来说&#xff0c;把图片分成19*19网格之后&#xff0c;理论上这个19*19个网格里面包含…

JavaWeb(二)

下面的知识主要就是Servlet&#xff0c;JSP&#xff0c;EL这个顺序去总结&#xff0c;把基础打扎实 Servlet 首先咱们肯定一直听说Servlet&#xff0c;经常说servlet容器&#xff0c;但是具体Servlet是个啥呢。咱们今天就去深入探讨一下。 咱们看一下菜鸟权威教程的解释 Java…

高通平台稳定性分析-CFI failure

一、查看 dmesg_TZ.txt中的错误: Kernel panic - not syncing: CFI failure (target: 0xffffff804323a848) Call trace: dump_backtrace.cfi_jt+0x0/0x8 dump_stack_lvl+0x94/0xe0 panic+0x1a0/0x468 cfi_module_add+0x0/0x24 find_check_fn+0x0/0x258 cam_subdev_ioct…

Kanzi:项目实例:智能灯光SmartControl界面设计

概述&#xff1a; 智能灯光是指&#xff1a;在满足一定条件下&#xff0c;自动显示一些 智能开关&#xff08;如&#xff1a;自动远光灯开关&#xff0c;延时下电开关&#xff0c;智能熄火开关&#xff0c;智能顶灯开关&#xff09;。 他们点亮的共同点是 1&#xff1a;标定…