【知了堂项目实训】utovr 后台管理系统

本贴最后更新于 2322 天前,其中的信息可能已经事过景迁

1. MVC 模型

1.1 定义

MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC 被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。(来源:百度百科)

  • View:视图,展示数据(前台技术)
  • Controller:控制器,完成接收用户的请求,根据用户请求去调度后台的程序,然后响应数据给前端。请求 Request/响应 Response
  • Model:数据模型,用户想看到的数据用程序封装起来

图解如下(图片来源于百度百科)
MVC 模型图

MVC 会经历两个流程:请求 + 响应

请求的流程:网页 → Controller → UserService → UserDao
响应的流程:UserDao → UserService → Controller → 网页

采用数据的响应方式是 ajax

1.2 分层思维(以登陆功能为例)

分层思维图
代码实现分层思维:
代码实现分层思维图

1.3 B/S 程序

B/S(Browser/Server,浏览器/服务器模式):通过浏览器去找后台的 Java 程序,浏览器里输入地址。

2. JDBC 技术

2.1 简介

JDBC(Java DataBase Connectivity,java 数据库连接),它是一个利用 Java 程序来访问数据库,并能够操作数据库的技术。简单地说,JDBC 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果。

2.2 开发步骤

需要重点关注的几个接口:Connection,Statement,ResultSet,PreparedStatement;注意要导入 MySQL 的驱动包。
  1. 配置连接数据库相关的参数:用户名,密码,地址,驱动程序类
  2. 加载驱动程序类 Class.forName(...)
  3. 建立连接 Connection
  4. 执行 SQL 语句 PrepareStatement
  5. 返回结果集
  6. 关闭连接 conn.close()

2.3 JDBC 程序测试过程

注意导入相应的包

导入的包

//配置连接数据库相关的参数 public class TestJdbc { String username = "root"; //用户名 String password = "1234"; //密码 String url = "jdbc:mysql://localhost:3306/student"; //地址 String driver ="com.mysql.jdbc.Driver"; //驱动程序类 //加载驱动程序类 { try{ Class.forName(driver); //加载驱动 } catch(ClassNotFoundException e){ //捕获异常 e.printStackTrace(); } } /* 做测试看是否连接成功:查看连接数据库名称和版本号 * 点击m01方法名+run as junit test,即可执行方法 * 若在junit窗口出现MySQL版本号信息,则连接成功 */ @Test public void m01() throws SQLException{ Connection conn = DriverManager.getConnection(url,username,password); DatabaseMetaData dmd = conn.getMetaData(); String name = dmd.getDatabaseProductName(); String version = dmd.getDatabaseProductVersion(); System.out.println(name+" "+version); } }

2.4 利用 JDBC 技术实现增删改查

#对学生表进行数据添加操作

