章节索引
前言
实现《新手在服务器上实现Java Web基础后端操作》一文中的Java Web工程。
一、 IDE的选择与安装
本文选择的IDE是NetBeans。可参照该文对NetBeans进行安装。
二、创建并配置项目
可参照该文在NetBeans中新建一个Java Web项目,并引入所依赖的jar包。
三、实现
1. 目标
在浏览器上完成账号和密码的登录请求、账号密码注册请求和密码修改请求。
2. 实现该功能所需的类
1)各类功能介绍
-
用户实体类——User:定义user的各种字段,即《新手在服务器上实现Java Web基础后端操作》文中建立的数据库中user表中属性username、password所对应的get/set操作。
-
数据库连接管理类——DBManager:负责数据库连接的创建、管理和销毁。
-
数据库访问对象——UserDAO:DAO(data access object),负责根据不同功能的servlet对数据库中的user表进行增删改查。
-
处理登录请求——LoginServlet:验证http请求中的账户密码是否正确,并将验证结果作为响应返回。
-
处理注册请求——RegisterServlet:获取请求中的username和password信息,在表user中增加一条数据,并将添加结果作为响应返回。
-
处理修改用户密码请求——ModifyServlet:获取请求中的username和newPassword信息,在表user中对对应username的password进行修改。并将修改结果作为响应返回。
2) 对客户端请求的接收应答流程梳理
以登录操作为例:
1.浏览器发送登录请求到LoginServlet。
2.LoginServlet从请求中的参数将username和password对应的值取出来。
3.LoginServlet调用userDAO类,去服务器本地的数据库查询用户信息。其中在userDAO类中用到了DBManager管理数据库的连接,用到User类获取数据库中username和password的值。
4.LoginServlet将查询结果返回。
tips:HTTP中GET、POST等用法简介
3) 各类的实现代码
用户实体类——User
public class User {
//用户姓名
private String userName;
//用户密码
private String password;
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;
}
}
数据库连接管理类——DBManager
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.util.logging.Level;
import java.util.logging.Logger;
public class DBManager {
private static final String DB_USERNAME = "root"; //定义的数据库用户名
private static final String DB_PASSWORD = "Memory6418"; //定义的数据库连接密码
private static final String DB_URL = "jdbc:mysql://localhost:3306/myfirstapp?characterEncoding=utf8"; //定义数据库连接URL
/**
* 获得数据库连接对象
*
* @return 数据库连接对象
*/
public static Connection getConnection() {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection connection = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD);
return connection;
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | SQLException ex) {
Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
/**
* 关闭所有的数据库连接资源
*
* @param connection Connection 数据库连接
* @param statement Statement 资源
* @param resultSet ResultSet 结果集合
*/
public static void closeAll(Connection connection, Statement statement, ResultSet resultSet) {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException ex) {
Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
数据库访问对象——UserDAO
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class UserDAO {
//查询
public static User queryUser(String username) {
//获得数据库的连接对象
Connection connection = DBManager.getConnection();
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
//生成SQL代码
String sqlStatement = "SELECT * FROM user WHERE username=?";
//设置数据库的字段值
try {
preparedStatement = connection.prepareStatement(sqlStatement);
// 构建数据库查询表达式,将上面的“?”替换为函数传入的username值
preparedStatement.setString(1, username);
resultSet = preparedStatement.executeQuery();
User user = new User();
// 判断如果查询结果中至少有一条记录,将数据封装成一个User对象
if (resultSet.next()) {
user.setUserName(resultSet.getString("username"));
user.setPassword(resultSet.getString("password"));
return user;
}
return null;
} catch (SQLException ex) {
Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
return null;
} finally {
// 关闭数据库连接相关的对象
DBManager.closeAll(connection, preparedStatement, resultSet);
}
}
// 注册
public static void insertUser(String username, String password) {
//获得数据库的连接对象
Connection connection = DBManager.getConnection();
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
//生成SQL代码
String sqlStatement = "insert into user(username, password) values (?, ?)";
//设置数据库的字段值
try {
preparedStatement = connection.prepareStatement(sqlStatement);
// 构建数据库查询表达式,将上面的“?”替换为函数传入的username值
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
preparedStatement.executeUpdate();
} catch (SQLException ex) {
Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
// 关闭数据库连接相关的对象
DBManager.closeAll(connection, preparedStatement, resultSet);
}
}
// 修改密码
public static void modifyPassword(String username, String newPassword) {
//获得数据库的连接对象
Connection connection = DBManager.getConnection();
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
//生成SQL代码
String sqlStatement = "update user set password = ? where username = ?";
//设置数据库的字段值
try {
preparedStatement = connection.prepareStatement(sqlStatement);
// 构建数据库查询表达式,将上面的“?”替换为函数传入的username值
preparedStatement.setString(1, newPassword);
preparedStatement.setString(2, username);
preparedStatement.executeUpdate();
} catch (SQLException ex) {
Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
// 关闭数据库连接相关的对象
DBManager.closeAll(connection, preparedStatement, resultSet);
}
}
}
处理登录请求——LoginServlet
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
/**
* 测试登录Servlet
*
* @author Implementist
*/
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应内容类型、请求和相应的字符集
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
try (PrintWriter out = response.getWriter()) {
//获得请求中传来的用户名和密码
//从请求链接中的username=xxx&password=yyy取得
String username = request.getParameter("username").trim();
String password = request.getParameter("password").trim();
boolean loginResult = verifyLogin(username, password);
//根据登录验证的结果返回相应内容
if (loginResult) {
out.write("Success!");
} else {
out.write("Fail!");
}
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//为简便起见,Get请求的处理直接调用Post请求
doPost(request, response);
}
boolean verifyLogin(String username, String password) {
//验证账号密码是否正确且匹配
User user = UserDAO.queryUser(username);
return null != user && password.equals(user.getPassword());
}
}
处理注册请求——RegisterServlet
与LoginServlet类似,doPost和doGet方法无需修改。
boolean verifyRegister(String username, String password) {
//插入数据,并查询数据库中是否有该信息
UserDAO.insertUser(username, password);
User user = UserDAO.queryUser(username);
return null != user && password.equals(user.getPassword());
}
这里还未考虑注册时是否已有数据存在等问题,后续修改后再继续更新。
处理修改用户密码请求——ModifyServlet
与LoginServlet类似,doPost和doGet方法无需修改。
boolean verifyModify(String username, String password) {
//修改密码,并查询数据库中是否密码已修改。
UserDAO.modifyPassword(username, password);
User user = UserDAO.queryUser(username);
return null != user && password.equals(user.getPassword());
}
这里还未考虑用户名等重复问题,已知用户名就能修改密码等问题,后续修改后再更新。
3)打包并部署
A.在netbeans中,右击项目名,选择清理并构建。随后,在本项目对应的dist文件夹下有一个 .war 文件,即我们所需的“war包”。
B.在将war包上传到服务器。tomcat会对war包进行解包。
如果服务器上只部署一个Web程序,上传路径为:%TOMCAT_HOME%/webapps/,删除ROOT文件夹,将你的war包改名为ROOT.war
如果服务器上要部署多个Web程序,上传路径为:%TOMCAT_HOME%/webapps/ROOT,无需改名
C.启动tomcat
1)进入%TOMCAT_HOME%/bin:cd %TOMCAT_HOME%/bin
2)启动tomcat:./startup.sh,看到Tomcat started就表示tomcat已经成功启动。
3. 测试
http://a.b.c.d:8080//WhichServlet?username=ABC&password=BCD
其中a.b.c.d是服务器的ip地址,WhichServlet指上述实现不同功能的Servlet名称,username=ABC与password=BCD指需要验证的信息。
上述内容参考:
创建Java Web工程
创建并通过Java连接MySQL数据库
服务器端的一些测试方法
总结
本文参照其他blog的内容,简单介绍了在服务器上完成Java Web后端操作的流程,更进阶的知识还需继续学习。
内容如有错误,欢迎指正。