核心技术
- java web servlet:
HttpServlet
类,基于@WebServlet()
注释的Servlet
类的配置 - tomcat项目部署
- mysql数据库
- jdbc
- druid数据库连接池
- html
用到的软件
- java web集成开发环境:IntelliJ IDEA
- 服务器:tomcat
- mysql的可视化界面:SQLyog
用到的jar包
- 项目所需的jar包:
druid-1.0.9.jar
,mysql-connector-java-5.1.48-bin.jar
druid-1.0.9.jar
:阿里巴巴的德鲁伊数据库连接池驱动包mysql-connector-java-5.1.48-bin.jar
:jdbc的数据库连接的驱动包
案例要求
- 一个简单的web项目,能够实现指定账户密码的登陆操作,并且显示登陆结果
- 实现注册和登陆功能
- 将注册的账户存储在mysql数据库当中
- 使用druid数据库连接池技术
项目jar包和数据库的配置
- web项目的jar包首先要放置在
web
目录下的WEB-INF
目录下
- 右键
libs
文件夹选择Add as Library
- 在
tomcat
的lib
目录下也添加这两个jar包(否则web项目在浏览器运行时会找不到类) - 数据库连接池druid的配置文件
druid.properties
放置到src
文件夹下
druid.properties
的配置信息# jdbc的驱动目录,class.forName(); driverClassName=com.mysql.jdbc.Driver # 数据库的url url=jdbc:mysql://127.0.0.1:3306/city # 要连接的账户 username=root # 要链接账户的对应密码 password=root # 初始连接池当中connection对象的数目 initialSize=5 # connection对象的最大数目 maxActive=10 # 最大等待时间 maxWait=3000
- 在mysql数据库当中创建users表
CREATE TABLE users ( USER VARCHAR(30) UNIQUE NOT NULL, PASSWORD VARCHAR(50) NOT NULL );
编写druid工具类
- 要求:实现获取
Connection
对象方法,实现PreparedStatement,ResultSet,Connection
对象的close
方法 - DruidUtils类代码
package cn.web.jdbc; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; public class DruidUtils { private static DataSource dataSource; static { Properties properties = new Properties(); ClassLoader classLoader = DruidUtils.class.getClassLoader(); InputStream inputStream = classLoader.getResourceAsStream("druid.properties"); try { properties.load(inputStream); dataSource = DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } } public static DataSource getDataSource() { return dataSource; } public static Connection getConnection() { try { return dataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return null; } public static void close(PreparedStatement preparedStatement) { if(preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(Connection connection) { if(connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(ResultSet resultSet) { if(resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(PreparedStatement preparedStatement, Connection connection, ResultSet resultSet) { close(preparedStatement); close(resultSet); close(connection); } public static void close(PreparedStatement preparedStatement, Connection connection) { close(preparedStatement); close(connection); } }
编写UserManager类(管理用户对象)
- 要求:实现注册和登陆功能
- UserManager类代码
package cn.web.user; import cn.web.jdbc.DruidUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class UserManager { private static String REGISTER_SQL = "INSERT INTO users VALUES (?, ?)"; private static String LOGIN_SQL = "SELECT * FROM users WHERE user = ? AND password = ?"; private static Connection connection; private static PreparedStatement preparedStatement; private static ResultSet resultSet; private static void getConnection() { connection = DruidUtils.getConnection(); } private static void getPreparedStatement(String sql) { try { preparedStatement = connection.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } } private static void setPreparedStatement(String user, String password) { try { preparedStatement.setString(1, user); preparedStatement.setString(2,password); } catch (SQLException e) { e.printStackTrace(); } } public static boolean login(String user, String password) { boolean count = true; getConnection(); getPreparedStatement(LOGIN_SQL); setPreparedStatement(user, password); try { resultSet = preparedStatement.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } try { if(!resultSet.next()) { count = false; } } catch (SQLException e) { e.printStackTrace(); } DruidUtils.close(preparedStatement, connection, resultSet); return count; } public static boolean register(String user, String password) { int count = -1; getConnection(); getPreparedStatement(REGISTER_SQL); setPreparedStatement(user, password); try { count = preparedStatement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } DruidUtils.close(preparedStatement, connection, resultSet); return count == 1 ? true : false; } }
实现注册和登陆的servlet类
- 要求:对注册和登陆返回结果
- LoginServlet类代码实现
package cn.web.net; import cn.web.user.UserManager; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(urlPatterns = {"/login"}) public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=utf-8"); boolean result = UserManager.login(request.getParameter("user"), request.getParameter("password")); if(result) { response.getWriter().write("登陆成功!"); } else { response.getWriter().write("登陆失败!"); } } }
- RegisterServlet类的代码实现
package cn.web.net; import cn.web.jdbc.DruidUtils; import cn.web.user.UserManager; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @WebServlet(urlPatterns = {"/register"}) public class RegisterServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=utf-8"); boolean result = UserManager.register(request.getParameter("user"), request.getParameter("password")); if(result == true) { response.getWriter().write("注册成功!"); } else { response.getWriter().write("注册失败!"); } } }
编写登陆和注册页面的html文件
注册页面
- register.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册</title> </head> <body> 开发者:tom<br> <form action="/register" method="post"> <input type="text" placeholder="user" name="user"><br> <input type="text" placeholder="password" name="password"><br> <input type="submit" name="注册"> </form> </body> </html>
- 页面效果
登陆页面
- login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登陆</title> </head> <body> <form action="/login" method="post"> <input type="text" placeholder="user" name="user"><br> <input type="text" placeholder="password" name="password"><br> <input type="submit" value="登陆"> </form> </body> </html>
- 页面效果
项目的部署
在这次项目当中踩到的坑
- jar包的
lib
文件要放在web/WEB-INF
下面 - jar包还应该放在
tomcat
的lib
文件夹下一份 - 项目路径尽量不要有中文名字,如果有中文名字使用
java.net.URLDecoder.decode()
方法进行重新编码 - 页面当中使用
response.getWriter().write()
方法出现中文乱码,使用response.setContentType("text/html; charset=utf-8")
进行编码的设定
项目源代码下载
- 链接:https://pan.baidu.com/s/1nkdKUhrGlptmMBkcVKHbzw
- 提取码:n1p1