@Test public void m02() throws SQLException{ Connection conn = DriverManager.getConnection(url,username,password); //建立链接 String sql = "insert into student values(?,?)"; //向学生表添加数据,?站位 PreparedStatement ps = conn.prepareStatement(sql); //对即将执行的SQL语句进行预编译 ps.setInt(1, 1002); //1代表第一个?,1002代表?的值 ps.setString(2, "小红"); int i = ps.executeUpdate(); //执行数据更新操作(增删改),语法结构类似Array.push() System.out.println("i = "+i); //返回值为1或0,1代表插入成功,0代表插入失败 conn.close(); //关闭连接 }

#对学生表进行数据删除操作

@Test public void m03() throws SQLException{ Connection conn = DriverManager.getConnection(url,username,password); String sql1 = "delete from student where (son=1002) "; //通过id删除某一条数据 PreparedStatement ps = conn.prepareStatement(sql1); //对即将执行的SQL语句进行预编译 int i = ps.executeUpdate(); System.out.println("i = "+i); //返回值为1或0,1代表插入成功,0代表插入失败 conn.close(); }

#对学生表进行数据修改操作

@Test public void m04() throws SQLException{ Connection conn = DriverManager.getConnection(url,username,password); String sql2 = "update student SET sname='小张' where (son=1001) "; PreparedStatement ps = conn.prepareStatement(sql2); //对即将执行的SQL语句进行预编译 int i = ps.executeUpdate(); System.out.println("i = "+i); //返回值为1或0,1代表插入成功,0代表插入失败 conn.close(); }

#对学生表进行数据查询操作

@Test public void m05() throws SQLException{ Connection conn = DriverManager.getConnection(url,username,password); String sql3 = "select *from student"; PreparedStatement ps = conn.prepareStatement(sql3); //对即将执行的SQL语句进行预编译 ResultSet rs = ps.executeQuery(); //执行查询并返回结果 while(rs.next()){ //循环向下移动,同时rs.next()返回布尔类型 //注意:只有布尔类型才能用到循环条件里面 int son = rs.getInt("son"); //获得值 String sname = rs.getString("sname"); //必须让java数据类型与数据库数据类型匹配 System.out.println(son+" "+sname); } conn.close(); }

3. Ajax 技术

3.1 Ajax 简介

  • Ajax = 异步 JavaScriptXML标准通用标记语言的子集)。
  • 异步的无数据刷新技术
  • 通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
  • 网页通过 JavaScript 发送请求给服务器,然后服务器处理结束后将数据返回给 JavaScript,最后通过 JavaScript 来将数据显示到网页里面。

图解如下(图片来源于百度百科)
Ajax 图

//ajax()方法的部分参数 $(document).ready(function () { //在页面内容都加载完后再执行以下代码 $.ajax({ url:'', //发送请求的地址 type:'', //请求方式 post或get dataType:'', //预期服务器返回的数据类型 async:false, //默认值为ture,即所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。 data:{ }, //发送到服务器的数据,将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。 success:function () { //请求成功执行函数 }, error:function (){ //请求失败执行函数 }, complete:function(){ //请求完成后回调函数(请求成功或失败之后均调用) } }); })

4.登陆功能的实现

登陆流程图:
登陆流程图

4.1 搭建登陆界面

  • 导入前端界面中 CSS,JS,图片素材
  • 导入路径:WebContent(zui:开源 HTML5 跨屏框架)
    前端目录

4.2 制作后台的请求地址

1.制作一个后台的请求地址,它代表后台的 Java 程序。
2.请求的地址(URL)编写到哪个地方:

  • HTML 的表单里面,<form action="地址" method="post">
  • Servlet 后端处理登陆请求的程序,也需要配置 URL,并且要和表单里的 URL 一致

3.如果网页报错:HTTP 404 错误,则代表后端请求地址不对,或者是找不到后台程序
4.HTTP 请求方式:GET 和 POST 请求

  • POST 请求一般是登陆,注册的表单数据发送,大数据文件上传
  • GET 请求一般是网页中超链接请求
  • POST 请求数据具备一定的安全性

5.获取表单里面提交的数据

  • HttpServletRequest 接口作用:代表网页发送的请求,且里面装有网页发送过来的数据
  • String getParameter(String name):获取网页中的数据(参数),通俗讲就是将网页里面的数据放到 java 程序里面

4.3 前端数据校验

解决方法:JS 正则表达式

window.onload = function() { // 监听:网页元素全部加载完成后再执行以下代码 var email = document.getElementById("email"); //获取email输入框中的值 var reg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; //邮箱验证的正则表达式 var form = document.getElementById("form"); var flag = false; // 全局变量 email.onchange = function() { flag = reg.test(email.value); if(flag) { // 正确的邮箱地址 email.style.borderColor = "green"; email.style.borderWidth = "1px"; email.style.borderStyle = "solid"; } else { // 错误的邮箱地址 email.style.borderColor = "red"; email.style.borderWidth = "1px"; email.style.borderStyle = "solid"; } } }

4.4 将页面数据发送给后台

数据传递
View - ->Servlet (login.html 发送登录请求,请求方式是 post)

public class UserServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); // 解决中文乱码的问题 String email = req.getParameter("email"); // 变量 代表获取用户填写的邮箱地址 String password = req.getParameter("password"); } }

Servlet - ->Service

public class UserService { private UserDao userDao = new UserDao(); /** * 登录业务功能代码 * 返回值: 1 和 0 * 数字1代表此用户账号和密码在数据库存在 * 数字0代表用户的账号和密码不存在 * @param email * @param password * @return * @throws SQLException */ public int login(String email, String password) throws SQLException { return 0; } }

Service - ->Dao

public int login(String email, String password) throws SQLException { }

4.5 后台数据校验

在数据库中查找是否有对应的账号信息,若有则返回 1,若无则返回 0

public class UserDao { String username = "root"; String pass = "1234"; String url = "jdbc:mysql://localhost:3306/utovr"; String driver = "com.mysql.jdbc.Driver"; public UserDao() { try { Class.forName(driver); // 加载驱动 } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 用户登录的数据库操作 * @param email * @param password * @return * @throws SQLException */ public int login(String email, String password) throws SQLException { String sql = "SELECT COUNT(user_id) FROM utovr_user WHERE user_email = ? AND user_password = MD5(?);"; // sql语句作用:查找数据库中的email和password值,若存在且对应则返回1 Connection conn = DriverManager.getConnection(url, username, pass); // 建立连接 PreparedStatement ps = conn.prepareStatement(sql); // 预编译 ps.setString(1, email); // 把方法里面参数赋值给SQL语句 ps.setString(2, password); // 把方法里面的参数赋值给SQL语句 ResultSet rs = ps.executeQuery(); // 执行查询语句 int i = 0; if(rs.next()) { i = rs.getInt(1); // 获取查询结果的第1列数据 } conn.close(); // 关闭连接 return i; }

4.6 返回校验结果实现页面跳转

Dao - -> Service

public class UserService { private UserDao userDao = new UserDao(); //使用另一个类写的代码,则必须new一个对象 /** * 登录业务功能代码 * 返回值: 1 和 0 * 数字1代表此用户账号和密码在数据库存在 * 数字0代表用户的账号和密码不存在 * @param email * @param password * @return * @throws SQLException */ public int login(String email, String password) throws SQLException { return userDao.login(email, password); //返回userDao类中login方法的值 } }

Service - -> Servlet

public class UserServlet extends HttpServlet { private UserService us = new UserService(); // 使用另一个类写的代码,则必须new一个对象 /** * 登录功能 * @param req * @param resp * @throws IOException * @throws ServletException */ public void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); // 解决中文乱码的问题 String email = req.getParameter("email"); // 变量 代表获取用户填写的邮箱地址(页面里面) String password = req.getParameter("password"); int i = 0; try { i = us.login(email, password); //获取userService类中login方法的值 } catch (SQLException e) { e.printStackTrace(); } if(i == 1) { // 页面的跳转 req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req, resp); } else { // 账号和密码不正确时 System.out.println("Error...."); } } }

5. 用户管理界面的增删改查

5.1 显示用户数据到页面

打通 Dao- ->Service- ->Servlet- -> 前端网页

  1. Dao 层获取数据库数据
  2. Service 层引入 dao 中的方法
  3. Servlet 层中用户信息列表的数据发送
  4. 利用 Ajax 将数据显示到网页
// 将数据库中数据渲染到页面表格中 $.ajax({ url: 'user?method=listUser', //地址 type: 'GET', //请求方式 success: function(data) { $("#usertable > tbody").empty(); // 清空以后的数据 $.each(data, function(i, n) { //遍历,i为索引,n为值 msg = "<tr>"; msg += '<td class="text-center"><input type="checkbox" name="checkbox"></td>'; msg += '<td class="text-center">'+ n.user_id +'</td>'; msg += '<td>'+ n.user_name +'</td>'; msg += '<td>'+ n.user_email +'</td>'; msg += '<td class="text-center">*************</td>'; msg += '<td class="text-center">'; msg += '<div class="btn-group">'; msg += '<button type="button" class="btn btn-xs '+ (n.user_status == 1 ? "btn-primary" : "") +'">启用</button>'; msg += '<button type="button" class="btn btn-xs '+ (n.user_status == 0 ? "btn-danger" : "") +'">禁用</button>'; msg += '</div>'; msg += '</td>'; msg += '<td class="text-center">'+ n.user_register_time +'</td>'; msg += '<td class="text-center"><a href="user?method=pageRedirect&page=update&user_id='+n.user_id+'&user_name='+n.user_name+'&user_email='+n.user_email+'&user_password='+n.user_password+'" class="btn btn-sm btn-success"><i class="icon-edit"></i> 编辑</a><button type="button" class="btn btn-sm btn-danger" onclick="deleteUser('+ n.user_id +',this)"><i class="icon-trash"></i> 删除</button></td>'; msg += "</tr>"; $("#usertable > tbody").append(msg); //在div里添加msg变量 }); }, dataType: 'json' //数据类型 });

5.2 删除用户数据

删除用户
Ajax 代码

// 触发删除用户事件 function deleteUser(user_id, obj) { // ajax操作 $.ajax({ url: 'user?method=deleteUser&user_id='+user_id, type: 'GET', success: function(data) { if(data == "ok") { $(obj).parent().parent().empty(); //删除数据 } }, dataType: 'json' }); }

5.3 添加用户数据

Ajax 代码

$("#user_submit").click(function() { //点击添加按钮执行函数 // 获取值 var user_name = $("#user_name").val(); var user_status = $("#user_status").val(); // Ajax的提交 $.ajax({ url: 'user', //地址 type: 'POST', //请求方式 data: {'method':'addUser','user_name':user_name,'user_status':user_status}, //添加的数据 dataType: 'json', //数据格式 success: function(data) { //请求成功执行函数 if(data == 1) { window.alert('数据添加成功'); } } }); });

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...