【JavaWeb开发-Servlet】day07-学生成绩管理系统-实现登录注册功能

news2024/10/6 18:25:55

目录

一、登录功能

1、实现登录页面

 ①新建一张登录表:login

 ②插入一条测试数据

 ③新建一个login.jsp登录界面

 ④此表的实体Teacher类:

 ⑤ 然后在写一个dao方法,需要根据用户名查询登录表中的用户信息

 ⑥业务层中我们直接调用dao层方法

 ⑦在Servlet中新建分支login.do

 ⑧CheckCode.class

 ⑨ 写完了这个Servlet不要忘了修改部署文件

 ⑩下面进行测试:​编辑

2、实现登录验证

① 创建一个过滤器

②SessionFilter.class

③ 在web.xml中添加过滤器

④功能与原理:

二、注册功能

①搭建一个前端页面(这个页面先搭后搭建都可以,没有顺序要求)

②Dao层实现如何在数据库中插入数据

③业务层

④Servlet层

⑤思路与测试:

 项目资源链接:


一、登录功能

1、实现登录页面

①新建一张登录表:login

 

②插入一条测试数据

③新建一个login.jsp登录界面

<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.*,sams.ck.entity.*,java.text.*"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<title>login</title>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<%@ include file="head.jsp" %>
	</head>

	<body>
		<div>
			<h3>
				登录
			</h3>
			<form action="login.do" method="post">
				<table cellpadding="0" cellspacing="0" border="0" class="form_table">
					<tr>
						<td valign="middle" align="right">
							用户名:
						</td>
						<td valign="middle" align="left">
							<input type="text" class="inputgri" name="uname" placeholder="请输入您的用户名" value="<%=request.getAttribute("uname")==null?"":request.getAttribute("uname") %>" />
									
							<span style="color:red">
								<%=request.getAttribute("umsg")==null?"":request.getAttribute("umsg") %>
							</span>
						</td>
					</tr>
						<tr>
					<td valign="middle" align="right">
						密码:
					</td>
					<td valign="middle" align="left">
						<input type="password" class="inputgri" name="pwd" placeholder="请输入您的密码"/>
						<span style="color:red">
						<%=request.getAttribute("pmsg")==null?"":request.getAttribute("pmsg") %>
						</span>
					</td>
					</tr>
					<tr>
					<td valign="middle" align="right">
						验证码:
						<a href="javascript:;" onclick="document.getElementById('num').src = 'checkCode.do?'+(new Date()).getTime()">
							<img id="num" src="checkCode.do" />
						</a>
					</td>
					<td valign="middle" align="left">
						<input type="text" class="inputgri" name="number" placeholder="请输入您的验证码"/>
						<span style="color:red">
							<%=request.getAttribute("ckmsg")==null?"":request.getAttribute("ckmsg") %>
						</span>
					</td>
					</tr>
				</table>
				<p>
					<input type="submit" class="button" value="登录" />
					<input type="button" class="button" value="注册" onclick="location='register.jsp'"/>	
				</p>
			</form>
		</div>
	</body>
</html>
    

因为我们的登录用户不是学生而是老师或者管理员,所以我们需要建一张新的数据表,然后在创建

④此表的实体Teacher类:

 

package sams.ck.entity;

import java.util.Objects;

public class Teacher {
	//定义属性,要与登录表的内容对应
	private int uid;//用户id
	private String uname;//用户名
	private String pwd;//密码
	private String rname;//真实姓名
	private String tel;//电话号码
	
	//为学生实体类型添加无参构造方法
	public Teacher() {}

	public int getUid() {
		return uid;
	}

	public void setUid(int uid) {
		this.uid = uid;
	}

	public String getUname() {
		return uname;
	}

