Web三层架构
- Web层——转发jsp页面,封装数据传给Service层处理
- Service层——接受Web层传来的数据,处理业务逻辑
- Dao层——实现对数据库的操作,提供接口给Service层调用
三层架构有利于更好的解耦,不同层各司其职。
开发顺序
这里我是置底向上的开发。
目录结构
cn.login.dao.impl
cn.login.dao
cn.login.exception
cn.login.impl
cn.login.service
cn.login.utils
cn.login.web
jdbc工具类
封装了常用的操作jdbc的方法,以便dao层来调用.使用了java中的.properties文件来设置配置信息
public class JdbcUtils{
private static String url ;
private static String dirver ;
private static String user ;
private static String password ;
static{//在类第一次加载时,会执行块中的代码
Properties properties =new Properties();
try(InputStream in = new FileInputStream((String.valueOf(JdbcUtils.class.getResource("db.properties").getPath())))) //自动关闭资源,非常重要
{ //加载配置文件
properties.load(in);
}
catch (IOException e) {
e.printStackTrace();
}
//获取配置文件的信息
url = properties.getProperty("URL");
dirver = properties.getProperty("DRIVER");
user = properties.getProperty("USER");
password = properties.getProperty("PASSWORD");
try {
Class.forName(dirver);//加载驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//静态方法就不需要创建实例来调用了
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
public static void release(Connection connection, Statement statement, ResultSet resultSet){
if(resultSet != null)
try{
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
if(statement != null)
try{
statement.close();
}catch (SQLException e) {
e.printStackTrace();
}
if(connection != null)
try{
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
开发Dao层
public class UserDao {
public Boolean find(User user) throws SQLException {
Connection connection = JdbcUtils.getConnection();
String sql = "select * from user where email = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, user.getEmail());
ResultSet set = statement.executeQuery();
Boolean flag = isSetNull(set);
JdbcUtils.release(connection, statement, set);
return flag;
}
public Boolean add(User user) throws SQLException {
Connection connection = JdbcUtils.getConnection();
String sql = "insert into user(email,password)values(?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,user.getEmail());
statement.setString(2,user.getPassword()) ;
statement.execute();
JdbcUtils.release(connection,statement);
return true;
}
public Boolean login(User user) throws SQLException {
String password = user.getPassword();
String email = user.getEmail();
String sql = "select * from user where email = ? and password = ?";
Connection connection = JdbcUtils.getConnection();
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,email);
statement.setString(2,password);
ResultSet set = statement.executeQuery();
Boolean flag = isSetNull(set);
JdbcUtils.release(connection,statement,set);
return flag;
}
public Boolean isSetNull(ResultSet set) throws SQLException {
if(set.next()){//如果存在
return true;
}
else{
return false;
}
}
}
开发service层
这里自定义了两个异常类UserExist UserNull
,并且将异常抛给了Web层来处理。
public class LoginBussiness {
public Boolean loginUser(User user) throws SQLException, UserExist, UserNull {
UserDao dao = new UserDao();
if(user.getEmail() == "" || user.getPassword() == ""){
throw new UserNull("邮箱或密码不能为空");
}
else if(dao.login(user))
return true;
else
return false;
}
public Boolean regiserUser(User user) throws SQLException, UserExist, UserNull {
UserDao dao = new UserDao();
if(user.getEmail() == "" || user.getPassword() == ""){
throw new UserNull("邮箱或密码不能为空");
}
else if(dao.find(user)){
throw new UserExist("用户已经存在");
}
else
return dao.add(user);
}
}
开发Web层
public class register extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset = utf8");
String email = request.getParameter("email");
String password = request.getParameter("password");
User user = new User();
user.setPassword(password);
user.setEmail(email);
LoginBussiness service = new LoginBussiness();
try {
if(service.regiserUser(user))
response.getOutputStream().write("注册成功!".getBytes("utf8"));
else
response.getOutputStream().write("注册失败".getBytes("utf8"));
} catch (SQLException e) {
e.printStackTrace();
} catch (UserExist userExist) {
response.getOutputStream().write(userExist.getMessage().getBytes("utf8"));
} catch (UserNull userNull) {
response.getOutputStream().write(userNull.getMessage().getBytes("utf8"));
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("register.jsp").forward(request,response);
}
}
public class login extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset = utf8");
String email = request.getParameter("email");
System.out.println(request.getParameter("password"));
String password = request.getParameter("password");
User user = new User();
user.setEmail(email);
user.setPassword(password);
LoginBussiness service = new LoginBussiness();
try {
if(service.loginUser(user))
{
response.getOutputStream().write("登录成功".getBytes("utf8"));
}
else
response.getOutputStream().write("账号或密码错误".getBytes("utf8"));
} catch (SQLException e) {
e.printStackTrace();
} catch (UserExist userExist) {
response.getOutputStream().write(userExist.getMessage().getBytes("utf8"));
} catch (UserNull userNull) {
response.getOutputStream().write(userNull.getMessage().getBytes("utf8"));
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("login.jsp").forward(request,response);
}
}
最后效果
提交的表单存在空字段时
注册的用户已存在时