Java的完整用户登陆系统

本文详述了一个使用Servlet+jsp+mvc+jdbc技术实现的Java用户登录系统的全过程。涵盖了从功能需求、数据库设计、代码规范到具体操作步骤的详细讲解,包括用户登录、注册、退出、查看个人信息及修改密码等功能。涉及的技术包括MyEclipse、MySQL、TomCat,以及日志规范的log4j。

信息管理系统

用到的技术

Servlet+jsp+mvc+jdbc

其他软件(可以自行替换)

开发工具:myEclipse
数据库: mySql
服务器:TomCat

功能需求

  1. 用户登录
  2. 用户注册
  3. 用户退出
  4. 查看个人信息
  5. 修改密码
  6. 查询所有用户信息

数据库设计

创建用户表. 表名:t_user
表设计:

字段名 类型 约束
uid int(10) 主键、非空、自增
uname varchar(50) 非空
pwd varchar(50) 非空
sex char(2) 非空
age int(3)
birth date
##创建用户表
create table t_user(
	uid int(10) not null auto_increment,
	uname varchar(100) not null,
	pwd varchar(100) not null,
	sex char(2)  not null,
	age int(3),
	birth date,
	primary key(uid)
)
##添加测试数据
insert into t_user values(default,'小明','123321',1,18,'2000-10-4');
insert into t_user values(default,'小红','456789',0,18,'2000-9-8');
select * from t_user; 

代码规范

命名规范

包名:com.youdian.*
类名:首字母大写,见名知意
变量名和方法名:驼峰原则,见名知意

注释规范

  1. 方法功能注释
  2. 方法体核心位置有说明注释

日志规范

使用log4j进行日志输出
数据流转的位置必须有后台输出语句

功能设计

逻辑:用户请求登陆页面,输入用户名密码,请求发送给处理请求的Servlet,Servlet拿到数据后进行验证。根据MVC分层思想,从Servlet调Service,从Service调Dao,完成数据库操作。如果验证正确,则重定向到主页面,如果验证失败,则显示“用户名或密码错误”,返回登陆页面。

登陆页面的jsp,其中placeholder浏览器识别,编译器不能识别

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>欢迎登录后台管理系统</title>
<link href="css/style.css" rel="stylesheet" type="text/css" />
<script language="JavaScript" src="js/jquery.js"></script>
<script src="js/cloud.js" type="text/javascript"></script>

<script language="javascript">
	$(function(){
    
    
    $('.loginbox').css({
    
    'position':'absolute','left':($(window).width()-692)/2});
	$(window).resize(function(){
    
      
    $('.loginbox').css({
    
    'position':'absolute','left':($(window).width()-692)/2});
    })  
});  
</script> 

</head>

<body style="background-color:#df7611; background-image:url(images/light.png); background-repeat:no-repeat; background-position:center top; overflow:hidden;">



    <div id="mainBody">
      <div id="cloud1" class="cloud"></div>
      <div id="cloud2" class="cloud"></div>
    </div>  


<div class="logintop">    
    <span>欢迎登录后台管理界面平台</span>    
    </div>
    
    <div class="loginbody">
    
    <span class="systemlogo"></span> 
    <br />
    <%
    	//声明java代码块进行错误提示语的逻辑校验
    	Object obj=request.getAttribute("flag");
    	if(obj!=null){
    %>
	    <div style="text-align: center;">
	     <span style="font-size: 15px;color:darkred;font-weight: bold;">用户名或者密码错误</span>
	    </div>
    <%} %>
   <%
    	//声明java代码块进行密码修改提示语
    	Object pwd=session.getAttribute("pwd");
    	if(pwd!=null){
    %>
	    <div style="text-align: center;">
	     <span style="font-size: 15px;color:darkred;font-weight: bold;">密码修改成功</span>
	    </div>
    <%}
    	session.removeAttribute("pwd");
    %>
       <%
    	//声明java代码块进行注册提示语
    	Object reg=session.getAttribute("reg");
    	if(reg!=null){
    %>
	    <div style="text-align: center;">
	     <span style="font-size: 15px;color:darkred;font-weight: bold;">注册成功</span>
	    </div>
    <%}
    	session.removeAttribute("reg");
    %>
    <div class="loginbox loginbox1">   
    <form action="user" method="post">
    	<input type="hidden" name="oper" value="login" />
    	<ul>
    	<li></li>
	    <li><input name="uname" type="text" placeholder="用户名" class="loginuser"  /></li>
	    <li><input name="pwd" type="password" placeholder="密码" class="loginpwd"  /></li>
	    <li class="yzm">
	    <span><input name="" type="text" value="验证码" onclick="JavaScript:this.value=''"/></span><cite>X3D5S</cite> 
	    </li>
	    <li><input name="" type="submit" class="loginbtn" value="登录"  onclick="javascript:window.location='main.html'"  /><label><a href="user/reg.jsp">注册</a></label><label><a href="#">忘记密码?</a></label></li>
	   </ul>
    </form>
    </div> 
    </div>   
    <div class="loginbm">版权所有 练习 <a href="http://www.uimaker.com">uimaker.com</a> 用于学习交流</div>