	public void setUname(String uname) {
		this.uname = uname;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public String getRname() {
		return rname;
	}

	public void setRname(String rname) {
		this.rname = rname;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	@Override
	public int hashCode() {
		return Objects.hash(uid);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Teacher other = (Teacher) obj;
		return uid == other.uid;
	}

	@Override
	public String toString() {
		return "Teacher [uid=" + uid + ", uname=" + uname + ", pwd=" + pwd + ", rname=" + rname + ", tel=" + tel + "]";
	}
	
	
}

⑤ 然后在写一个dao方法,需要根据用户名查询登录表中的用户信息

 

package sams.ck.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import sams.ck.entity.Student;
import sams.ck.entity.Teacher;
import sams.ck.util.DBUtil;

public class userDao {
	//根据用户名查询用户信息
		public Teacher findByUserName(String uname){
			Teacher tea=null;
			try {
				//获取数据库链接
				Connection con=DBUtil.getConnection();
				//定义sql
				String sql="select * from login where uname=?";
				//获取PreparedStatement对象
				PreparedStatement prep=con.prepareStatement(sql);
				//注入占位符参数
				prep.setString(1, uname);
				//执行sql获取结果集对象
				ResultSet rs=prep.executeQuery();
				while(rs.next()){
					tea=new Teacher();
					tea.setUid(rs.getInt("id"));
					tea.setUname(rs.getString("uname"));
					tea.setRname(rs.getString("realname"));
					tea.setPwd(rs.getString("pwd"));
					tea.setTel(rs.getString("telephone"));
				}
					
			} catch (SQLException e) {
				e.printStackTrace();
			}
			return tea;
		}
}

⑥业务层中我们直接调用dao层方法

 

 

package sams.ck.service;

import sams.ck.dao.userDao;
import sams.ck.entity.Teacher;

public class userService {
	private userDao dao = new userDao();
	//登录方法
	public Teacher login(String uname){
		return dao.findByUserName(uname);
	}
}

然后来到Servlet层,这里我没有新建一个关于登录的Servlet服务,我把原来的stuServlet改为了Servlet,这样就可以把登录和前面学生的相关服务放在一起,当然也可以分开来写,只不过在新写了一个Servlet后还有对应修改部署文件(web.xml),后面我会用验证码举例。

⑦在Servlet中新建分支login.do

(.do是一种合并Servlet的写法,可以将多个页面集中管理

更过详细请查阅——Servlet合并:
Servlet请求方式:
        精确匹配  /a
        通配匹配  /*
        后缀匹配  *.do

)

else if (path.equals("/login")) {
			
			String uname = request.getParameter("uname");
			String pwd = request.getParameter("pwd");
			String ck = request.getParameter("number");
			Teacher tea = uservice.login(uname);
			request.setAttribute("uname", uname);
			if (tea == null) {
				// 说明数据库中没有与该用户名对应的数据用户名错误
				request.setAttribute("umsg", "用户名错误");
				request.getRequestDispatcher("login.jsp").forward(request, response);
				return;
			}
			if (!tea.getPwd().equals(pwd)) {
				// 说明密码错误
				request.setAttribute("pmsg", "密码错误");
				request.getRequestDispatcher("login.jsp").forward(request, response);
				return;
			}
			// 从session当中将CheckCodeServlet中绑定的验证码取出
			String ck2 = (String) session.getAttribute("ck");
			// 将前端页面传递过来的验证码与后台生成的验证码进行比较
			if (!ck.equals(ck2)) {
				// 说明验证码错误
				request.setAttribute("ckmsg", "验证码错误");
				request.getRequestDispatcher("login.jsp").forward(request, response);
				return;
			}

			// 用户名和密码验证都没有问题后,将登录对象的数据绑定到session对象中
			session.setAttribute("e", tea);
			// 如果上述两个条件都没有触发 说明用户名和密码正确
			response.sendRedirect("stuList.do");
		}

 实现验证码功能时,我们单独写了一个Servlet(也可以和上面的写在一起,以CheckCode.do的方式)但是代码有点多,就单拿出来了。

 ⑧CheckCode.class

package sams.ck.servlet;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;
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 javax.servlet.http.HttpSession;

public class CheckcodeServlet extends HttpServlet {
	//生成验证码图片和验证码的
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置响应消息头  告诉浏览器 服务器给你返回的是一个jpeg格式的图片
		response.setContentType("image/jpeg");
		//画图
		//通过BufferedImage 内存映像对象 来完成图片的绘制
		BufferedImage image=new BufferedImage(60,20,BufferedImage.TYPE_INT_RGB);
		//获取画笔对象
		Graphics g=image.getGraphics();
		//设置画笔的颜色
		g.setColor(new Color(255,255,255));
		//填充背景色
		g.fillRect(0, 0, 60, 20);
		//设置前景色
		g.setColor(new Color(0,0,0));
		//生成随机数
		Random rad=new Random();
		String number=rad.nextInt(99999)+"";
		
		//将生成的验证码绑定到Session对象当中
		HttpSession session=request.getSession();
		session.setAttribute("ck",number);
		
		
		//将生成的验证码(纯数字版) 画到图片上
		g.drawString(number, 5, 15);
		//为验证码添加干扰线
		for(int i=0;i<6;i++){
			//随机设定画笔的颜色
			g.setColor(new Color(rad.nextInt(255),rad.nextInt(255),rad.nextInt(255)));
			g.drawLine(rad.nextInt(60), rad.nextInt(20), rad.nextInt(60), rad.nextInt(20));
			
		}
		//将画好的验证码压缩并输出
		//获取服务器向浏览器输出数据的输出流
		OutputStream os=response.getOutputStream();
		//将图片压缩 输出
		ImageIO.write(image, "JPEG", os);
		
	}

}

⑨ 写完了这个Servlet不要忘了修改部署文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <servlet>
    <servlet-name>student</servlet-name>
    <servlet-class>sams.ck.servlet.Servlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>student</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>checkCode</servlet-name>
    <servlet-class>sams.ck.servlet.CheckcodeServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>checkCode</servlet-name>
    <url-pattern>/checkCode.do</url-pattern>
  </servlet-mapping>
</web-app>

这样就完成了。

⑩下面进行测试:

  

 测试成功,但是还有一个小问题,就是当我们的用户即使没有登录通过网址也能访问到我们的页面内容,因为我们没有对登录进行验证,下面我们会通过session验证的方法,加强网站的安全性。

2、实现登录验证

① 创建一个过滤器

 

②SessionFilter.class

package sams.ck.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionFilter implements Filter {

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req=(HttpServletRequest)request;
		HttpServletResponse res=(HttpServletResponse)response;
		String uri=req.getRequestURI();
		//将获取的请求资源路径uri进行字符串切割处理
		String path=uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf("."));
		//System.out.println(path);
		if(path.equals("/login")||path.equals("/style")||path.equals("/checkCode")||path.equals("/register")){
			chain.doFilter(request, response);
			return;
		}
		//获取session对象
		HttpSession session=req.getSession();
		//进行session验证
		Object obj=session.getAttribute("e");
		if(obj==null){
			//跳转回登录页面 
			res.sendRedirect("login.jsp");
			return;
		}
		chain.doFilter(request, response);
	}

	
}

③ 在web.xml中添加过滤器

  <filter>
  	<filter-name>s</filter-name>
  	<filter-class>sams.ck.filter.SessionFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>s</filter-name>
  	<url-pattern>/*</url-pattern> 
  </filter-mapping>

④功能与原理:

实现对所有访问路径的拦截,只对login、style、checkcode路径放行,必须从login页面跳转到list页面否则其他路径都不予通行,原理是登录时会在session中留下记录,所以session不为空,判断后可以继续向下访问,如果session为空,也就是没有完成登录,就会跳转到login.jsp,直到完成登录才能进行继续访问。

二、注册功能

①搭建一个前端页面(这个页面先搭后搭建都可以,没有顺序要求)

register.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.*,sams.ck.entity.*,java.text.*"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<title>login</title>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<%@ include file="head.jsp" %>
	</head>

	<body>
		<div>
			<h3>
				注册
			</h3>
			<form action="register.do" method="post">
				<table cellpadding="0" cellspacing="0" border="0" class="form_table">
					<tr>
						<td valign="middle" align="right">
							用户名:
						</td>
						<td valign="middle" align="left">
							<input type="text" class="inputgri" name="uname" placeholder="请输入您的用户名"/>
						</td>
					</tr>
					<tr>
					<td valign="middle" align="right">
						密码:
					</td>
					<td valign="middle" align="left">
						<input type="password" class="inputgri" name="pwd" placeholder="请输入您的用户密码"/>
					</td>
					</tr>
					<td valign="middle" align="right">
						密码:
					</td>
					<td valign="middle" align="left">
						<input type="password" class="inputgri" name="repwd" placeholder="请再次输入您的密码"/>
						<span style="color:red">
							<%=request.getAttribute("remsg")==null?"":request.getAttribute("remsg") %>
						</span>
					</td>
					<tr>
						<td valign="middle" align="right">
							真实姓名:
						</td>
						<td valign="middle" align="left">
							<input type="text" class="inputgri" name="realname" placeholder="请输入您的真实姓名"/>
						</td>
					</tr>
					<tr>
						<td valign="middle" align="right">
							手机号码:
						</td>
						<td valign="middle" align="left">
							<input type="text" class="inputgri" name="telephone" placeholder="请输入您的手机号码"/>
						</td>
					</tr>
				</table>
				<p>
					<input type="submit" class="button" value="完成" />
					<input type="button" class="button" value="返回" onclick="location='login.jsp'"/>	
				</p>
			</form>
		</div>
	</body>
</html>
    

②Dao层实现如何在数据库中插入数据

//实现注册功能
		public void register(Teacher teacher) {
			
			try {
				//建立数据库连接
				Connection conn = DBUtil.getConnection();
				//定义sql语句
				String sql = "insert into login(uname,pwd,realname,telephone)values(?,?,?,?)";
				//获取PreparedStatement对象
				PreparedStatement prep = conn.prepareStatement(sql);
				//添加占位符参数
				prep.setString(1, teacher.getUname());
				prep.setString(2, teacher.getPwd());
				prep.setString(3, teacher.getRname());
				prep.setString(4, teacher.getTel());
				//执行SQL
				prep.executeUpdate();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
		}

③业务层

package sams.ck.service;

import sams.ck.dao.userDao;
import sams.ck.entity.Teacher;

public class userService {
	private userDao dao = new userDao();
	//登录方法
	public Teacher login(String uname){
		return dao.findByUserName(uname);
	}
	//注册方法
	public void register(Teacher teacher) {
		dao.register(teacher);
	}
}

④Servlet层

else if (path.equals("/register")) {
			// 获取前端浏览器传递过来的用户信息
			String uname = request.getParameter("uname");
			String pwd = request.getParameter("pwd");
			String repwd = request.getParameter("repwd");
			String rname = request.getParameter("realname");
			String tel = request.getParameter("telephone");
			
			if(!pwd.equals(repwd)) {
				//两次密码不一致,重定向回到注册页面重新输入
				request.setAttribute("remsg", "两次密码输入不一致,请重新输入。");
				request.getRequestDispatcher("register.jsp").forward(request, response);
				return;
			}
			
			// 将获取的前端传递的参数封装到teacher对象当中
			Teacher teacher = new Teacher();
			teacher.setPwd(repwd);
			teacher.setUname(uname);
			teacher.setRname(rname);
			teacher.setTel(tel);
			uservice.register(teacher);
			// 添加成功后将页面重定向会 信息展示页
			response.sendRedirect("login.jsp");
		}

 ⑤思路与测试:

思路:

        注册和添加非常相似,sql都是insert语句。然后实现逻辑上就是在前端提交表单,在后端接收表单中的数据,对数据进行处理,封装在实体对象中,在通过业务层提交给dao层,最后进入数据库。唯一需要注意的一点是,注册时需要对密码进行判断,我们要用两个密码变量,比较参数是否一致,若不一致,需要重新输入,并给出提示信息,这里提示信息用setAttribute传递后端变量,再用转发功能交给前端页面。

request.setAttribute("remsg", "两次密码输入不一致,请重新输入。");
request.getRequestDispatcher("register.jsp").forward(request, response);

前端从request中获取到参数并进行判断是否输出提示。 

<%=request.getAttribute("remsg")==null?"":request.getAttribute("remsg") %>

当两次密码一致时,就不需要提示错误信息。直接提交表单,并回到登录界面即可。

测试:

 

 

 

 

 

 

本次课设所有基本功能:增删改查、分页、搜索、登录、注册已经全部实现,项目源代码如下,如有问题请评论区留言或者私信问我。

 项目资源链接:

https://download.csdn.net/download/qq_51701007/87263900icon-default.png?t=M85Bhttps://download.csdn.net/download/qq_51701007/87263900

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【负荷预测】基于灰色理论负荷预测的应用研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

南京邮电大学编译原理实验一(词法分析器的构造)

文章目录一、 实验目的和要求二、实验环境(实验设备)三、实验原理及内容&#xff08;一&#xff09;设计概要1、C语言子集2、单词及编码3、状态转换图&#xff08;二&#xff09;实现分析&#xff08;三&#xff09;结果分析四、实验小结&#xff08;包括问题和解决方法、心得体…

文本纠错--N-gram--Macbert模型的调用以及对返回结果的处理

文本根据词典进行纠错 输入一段可能带有错误信息的文字&#xff0c; 通过词典来检测其中可能错误的词。 例如&#xff1a;有句子如下&#xff1a;中央人民政府驻澳门特别行政区联络办公室1日在机关大楼设灵堂    有词典如下&#xff1a;中国人民&#xff0c;中央人民&#x…

红帽曹衡康:开源是企业数字化转型的机遇

在数据成为企业核心资产的今天&#xff0c;为了更好地降本增效&#xff0c;实现业务创新和增长&#xff0c;越来越多的企业都开启了数字化转型之路。然而对于绝大多数企业来说&#xff0c;这条转型之路都并非一帆风顺。事实上&#xff0c;数字化转型在为企业开启更多机遇的同时…

爆火Chatgpt注册 chatgpt使用 完全指南

1 chatgpt 简介 ChatGPT是一种语言模型&#xff0c;它被训练来对对话进行建模。它能够通过学习和理解人类语言来进行对话&#xff0c;并能够生成适当的响应。ChatGPT使用了一种叫做Transformer的神经网络架构&#xff0c;这是一种用于处理序列数据的模型&#xff0c;能够在输入…

Java System类

JavaSystem类\huge{Java \space System类}Java System类 System类概述 简而言之&#xff1a;SystemSystemSystem类就是一个工具类&#xff0c;直接调用对应的方法来使用即可&#xff0c;不需要也不能被实例化。 常用方法 ①. exit() 退出Java虚拟机 //执行这个exit(0)代码之…

[附源码]计算机毕业设计的花店售卖系统的设计与实现Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

GPU——占用情况和进程情况的参数解读表

GPU——占用情况和进程情况的参数解读表一、GPU占用情况二、GPU的进程情况参考资料一、GPU占用情况 名称功能说明Fan风扇转速在0 (%) 到100 (%) 之间变动Temp摄氏温度CPerf性能状态从P0到P12&#xff0c;P0表示最大性能&#xff0c;P12表示状态最小性能Persistence-M持续模式的…

微服务框架 SpringCloud微服务架构 微服务保护 31 限流规则 31.2 流控模式【关联】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护31 限流规则31.2 流控模式【关联】31.2.1 流控模式31.2.2 流控模式 - 关联31.2.3 小结31 限流规则…

OpenCV入门(C++/Python)- 使用OpenCV色彩空间(七)

在本教程中&#xff0c;了解计算机视觉中使用的流行色彩空间&#xff0c;并将其用于基于颜色的分割。 使用OpenCV色彩空间不同的颜色空间RGB颜色空间LAB颜色空间YCrCB 颜色空间HSV颜色空间如何使用这些颜色空间进行分割简单方法文章内容如下&#xff1a;首先&#xff0c;我们将…

Linux线程的创建

用户态创建线程&#xff1a; 线程不是一个完全由内核实现的机制&#xff0c;它是由内核态和用户态合作完成的。pthread_create不是一个系统调用&#xff0c;是Glibc库的一个函数。 在nptl/pthread_creat.c里面找到了这个函数&#xff1a; int __pthread_create_2_1 (pthread…

直播预告 | SOFAChannel#31《RPC 框架设计的考和量》

SOFARPC 是蚂蚁集团开源的一款基于 Java 实现的 RPC 服务框架&#xff0c;为应用之间提供远程服务调用能力&#xff0c;具有高可伸缩性&#xff0c;高容错性&#xff0c;目前蚂蚁集团所有的业务的相互间的 RPC 调用都是采用 SOFARPC。SOFARPC 为用户提供了负载均衡&#xff0c;…

web课程设计网页制作、基于HTML+CSS大学校园班级网页设计

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

代码随想录刷题Day60 | 84. 柱状图中最大的矩形

代码随想录刷题Day60 | 84. 柱状图中最大的矩形 84. 柱状图中最大的矩形 题目&#xff1a; 定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: …

C++调用OpenCV实现图像阈值处理

1 前言 在计算机视觉技术中&#xff0c;阈值处理是一种非常重要的操作&#xff0c;它是很多高级算法的底层处理逻辑之一。比如在使用OpenCV检测图形时&#xff0c;通常要先对灰度图像进行阈值&#xff08;二值化&#xff09;处理&#xff0c;这样就得到了图像的大致轮廓&#…

English Learning - L1 站在高处建立灵魂 2022.12.5

English Learning - L1 站在高处建立灵魂 2022.12.51.1 到底什么是语法1.2 为什么要学习语法口语分广义和狭义讲母语的人为啥不学语法&#xff1f;作为一名二语习得者口语中可不可以没有有语法&#xff1f;1.3 英语&#xff08;听说读写&#xff09;的核心金字塔理论关于词汇量…

免费内网穿透工具测评对比,谁更好用 2

文章目录1. 前言2. 对比内容2.1 http协议功能及操作对比2.1.1 网云穿的http设置2.1.2 Cpolar的http设置2.2 使用感受对比3. 结语1. 前言 上篇文章&#xff0c;笔者对比了网云穿和Cpolar的直观内容&#xff0c;包括网站界面、客户端界面和内网穿透设置界面。总的来说&#xff0…

保姆级教程:手把手教你使用深度学习处理文本

大家好&#xff0c;今天给大家分享使用深度学习处理文本&#xff0c;更多技术干货&#xff0c;后面会陆续分享出来&#xff0c;感兴趣可以持续关注。 文章目录NLP技术历程准备数据标准化词元化Tokenization&#xff08;文本拆分&#xff09;技术提升建立索引表使用TextVectoriz…

开源开放 | 开源知识图谱抽取工具DeepKE发布更新

知识图谱是一种用图模型来描述知识和建模世界万物之间关联关系的大规模语义网络&#xff0c;是大数据时代知识表示的重要方式之一。近年来&#xff0c;知识图谱在辅助语义搜索、支持智能问答、增强推荐计算、提升语言语义理解和大数据分析能力等越来越多的技术领域得到重视&…

极客时间课程笔记:业务安全

业务安全 业务安全体系&#xff1a;对比基础安全&#xff0c;业务安全有哪些不同&#xff1f;业务安全和基础安全在本质上就有很大的不同&#xff1a;在基础安全中&#xff0c;黑客将技术作为核心竞争力&#xff1b;在业务安全中&#xff0c;黑产将资源作为核心竞争力。谁能够…