servlet+jsp+filter实现用户管理系统 —— 增删改查的艺术

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

public void setName(String name) {

this.name = name;

}

public String getGender() {

return gender;

}

public void setGender(String gender) {

this.gender = gender;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

public String getQq() {

return qq;

}

public void setQq(String qq) {

this.qq = qq;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

@Override

public String toString() {

return “User{” +

“id=” + id +

“, name='” + name + ‘’’ +

“, gender='” + gender + ‘’’ +

“, age=” + age +

“, address='” + address + ‘’’ +

“, qq='” + qq + ‘’’ +

“, email='” + email + ‘’’ +

“, username='” + username + ‘’’ +

“, password='” + password + ‘’’ +

‘}’;

}

}

2 查询所有用户


查询所有用户并显示的设计逻辑如下图所示:

当点击主界面index.jsp中的查询按钮时,超链接跳转到后台 UserListServlet.java 程序,完成三个步骤:

  1. 调用service层的findAll(),返回保存有查询到的所有用户信息的List集合

  2. 将List集合存入request域中,令 key = “users”

  3. 转发值list.jsp进行页面展示

UserListServlet.java 对应核心代码为:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 调用UserService完成查询

UserService service = new UserServiceImpl();

List users = service.findAll();

// 将list存入request域

request.setAttribute(“users”, users);

// 转发到list.jsp

request.getRequestDispatcher(“/list.jsp”).forward(request, response);

}

list.jsp页面采用 jstl + el 语法的 foreach 语句遍历request域中存储的集合,生成表格展示:

<c:forEach items=“${users}” var=“user” varStatus=“s”>

${s.count} ${user.name} ${user.gender} ${user.age} ${user.address} ${user.qq} ${user.email} 修改  删除

</c:forEach>

service层 UserServiceImpl.java 类定义findAll()方法以供UserListServlet.java 调用:

public class UserServiceImpl implements UserService{

private UserDao dao = new UserDaoImpl();

@Override

public List findAll(){

// 调用Dao完成查询

return dao.findAll();

}

}

该方法调用了dao层 UserDaoImpl.java 中操作数据库查询的findAll()方法:

public class UserDaoImpl implements UserDao{

private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

@Override

public List findAll(){

// 使用JDBC操作数据库

String sql = “select * from user”;

List users = template.query(sql, new BeanPropertyRowMapper(User.class));

return users;

}

}

操作数据库使用了Spring框架对JDBC的封装——JDBCTemplate对象template,来简化java操作数据库的开发,由于这里要执行的是查询操作,所以只需定义查询所有用户的sql语句并调用template的query方法即可。创建template时需要传入一个连接池类DataSource的对象,可以使用阿里巴巴druid数据库连接池技术来封装JDBC的工具类,该工具类封装了加载配置文件,初始化连接池对象,获取连接池对象以及获取连接Connection对象的功能,具体实现如下:

package util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;

import javax.xml.crypto.Data;

import java.io.IOException;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.SQLException;

import java.util.Properties;

/**

  • JDBC工具类 使用Durid连接池

*/

public class JDBCUtils {

private static DataSource ds ;

static {

try {

//1.加载配置文件

Properties pro = new Properties();

//使用ClassLoader加载配置文件,获取字节输入流

InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream(“druid.properties”);

pro.load(is);

//2.初始化连接池对象

ds = DruidDataSourceFactory.createDataSource(pro);

} catch (IOException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

}

/**

  • 获取连接池对象

*/

public static DataSource getDataSource(){

return ds;

}

/**

  • 获取连接Connection对象

*/

public static Connection getConnection() throws SQLException {

return ds.getConnection();

}

}

相应的druid配置文件为:

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql:///day17

username=root

password=root

初始化连接数量

initialSize=5

最大连接数

maxActive=10

最大等待时间

maxWait=3000

3 添加联系人功能


添加联系人的设计逻辑如下图所示:

点击添加联系人的按钮之后,跳转至后台 AddUserServlet.java 程序,完成五个步骤:

  1. 设置编码为"utf-8"防止出现中文乱码

  2. 获取添加的新的联系人的所有数据

  3. 根据获取的数据封装联系人为User类的对象

  4. 调用service层的add()方法完成添加

