1 概述

这篇博客主要是分享一个基于Servlet+Jsp(el, jstl)+MyBatis的CRUD练习小项目。包括项目的源码,以及项目的逻辑。通过这个项目能够学习Java web中最基础的servlet,jsp和mybatis的使用,为后续Spring的学习打下基础。项目源代码
关键词:javaweb基础,servlet,jsp,mybatis;

2 系统展示


(图片要是看不清可以右键新标签打开)

3 功能实现

基本的增删改查功能,项目采样web层、service层和dao层,三层架构。每个功能的实现都是从dao层开始,然后是web层,最后才是service层。

3.1 环境准备

  1. 创建web项目,导入依赖。(使用idea创建项目可以看我的这篇博客:IDEA创建Maven web项目以及Tomcat部署项目的方法)
  2. 创建三层架构的包,web,service,dao
  3. 创建数据库表tb_brand
  4. 创建pojo类,Brand类
  5. 配置MyBatis的基础环境,主要三步:配置MyBatis-config.xml,SQL的映射文件BrandMapper.xml(本项目中的sql语句比较简单,用的是注解开发),创建BrandMapper接口。

3.2 查询-查询所有记录

逻辑:通过点击“查询所有”跳转到SelectAllServlet,然后调用service,service会调用mapper。

首先创建mapper接口,并编写selectAll()。

    @Select("select * from tb_brand")@ResultMap("brandResultMap")List<Brand> selectAll();

因为是简单的sql语句,所以使用注解开发。注意,select返回的数据库的字段与pojo的属性名并不一致,所以通过在BrandMapper.xml中的resultMap进行映射。

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

column表示数据库中的字段,property表示brand类的属性名。
完成Dao层后,编写service层,创建一个BrandService类,添加一个selectAll()。

    public List<Brand> selectAll(){SqlSession sqlSession = sqlSessionFactory.openSession();BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);List<Brand> brands = mapper.selectAll();sqlSession.close();return brands;}

这里使用了SqlSessionFactory工厂创建sqlSession,工厂只需要创建一次并且每个service方法中都要使用工厂,所以将这部分功能抽象成一个工具类SqlSessionFactoryUtils

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

service层完成后,先编写前端的jsp页面(brand.jsp)。在这里只展示关键部分。通过jstl的<c:forEach>标签从servlet中读取selectAll()方法的返回结果,并遍历出来。

    <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 == 0}"><td>禁用</td></c:if><td><a href="#">修改</a> <a href="#">删除</a></td></tr></c:forEach>

最后实现servlet

@WebServlet("/selectAllServlet")
public class SelectAllServlet extends HttpServlet {private BrandService service = new BrandService();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 调用service的selectAll()List<Brand> brands = service.selectAll();// 将查询结果封装值reqreq.setAttribute("brands", brands);// 将req请求转发至brand.jsp,brand.jsp就能通过el表达式从req中读取数据req.getRequestDispatcher("/brand.jsp").forward(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

3.3 增加-增加一条记录

逻辑:通过点击“修改”按钮,跳转到addBrand.jsp页面,在该页面中的表单填写新记录,最后通过“提交”按钮,将数据传到addServlet,addServlet会调用service,service会调用mapper接口中的add方法。

同样,先写Dao层。在mapper接口中创建add()方法。

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

在BrandService中编写add()方法

    public void add(Brand brand){SqlSession sqlSession = sqlSessionFactory.openSession();BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);mapper.add(brand);sqlSession.commit();sqlSession.close();}

先写前端页面,在brand.jsp中的“新增”按钮绑定事件,然后事件触发后跳转到addBrand.jsp
按钮:

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

通过id绑定事件

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

addBrand.jsp就是一个表单,信息填完后,表单会提交到AddServlet

<form action="/ServletAndJspCRUDDemo/addservlet" 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>

最后编写AddServlet

@WebServlet("/addservlet")
public class AddServlet extends HttpServlet {private BrandService service = new BrandService();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// addBrand.jsp的表单通过req传递到servlet,servlet从req获取相应的参数,参数的键就是表单的name。req.setCharacterEncoding("utf-8");  // 防止中文乱码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");// 从req中获取的参数,封装成一个brand实例Brand brand = new Brand();brand.setBrandName(brandName);brand.setCompanyName(companyName);brand.setOrdered(Integer.parseInt(ordered));brand.setDescription(description);brand.setStatus(Integer.parseInt(status));// 调用service的方法service.add(brand);// 处理完后重新将请求转发到“查询所有”页面req.getRequestDispatcher("/selectAllServlet").forward(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

3.4 修改-修改记录

修改功能的实现分两步,第一步是点击修改按钮后,要重新读取数据,然后在前端页面显示出来。第二步是修改完成后,重新提交。

3.4.1 数据返显


Dao层

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

Service层

