ajax+struts2实现验证用户名是否已经被注册

1.数据库相关操作没有使用hibernate框架(还没看完),使用了最基础的代码,但是运用了DAO设计模式。

在这个模式中DAO主要完成数据的操作,客户端依靠DAO接口进行操作,服务端要将接口进行具体实现。DAO的主要组成由以下几个部分组成。

        1、DatabaseConnection:专门负责数据库打开与关闭操作的类。

        2、VO:主要由属性、setter、getter方法,VO类中的属性与数据表中的字段相对应。每一个VO对象相当于表中的一条记录。

        3、DAO接口:主要定义数据库操作的接口,定义数据库的原子性操作,如增删改,按ID查询。

        4、Impl:DAO的具体实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭,接口类的名称首字母用“I”,表示其是一个接口。

        5、Proxy:代理实现类。主要完成数据库的打开和关闭,并调用Impl类对象(真实对象类)的操作,之所以增加代理类是为了以后的拓展,如果一个程序可以A-B,那么中间最好加一个过渡,使用A-C-B的形式,可以有效减少程序的耦合度,使开发结构更加清晰。

        6、Factory:工厂类,通过工厂类取得一个DAO的实例化对象,编写工厂类也是为了降低代码的耦合度,工厂类产生实例的方法通常是静态函 数,这样一来就可以通过工厂类名直接生成实例。

具体代码就不予展示了,展示实现验证用户名是否存在的核心代码核心代码:

User:
package com.bpf.test.vo;

public class User {
	private String username;
	private String password;
	private String sex;
	private String email;
	private String phoneNumber;
	
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPhoneNumber() {
		return phoneNumber;
	}
	public void setPhoneNumber(String phoneNumber) {
		this.phoneNumber = phoneNumber;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	

}


UserDAOImpl:
存在返回ture

package com.bpf.test.impl;
import java.sql.*;

import com.bpf.test.dao.*;
import com.bpf.test.vo.*;

public class UserDAOImpl implements UserDAO {
	private Connection conn = null;
	private PreparedStatement pstmt = null;
	
	public UserDAOImpl(Connection conn) {
		// TODO Auto-generated constructor stub
		this.conn = conn;
	}
	@Override
	public boolean hasRegistered(User user) throws Exception {
		// TODO Auto-generated method stub
		String username = user.getUsername();
		boolean hasRegisteredFlag = false;
		String sql = "SELECT * FROM userinfo Where username = '"+username+"'";
		this.pstmt = this.conn.prepareStatement(sql);//预编译
		ResultSet rs = pstmt.executeQuery();
		if(rs.next()){
			hasRegisteredFlag = true;
		}
		this.pstmt.close();
		return hasRegisteredFlag;
	}

}

UserDAOProxy:
package com.bpf.test.proxy;
import com.bpf.test.dao.*;
import com.bpf.test.dbconn.*;
import com.bpf.test.impl.*;
import com.bpf.test.vo.*;

public class UserDAOProxy implements UserDAO {
	private DataBaseConnection dbc = null;
	private UserDAO userDAOImpl = null;
	
	public UserDAOProxy() throws Exception {
		// TODO Auto-generated constructor stub
		this.dbc = new DataBaseConnection();
		this.userDAOImpl = new UserDAOImpl(this.dbc.getConnection());//实例化真实类
	}
	@Override
	public boolean hasRegistered(User user) throws Exception {
		// TODO Auto-generated method stub
		boolean flag = false;
		try{
			flag = userDAOImpl.hasRegistered(user);
		}catch(Exception e){
			throw e;
		}finally{
			dbc.close();
		}
		return flag;
	}
}

UserDAOFactory:
package com.bpf.test.factory;
import com.bpf.test.dao.*;
import com.bpf.test.proxy.*;

public class DAOFactory {
	public static UserDAO getUserDAOInstance() throws Exception { //取得DAO接口实例
	       return new UserDAOProxy(); //取得代理类的实例
	    }
}
Check(action):
使用模型驱动可以直接把用户表单封装到实体类中,用户名存在就返回ture到ajax
package com.bpf.checked;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.bpf.test.dao.UserDAO;
import com.bpf.test.factory.DAOFactory;
import com.bpf.test.vo.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class Check extends ActionSupport implements ModelDriven<User> {
	private HttpServletRequest request = ServletActionContext.getRequest();
	private HttpServletResponse response = ServletActionContext.getResponse();
	private HttpSession session = request.getSession();
	private UserDAO userDAOProxy = null;
	private User user = new User();
	@Override
	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}
	
	//验证用户名是否已经被注册
	public String registerCheck() throws IOException{
		PrintWriter out = response.getWriter();
		try{
        	userDAOProxy = DAOFactory.getUserDAOInstance();
        }catch(Exception e){
        	e.printStackTrace();
        }
		try{
        	boolean flag = userDAOProxy.hasRegistered(user);
        	out.print(String.valueOf(flag));
        }catch(Exception e){
        	e.printStackTrace();
        }
		return NONE;
	}	
}
struts.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入DTD约束 -->
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
  <constant name="struts.i18n.encoding" value="UTF-8"></constant>
  <package name="myProject" extends="struts-default" namespace="/">
    <action name="check_*" class="com.bpf.checked.Check" method="{1}">
    </action>
  </package>
</struts>