  5. 跳转回userListServlet再次查询所有联系人并展示

基于以上步骤,AddUserServlet.java 的主要代码如下:

@WebServlet(“/addUserServlet”)

public class AddUserServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 设置编码

request.setCharacterEncoding(“utf-8”);

// 获取数据

Map<String, String[]> map = request.getParameterMap();

// 封装对象

User user = new User();

try {

BeanUtils.populate(user, map);

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

// 调用service保存

UserService service = new UserServiceImpl();

service.addUser(user);

// 跳转到userListServlet

response.sendRedirect(request.getContextPath() + “/userListServlet”);

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doPost(request, response);

}

}

其中使用了Spring的BeanUtils.populate()方法简化了User类的封装,只需传入初始化的空User类对象user和保存有该user对象的所有属性的map,map又可以由request.getParameterMap()方法快速获取。

添加联系人界面 add.jsp 需要为表单设置action属性,将其指向 addUserServlet

service层 UserServiceImpl.java 类定义add(User user)方法以供AddUserServlet.java 调用:

@Override

public void addUser(User user){

dao.add(user);

}

该方法调用了dao层 UserDaoImpl.java 中添加数据库数据的add(User user)方法:

为了保证动态操作数据库,定义sql语句时将要写数据的地方用 ? 占位,使用template的update()方法时再动态传入数据

@Override

public void add(User user){

String sql = “insert into user values(null,?,?,?,?,?,?,null,null)”;

template.update(sql, user.getName(), user.getGender(), user.getAge(), user.getAddress(), user.getQq(), user.getEmail());

}

4 删除用户功能


删除联系人的设计逻辑如下图所示:

点击删除按钮之后,跳转到后台 DelUserServlet.java 程序,完成三个步骤:

  1. 获取待删除用户的id

  2. 调用service层的deleteUser(String id)方法完成删除

  3. 跳转回userListServlet再次查询所有联系人并展示

基于以上步骤,DelUserServlet.java 的主要代码如下:

@WebServlet(“/delUserServlet”)

public class delUserServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 获取id

String id = request.getParameter(“id”);

// 调用service删除

UserService service = new UserServiceImpl();

service.deleteUser(id);

// 跳转到查询所有servlet

response.sendRedirect(request.getContextPath() + “/userListServlet”);

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doPost(request, response);

}

}

service层 UserServiceImpl.java 类定义deleteUser(String id)方法以供DelUserServlet.java 调用:

由于数据库存储的id是int型数据,所以在这里简单做一个数据类型转换,并利用java自动拆包特点

@Override

public void deleteUser(String id) {

dao.delete(Integer.parseInt(id));

}

该方法调用了dao层 UserDaoImpl.java 中删除数据库数据的delete(int id)方法:

@Override

public void delete(int id) {

String sql = “delete from user where id = ?”;

template.update(sql, id);

}

修改页面list.jsp,删除操作最好由js控制弹出一个确认提示框再进行相关操作,所以先对按钮增加一个js判断,由于user的id属性只能在foreach循环中获取(局部变量),所以这里js函数要传一个参数:

删除</a

相应的js代码为,跳转链接要把id也传过去:

function deleteUser(id) {

// 用户确定操作提示

if (confirm(“您确定要删除吗”)){

location.href=“${pageContext.request.contextPath}/delUserServlet?id=”+id;

}

}

5 修改联系人功能


修改联系人的设计逻辑如下图所示:

修改逻辑要分为两个部分进行:回显、修改

5.1 回显部分

点击修改按钮之后,首先进行回显部分的操作,将选中的用户信息事先展示到页面的各个输入框内,跳转到后台 FindUserServlet.java 程序,完成四个步骤:

  1. 获取待修改用户的id

  2. 调用service层的findUserById(String id)方法,查询用户信息

  3. 将User类对象存到request域内

  4. 转发至修改页面update.jsp并作展示

基于以上步骤,FindUserServlet.java 的主要代码如下:

@WebServlet(“/findUserServlet”)

public class FindUserServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 获取id

String id = request.getParameter(“id”);

// 调用service查询

UserService service = new UserServiceImpl();

User user = service.findUserById(id);

// 将user存入request

request.setAttribute(“user”, user);

// 转发到update.jsp

request.getRequestDispatcher(“/update.jsp”).forward(request, response);

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doPost(request, response);

}

}

service层 UserServiceImpl.java 类定义findUserById(String id)方法以供FindUserServlet.java 调用:

@Override

public User findUserById(String id) {

return dao.findById(Integer.parseInt(id));

}