    public Brand selectById(int id){SqlSession sqlSession = sqlSessionFactory.openSession();BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);Brand brand = mapper.selectById(id);sqlSession.close();return brand;}

先写前端。
点击修改按钮后,首先要获得当条记录的id,所以在brand.jsp中的“修改”按钮中传递id

<a href="/ServletAndJspCRUDDemo/selectByIdServlet?id=${brand.id}">修改</a>

SelectByIdServlet

@WebServlet("/selectByIdServlet")
public class SelectByIdServlet extends HttpServlet {private BrandService service = new BrandService();@Overrideprotected 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);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

最后会将请求转发至update.jsp

<form action="/ServletAndJspCRUDDemo/updateServlet" method="post"><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>

这是个表单,通过el表达式从req中读取数据,还使用了jstl的<c:if>标签做判断。

3.4.2 修改提交


在前端页面完成信息编辑后,通过点击提交按钮,将新记录提交到后台,实质使用的是update sql。
Dao层

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

Service层

    public void update(Brand brand){SqlSession sqlSession = sqlSessionFactory.openSession();BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);mapper.update(brand);sqlSession.commit();sqlSession.close();}

update.jsp中的表单会提交到UpdateServlet

@WebServlet("/updateServlet")
public class UpdateServlet extends HttpServlet {private BrandService service = new BrandService();@Overrideprotected 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.setId(Integer.parseInt(id));brand.setBrandName(brandName);brand.setCompanyName(companyName);brand.setOrdered(Integer.parseInt(ordered));brand.setDescription(description);brand.setStatus(Integer.parseInt(status));service.update(brand);req.getRequestDispatcher("/selectAllServlet").forward(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

3.4 删除-删除一条记录

Dao层

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

Service层

    public void delete(int id){SqlSession sqlSession = sqlSessionFactory.openSession();BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);mapper.delete(id);sqlSession.commit();sqlSession.close();}

前端页面,与“修改”类似,需要获取当条记录的id,通过brand.jsp页面的删除按钮绑定。

<a href="/ServletAndJspCRUDDemo/deleteServlet?id=${brand.id}">删除</a></td>

DeleteServlet

@WebServlet("/deleteServlet")
public class DeleteServlet extends HttpServlet {private BrandService brandService = new BrandService();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String id = req.getParameter("id");brandService.delete(Integer.parseInt(id));req.getRequestDispatcher("/selectAllServlet").forward(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}
}

4 小结

完结撒花!
项目比较简单,但涵盖了web端最基本的增删改查功能,可以用来练习。

Java+Servlet+Jsp(el, jstl)+MyBatis的CRUD练习小项目相关推荐

  1. IDEA+Java+Servlet+JSP+Mysql实现Web停车场管理系统【建议收藏】

    目录 一.系统介绍 1.开发环境 2.技术选型 3.系统功能 4.数据库 5.工程截图 二.系统展示 1.登录界面 2.主页面 3.系统信息管理-添加角色信息 4.系统信息管理-管理角色信息 5.系统 ...

  2. java毕业设计——基于java+Servlet+jsp的网上花店销售系统设计与实现(毕业论文+程序源码)——网上花店销售系统

    基于java+Servlet+jsp的网上花店销售系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Servlet+jsp的网上花店销售系统设计与实现,文章末尾附有本毕业设计的 ...

  3. Java+Servlet+JSP+Mysql+Tomcat实现Web学生选课管理系统

    Java实现Web学生选课管理系统 一.系统介绍 1.软件环境 2.系统功能 3.数据库 二.系统展示 1.登录页面 2.学生-主页面 3.学生-查看个人信息 4.学生-选择课程 5.学生-查看已选课 ...

  4. IDEA+Java+Servlet+JSP+Bootstrap+Mysql实现Web学生成绩管理系统

    目录 一.系统介绍 1.开发环境 2.技术选型 3.系统功能 4.数据库 5.工程截图 二.系统展示 1.注册页面 2.登录页面 3.学生-主页面 4.学生-个人信息-查询登录密码 5.学生-个人信息 ...

