【JAVA后端三】新手创建Java Web工程


前言

实现《新手在服务器上实现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后端操作的流程,更进阶的知识还需继续学习。
内容如有错误,欢迎指正。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值