该方法调用了dao层 UserDaoImpl.java 中查询数据库数据的findById(int id)方法:

由于要返回一个User类对象,所以要使用template.queryForObject()方法

@Override

public User findById(int id) {

String sql = “select * from user where id = ?”;

return template.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), id);

}

获取到待修改的user后,将其各个原本的属性值回显至update.jsp页面的文本输入框内,每一个input输入框的value属性要用el语法设置为待修改用户的属性${user.属性名},如:

5.2 修改部分

对于修改信息界面,需要添加一个隐藏域,用于存储id,后续servlet操作需要根据id来进行

点击提交按钮以后,跳转到后台 UpdateUserServlet.java 程序,完成四个步骤:

  1. 设置编码为 “utf-8”,防止出现中文乱码问题

  2. 获取修改页面提交的表单数据集合map

  3. 使用获得的数据封装User类对象

  4. 调用service层的updateUser(User user)方法完成修改

  5. 跳转回userListServlet再次查询所有联系人并展示

基于以上步骤,UpdateUserServlet.java 的主要代码如下:

@WebServlet(“/updateUserServlet”)

public class UpdateUserServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

request.setCharacterEncoding(“utf-8”);

// 获取map

Map<String, String[]> map = request.getParameterMap();

// 封装对象

User user = new User();

try {

BeanUtils.populate(user, map);

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

// 调用service

UserService service = new UserServiceImpl();

service.updateUser(user);

// 跳转到查询所有Servlet

response.sendRedirect(request.getContextPath()+“/userListServlet”);

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doPost(request, response);

}

}

service层 UserServiceImpl.java 类定义updateUser(User user)方法以供UpdateUserServlet.java 调用:

@Override

public void updateUser(User user) {

dao.update(user);

}

该方法调用了dao层 UserDaoImpl.java 中修改数据库数据的update(User user)方法:

修改数据库的sql逻辑和添加联系人的类似

@Override

public void update(User user) {

String sql = “update user set name=?, gender=?, age=?, address=?, qq=?, email=? where id=?”;

template.update(sql, user.getName(), user.getGender(), user.getAge(), user.getAddress(), user.getQq(), user.getEmail(), user.getId());

}

6 删除选中的联系人功能


删除联系人的设计逻辑如下图所示:

点击删除选中按钮之后,跳转到后台 DelSelectServlet.java 程序,完成三个步骤:

  1. 获取所有选中的用户的id

  2. 调用service层的deleteUsers(String[] ids)方法,删除所有用户

  3. 跳转回userListServlet再次查询所有联系人并展示

基于以上步骤,DelSelectServlet.java 的主要代码如下:

@WebServlet(“/delSelectedServlet”)

public class DelSelectedServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 获取所有id

String[] ids = request.getParameterValues(“uid”);

// 调用service删除

UserService service = new UserServiceImpl();

service.delSelectedUser(ids);

// 跳转查询所有的servlet

response.sendRedirect(request.getContextPath() + “/userListServlet”);

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doPost(request, response);

}

}

service层 UserServiceImpl.java 类定义delSelectedUser(String[] ids)方法以供DelSelectServlet.java 调用:

@Override

public void delSelectedUser(String[] ids) {

if (ids != null && ids.length > 0){

for (String id : ids) {

// 调用dao删除

dao.delete(Integer.parseInt(id));

}

}

}

由于之前已经实现过dao层删除单个用户的操作,所以这里只需循环遍历id数组,将每一个id对应的单个用户都删除即可。

修改用户页面list.jsp,将用户展示的table用表单form包裹起来,这样就可以提交所有选中的行了。checkbox的value值要设置为用户的id。

这样提交时才能把选中的用户的id都提交过去

编号 姓名 性别 年龄 籍贯 QQ 邮箱 操作

<c:forEach items=“${users}” var=“user” varStatus=“s”>

${s.count} ${user.name} ${user.gender} ${user.age} ${user.address} ${user.qq} ${user.email} 修改 

删除

</c:forEach>

添加script代码,实现手动确认功能

window.onload = function () {

// 给删除选中按钮添加单击事件

document.getElementById(“delSelected”).onclick = function () {

// 表单提交

if (confirm(“您确定要删除选中条目吗”)){

// 判断是否有选中的条目

var flag = false;

var cbs = document.getElementsByName(“uid”);

for (var i = 0; i < cbs.length; i ++){

if(cbs[i].checked){

flag = true;

break;

}

}

if (flag){

document.getElementById(“form”).submit();

}

}

}

}