  5. Java+Servlet+JSP实现Web宠物诊所管理系统

    宠物诊所管理系统 一.系统介绍 二.系统展示 1.登录 2.注册 3.宠物查询主页面 4.宠物查询结果 5.宠物信息修改 6.宠物信息新增 7.医生查询主界面 8.医生查询结果 9.医生信息修改 10 ...

  6. IDEA+Java+Servlet+JSP+Mysql实现学生选课签到系统

    一.系统介绍 1.开发环境 开发工具:IDEA2018 JDK版本:jdk1.8 Mysql版本:8.0.13 2.技术选型 Java+Servlet+Boostrap+Jsp+Mysql 3.系统功 ...

  7. 基于javaweb的电影院售票管理系统(java+servlet+jsp+jdbc+mysql)

    基于javaweb的电影院售票管理系统(java+servlet+jsp+jdbc+mysql) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/idea/my ...

  8. DW-CHEN的Java点滴记录JavaWeb之HTTP协议/Servlet/Cookie/Session/JSP/EL/JSTL/Filter/Listener

    JavaEE规范 JavaEE(Java Enterprise Edition):Java企业版,早期叫J2EE(J2EE的版本从1.0到1.4结束):现在Java版本从JavaEE 5开始 Java ...

  9. 动态页面技术(JSP/EL/JSTL)

    1 JSP技术 1.1 jsp脚本和注释 jsp脚本:   1) <%java代码%> ----- 内部的java代码翻译到service方法的内部   2) <%=java变量或表 ...

  10. JavaWeb——动态页面技术(JSP/EL/JSTL)

    静态页面与动态页面: 1.动态网页,是指跟静态网页相对的一种网页编程技术.静态网页,随着html代码的生成,页面的内容和显示效果就基本上不会发生变化了--除非你修改页面代码.而动态网页则不然,页面代码 ...

最新文章

  1. linux 检查 文件末尾 是否有空行
  2. echart参数设置——曲线图
  3. 通过WebRTC实现实时视频通信(三)
  4. mysql分组后去重复数据_mysql去掉重复数据只保留一条,以及取分组后的一条数据...
  5. python如何让图片镜像翻转_98后常春藤学霸林之秋,一作拿下CVPR最佳论文提名,首次挑战图片翻转不变性假设...
  6. mysql 死锁监视器_并发基础知识:死锁和对象监视器
  7. 学习笔记(1):uni-app实战社区交友类app开发-引入自定义图标库
  8. mongodb数据库扩展名_MongoDB 数据库引用
  9. 原型模式(Prototype) 1
  10. 通过saltapi接口安装实例(modules)
  11. 网络工程师Day4--实验3-1 配置ACL过滤企业数据
  12. python将PDF转换成图片(pdf2image的使用)
  13. 2021大学生笔记本电脑购买指南
  14. [CM311-1A]-买了一个机顶盒准备刷成 Linux 盒子!
  15. ABP-Hangfire定时任务
  16. 单手杀穿经典链表题Pt.2——LeetCode天梯渡劫(倒数第k节点,合并链表,链表分割,回文结构)
  17. 知到网课美的必修课考试试题|真题题库(含答案)
  18. 稀疏编码(sparsecode)简单理解
  19. 面向初学者的 20 大人工智能项目创意
  20. CyberLink PowerDVD Ultra v19.0.2005.62极致中文破解版

热门文章

  1. 转:: 刺鸟:用python来开发webgame服务端(4)
  2. jQuery + JavaScript 实现的动态添加文本框功能 和 动态删除文本框功能(二)
  3. windows系统下itunes的备份路径修改
  4. TI 杯2019年全国大学生电子设计竞赛题
  5. graphpad做单因素方差分析_GraphPad中国官网 - Prism 8 统计指南 - 单因素方差分析
  6. SQL SERVER “指定的网络名不再可用”
  7. Zstack协议栈中CC2530协调器掉电重启后重新加入之前网络的方法
  8. 怎样删除计算机Windows7自带的游戏,win7自带游戏如何卸载?win7卸载自带游戏的步骤...
  9. ABP官方文档(四十七)【通知系统】
  10. 读计算机网络得学五笔吗,电脑五笔打字难不难学?大约要学多久才可以掌握?