jstl
jstl
1.2
taglibs
standard
1.1.2
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
8.1.2 创建包
创建不同的包结构,用来存储不同的类。包结构如下
8.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);
8.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 +
‘}’;
}
}
8.1.5 准备mybatis环境
定义核心配置文件 Mybatis-config.xml
,并将该文件放置在 resources
下
在 resources
下创建放置映射配置文件的目录结构 com/itheima/mapper
,并在该目录下创建映射配置文件 BrandMapper.xml
8.2 查询所有
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-818Vau8L-1642765224821)(assets/image-20210818174441917.png)]
当我们点击 index.html
页面中的 查询所有
这个超链接时,就能查询到上图右半部分的数据。
对于上述的功能,点击 查询所有
超链接是需要先请后端的 servlet
,由 servlet
跳转到对应的页面进行数据的动态展示。而整个流程如下图:
8.2.1 编写BrandMapper
在 mapper
包下创建创建 BrandMapper
接口,在接口中定义 selectAll()
方法
/**
-
查询所有
-
@return
*/
@Select(“select * from tb_brand”)
List selectAll();
8.2.2 编写工具类
在 com.itheima
包下创建 utils
包,并在该包下创建名为 SqlSessionFactoryUtils
工具类
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;
}
}
8.2.3 编写BrandService
在 service
包下创建 BrandService
类
public class BrandService {
SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();
/**
-
查询所有
-
@return
*/
public List selectAll(){
//调用BrandMapper.selectAll()
//2. 获取SqlSession
SqlSession sqlSession = factory.openSession();
//3. 获取BrandMapper
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
//4. 调用方法
List brands = mapper.selectAll();
sqlSession.close();
return brands;
}
}
8.2.4 编写Servlet
在 web
包下创建名为 SelectAllServlet
的 servlet
,该 servlet
的逻辑如下:
-
调用
BrandService
的selectAll()
方法进行业务逻辑处理,并接收返回的结果 -
将上一步返回的结果存储到
request
域对象中 -
跳转到
brand.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 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);
}
}
8.2.5 编写brand.jsp页面
将资料 资料\2. 品牌增删改查案例\静态页面
下的 brand.html
页面拷贝到项目的 webapp
目录下,并将该页面改成 brand.jsp
页面,而 brand.jsp
页面在表格中使用 JSTL
和 EL表达式
从request域对象中获取名为 brands
的集合数据并展示出来。页面内容如下:
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
<c:forEach items=“${brands}” var=“brand” varStatus=“status”>
<%–${brand.id}–%>
${status.count} ${brand.brandName} ${brand.companyName} ${brand.ordered} ${brand.description}<c:if test=“${brand.status == 1}”>
启用</c:if>
<c:if test=“${brand.status != 1}”>
禁用</c:if>
修改 删除</c:forEach>
8.2.6 测试
启动服务器,并在浏览器输入 http://localhost:8080/brand-demo/index.html
,看到如下 查询所有
的超链接,点击该链接就可以查询出所有的品牌数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zc1SpOxe-1642765224821)(assets/image-20210818182952394.png)]
为什么出现这个问题呢?是因为查询到的字段名和实体类对象的属性名没有一一对应。相比看到这大家一定会解决了,就是在映射配置文件中使用 resultMap
标签定义映射关系。映射配置文件内容如下:
并且在 BrandMapper
接口中的 selectAll()
上使用 @ResuleMap
注解指定使用该映射
/**
-
查询所有
-
@return
*/
@Select(“select * from tb_brand”)
@ResultMap(“brandResultMap”)
List selectAll();
重启服务器,再次访问就能看到我们想要的数据了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-10DKz3WO-1642765224822)(assets/image-20210819190221889.png)]
8.3 添加
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I0RxLddH-1642765224822)(assets/image-20210819192049571.png)]
上图是做 添加 功能流程。点击 新增
按钮后,会先跳转到 addBrand.jsp
新增页面,在该页面输入要添加的数据,输入完毕后点击 提交
按钮,需要将数据提交到后端,而后端进行数据添加操作,并重新将所有的数据查询出来。整个流程如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ldr0QnFL-1642765224822)(assets/image-20210819192737982.png)]
接下来我们根据流程来实现功能:
8.3.1 编写BrandMapper方法
在 BrandMapper
接口,在接口中定义 add(Brand brand)
方法
@Insert(“insert into tb_brand values(null,#{brandName},#{companyName},#{ordered},#{description},#{status})”)
void add(Brand brand);
8.3.2 编写BrandService方法
在 BrandService
类中定义添加品牌数据方法 add(Brand 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();
}
8.3.3 改进brand.jsp页面
我们需要在该页面表格的上面添加 新增
按钮
并给该按钮绑定单击事件,当点击了该按钮需要跳转到 brand.jsp
添加品牌数据的页面
==注意:==该
script
标签建议放在body
结束标签前面。
8.3.4 编写addBrand.jsp页面
从资料 资料\2. 品牌增删改查案例\静态页面
中将 addBrand.html
页面拷贝到项目的 webapp
下,并改成 addBrand.jsp
动态页面
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
添加品牌
品牌名称:
企业名称:
排序:
描述信息:
状态:
禁用
启用
8.3.5 编写servlet
在 web
包下创建 AddServlet
的 servlet
,该 servlet
的逻辑如下:
-
设置处理post请求乱码的字符集
-
接收客户端提交的数据
-
将接收到的数据封装到
Brand
对象中 -
调用
BrandService
的add()
方法进行添加的业务逻辑处理 -
跳转到
selectAllServlet
资源重新查询数据
具体的代码如下:
@WebServlet(“/addServlet”)
public class AddServlet extends HttpServlet {
private BrandService service = new BrandService();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理POST请求的乱码问题
request.setCharacterEncoding(“utf-8”);
//1. 接收表单提交的数据,封装为一个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);
}
}
8.3.6 测试
点击 brand.jsp
页面的 新增
按钮,会跳转到 addBrand.jsp
页面
点击 提交
按钮,就能看到如下页面,里面就包含我们刚添加的数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E5drez4I-1642765224822)(assets/image-20210819220738074.png)]
8.4 修改
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GtzXwVb7-1642765224823)(assets/image-20210819223202473.png)]
点击每条数据后面的 编辑
按钮会跳转到修改页面,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vXfaDAAT-1642765224823)(assets/image-20210819223314230.png)]
在该修改页面我们可以看到将 编辑
按钮所在行的数据 回显 到表单,然后需要修改那个数据在表单中进行修改,然后点击 提交
的按钮将数据提交到后端,后端再将数据存储到数据库中。
从上面的例子我们知道 修改
功能需要从两方面进行实现,数据回显和修改操作。
8.4.1 回显数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bwmLoI8u-1642765224824)(assets/image-20210819223830713.png)]
上图就是回显数据的效果。要实现这个效果,那当点击 修改
按钮时不能直接跳转到 update.jsp
页面,而是需要先带着当前行数据的 id
请求后端程序,后端程序根据 id
查询数据,将数据存储到域对象中跳转到 update.jsp
页面进行数据展示。整体流程如下
8.4.1.1 编写BrandMapper方法
在 BrandMapper
接口,在接口中定义 selectById(int id)
方法
/**
-
根据id查询
-
@param id
-
@return
*/
@Select(“select * from tb_brand where id = #{id}”)
@ResultMap(“brandResultMap”)
Brand selectById(int id);
8.4.1.2 编写BrandService方法
在 BrandService
类中定义根据id查询数据方法 selectById(int id)
/**
-
根据id查询
-
@return
*/
public Brand selectById(int id){
//调用BrandMapper.selectAll()
//2. 获取SqlSession
SqlSession sqlSession = factory.openSession();
//3. 获取BrandMapper
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
//4. 调用方法
Brand brand = mapper.selectById(id);
sqlSession.close();
return brand;
}
8.4.1.3 编写servlet
在 web
包下创建 SelectByIdServlet
的 servlet
,该 servlet
的逻辑如下:
-
获取请求数据
id
-
调用
BrandService
的selectById()
方法进行数据查询的业务逻辑 -
将查询到的数据存储到 request 域对象中
-
跳转到
update.jsp
页面进行数据真实
具体代码如下:
@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);
}
}
8.4.1.4 编写update.jsp页面
拷贝 addBrand.jsp
页面,改名为 update.jsp
并做出以下修改:
-
title
标签内容改为修改品牌
-
form
标签的action
属性值改为/brand-demo/updateServlet
-
input
标签要进行数据回显,需要设置value
属性
品牌名称:
企业名称:
排序:
-
textarea
标签要进行数据回显,需要在标签体中使用EL表达式
描述信息:${brand.description}
- 单选框使用
if
标签需要判断brand.status
的值是 1 还是 0 在指定的单选框上使用checked
属性,表示被选中状态
状态:
<c:if test=“${brand.status == 0}”>
禁用
启用
</c:if>
<c:if test=“${brand.status == 1}”>
禁用
启用
</c:if>
综上,update.jsp
代码如下:
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
修改品牌
品牌名称:
企业名称:
排序:
描述信息:${brand.description}
状态:
<c:if test=“${brand.status == 0}”>
禁用
启用
</c:if>
<c:if test=“${brand.status == 1}”>
禁用
启用
</c:if>
8.4.2 修改数据
做完回显数据后,接下来我们要做修改数据了,而下图是修改数据的效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udx6YmxV-1642765224824)(assets/image-20210819225948187.png)]
在修改页面进行数据修改,点击 提交
按钮,会将数据提交到后端程序,后端程序会对表中的数据进行修改操作,然后重新进行数据的查询操作。整体流程如下:
8.4.2.1 编写BrandMapper方法
在 BrandMapper
接口,在接口中定义 update(Brand brand)
方法
/**
-
修改
-
@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);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取(备注前端)
最后
在面试前我花了三个月时间刷了很多大厂面试题,最近做了一个整理并分类,主要内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。
包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。
-
HTML5新特性,语义化
-
浏览器的标准模式和怪异模式
-
xhtml和html的区别
-
使用data-的好处
-
meta标签
-
canvas
-
HTML废弃的标签
-
IE6 bug,和一些定位写法
-
css js放置位置和原因
-
什么是渐进式渲染
-
html模板语言
-
meta viewport原理
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!文章来源:https://www.toymoban.com/news/detail-853572.html
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算文章来源地址https://www.toymoban.com/news/detail-853572.html
等大厂,18年进入阿里一直到现在。**
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-XHiMb9DN-1712271977259)]
[外链图片转存中…(img-6975iF6c-1712271977259)]
[外链图片转存中…(img-VXCLRkNL-1712271977259)]
[外链图片转存中…(img-lnl4QmJW-1712271977260)]
[外链图片转存中…(img-DNnKHCrb-1712271977260)]
[外链图片转存中…(img-R0jUM1iK-1712271977260)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取(备注前端)
[外链图片转存中…(img-t5dXZXwd-1712271977260)]
最后
在面试前我花了三个月时间刷了很多大厂面试题,最近做了一个整理并分类,主要内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。
包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。
-
HTML5新特性,语义化
-
浏览器的标准模式和怪异模式
-
xhtml和html的区别
-
使用data-的好处
-
meta标签
-
canvas
-
HTML废弃的标签
-
IE6 bug,和一些定位写法
-
css js放置位置和原因
-
什么是渐进式渲染
-
html模板语言
-
meta viewport原理
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
到了这里,关于Web前端阿里等大厂面试题汇总,Web核心技术之JSP(过时技术),前端音频框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!