接下来设置第一行的checkbox可以实现全选全不选,逻辑上只用保证所有的所有checkbox的checked属性与第一行相同即可

window.onload = function () {

// 第一行checkbox实现全选

document.getElementById(“firstCb”).onclick = function () {

var cbs = document.getElementsByName(“uid”);

for (var i = 0; i < cbs.length; i ++){

// 设置所有checkbox的状态与第一行相同

cbs[i].checked = this.checked;

}

}

}

7 分页查询功能


由于要实现分页查询,需要总记录数、总页码数、每一页的数据集合、当前的页码以及每一页显示的条目数等数据,所以最好用一个类的对象来保存这些数据,如下图所示

于是设计PageBean类来保存这些数据,相应的生成getter、setter及toString方法

package domin;

import java.util.List;

/**

  • 分页对象

*/

public class PageBean {

private int totalCount; // 总记录数

private int totalPage; // 总页码

private List list; // 每页数据

private int currentPage;// 当前页码

private int rows; // 每页显示记录数

public int getTotalCount() {

return totalCount;

}

public void setTotalCount(int totalCount) {

this.totalCount = totalCount;

}

public int getTotalPage() {

return totalPage;

}

public void setTotalPage(int totalPage) {

this.totalPage = totalPage;

}

public List getList() {

return list;

}

public void setList(List list) {

this.list = list;

}

public int getCurrentPage() {

return currentPage;

}

public void setCurrentPage(int currentPage) {

this.currentPage = currentPage;

}

public int getRows() {

return rows;

}

public void setRows(int rows) {

this.rows = rows;

}

@Override

public String toString() {

return “PageBean{” +

“totalCount=” + totalCount +

“, totalPage=” + totalPage +

“, list=” + list +

“, currentPage=” + currentPage +

“, rows=” + rows +

‘}’;

}

}

实际上,服务器端只需接收到页面传过来的当前页码及每页显示的条目数即可得到所有的PageBean类的属性,具体如上图所示

实现分页查询并显示的设计如下图所示:

查询用户信息时,会自动调用后台 FindUserByPageServlet.java 程序,完成以下四个步骤:

  1. 接受请求参数 currentPage, rows

  2. 调用service层的 findUserByPage(currentPage, rows) 方法获取分页查询结果(PageBean类的对象)

  3. 将该对象存入request域中

  4. 转发至页面list.jsp展示

基于以上步骤,FindUserByPageServlet.java 的主要代码如下:

@WebServlet(“/findUserByPageServlet”)

public class FindUserByPageServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 获取参数

String currentPage = request.getParameter(“currentPage”);

String rows = request.getParameter(“rows”);

if (currentPage == null || “”.equals(currentPage)){

currentPage = “1”;

}

if (rows == null || “”.equals(rows)){

rows = “5”;

}

// 调用service查询

UserService service = new UserServiceImpl();

PageBean pb= service.findUserByPage(currentPage, rows);

// 将PageBean存入request

request.setAttribute(“pb”, pb);

// 转发到list.jsp

request.getRequestDispatcher(“/list.jsp”).forward(request, response);

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doPost(request, response);

}

}

service层 UserServiceImpl.java 类定义findUserByPage(String _currentPage, String _rows)方法以供FindUserByPageServlet.java 调用,在这里要根据传入的当前页面和每页显示条目数来计算出其他所需要的值,具体分为以下七个步骤:

  1. 创建PageBean对象pb

  2. 设置pb的currentPage和rows属性

  3. 调用dao层的finTotalCount()方法查询总记录数totalCount

  4. 计算sql查询的起始数据位置 start = (currentPage - 1) * rows

  5. 调用dao层的findByPage(int start, int rows)方法查询用户集合

  6. 计算总页码,totalCount % rows 并向上取整

  7. 返回pb

基于以上步骤,UserServiceImpl.java 中添加方法代码如下:

@Override

