一个Servlet登陆的案例
下面会用到数据库JDBC、Tomcat等。
下面的这个例子非常简单,相信学过Servlet、数据库等知识后都能看懂,但是在这儿我要说的是一个特别坑的地方。
本人用的是idea的编译器,导入数据库驱动后发现一直在报错,检查了好久,都没找到问题所在,最后发现导入内容是没有用的,导入内容只是给编译器看的,但是Java Web的项目是靠Tomcat运行的所以需要在web\WEB-INF下创建一个lib目录,然后将驱动程序包复制进去,然后就一切都好了。
下面的是登陆用的Servlet。
mysql.ini文件的内容大致如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/(这里填写数据库名)?useUnicode=true&characterEncoding=utf-8&useSSL=false
user=root
pass=*(密码是自己的,账号也是自己的)
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.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
@WebServlet(name = "Test2", urlPatterns = "/Test2")
public class Test2 extends HttpServlet {
private String driver;
private String url;
private String user;
private String pass;
public void initParam(String fileName) {
Properties props = new Properties();
try {
props.load(new FileInputStream(fileName));
driver = props.getProperty("driver");
url = props.getProperty("url");
user = props.getProperty("user");
pass = props.getProperty("pass");
} catch (FileNotFoundException fnfe) {
System.out.println("找不到数据库驱动配置文件");
fnfe.printStackTrace();
}
catch (IOException e) {
System.out.println("加载数据库驱动配置文件出错");
e.printStackTrace();
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/data;charset=UTF-8");
// 加载数据库驱动配置
initParam("E:\\project\\CollectionElfin\\mysql.ini");
// 启动数据库
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
System.out.println("找不到数据库驱动");
e.printStackTrace();
}
BufferedReader in = new BufferedReader(req.getReader());
PrintWriter out = resp.getWriter();
String account = in.readLine();
String password = in.readLine();
try (
Connection conn = DriverManager.getConnection(url, user, pass);
Statement stmt = conn.createStatement()
) {
ResultSet resultSet = stmt.executeQuery("select account, password from test " +
"where account = '" + account + "' and password = '" + password + "';");
if (resultSet.next()) {
out.println("登陆成功");
out.flush();
} else {
out.println("登陆失败");
out.flush();
}
// 这里也可以做跳转等其他工作。
} catch (Exception e) {
e.printStackTrace();
}
}
}
下面的是一个Java写的测试类,使用的是模拟Web发送请求。
当然也可以使用HTML等测试。
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
public class LoginTest {
public static void sendPost(String url, String param) {
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
// 发送POST请求必须设置如下两行
conn.setDoInput(true);
conn.setDoOutput(true);
try (
// 获取URLConnection对象对应的输出流
PrintWriter out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8"))
) {
out.println("1293141942");
out.println("abcdefg");
out.flush();
}
try (
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(),
"UTF-8"))
) {
System.out.println(in.readLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
sendPost("http://localhost:8080/Test2", null);
}
}