信息管理系统
用到的技术
Servlet+jsp+mvc+jdbc
其他软件(可以自行替换)
开发工具:myEclipse
数据库: mySql
服务器:TomCat
功能需求
- 用户登录
- 用户注册
- 用户退出
- 查看个人信息
- 修改密码
- 查询所有用户信息
数据库设计
创建用户表. 表名: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.*
类名:首字母大写,见名知意
变量名和方法名:驼峰原则,见名知意
注释规范
- 方法功能注释
- 方法体核心位置有说明注释
日志规范
使用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>
操作步骤:
- 设置请求编码格式
- 设置响应编码格式
- 获取请求信息
- 处理请求信息
- 响应处理结果
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