public PageBean findUserByPage(String _currentPage, String _rows) {

int currentPage = Integer.parseInt(_currentPage);

int rows = Integer.parseInt(_rows);

// 创建PageBean对象

PageBean pb = new PageBean();

// 查询总记录数

int totalCount = dao.finTotalCount();

pb.setTotalCount(totalCount);

// 计算总页码

int totalPage = (totalCount % rows) == 0 ? (totalCount/rows) : (totalCount/rows) + 1;

pb.setTotalPage(totalPage);

// 设置参数

if (currentPage > totalPage)

currentPage = totalPage;

if (currentPage <= 0)

currentPage = 1;

pb.setCurrentPage(currentPage);

pb.setRows(rows);

// 调用dao查询List集合

int start = (currentPage - 1) * rows;

List list = dao.findByPage(start, rows);

pb.setList(list);

return pb;

}

该方法调用了dao层 UserDaoImpl.java 中查询数据库总数据数的finTotalCount()方法:

@Override

public int finTotalCount() {

String sql = “select count(*) from user”;

return template.queryForObject(sql, Integer.class);

}

还调用了dao层按照页面可展示用户数查询的findByPage(int start, int rows)方法:

@Override

public List findByPage(int start, int rows) {

String sql = “select * from user limit ? , ?”;

return template.query(sql, new BeanPropertyRowMapper<>(User.class), start, rows);

}

改造显示页面list.jsp

首先将循环取出每一条用户数据按行展示的jstl语句中foreach的items参数修改

items=“${pb.list}”

动态显示总记录数

p b . t o t a l C o u n t 条记录,共 {pb.totalCount}条记录,共 pb.totalCount条记录,共{pb.totalPage}页

动态修改导航栏个数,高亮当前页面,并绑定servlet

<c:forEach begin=“1” end=“${pb.totalPage}” var=“i”>

