准备:IntelliJ IDEA 2022.1 (Ultimate Edition),Java 8, Tomcat 9.0.62, MySQL 8.0.26
1. 创建Java EE工程
Additional Libraries and Frameworks中选择Web Application
若没有Java EE,通过Ctrl+Alt+Shift+/调出Maintanence,单击Registry进入搜索javaee.legacy.project.wizard,在Value中选中,再新建工程即有Java EE选项。
2. 创建工程后,在WEB-INF目录下分别新建目录classes和lib
3. 设置classes目录为输出目录,并添加lib目录为依赖,如下图完成Paths和Dependencies设置
4. 以实现查询用户信息为例,使用如下SQL语句在MySQL中添加用户数据
create database serverjava;
use serverjava;
create table usertable(userId int, userPhone varchar(20), userName varchar(20), userPwd varchar(20));
insert into usertable values(1,'17612345678','zhangsan','123456'),(2,'15887654321','lisi','1234'),(3,'15812341234','wangwu','1235');
select * from usertable;
5. 选择c3p0和dbutils进行数据库连接,在lib目录中导入c3p0, commons-dbutils, mchange-commons-java, mysql-connector-java, mysql-connector-java-x.x.x-bin包(缺一不可), mysql-connector-java-x.x.x-bin包若无会导致实例化Servlet错误
jar包下载地址:
Maven Repository: Search/Browse/Explore (mvnrepository.com)
JAR Search - findJAR.com
6. 在src目录下创建数据库配置文件c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/serverjava?serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">123456</property>
</default-config>
</c3p0-config>
由于mysql版本为8.0以上,<property name="driverClass">中com.mysql.jdbc.Driver需改为com.mysql.cj.jdbc.Driver;且需要设置CST,因此<property name="jdbcUrl">中数据库名serverjava后添加?serverTimezone=UTC(否则有可能会报错:caused by java.sql.sqlexception the server time zone value '?й???????' is unrecognized or represent)。
7. 在src目录下创建db包,并在包中新建JDBCUtils类
package db;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtils {
private static ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
public static Connection getConnection() throws SQLException{
return comboPooledDataSource.getConnection();
}
public static DataSource getDataSource(){
return comboPooledDataSource;
}
public static void release(ResultSet rs, Statement stmt, Connection conn){
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
release(stmt, conn);
}
public static void release(Statement stmt, Connection conn) {
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;
}
}
}
8. 在db包中创建bean包,并在bean包中创建要操作表的bean类UserBean
package db.bean;
public class UserBean {
private int userId;
private String userPhone;
private String userName;
private String userPwd;
public String getUserPhone() {
return userPhone;
}
public void setUserPhone(String userPhone) {
this.userPhone = userPhone;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
}
9. 在src目录下新建Servlet包,并在包中创建DemoServlet类(继承HttpServlet),重写doGet和doPost两个方法以用于分别处理get请求和post请求,并实现查询数据库
package Servlet;
import db.JDBCUtils;
import db.bean.UserBean;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
public class DemoServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String account = request.getParameter("account");
String password = request.getParameter("password");
System.out.println("account:" + account + "\npassword:" + password);
String result = "Database reading error!";
if (account == null) {
result = "Account is null!";
} else if (password.isEmpty()) {
result = "Password is null!";
} else {
QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());
String sql5 = "select * from usertable where userName="+"'"+account+"'";
try {
UserBean userBean = runner.<UserBean>query(sql5, new BeanHandler<UserBean>(UserBean.class));
if (userBean != null) {
if (password.endsWith(userBean.getUserPwd())) {
result = "Login successful!";
} else {
result = "Password doesn't match account, login failed!";
}
} else {
result = "Account does not exist!";
}
} catch (SQLException e) {
e.printStackTrace();
}
}
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.println(result);
pw.flush();
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
super.doPost(request, response);
}
}
(account是String类型,SQL查询语句中需加引号)
10. 编辑web/WEB-INF/web.xml以对DemoServlet进行注册
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>DemoServlet</servlet-name>
<servlet-class>Servlet.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DemoServlet</servlet-name>
<url-pattern>/DemoServlet</url-pattern>
</servlet-mapping>
</web-app>
或在声明DemoServlet前使用注解进行注册
@WebServlet(name="DemoServlet",urlPatterns="/DemoServlet")
public class DemoServlet extends HttpServlet {
//fields and methods
}
11. 配置Tomcat
Edit SignConfigurations->"+"->tomcat service->local,URL可做修改(若不修改显示的会是index.jsp中内容)
12. 运行
将域名修改为(用户名与密码匹配)localhost:8080/GJPServlet_war_exploded/DemoServlet?account=lisi&password=1234
若密码错误localhost:8080/GJPServlet_war_exploded/DemoServlet?account=lisi&password=1235
参考:用IDEA进行Java后台开发(一)_小小9575的博客-CSDN博客_idea java开发