本篇文章为你整理了JSP快速上手与MVC模式和三层架构的知识点总结+综合案例(jsp三层架构是哪三层)的详细内容,包含有什么是jsp web三层架构 jsp三层架构是哪三层 jsp,servlet与mvc,三层架构的对应关系 jsp是mvc的哪一层 JSP快速上手与MVC模式和三层架构的知识点总结+综合案例,希望能帮助你了解 JSP快速上手与MVC模式和三层架构的知识点总结+综合案例。
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 priv.dandelion /groupId
artifactId day10JSP /artifactId
version 1.0-SNAPSHOT /version
packaging war /packaging
properties
!-- project.build.sourceEncoding UTF-8 /project.build.sourceEncoding --
maven.compiler.source 8 /maven.compiler.source
maven.compiler.target 8 /maven.compiler.target
/properties
dependencies
!-- junit单元测试依赖 --
dependency
groupId junit /groupId
artifactId junit /artifactId
version 4.11 /version
scope test /scope
/dependency
!-- servlet依赖 --
dependency
groupId javax.servlet /groupId
artifactId javax.servlet-api /artifactId
version 3.1.0 /version
/dependency
/dependencies
build
plugins
plugin
!-- tomcat插件 --
groupId org.apache.tomcat.maven /groupId
artifactId tomcat7-maven-plugin /artifactId
version 2.2 /version
/plugin
/plugins
/build
/project
浏览器第一次访问 hello.jsp 页面
tomcat 会将 hello.jsp 转换为名为 hello_jsp.java 的一个 Servlet
tomcat 再将转换的 servlet 编译成字节码文件 hello_jsp.class
tomcat 会执行该字节码文件,向外提供服务
%...% :内容会直接放到_jspService()方法之中
%=…% :内容会放到out.print()中,作为out.print()的参数
%!…% :内容会放到_jspService()方法之外,被类直接包含
4.1.2 脚本演示
HTML代码和Java代码脚本
%@ page contentType="text/html;charset=UTF-8" language="java" %
!DOCTYPE html
html lang="en"
head
meta charset="UTF-8"
title Title /title
/head
body
input type="button" value="新增" br
table border="1" cellspacing="0" width="800"
th 序号 /th
th 品牌名称 /th
th 企业名称 /th
th 排序 /th
th 品牌介绍 /th
th 状态 /th
th 操作 /th
/tr
tr align="center"
td 1 /td
td 三只松鼠 /td
td 三只松鼠 /td
td 100 /td
td 三只松鼠,好吃不上火 /td
td 启用 /td
td a href="#" 修改 /a a href="#" 删除 /a /td
/tr
tr align="center"
td 2 /td
td 优衣库 /td
td 优衣库 /td
td 10 /td
td 优衣库,服适人生 /td
td 禁用 /td
td a href="#" 修改 /a a href="#" 删除 /a /td
/tr
tr align="center"
td 3 /td
td 小米 /td
td 小米科技有限公司 /td
td 1000 /td
td 为发烧而生 /td
td 启用 /td
td a href="#" 修改 /a a href="#" 删除 /a /td
/tr
/table
/body
/html
%
// 查询数据库
List Brand brands = new ArrayList Brand
brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
注意:脚本中的类需要导包,使用方式见4.2.2成品代码
%@ page import="priv.dandelion.entity.Brand" %
%@ page import="java.util.List" %
%@ page import="java.util.ArrayList" %
%@ page contentType="text/html;charset=UTF-8" language="java" %
// 模拟查询数据库,得到List集合
List Brand brands = new ArrayList Brand
brands.add(new Brand(1, "三只松鼠", "三只松鼠", 100, "三只松鼠,好吃不上火", 1));
brands.add(new Brand(2, "优衣库", "优衣库", 200, "优衣库,服适人生", 0));
brands.add(new Brand(3, "小米", "小米科技有限公司", 1000, "为发烧而生", 1));
阅读麻烦
上面案例的代码,相信你后期再看这段代码时还需要花费很长的时间去梳理
不利于团队协作:前端人员不会 Java,后端人员不精 HTML,如果页面布局发生变化,前端工程师对静态页面进行修改,然后再交给后端工程师,由后端工程师再将该页面改为 JSP 页面
由于上述的问题, JSP 已逐渐退出历史舞台,以后开发更多的是使用 HTML + Ajax 来替代。Ajax 是我们后续会重点学习的技术。有个这个技术后,前端工程师负责前端页面开发,而后端工程师只负责前端代码开发。
下来对技术的发展进行简单的说明
4.3.2 JSP的发展
第一阶段:使用 servlet 即实现逻辑代码编写,也对页面进行拼接。这种模式我们之前也接触过
第二阶段:随着技术的发展,出现了 JSP ,人们发现 JSP 使用起来比 Servlet 方便很多,但是还是要在 JSP 中嵌套 Java 代码,也不利于后期的维护
第四阶段:使用 servlet 进行后端逻辑代码开发,而使用 HTML 进行数据展示。而这里面就存在问题,HTML 是静态页面,怎么进行动态数据展示呢?这就是 ajax 的作用了。
EL 表达式的主要作用是 获取数据。其实就是从域对象中获取数据,然后将数据展示在页面上。
而 EL 表达式的语法也比较简单,${expression} 。例如:${brands} 就是获取域中存储的 key 为 brands 的数据。
定义Servlet,封装数据并存储到Request域对象中并转发到el-demo.jsp页面
@WebServlet("/demo1")
public class ServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 准备数据
List Brand brands = new ArrayList Brand
brands.add(new Brand(1, "三只松鼠", "三只松鼠", 100, "三只松鼠,好吃不上火", 1));
brands.add(new Brand(2, "优衣库", "优衣库", 200, "优衣库,服适人生", 0));
brands.add(new Brand(3, "小米", "小米科技有限公司", 1000, "为发烧而生", 1));
// 存储到request域中,参数为key-value
request.setAttribute("brands", brands);
// 转发到 el-demo.jsp
request.getRequestDispatcher("/el-demo.jsp").forward(request, response);
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
%@ page isELIgnored="false" %
%@ page contentType="text/html;charset=UTF-8" language="java" %
html
head
title Title /title
/head
body
${brands}
/body
/html
!-- prefix="c" 用于定义标签前缀 一般用c --
%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %
!-- 可能会使用到EL表达式,若无内容显示则需要加上以下指令 --
%@ page isELIgnored="false" %
注意:c if 标签的 test 中如果使用到EL表达式,则将的判断过程也写入到EL表达式中才能完成判断
正确: c:if test="${statusFlag == 1}" /c:if
错误: c:if test="${statusFlag} == 1" /c:if
%@ page contentType="text/html;charset=UTF-8" language="java" %
%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %
%@ page isELIgnored="false" %
html
head
title Title /title
/head
body
!-- demo:条件为真时可以显示 --
c:if test="true"
/c:if
!-- demo:request域中包含 k-v:(statusFlag, 1) --
!-- 显示 --
c:if test="${statusFlag == 1}"
/c:if
!-- 不显示 --
c:if test="${statusFlag == 0}"
/c:if
/body
/html
!--15:34--
!-- 15:49 --
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 准备数据
List Brand brands = new ArrayList Brand
brands.add(new Brand(1, "三只松鼠", "三只松鼠", 100, "三只松鼠,好吃不上火", 1));
brands.add(new Brand(2, "优衣库", "优衣库", 200, "优衣库,服适人生", 0));
brands.add(new Brand(3, "小米", "小米科技有限公司", 1000, "为发烧而生", 1));
// 存储到request域中
request.setAttribute("brands", brands);
request.setAttribute("statusFlag", 1);
System.out.println("开始转发");
// 转发到 jstl-if.jsp
request.getRequestDispatcher("/jstl-if.jsp").forward(request, response);
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
%@ page contentType="text/html;charset=UTF-8" language="java" %
%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %
%@ page isELIgnored="false" %
!DOCTYPE html
html lang="en"
head
meta charset="UTF-8"
title Title /title
/head
body
input type="button" value="新增" br
table border="1" cellspacing="0" width="800"
th 序号 /th
th 品牌名称 /th
th 企业名称 /th
th 排序 /th
th 品牌介绍 /th
th 状态 /th
th 操作 /th
/tr
!-- varStatus包含属性index和count,index从0开始,count从1开始,表示第几次迭代 --
c:forEach items="${brands}" var="brand" varStatus="status"
tr align="center"
%-- td ${brand.id} /td --%
td ${status.count} /td
td ${brand.name} /td
td ${brand.company} /td
td ${brand.order} /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="#" 修改 /a a href="#" 删除 /a /td
/tr
/c:forEach
/table
/body
/html
三层架构是将我们的项目分成了三个层面,分别是 表现层(表示层)、业务逻辑层、数据访问层(持久层)。
数据访问层:对数据库的CRUD基本操作
业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能。例如 注册业务功能 ,我们会先调用 数据访问层 的 selectByName() 方法判断该用户名是否存在,如果不存在再调用 数据访问层 的 insert() 方法进行数据的添加操作
表现层:接收请求,封装数据,调用业务逻辑层,响应数据
表现层(表示层): priv.dandelion.controller 或者 priv.dandelion.web
业务逻辑层:priv.dandelion.service
数据访问层(持久层):priv.dandelion.dao 或者 priv.dandelion.mapper
图中上半部分是MVC模式,下半部分是三层架构
MVC 模式 中的 C(控制器)和 V(视图)就是 三层架构 中的表现层,而 MVC 模式 中的 M(模型)就是 三层架构 中的 业务逻辑层 和 数据访问层(持久层)。
?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 priv.dandelion /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
!-- mybatis --
dependency
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
plugin
groupId org.apache.tomcat.maven /groupId
artifactId tomcat7-maven-plugin /artifactId
version 2.2 /version
/plugin
/plugins
/build
/project
-- 添加数据
insert into tb_brand (brand_name, company_name, ordered, description, status)
values (三只松鼠, 三只松鼠股份有限公司, 5, 好吃不上火, 0),
(华为, 华为技术有限公司, 100, 华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界, 1),
(小米, 小米科技有限公司, 50, are you ok, 1);
public Brand(Integer id, String brand_name, String company_name, Integer ordered, String description, Integer status) {
this.id = id;
this.brand_name = brand_name;
this.company_name = company_name;
this.ordered = ordered;
this.description = description;
this.status = status;
public Integer getId() {
return id;
public void setId(Integer id) {
this.id = id;
public String getBrand_name() {
return brand_name;
public void setBrand_name(String brand_name) {
this.brand_name = brand_name;
public String getCompany_name() {
return company_name;
public void setCompany_name(String company_name) {
this.company_name = company_name;
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 +
", brand_name=" + brand_name + \ +
", company_name=" + company_name + \ +
", ordered=" + ordered +
", description=" + description + \ +
", status=" + status +
};
数据库连接信息
property name="url" value="jdbc:mysql:///db1?useSSL=false amp;useUnicode=true amp;characterEncoding=utf-8 amp;useServerPrepStmts=true"/
无论多长
无论多长
一定不能换行!!!换行的内容不生效
qwq 调试了一个下午
?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="priv.dandelion.entity"/
/typeAliases
environments default="development"
environment id="development"
!-- 采用JDBC的事务管理方式 --
transactionManager type="JDBC"/
!-- 数据库连接信息 --
dataSource type="POOLED"
property name="driver" value="com.mysql.jdbc.Driver"/
!-- value的值一定不能换行,一定!一定!不能换行 --
property name="url" value="jdbc:mysql:///db1?useSSL=false amp;useUnicode=true amp;characterEncoding=utf-8 amp;useServerPrepStmts=true"/
property name="username" value="root"/
property name="password" value="123456"/
/dataSource
/environment
/environments
!-- 扫描mapper,加载SQL映射文件 --
mappers
package name="priv.dandelion.dao"/
/mappers
/configuration
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"
mapper namespace="priv.dandelion.dao.BrandMapper"
!-- 解决数据库与实体类命名不一致问题 --
resultMap id="brandResultMap" type="brand"
result column="brand_name" property="brandName" /result
result column="company_name" property="companyName" /result
/resultMap
/mapper
SqlSessionFactoryUtils工具类,用于创建和获取SqlSession工厂对象
package priv.dandelion.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 {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 返回工厂对象
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
public static String reEncodingToUtf8(String str) {
// 使用ISO-8859-1编码将乱码字符编回二进制码,得到其字节数组
byte[] bytes = str.getBytes(StandardCharsets.ISO_8859_1);
// 将字节数组使用UTF-8重新编码
return new String(bytes, StandardCharsets.UTF_8);
其中部分被注释代码可按照其下方代码进行改进
其改进原理参见:MyBatis快速上手与只是点总结 - 5.9 MyBatis参数传递 - 单个参数 - POJO类型
package priv.dandelion.dao;
import org.apache.ibatis.annotations.*;
import priv.dandelion.entity.Brand;
import java.util.List;
public interface BrandMapper {
@Select("select * from tb_brand;")
@ResultMap("brandResultMap")
public List Brand selectAll();
@Select("select * from tb_brand where id = #{id}")
@ResultMap("brandResultMap")
public Brand selectById(int id);
// @Insert("insert into tb_brand " +
// "(brand_name, company_name, ordered, description, status) " +
// "values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});")
// @ResultMap("brandResultMap")
// public void addBrand(
// @Param("brandName") String brandName,
// @Param("companyName") String companyName,
// @Param("ordered") int ordered,
// @Param("description") String description,
// @Param("status") int status
// );
@Insert("insert into tb_brand " +
"values(null, #{brandName}, #{companyName}, " +
"#{ordered}, #{description}, #{status})")
void addBrand(Brand brand);
// @Update("update tb_brand " +
// "set brand_name = #{brandName}," +
// "company_name = #{companyName}," +
// "ordered = #{ordered}," +
// "description = #{description}," +
// "status = #{status} " +
// "where id = #{id};")
// @ResultMap("brandResultMap")
// public void updateBrand(
// @Param("id") int id,
// @Param("brandName") String brandName,
// @Param("companyName") String companyName,
// @Param("ordered") int ordered,
// @Param("description") String description,
// @Param("status") int status
// );
@Update("update tb_brand " +
"set brand_name = #{brandName}," +
"company_name = #{companyName}," +
"ordered = #{ordered}," +
"description = #{description}," +
"status = #{status} " +
"where id = #{id};")
@ResultMap("brandResultMap")
public void updateBrand(Brand brand);
@Delete("delete from tb_brand where id = #{id};")
@ResultMap("brandResultMap")
public void deleteBrand(@Param("id") int id);
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/selectAll")
public class SelectAllServlet extends HttpServlet {
BrandService service = new BrandService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 调用service中的查询方法
List Brand brands = service.selectAll();
// 将返回的结果存储到request域中
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);
8.2.4 编写Servlet
package priv.dandelion.service;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import priv.dandelion.dao.BrandMapper;
import priv.dandelion.entity.Brand;
import priv.dandelion.utils.SqlSessionFactoryUtils;
import java.util.List;
public class BrandService {
SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();
public List Brand selectAll() {
// 获取SqlSession
SqlSession sqlSession = factory.openSession();
// 获取Mapper
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
// 执行SQL
List Brand brands = mapper.selectAll();
// 回收资源
sqlSession.close();
return brands;
8.2.5 编写 brand.jsp 页面
%@ page contentType="text/html;charset=UTF-8" language="java" %
%-- 禁止忽略EL表达式 --%
%@ page isELIgnored="false" %
%-- 使用JSTL内核 --%
%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %
!DOCTYPE html
html lang="en"
head
meta charset="UTF-8"
title 查询所有 /title
/head
body
table border="1" cellspacing="0" width="80%"
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 ${brand.id} /td --%
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="/brand_demo/selectByIdt?id=${brand.id}" 修改 /a a href="#" 删除 /a /td
/tr
/c:forEach
/table
script
document.getElementById("add").onclick = function (){
location.href = "/brand_demo/addBrand.jsp";
/script
/body
/html
8.3 添加
重复数据的判定部分未实现
8.3.1 编写BrandMapper方法
添加AddBrand()方法,见 8.1环境准备-成品BrandMapper.java
8.3.2 编写BrandService方法
给按钮绑定单击事件,当点击了该按钮则跳转到addBrand.jsp添加品牌数据的页面
script
document.getElementById("add").onclick = function (){
location.href = "/brand-demo/addBrand.jsp";
/script
8.3.4 编写addBrand.jsp页面
%@ page contentType="text/html;charset=UTF-8" language="java" %
!DOCTYPE html
html lang="en"
head
meta charset="UTF-8"
title 添加品牌 /title
/head
body
h3 添加品牌 /h3
form action="/brand_demo/add" method="post"
品牌名称: input name="brandName" br
企业名称: input name="companyName" br
排序: input name="ordered" br
描述信息: textarea rows="5" cols="20" name="description" /textarea br
input type="radio" name="status" value="0" 禁用
input type="radio" name="status" value="1" 启用 br
input type="submit" value="提交"
/form
/body
/html
8.3.5 编写Servlet
package priv.dandelion.controller;
import priv.dandelion.entity.Brand;
import priv.dandelion.service.BrandService;
import priv.dandelion.utils.ReEncoding;
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("/add")
public class AddServlet extends HttpServlet {
BrandService service = new BrandService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决中文乱码问题
// POST请求的中文乱码问题解决方案
// req.setCharacterEncoding("UTF-8");
// 本项目已使用工具类实现对GET和POST请求的中文乱码的统一处理的方法,详见工具类priv.dandelion.utils.ReEncoding
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 brand = new Brand(
ReEncoding.makeReEncoding(brandName),
ReEncoding.makeReEncoding(companyName),
Integer.parseInt(ordered),
ReEncoding.makeReEncoding(description),
Integer.parseInt(status)
// 检查中文乱码
System.out.println(brand);
// 调用service中的添加方法
service.addBrand(brand);
// 转发到查询所有Servlet
req.getRequestDispatcher("/selectAll").forward(req, resp);
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
8.4 修改
8.4.1 回显数据
在点击修改后,页面的输入框中回显示目前数据库中存放的的数据
为实现此效果,点击修改按钮时不能直接跳转到update.jsp页面,而是带着该数据的id请求后端程序,将查询结果存储到域对象中再跳转到update.jsp页面进行数据展示。
8.4.1.1 编写BrandMapper方法
添加selectById()方法,见 8.1环境准备-成品BrandMapper.java
8.4.1.2 编写BrandService方法
public Brand selectById(int id) {
// 获取SqlSession
SqlSession sqlSession = factory.openSession();
// 获取Mapper
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
// 执行SQL
Brand brand = mapper.selectById(id);
// 回收资源,返回数据
sqlSession.close();
return brand;
8.4.1.3 编写Servlet
package priv.dandelion.controller;
import priv.dandelion.entity.Brand;
import priv.dandelion.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("/selectById")
public class selectByIdt extends HttpServlet {
private BrandService service = new BrandService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 接收id
String id = req.getParameter("id");
// 调用service
Brand brand = service.selectById(Integer.parseInt(id));
// 存储到request域中
req.setAttribute("brand", brand);
// 转发请求到页面
req.getRequestDispatcher("/updateBrand.jsp").forward(req, resp);
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
8.4.1.4 编写 update.jsp 页面
单选框使用 if 标签需要判断 brand.status 的值是 1 还是 0 在指定的单选框上使用 checked 属性,表示被选中状态
%@ page contentType="text/html;charset=UTF-8" language="java" %
%-- 禁止忽略EL表达式 --%
%@ page isELIgnored="false" %
%-- 使用JSTL内核 --%
%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %
!DOCTYPE html
html lang="en"
head
meta charset="UTF-8"
title 添加品牌 /title
/head
body
h3 修改品牌 /h3
form action="/brand_demo/update" method="post"
!-- input 标签要进行数据回显,需要设置 value 属性 --
品牌名称: input name="brandName" value="${brand.brandName}" br
企业名称: input name="companyName" value="${brand.companyName}" br
排序: input name="ordered" value="${brand.ordered}" br
!-- textarea 标签要进行数据回显,需要在标签体中使用 EL表达式 --
描述信息: textarea rows="5" cols="20" name="description" ${brand.description} /textarea br
!-- 单选框使用 if 标签需要判断 brand.status 的值是 1 还是 0 在指定的单选框上使用 checked 属性,表示被选中状态 --
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
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/update")
public class UpdateServlet extends HttpServlet {
BrandService service = new BrandService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决中文乱码问题
// POST请求的中文乱码问题解决方案
// req.setCharacterEncoding("UTF-8");
// 本项目已使用工具类实现对GET和POST请求的中文乱码的统一处理的方。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。