</body>
</html>

操作步骤:

  1. 设置请求编码格式
  2. 设置响应编码格式
  3. 获取请求信息
  4. 处理请求信息
  5. 响应处理结果
    5.1直接响应
    5.2请求转发
    5.3重定向

分析:

1和2是公共代码部分,其余部分根据功能不同调用不同的方法

		//设置请求编码格式
		req.setCharacterEncoding("utf-8");
		//设置响应编码格式
		resp.setContentType("text/html;charset=utf-8");

让用户在请求时发送自己要干什么,在form标签下面:

<input type="hidden" name="oper" value="login" />

可以用这个操作符来判断用户干什么:

if("login".equals(oper))//调用登录处理方法
else if("out".equals(oper))//调用退出功能
else if("pwd".equals(oper))//调用密码修改功能
else if("show".equals(oper))//调用显示所有用户功能
else if("reg".equals(oper))//调用注册功能
logger.debug("没有找到对应的操作符:"+oper);

再根据MVC的分层思想:先是控制器层servlet,再是service,dao,实体类

数据的流转都需要实体类参与,所以先创建实体类User

在User类中,声明私有属性后,加入get()和set()方法,toString(),hashCode和equals(),有参构造器,无参构造器

package com.youdian.pojo;

public class User {
   
   
	private int uid;
	private String uname;
	private String pwd;
	private String sex;
	private int age;
	//mysql查出来的时间可以是String,oracle不可以
	private String birth;
	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 getSex() {
   
   
		return sex;
	}
	public void setSex(String sex) {
   
   
		this.sex = sex;
	}
	public int getAge() {
   
   
		return age;
	}
	public void setAge(int age) {
   
   
		this.age = age;
	}
	public String getBirth() {
   
   
		return birth;
	}
	public void setBirth(String birth) {
   
   
		this.birth = birth;
	}
	@Override
	public String toString() {
   
   
		return "User [uid=" + uid + ", uname=" + uname + ", pwd=" + pwd
				+ ", sex=" + sex + ", age=" + age + ", birth=" + birth + "]";
	}
	@Override
	public int hashCode() {
   
   
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((birth == null) ? 0 : birth.hashCode());
		result = prime * result + ((pwd == null) ? 0 : pwd.hashCode());
		result = prime * result + ((sex == null) ? 0 : sex.hashCode());
		result = prime * result + uid;
		result = prime * result + ((uname == null) ? 0 : uname.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
   
   
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (age != other.age)
			return false;
		if (birth == null) {
   
   
			if (other.birth != null)
				return false;
		} else if (!birth.equals(other.birth))
			return false;
		if (pwd == null) {
   
   
			if (other.pwd != null)
				return false;
		} else if (!pwd.equals(other.pwd))
			return false;
		if (sex == null) {
   
   
			if (other.sex != null)
				return false;
		} else if (!sex.equals(other.sex))
			return false;
		if (uid != other.uid)
			return false;
		if (uname == null) {
   
   
			if (other.uname != null)
				return false;
		} else if (!uname.equals(other.uname))
			return false;
		return true;
	}
	public User(int uid, String uname, String pwd, String sex, int age,
			String birth) {
   
   
		super();
		this.uid = uid;
		this.uname = uname;
		this.pwd = pwd;
		this.sex = sex;
		this.age = age;
		this.birth = birth;
	}
	public User() {
   
   
		super();
		 
	}
	
}

再写出service接口
其中 User checkUserLoginService(String uname,String pwd);接收两个参数,传入service层,通过service来判断是否有该用户——业务逻辑与控制器解耦

package com.youdian.service;

public interface UserService {
   
   
	//校验用户登陆
	User checkUserLoginService(String uname,String pwd);

}

写出dao的接口,可以查询到的用户信息

package com.youdian.dao;

import com.youdian.pojo.User;

public interface UserDao {
   
   
	//根据用户名密码查询用户信息,返回查询到的用户信息
	User checkUserLoginDao(String uname,String pwd);
}

写出接口的实现类
其中查询数据库信息步骤如下:
声明JDBC对象
声明变量
加载驱动
获取连接
创建sql命令
创建sql命令对象
给占位符赋值
执行sql
遍历结果
关闭资源
返回结果

package com.youdian.dao.impl;


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



import java.sql.SQLException;

import com.youdian.dao.UserDao;
import com.youdian.pojo.User;

public class UserDaoImpl implements UserDao{
   
   
	
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Text extends JFrame implements ActionListener,TextListener { private JLabel username,password,email,telephone; private JTextField usernameField,emailField; private TextField teleField; private JPasswordField passwordField; private JButton registButton,cancelButton; public Text() { super("用户注册"); Container container = getContentPane(); container.setLayout(new FlowLayout()); username = new JLabel("用户名"); username.setToolTipText("请输入用户名"); password = new JLabel("密 码"); password.setToolTipText("密码不能少于6位"); email = new JLabel("邮 箱"); email.setToolTipText("邮箱中必须包含@字符"); telephone = new JLabel("电 话"); telephone.setToolTipText("电话只能为数字"); usernameField = new JTextField(15); usernameField.addActionListener(this); passwordField = new JPasswordField(15); passwordField.addActionListener(this); emailField = new JTextField(15); emailField.addActionListener(this); teleField = new TextField(21); teleField.addActionListener(this); teleField.addTextListener(this); registButton = new JButton("注册"); cancelButton = new JButton("取消"); container.add(username); container.add(usernameField); container.add(password); container.add(passwordField); container.add(email); container.add(emailField); container.add(telephone); container.add(teleField); container.add(registButton); container.add(cancelButton); registButton.addActionListener(this); cancelButton.addActionListener(this); setSize(250,200); setVisible(true); setResizable(false); } public void textValueChanged(TextEvent event) { if (event.getSource() == teleField) { /*if (!checkNumber(teleField.getText())) { JOptionPane.showMessageDialog(this,"电话必须为数字","温馨提示",JOptionPane.INFORMATION_MESSAGE); teleField.setText(""); } */ } } public void actionPerformed(ActionEvent event) { if (event.getSource() == usernameField) { if (usernameField.getText().equals("")) { JOptionPane.showMessageDialog(null,"用户名不能为空","温馨提示",JOptionPane.INFORMATION_MESSAGE); } } if (event.getSource() == passwordField) { if (passwordField.getPassword().length == 0) { JOptionPane.showMessageDialog(this,"密码不能为空","温馨提示",JOptionPane.INFORMATION_MESSAGE); } else if (passwordField.getPassword().length < 6) { JOptionPane.showMessageDialog(this,"密码长度不能小于6位","温馨提示",JOptionPane.INFORMATION_MESSAGE); passwordField.setText(""); } } if (event.getSource() == emailField) { if (emailField.getText().indexOf("@") = (emailField.getText().length() - 1) || emailField.getText().equals("")) { JOptionPane.showMessageDialog(this,"您的邮箱格式不正确","温馨提示",JOptionPane.INFORMATION_MESSAGE); emailField.setText(""); } } if (event.getSource() == teleField) { if (teleField.getText().equals("")) { JOptionPane.showMessageDialog(this,"联系电话不能为空","温馨提示",JOptionPane.INFORMATION_MESSAGE); } else if (!checkNumber(teleField.getText())) { JOptionPane.showMessageDialog(this,"电话必须为数字","温馨提示",JOptionPane.INFORMATION_MESSAGE); teleField.setText(""); } } if (event.getSource() == registButton) { if (usernameField.getText().equals("") || passwordField.getPassword().length == 0 || emailField.getText().equals("") || teleField.getText().equals("")) { JOptionPane.showMessageDialog(this, "您填写的信息不完整","温馨提示",JOptionPane.INFORMATION_MESSAGE); usernameField.setText(""); passwordField.setText(""); emailField.setText(""); teleField.setText(""); } else if (passwordField.getPassword().length < 6) { JOptionPane.showMessageDialog(this,"密码长度不能小于6位","温馨提示",JOptionPane.INFORMATION_MESSAGE); passwordField.setText(""); } else if (emailField.getText().indexOf("@") = (emailField.getText().length() - 1)) { JOptionPane.showMessageDialog(this,"您的邮箱格式不正确","温馨提示",JOptionPane.INFORMATION_MESSAGE); emailField.setText(""); } else if (!checkNumber(teleField.getText())) { JOptionPane.showMessageDialog(this,"电话必须为数字","温馨提示",JOptionPane.INFORMATION_MESSAGE); teleField.setText(""); } else JOptionPane.showMessageDialog(this,"恭喜您,注册成功","温馨提示",JOptionPane.INFORMATION_MESSAGE); } if (event.getSource() == cancelButton) { usernameField.setText(""); passwordField.setText(""); emailField.setText(""); teleField.setText(""); } } public boolean checkNumber(String str) { for (int i=0;i<str.length();i++) { return false; } return true; } public static void main(String args[]) { Text application = new Text(); application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值