这篇来学习下MVC模型和分层思想,然后准备开发环境,后面我们来练习用户注册和登录的开发练习。
1 MVC模型
在软件开发行业,MVC几乎人人都知道这个模型,这里我们来看看JavaWeb开发中的MVC模型
JavaWeb MVC = JSP +Servlet + JavaBean
M: Model模型,主要就是javaBean|四种作用域
V:View 师徒,就是JSP页面
C:Controller 控制器, 就是只Servlet
分层思想
上面MVC模型中Servlet这层太大,为了方便开发和高内聚,低耦合,我们需要对servlet层分层。
2.开发环境准备
2.1数据库和表创建
我们先在本地安装一个mysql服务器,然后启动服务,用一个图形化界面工具(小海豚)去连接数据库,然后执行下面命令去创建一个数据库和创建一个users表。
//创建数据库,名称为j2ee
CREATE DATABASE j2ee;
//使用j2ee数据库,多个数据库情况下,需要先切换进入到该数据库,才能操作sql
USE j2ee;
//创建一个用户表
CREATE TABLE users(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
password VARCHAR(50),
email VARCHAR(200),
birthday DATE
)
暂时就是一个空表,到这里数据库环境已经准备好了,接下来去Eclipse上创建项目和配置。
2.2 Eclipse web项目创建
我们在Eclipse上创建一个动态web项目。
然后接下来,我们提交准备一些jar包放在WEB-INF/lib目录下,至少我们知道需要用到mysql-connect-xx.jar包。一般来说,我们知道jar包文件名称,我们就可以去maven仓库下载:https://mvnrepository.com/
接下来创建包结构,分层思想
com.anthony.domain
com.anthony.dao
com.anthony.dao.impl
com.anthony.service
com.anthony.service.impl
com.anthony.utils
com.anthony.exception
com.anthony.web.servlet
基本上项目结构层次都提前创建好了,接下来就是添加代码。
2.3 编写实体类Bean类代码
一般来说Java中说的Bean类就写在domain包下,这个实体类对象会在每个层中用到。
在domain包下创建一个User.java类,代码如下。
package com.anthony.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private String username;
private String password;
private String email;
private Date birthday;
private int id;
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;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
注意上面写的private几个属性,应该和你数据库建表的字段保持一样,这个是规范,方便以后反射用到。上面建议添加实现序列化,如果后面session需要钝化,就需要这里实现序列化。
2.4 在dao包下写一个接口
在dao(Data Access Object)包下写一个处理用户的接口,例如添加用户,修改用户,删除用户。
package com.anthony.dao;
import com.anthony.domain.User;
public interface UserDao {
/**
* 添加用户信息
* @param user
* @throws Exception
*/
public void addUser(User user) throws Exception;
}
注意上面是定义一个接口,具体实现类,我们在dao.impl包中写。
2.5 在dao.impl下写一个实现类
上面我们写了一个接口,并写了一个添加用户的方法,现在我们写一个具体实现这个接口的类。
package com.anthony.dao.impl;
import com.anthony.dao.UserDao;
import com.anthony.domain.User;
public class UserDaoImpl implements UserDao {
public void addUser(User user) throws Exception {
}
}
写道这里,我们少了DBUtil.java这个工具类去操作数据库,所以,我们接下来先写DBUtil.java类。
2.6 实现DBUtil.java类
这个类就封装sql操作,包括读取数据库的配置文件。
先写一个数据库配置文件,在src下新建一个dbinfo.properties文件,配置信息如下。
classDriver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/j2ee
user=root
password=123456
然后在utils包下新建一个DBUtils.java,代码如下
package com.anthony.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DBUtils {
private static String classDriver;
private static String url;
private static String user;
private static String password;
static {
Properties pro = new Properties();
InputStream in = DBUtils.class.getResourceAsStream("/dbinfo.properties");
try {
pro.load(in);
classDriver = pro.getProperty("classDriver");
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
} catch (IOException e) {
e.printStackTrace();
}
try {
Class.forName(classDriver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//得到连接的方法
public static Connection getConnection() throws Exception{
return DriverManager.getConnection(url, user, password);
}
//关闭资源方法
public static void close(Connection conn, Statement stmt, ResultSet rs) {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null; //赶紧垃圾回收
}
if(stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
然后我们再次回到UserDaoImpl.java
package com.anthony.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import com.anthony.dao.UserDao;
import com.anthony.domain.User;
import com.anthony.utils.DBUtils;
public class UserDaoImpl implements UserDao {
public void addUser(User user) throws Exception {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = DBUtils.getConnection();
ps = conn.prepareStatement("INSERT INTO users(username,password,email,birthday) VALUES(?,?,?,?)");
ps.setString(1, user.getUsername());
ps.setString(2, user.getPassword());
ps.setString(3, user.getEmail());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String date = sdf.format(user.getBirthday());
ps.setString(4, date);
//执行sql语句,这里是注册,插入数据
int i = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
DBUtils.close(conn, ps, null);
}
}
}