<c:if test=“${pb.currentPage == i}”>

  • ${i}
  • </c:if>

    <c:if test=“${pb.currentPage != i}”>

  • ${i}
  • </c:if>

    </c:forEach>

    添加导航栏向左符号《 和 向右符号 》功能

    <c:if test=“${pb.currentPage == 1}”>

  • </c:if>

    <c:if test=“${pb.currentPage != 1}”>

  • </c:if>

    «

    <c:if test=“${pb.currentPage == pb.totalPage}”>

  • </c:if>

    <c:if test=“${pb.currentPage != pb.totalPage}”>

  • </c:if>

    »

    完成分页查询后将 UpdateUserServlet.java 和 AddUserServlet.java 和 DelSelectedServlet.java 和delUserServlet.java 的重定向目标换成分页查询的servlet

    8 复杂条件查询


    由于根据条件查询所得的结果也要分页展示,所以仍需借助PageBean对象,如下图所示:

    当用户点击查询按钮时,会传过来一个表单,这里表单一共有姓名、地址、email三个属性,但有可能用户只输入其中的几个,所以sql语句要动态的生成,如上图所示,如果用户输入了姓名和地址,那么查询总的条目数的模糊查询sql语句变为:

    select count(*) from user where name like ? and address like ?;

    同理,分页查询的sql语句为:

    select * from user where name like ? and address like ? limit ?, ?;

    改造list.jsp

    给查询部分的表单添加action和method,action传入分页的servlet

    注意表单中的input标签必须加上name属性,否则数据到不了服务器。

    为了查询条件的回显,将查询输入框的value进行设置

    分页导航在点击左右按钮或数字按钮是,要把可能存在的条件查询的条件name=KaTeX parse error: Undefined control sequence: \[ at position 16: {condition.name\̲[̲0\]}&address={condition.address[0]}&email=${condition.eamil[0]} 也加上

  • ${i}
  • 改造FindUserByPageServlet.java

    添加获取条件查询的参数condition,condition如果为空,则表示默认查询,没有设置查询条件

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    // 获取参数

    String currentPage = request.getParameter(“currentPage”);

    String rows = request.getParameter(“rows”);

    if (currentPage == null || “”.equals(currentPage)){

    currentPage = “1”;

    }

    if (rows == null || “”.equals(rows)){

    rows = “5”;

    }

    // 获取条件查询的参数

    Map<String, String[]> condition = request.getParameterMap();

    // 调用service查询

    UserService service = new UserServiceImpl();

    PageBean pb= service.findUserByPage(currentPage, rows, condition);

    // 将PageBean存入request

    request.setAttribute(“pb”, pb);

    request.setAttribute(“condition”, condition); // 储存查询条件,用于回显

    // 转发到list.jsp

    request.getRequestDispatcher(“/list.jsp”).forward(request, response);

    }

    改造UserServiceImpl.java

    其中的findUserByPage方法添加一个参数map,表示条件查询的条件,在方法里面调用UserDaoImpl类的操作数据库方法时,也多传入一个map参数

    @Override

    public PageBean findUserByPage(String _currentPage, String _rows, Map<String, String[]> condition) {

    int currentPage = Integer.parseInt(_currentPage);

    int rows = Integer.parseInt(_rows);

    // 创建PageBean对象

    PageBean pb = new PageBean();

    // 查询总记录数

    int totalCount = dao.finTotalCount(condition);

    pb.setTotalCount(totalCount);

    // 计算总页码

    int totalPage = (totalCount % rows) == 0 ? (totalCount/rows) : (totalCount/rows) + 1;

    pb.setTotalPage(totalPage);

    // 设置参数

    if (currentPage <= 0)

    currentPage = 1;

    if (currentPage > totalPage)

    currentPage = totalPage;

    pb.setCurrentPage(currentPage);

    pb.setRows(rows);

    // 调用dao查询List集合

    int start = (currentPage - 1) * rows;

    List list = dao.findByPage(start, rows, condition);

    pb.setList(list);

    return pb;

    }

    改造UserDaoImpl.java

    动态生成sql语句,注意要排除分页条件参数 “currentPage” 和 “rows”

    @Override

    public int finTotalCount(Map<String, String[]> condition) {

    // 定义模板sql

    String sql = “select count(*) from user where 1=1”;

    StringBuilder sb = new StringBuilder(sql);

    // 遍历map

    Set keySet = condition.keySet();

    // 参数的集合

    List params = new ArrayList<>();

    for (String key : keySet) {

    // 排除分页条件参数

    if (“currentPage”.equals(key) || “rows”.equals(key))

    continue;

    String value = condition.get(key)[0];

    if (value != null && !“”.equals(value)){

    // 有值

    sb.append(" and “+ key +” like ? ");

    params.add(“%” + value + “%”); // 存储sql语句中 ? 的值

    }

    }

    System.out.println(sb.toString());

    System.out.println(params);

    return template.queryForObject(sb.toString(), Integer.class,params.toArray());

    }

    findByPage(int start, int rows, Map condition)方法的实现类似于上面的实现,在这里没有将重复代码提取出一个单独的方法,大家可以自己完成一下

    @Override

    public List findByPage(int start, int rows, Map<String, String[]> condition) {

    String sql = "select * from user where 1 = 1 ";

    StringBuilder sb = new StringBuilder(sql);

    // 遍历map

    Set keySet = condition.keySet();

    // 参数的集合

    Spring全套教学资料

    Spring是Java程序员的《葵花宝典》,其中提供的各种大招,能简化我们的开发,大大提升开发效率!目前99%的公司使用了Spring,大家可以去各大招聘网站看一下,Spring算是必备技能,所以一定要掌握。

    目录:

    部分内容:

    Spring源码

    • 第一部分 Spring 概述
    • 第二部分 核心思想
    • 第三部分 手写实现 IoC 和 AOP(自定义Spring框架)
    • 第四部分 Spring IOC 高级应用
      基础特性
      高级特性
    • 第五部分 Spring IOC源码深度剖析
      设计优雅
      设计模式
      注意:原则、方法和技巧
    • 第六部分 Spring AOP 应用
      声明事务控制
    • 第七部分 Spring AOP源码深度剖析
      必要的笔记、必要的图、通俗易懂的语言化解知识难点

    脚手框架:SpringBoot技术

    它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署。

    Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。

    • SpringBoot入门
    • 配置文件
    • 日志
    • Web开发
    • Docker
    • SpringBoot与数据访问
    • 启动配置原理
    • 自定义starter

    微服务架构:Spring Cloud Alibaba

    同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

    • 微服务架构介绍
    • Spring Cloud Alibaba介绍
    • 微服务环境搭建
    • 服务治理
    • 服务容错
    • 服务网关
    • 链路追踪
    • ZipKin集成及数据持久化
    • 消息驱动
    • 短信服务
    • Nacos Confifig—服务配置
    • Seata—分布式事务
    • Dubbo—rpc通信

    Spring MVC

    目录:

    部分内容:

    《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
    取出一个单独的方法,大家可以自己完成一下

    @Override

    public List findByPage(int start, int rows, Map<String, String[]> condition) {

    String sql = "select * from user where 1 = 1 ";

    StringBuilder sb = new StringBuilder(sql);

    // 遍历map

    Set keySet = condition.keySet();

    // 参数的集合

    Spring全套教学资料

    Spring是Java程序员的《葵花宝典》,其中提供的各种大招,能简化我们的开发,大大提升开发效率!目前99%的公司使用了Spring,大家可以去各大招聘网站看一下,Spring算是必备技能,所以一定要掌握。

    目录:

    [外链图片转存中…(img-8s2Hkmkk-1714744685156)]

    [外链图片转存中…(img-URTtZ0jr-1714744685157)]

    部分内容:

    [外链图片转存中…(img-1KhRhU8U-1714744685157)]

    [外链图片转存中…(img-6UI6oAWA-1714744685158)]

    Spring源码

    • 第一部分 Spring 概述
    • 第二部分 核心思想
    • 第三部分 手写实现 IoC 和 AOP(自定义Spring框架)
    • 第四部分 Spring IOC 高级应用
      基础特性
      高级特性
    • 第五部分 Spring IOC源码深度剖析
      设计优雅
      设计模式
      注意:原则、方法和技巧
    • 第六部分 Spring AOP 应用
      声明事务控制
    • 第七部分 Spring AOP源码深度剖析
      必要的笔记、必要的图、通俗易懂的语言化解知识难点

    [外链图片转存中…(img-mOQKD0JF-1714744685158)]

    [外链图片转存中…(img-kFw5VCE0-1714744685158)]

    脚手框架:SpringBoot技术

    它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署。

    Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。

    • SpringBoot入门
    • 配置文件
    • 日志
    • Web开发
    • Docker
    • SpringBoot与数据访问
    • 启动配置原理
    • 自定义starter

    [外链图片转存中…(img-BxVOMX2D-1714744685158)]

    [外链图片转存中…(img-37DnAWbF-1714744685159)]

    微服务架构:Spring Cloud Alibaba

    同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

    • 微服务架构介绍
    • Spring Cloud Alibaba介绍
    • 微服务环境搭建
    • 服务治理
    • 服务容错
    • 服务网关
    • 链路追踪
    • ZipKin集成及数据持久化
    • 消息驱动
    • 短信服务
    • Nacos Confifig—服务配置
    • Seata—分布式事务
    • Dubbo—rpc通信

    [外链图片转存中…(img-KGHNoJN9-1714744685159)]

    [外链图片转存中…(img-pXvE7AFl-1714744685159)]

    Spring MVC

    目录:

    [外链图片转存中…(img-o0MfvPf8-1714744685160)]

    [外链图片转存中…(img-k2ckQcUN-1714744685160)]

    [外链图片转存中…(img-p34NYcUf-1714744685160)]

    部分内容:

    [外链图片转存中…(img-Z8kYnEUj-1714744685160)]

    [外链图片转存中…(img-nws0RRRy-1714744685161)]

    《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 课程管理系统是一款软件系统,用于管理和维护学校的课程信息。为了实现增删改查功能,需要使用多种技术和工具。其中,JSPServletJavaWeb中的核心技术,用于实现网页的动态生成和交互。JDBC则是Java操作数据库的标准方式,用于连接和操作MySQL数据库。 为了实现增删改查功能,首先需要建立数据库,包括建立课程信息表、学生信息表等相关表格。然后,需要编写JSP页面,实现用户与系统交互的界面,如添加、删除、更新和查询课程信息的页面。接着,使用Servlet处理用户的请求,对数据库进行操作,根据用户的需求来增删改查数据,将结果返回到JSP界面上。 具体操作步骤是,首先编写一个servlet程序,通过JDBC连接数据库,并实现Servlet中的doGet方法,处理GET请求,用于查询课程信息,将数据传回JSP界面上。同时,还需实现doPost方法,处理POST请求,用于添加、删除和更新课程信息,先获取用户提交的数据,然后使用SQL语句实现对数据表的增删改查操作。最后,将结果返回给用户。这样,就能够实现一个简单的课程管理系统。 总之,对于课程管理系统实现,需要掌握Java Web相关技术和MySQL数据库的基础知识,编写JSP页面、Servlet程序,实现增删改查操作。相信通过不断的学习和实践,可以实现更加高效和优秀的课程管理系统。 ### 回答2: JSP (JavaServer Pages) 是一种动态网页开发技术,是 Java Servlet 技术的扩展,可以使用 Java 代码嵌入 HTML 页面中,可以以类似于PHP的方式动态生成网页。课程管理系统可以采用 JSP 技术来实现页面的动态生成和数据的呈现,比如可以使用 JSTL 标签库来实现动态表格的生成。 ServletJava 语言编写的服务器端程序,可以接收和处理客户端发送的请求,生成响应并返回给客户端。课程管理系统可以采用 Servlet 技术来实现与数据库的交互,比如可以使用 Servlet 接收 JSP 页面传来的请求,然后调用 DAO(数据访问对象)层的代码来访问数据库。 JDBC 是 Java 数据库连接技术,可以使用 JDBC 来访问各种数据库,包括 MySQL。课程管理系统可以采用 JDBC 技术来访问 MySQL 数据库,比如可以使用 MySQL Connector/J 驱动来建立连接,然后使用 JDBC API 来执行 SQL 查询。 MySQL 是一种关系型数据库管理系统,是开源且免费的。课程管理系统可以采用 MySQL 来存储课程信息和用户信息,比如可以创建两个表格,一个用于存储课程信息,一个用于存储用户信息。对于增删改查操作,可以编写相应的 SQL 语句,然后使用 JDBC API 来执行这些 SQL 语句。 在具体实现过程中,我们可以将每个功能模块封装成 DAO 对象,然后在 Servlet 中实例化这些 DAO 对象,从而实现与数据库的交互。比如,课程管理系统中可以有一个 CourseDAO 类,用于实现对课程信息表格的增删改查操作。在 Servlet 中,我们可以通过实例化 CourseDAO 对象,然后调用其相应的方法来实现对课程信息的管理。同样的,我们也可以编写一个 UserDAO 类来实现用户信息表格的增删改查操作。 总之,使用 JSPServlet、JDBC 和 MySQL 可以很方便地实现一个课程管理系统,使其具有动态页面展示和数据库交互的功能。 ### 回答3: JSPServlet、JDBC、MySQL 是 Java Web 开发中常用的技术框架和数据库。其中 JSPServletJava Web 开发的核心技术,JDBC 是 Java 访问关系型数据库的标准接口,而 MySQL 是一种流行的开源关系型数据库,可以用来存储和管理数据。通过这些技术选型,可以实现一个功能齐全的课程管理系统,具体实现步骤如下: 一、需求分析 在系统设计阶段,首先需要了解业务需求和功能要求,明确系统的基本框架和模块划分,这个过程需要和业务人员充分沟通和确认。例如,在课程管理系统中,需要实现课程的增删改查,学生的选课和退课等功能。 二、技术选型 在确定业务需求和功能要求之后,需要选择合适的技术框架和数据库,以实现系统功能和性能的最佳组合。例如,在课程管理系统中,可以选择使用 JSPServlet 技术框架,JDBC 接口实现数据操作,MySQL 数据库存储和管理数据。 三、系统设计 在决定了技术框架和数据库之后,需要进行详细的系统设计和模块划分。例如,在课程管理系统中,需要设计学生、课程、学生选课等实体数据的表结构和关联关系。与此同时,需要设计页面和控制器等程序代码,实现系统功能和交互逻辑。 四、系统实现 在系统设计完成之后,可以开始实现代码。在实现代码时,需要编写 JSP 页面代码、Servlet 程序代码、JDBC 驱动程序代码和 MySQL 数据库配置代码等。例如,在课程管理系统中,可以实现课程管理页面、学生管理页面、选课页面等,通过 Servlet 程序和 JDBC 接口实现数据的增删改查操作,最后通过 MySQL 数据库存储和管理数据。 五、系统测试 在实现代码之后,需要进行一定程度的测试,包括单元测试、集成测试和验收测试等。例如,在课程管理系统中,需要测试对课程、学生、选课等数据的正确性和有效性,确保系统功能和性能达到预期要求。 六、系统部署 在系统测试通过之后,可以将系统部署到生产环境中。例如,在课程管理系统中,需要将代码部署到 Web 服务器上,并配置好 MySQL 数据库和相关服务,确保系统可以稳定运行和提供业务服务。 综上所述,通过使用 JSPServlet、JDBC 和 MySQL 等技术框架和数据库,可以实现一个功能齐全的课程管理系统,具体实现过程需要进行需求分析、技术选型、系统设计、系统实现、系统测试和系统部署等多个步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值