注册页面部分代码:
使用了bootstrap相应式框架
<div class="form-group" id="div1">
<label class="sr-only" for="form-first-name">First name</label>
<input type="text" name="username" placeholder="用户名..." class="form-first-name form-control" id="username" 
aria-describedby="inputSuccess2Status" onblur="registerCheck()" onfocus="remove()">
</div>
ajax代码:
若存在则为div1添加一个类:has-error 效果是会产生一个警示红框 输入框失去焦点时验证,获得焦点时移除该效果
function registerCheck() {
  http_request = new XMLHttpRequest();
  var url = "check_registerCheck?username=" + $("#username").val();
  http_request.onreadystatechange = function () {
    if (http_request.readyState == 4 && http_request.status == 200) {
      var s = http_request.responseText;
      if (s == "true") {
        $("#div1").addClass("has-error");
      }
    }

  }
  http_request.open("POST", url, true);
  http_request.send();


}
function remove() {
  $("#div1").removeClass("has-error");
}
效果:
表中记录:






版权声明:本文为qq_34764487原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34764487/article/details/73650661

智能推荐

接口回调基础理解

接口回调听起来好像很厉害的样子,但其实只要能够搞清楚代码的执行过程,多看几遍,并且认真思考,再加上勤奋的练习,熟练掌握简单的接口回调并不是难题,接下来,我会用一个简单的例子,来带大家一起分析代码的执行过程,以及这样写的好处,以及这样写的思路。 我们知道recyclerView是没有自带点击事件的,所以这里我们就拿给recyclerView添加点击事件为例。 ok 我们做好了一个简单的recycer...

Mac下的myeclipse安装

1.首先要安装jdk跟jre 2.安装过程中可能会遇到您需要安装旧 Java SE 6 运行环境才能打开此 Java 应用程序的提示     解决办法就是安装ava for os x 2015-001.,这里不要点系统给你提示的界面,根本没法下载 我上传的链接,可以直接下载:链接: https://pan.baidu.com/s/1qYbT6os 密码: x...

30分钟实战树莓派连接到微软云Azure IoT Hub并将数据可视化

更多内容,关注公众号: 树莓派是很多动手达人必备的小玩具,本节内容,让我们拿出树莓派,在30分钟内,将树莓派连接到微软云Azure的IoT Hub,然后将温湿度曲线可视化。 本实战完整视频: 树莓派连接到Azure IoT Hub 并用时序见解展示数据 本节内容中,树莓派发送的数据是模拟出来的,并没有真实的连接到传感器,您可以选购不同的传感器来采集真实的环境信息。 Azure IoT Hub 为我...

spring cloud gateway 整合ribbon、nacos discovery实现负载均衡源码简析

1 spring cloud gateway 负载均衡入口 spring cloud gateway 使用 LoadBalancerClientFilter 来实现载均衡的功能,该过滤器通过LoadBalancerClient.choose(ServerWebExchange exchange)方法来获取目标实例。 LoadBalancerClient 为spring-cloud-commons包...

VUE快速搭建项目

作为一个前端小辣鸡 今天在网上找到了 一个 快速 无脑式搭建vue项目的方式 分享一下 我们采用图形界面创建项目。通过 vue ui 命令启动 vue cli service 后,访问 http://localhost:8000/project/create 可以直接进入项目创建流程。 步骤中有些地方值得一提 详情:包管理器指定 npm,后续在npm 配置文件(.npmrc)中可手动指定国内镜像源...

猜你喜欢

2017-8-10 Struts2学习笔记二

一、web.xml文件的编写 1. 由于struts2是用过滤器拦截请求的,所以需要在web.xml文件中配置一个过滤器。 2. 这个过滤器的名字叫StrutsPrepareAndExecuteFilter,中文名曰struts准备和执行过滤器,就是这个过滤器拦截我们在地址栏的请求。 3. 查找这个过滤器,将它的全路径写在filter-class标签中,eclipse可以使用Shift+Ctrl+...

Windows Terminal配置Git

文章目录 Windows Terminal配置Git 效果 下载和安装 配置Windows Terminal 配置其它命令行 Windows Terminal配置Git 效果 先上效果图: 下载和安装 Windows Terminal是微软开发的面向命令行用户的全新,现代,功能丰富,高效的终端应用程序。 它包括Windows命令行社区最常请求的许多功能,包括对选项卡,富文本,全球化,可配置性,主题...

CW MCU v11.1学习笔记1

说明:通过处理器专家创建芯片为MC9S08DZ60的工程,按键控制LED 一、CW11.1软件界面布局 1、双击桌面图标,打开软件,设置工作空间 软件主界面 调试界面 处理器专家界面 有时经常调整(删除)面板布局,如果想恢复布局,可在Window工具栏下的Reset Perspective选项来复位面板布局 二、新建工程 1、在C/C++模式下,在Commander面板下点击New MCU pro...

栈-综合应用-中缀表达式转后缀表达式

综合应用 使用栈完成一个计算表达式的结果 输入:2 * 3 - 4 / 5 * 0.2 => 0.08 思路 使用index -> 2 (第一个为止),数字放入数栈,符号放入符号栈,符号栈为空,直接放入。 遇到第二个运算符,与符号栈中的符号进行运算符优先级比较。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gvhtZGbo-1601271684334)...

git分支管理

一、主分支Master 首先,代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。 Git主分支的名字,默认叫做Master。它是自动建立的,版本库初始化以后,默认就是在主分支在进行开发。 二、开发分支Develop 主分支只用来分布重大版本,日常开发应该在另一条分支上完成。我们把开发用的分支,叫做Develop。 这个分支可以用来生成代码的最新隔夜版本(nig...