javaweb学习的第7天(2021-11-13)--------登录功能的实现
JS里面的事件驱动。
基本只研究用户事件。
这个函数需要写在这里:
例子:
jsp页面的body标签:
jsp页面的head标签:
相当于点击这个按钮会触发一个方法的调用,这个方法是定义在head标签里面。
效果:
常用的事件:
1、onload:加载完毕的事件
2、onclick:鼠标点击
3、obblur:失去焦点事件
4、onfocus:获取焦点事件
5、onmouseover:鼠标移进来
6、onmouseout:鼠标移出去
JS里面的BOM:
window对象:
alert()是window这个对象提供的。
用的最多的就是Window对象里面的子对象document
window.doucument里面的window可以省略。
BOM VS DOM
BOM就是DOM里面的其中一个对象document
使用document可以获取到当前这个jsp页面的每一个元素。
想实现的功能:
点击button,之前是alert弹窗信息,现在是更换一行话:
现在:
点了button之后:
代码:
body标签:
head标签:
升级难度:
实现的效果:
刚开始:
现在:
点击按钮后。
复杂事情这句话进入文本框,复杂事情被替换拼搏…
代码:
body标签:
粗略学习了以下js之后,重新回到之前的那个需求:
目前问题:
当我第一次输入密码输入错误的时候。第二次再准备去输入的时候,后面这个提示错误信息一直还在,希望后期我第二次输入的时候,这个信息可以没了。
注册功能的实现:
注册失败的定义:
用户名已经在数据库里面存在了。
1、注册页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>regist</title>
<style>
span{
color:red;
}
</style>
<script type="text/javascript">
function disappear(){
var s1 = document.getElementById("s1");
s1.innerHTML="";
}
</script>
</head>
<body>
<form action="regist" method="post">
<h1>欢迎注册</h1>
用户名称:<input id="text01" type="text" name="username" onclick="disappear();">
<span id="s1">${requestScope.registFailMsg}</span>
<br>
用户密码:<input type="password" name="password">
<br>
确认密码:<input type="password" name="repassword">
<br>
<input type="submit" name="regist" value="注册">
</form>
</body>
</html>
2、RegistServlet代码:
package com.rtl.login.servlet;
import com.rtl.bean.User;
import com.rtl.dao.UserDao;
import com.rtl.daoImpl.UserDaoImpl;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RegistServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
UserDao userDao = new UserDaoImpl();
User user = userDao.getUserByName(username);
if(user!=null){
//注册失败:
request.setAttribute("registFailMsg","用户名已经存在!请重新注册");
request.getRequestDispatcher("regist.jsp").forward(request,response);
}else{
user = new User();
user.setUname(username);
user.setUpwd(password);
//注册成功:
userDao.insert(user);
response.sendRedirect("login.jsp");
}
}
}
3、接口:UserDao
package com.rtl.dao;
import com.rtl.bean.User;
public interface UserDao {
User getUserByNameAndPwd(String uName,String uPwd);
User getUserByName(String uName);
void insert(User user);
}
4、接口的实现类:
package com.rtl.daoImpl;
import com.rtl.bean.User;
import com.rtl.dao.UserDao;
import com.rtl.utils.ConnectionUtils;
import java.sql.*;
public class UserDaoImpl implements UserDao {
@Override
public User getUserByNameAndPwd(String uName, String uPwd) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
User user = null;
try{
conn = ConnectionUtils.getConn();
String sql = "SELECT id,uname,upwd FROM user WHERE uname=? AND upwd=?";
ps = conn.prepareStatement(sql);
ps.setString(1,uName);
ps.setString(2,uPwd);
rs = ps.executeQuery();
if(rs.next()){
user = new User();
user.setId(rs.getInt(1));
user.setUname(rs.getString(2));
user.setUpwd(rs.getString(3));
return user;
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(conn!=null){
try {
ConnectionUtils.closeConn();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return user;
}
@Override
public User getUserByName(String uName) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
User user = null;
try{
conn = ConnectionUtils.getConn();
String sql = "SELECT id,uname,upwd FROM user WHERE uname=?";
ps = conn.prepareStatement(sql);
ps.setString(1,uName);
rs = ps.executeQuery();
if(rs.next()){
user = new User();
user.setId(rs.getInt(1));
user.setUname(rs.getString(2));
user.setUpwd(rs.getString(3));
return user;
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(conn!=null){
try {
// conn.close();
ConnectionUtils.closeConn();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return user;
}
@Override
public void insert(User user) {
try{
Connection conn = ConnectionUtils.getConn();
String sql ="INSERT INTO USER(uname,upwd) VALUES(?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,user.getUname());
ps.setString(2,user.getUpwd());
ps.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
try {
ConnectionUtils.closeConn();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
5、配置文件web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.rtl.login.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>regist</servlet-name>
<servlet-class>com.rtl.login.servlet.RegistServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>regist</servlet-name>
<url-pattern>/regist</url-pattern>
</servlet-mapping>
</web-app>
现在就是: 如果我们注册时候,表单里面由很多个选项,如果注册失败了,全部要重新填写会非常的困难。所以我们希望我在每次只要填写的时候,就知道这个选项我填对了没? 这个技术叫做Ajax
异步的js和XML
在不发生页面跳转,实现异步载入内容并改变内容的技术。
Ajax里面最重要的对象:
XmlHttpRequest对象
1、XmlHttpRequest对象的获取
2、XmlHttpRequest对象的方法:
open,
send,
3、XmlHttpRequest对象的属性:
readyState=4的时候,代表请求已经处理完毕,且响应已经就绪。
但是还要判断i请求是否成功了。
Ajax校验用户名
获取异步请求对象XmlHttpRequest
这个方法直接抽象出来,写在js的代码里面
在jsp页面的head标签里面。
如何获取对象xhr?
现在准备使用Ajax技术实现,当你输完用户名之后,准备输入用户密码的时候,就已经把用户名拿到数据库进行校验。
使用失去焦点事件onblur()
在用户名称这个这里绑定onblur()
前端代码:
后端服务器代码:
package com.rtl.login.servlet;
import com.rtl.bean.User;
import com.rtl.dao.UserDao;
import com.rtl.daoImpl.UserDaoImpl;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CheckUserNameServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
UserDao userDao = new UserDaoImpl();
User user = userDao.getUserByName(username);
String msg = "";
if(user == null){
//没有重名
msg = "√";
}else{
//重名了
msg = "已存在,请更换!";
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().println(msg);
}
}
3、配置文件web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.rtl.login.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>regist</servlet-name>
<servlet-class>com.rtl.login.servlet.RegistServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>regist</servlet-name>
<url-pattern>/regist</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>checkUserName</servlet-name>
<servlet-class>com.rtl.login.servlet.CheckUserNameServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>checkUserName</servlet-name>
<url-pattern>/checkUserName</url-pattern>
</servlet-mapping>
</web-app>
之前使用的原生的Xhr对象去发送异步请求。现在使用jQuery框架来实现。
使用jQuery来实现所有js的操作。
介绍如何使用jQuery:
1、导入jQuery的库
https://www.jq22.com/jquery-info122#google_vignette
在web目录右键
new directory
新建目录scripts,将.js文件拷贝进去
在代码里面引入
head标签里面写上这样的代码:
<script type="text/javascript" src="scripts/jquery.min.js"></script>
一般这个代码在jsp页面的比较靠前的位置。
jQuery语法1:
$(function (){
alert("页面加载完毕!!!");
});
只要你这个页面加载完毕就会执行。
因为window.onload()就是这个功能。
<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.5.1.min.js"></script>
使用jQuery来实现功能。
点击这个按钮,将这个文字显示在alert来。
body标签:
<input type="button" name="测试jQuery" id="b1">
head的script标签:
$(function (){
// alert("页面加载完毕!!!");
$("#b1").click(function (){
var msg = $("#span01").html();
alert(msg);
});
});
实现功能:
上面的文字进入文本框里面来
将jQuery对象转为DOM对象:
#s1里面 s1是id
DOM对象转为jQuery对象
使用jQuery之前:
click方法在这里:
使用jQuery之后
click方法定义在这里:
使用jQuery实现将HTML代码和js代码解耦合了。
使用jQuery完成用户名的异步校验。
之前使用Ajax里面原生的XMLHttpRequest对象实现的。
来看看之前的实现方式:
script标签:
使用jQuery对Ajax的支持技术
$.get $.post
都是对$.ajax
的实现