本文是根据Jsp以及Servlet课程,结合MyBatis框架的综合运用,开发一个小项目网站,使用MVC+三层架构的项目搭建方式来编写本文文章。
本文使用MySQL数据搭建数据库的平台,开发软件使用Navicat软件。打开软件后,创建数据库名称为mydb,在该数据库中创建表account,表的字段为:
请阅读者根据该图创建数据库表,并添加模拟数据
打开idea开发软件,新建动态网站项目,并将mybatis框架的配置文件导入项目,将所需要的架包放入lib文件夹,该过程如果有初学者还未掌握的,请查看
【MyBatis】第一课 MyBatis的框架的搭建和使用_笔触狂放的博客-CSDN博客
本篇文章进行搭建好项目。
然后将项目按照MVC+三层架构的方式搭建项目
在web文件夹下,新建index.jsp文件,如果存在该文件,则不需再创建。在该文件中编写html代码,完成简单的html页面。
index.jsp代码如下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
首页
<%--快捷键tab,代码自动补全--%>
将项目进行初步运行,部署在tomcat服务器上,配置tomcat的运行步骤,初学者如果还未掌握请查阅【Java】Idea软件配置tomcat以及创建web项目步骤_笔触狂放的博客-CSDN博客_tomcat怎么添加web项目
本篇文章的介绍。
在controoler控制层中 新建Servlet类AccountServlet,因Servlet属于tomcat服务器的api架包,需先导入jsp-api.jar,servlet-api.jar包才能使用。
即AccountServlet代码如下:
package com.account.controller;
import com.account.service.AccountServiceImp;
import com.account.service.IAccountService;
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.Map;
@WebServlet(urlPatterns = "/AccountServlet")
public class AccountServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
//接收浏览器提交了六个数据
Map infos = request.getParameterMap();
//把数据提交给业务逻辑层做处理
IAccountService service=new AccountServiceImp();
int i = service.addAccount(infos);
if (i>0){
//说明新增了一个账户,跳转回首页
response.sendRedirect("index.jsp");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
该控制层需要访问业务逻辑层,接口文件为IAccountService,实现类为AccountServiceImp
IAccountService.java
package com.account.service;
import java.util.List;
import java.util.Map;
/**
* 业务逻辑层
*/
public interface IAccountService {
//添加账户
int addAccount(Map map);
}
AccountServiceImp.java
package com.account.service;
import com.account.dao.IAccountDao;
import com.account.util.DBUtil;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 业务逻辑层,对数据进行处理和加工
*/
public class AccountServiceImp implements IAccountService {
//alt+enter
@Override
public int addAccount(Map map) {
Map m=new HashMap<>();
for (Map.Entry e:map.entrySet()) {
m.put(e.getKey(),e.getValue()[0]);
}
int i = DBUtil.dao.add(m);
//做事务的提交
DBUtil.sqlSession.commit();
return i;
}
}
工具类代码如下:
DBUtils.java
package com.account.util;
import com.account.dao.IAccountDao;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class DBUtil {
public static SqlSession sqlSession=null;
public static IAccountDao dao=null;
static {
//要加载MyBatis框架
//1.将主配置文件转换成输入流
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
sqlSession = new SqlSessionFactoryBuilder().build(is).openSession();
dao = sqlSession.getMapper(IAccountDao.class);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在dao层中新建IAccountDao
IAccountDao.java代码如下
package com.account.dao;
import org.apache.ibatis.annotations.*;
import java.util.List;
import java.util.Map;
/**
* 使用MyBatis框架作为dao层,用于操作sql语句做增删改查
*/
public interface IAccountDao {
//执行添加账户的操作
@Insert("insert into account values(#{id},#{password},#{name},#{personid},#{balance},#{opendate})")
int add(Map map);
}
打开主配置文件mybatis-config.xml,将dao层中的java注解的mybatis的接口文件完整包的路径加入主配置文件
接着可以运行项目至tomcat服务器上
最后能回到首页,说明添加成功了,可以刷新数据库表中的数据,观察是否数据已添加成功。
通过点击首页的查询超链接,向AccountListServlet发送get请求,
AccountListServlet收到请求后,向业务逻辑层发送执行任务,并将返回值存储起来
package com.account.controller;
import com.account.service.AccountServiceImp;
import com.account.service.IAccountService;
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;
import java.util.Map;
@WebServlet(urlPatterns = "/AccountListServlet")
public class AccountListServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
//收到浏览器的请求,完成获得数据库中所有账户信息
IAccountService service=new AccountServiceImp();
List
业务逻辑层中IAccountService代码如下:
//获得所有账户信息
List
业务逻辑层中AccountServiceImp代码如下:
@Override
public List
数据访问层中IAccountDao代码如下:
//查询所有账户信息
@Select("select * from account")
List
在控制层接收到查询的数据后,发送到页面上进行展示在表格上
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
账户信息列表
<%--获得所有账户信息--%>
<% List
显示效果如下:
通过点击账户信息列表上的修改超链接,将当期那要修改的账户信息对应的下标发送到修改页面,并在修改页面上获得下标值,以及从session中获得列表数据信息,根据下标从列表集合中获得要修改的账户信息,展示在修改页面上。
updateAccount.jsp代码如下:
<%@ page import="java.util.Map" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
更新账户
<%--获得要修改的账户信息对应的下标--%>
<% int index=Integer.parseInt(request.getParameter("index"));%>
<%--从session中获得所有账户信息--%>
<% List> accounts=(List>)session.getAttribute("accounts");%>
效果图如下:
当用户修改信息后,将修改后的数据进行提交给控制层的UpdateServlet,在修改中账号不能被修改,账号作为主键id,是唯一的,也是修改执行的判断条件。
UpdateServlet代码如下:
package com.account.controller;
import com.account.service.AccountServiceImp;
import com.account.service.IAccountService;
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.Map;
@WebServlet(urlPatterns = "/UpdateServlet")
public class UpdateServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
Map parameterMap = request.getParameterMap();
//发送给业务逻辑层
IAccountService service=new AccountServiceImp();
int i = service.update(parameterMap);
if (i>0){
//修改成功,同步刷新浏览器
response.sendRedirect("AccountListServlet");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
UpdateServlet将接收到浏览器提交的修改的数据后,一并封装发送给业务逻辑层进行处理
IAccountService代码如下:
//修改账户信息
int update(Map map);
AccountServiceImp代码如下:
@Override
public int update(Map map) {
Map m=new HashMap<>();
for (Map.Entry e:map.entrySet()) {
m.put(e.getKey(),e.getValue()[0]);
}
int i = DBUtil.dao.update(m);
DBUtil.sqlSession.commit();
return i;
}
数据访问层中IAccountDao对应的执行的方法如下:
//修改账户信息
@Update("update account set password=#{password},name=#{name}," +
"personid=#{personid},balance=#{balance}," +
"opendate=#{opendate} where id=#{id}")
int update(Map map);
在修改成功之后,控制层将跳转调度至账户信息列表页面,显示修改后的数据信息。
点击账户信息列表中的“删除”超链接,将要删除的账户信息的账号作为删除的条件发送给控制层DeleteServlet,控制层接收到数据后,将数据发送给业务逻辑层进行处理
package com.account.controller;
import com.account.service.AccountServiceImp;
import com.account.service.IAccountService;
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(urlPatterns = "/DeleteServlet")
public class DeleteServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
//获得浏览器通过点击删除,发送过来的账户账号
String id = request.getParameter("id");
//传给业务逻辑层,要求业务逻辑层完成删除功能
IAccountService service=new AccountServiceImp();
int i = service.delete(Integer.parseInt(id));
if (i>0){
//删除成功,刷新浏览器页面
response.sendRedirect("AccountListServlet");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
IAccountService代码如下:
//删除账户
int delete(int id);
AccountServiceImp代码如下:
@Override
public int delete(int id) {
int i = DBUtil.dao.delete(id);
DBUtil.sqlSession.commit();
return i;
}
数据访问层中IAccountDao对应的执行的方法如下:
//删除账户
@Delete("delete from account where id=#{id}")
int delete(@Param("id")int id);
在执行完成之后,控制层判断是否执行删除成功,删除成功后,账户信息列表页面应同步刷新。
本篇文章使用Java注解的方式配置MyBatis框架作为持久层操作数据库连接,以MVC三层架构的方式搭建项目环境,配合Jsp+Servlet的方式完成了整个项目简单的增删改查的功能,对于初学者来说是一个非常适合的综合练习的案例,欢迎读者进行访问和学习,熟练掌握技术,把眼前的路铺平,远处的路才能走的更稳。