前言
源代码地址
因为最近这段时间在看java web开发的一些东西 因为spring mvc框架是封装了servlet而来的 所以觉得很有必要学习一下servlet 以便后面如果学习spring mvc等框架的时候可以有助于理解 进而写了一个包含mysql连接 cookies设置 session attribute设置和检验的简单demo
servlet架构
servlet生命周期
- 第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。
- Servlet 容器在调用 service() 方法之前加载 Servlet。
- 然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法。
使用了tomcat作为servlet容器
tomcat实现了对servlet和jsp的支持 并提供了作为web服务器的一些特有功能
如Tomcat管理和控制平台、安全域管理和Tomcat阀等 由于tomcat内置了一个http服务器 它也可以被单独视为一个web服务器
但是不能将tomcat和apache http web服务器混淆 这两个http web服务器不是捆绑在一起的
tomcat的可以通过xml文件格式的配置文件进行配置
在intellij idea进行tomcat server运行配置
这个在网上找到一个博客写的很详尽 这里就不重复了
tomcat server运行配置
login demo
文件结构
数据库
在mysql中设置一个如下结构的表(因为仅仅是写一个简单的登录demo 所以没有考虑密码哈希之类的问题)
添加一个实例
数据库连接1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50package servletPackage;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.ResultSet;
public class FindPsw {
// 加载JDBC引擎的路径
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
// 数据库链接的URI
static final String DB_URL = "jdbc:mysql://localhost:3306/javaTest";
// 连接数据库的用户名
static final String USER = "root";
// 数据库密码
static final String PSW = "Gzm20125";
public String getPsw(String name) {
// 数据库连接对象
Connection conn;
// 执行语句的statement对象 类似于python-connector的cursor
Statement stmt;
String psw;
try {
// 加载JDBC引擎
Class.forName(JDBC_DRIVER);
// 建立数据库链接
conn = DriverManager.getConnection(DB_URL, USER, PSW);
// 获取statement
stmt = conn.createStatement();
String stmtToExec = String.format("select psw from testUser where name = '%s';", name);
System.out.println("exec string is " + stmtToExec);
// 执行查询语句 返回结果
ResultSet rs = stmt.executeQuery(stmtToExec);
if (rs.next()) {
psw = rs.getString("psw");
}
else {
psw = "";
}
rs.close();
stmt.close();
conn.close();
return psw;
}catch (Exception e) {
e.printStackTrace();
return "";
}
}
}
登录页面1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35package servletPackage;
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.io.PrintWriter;
/* 声明/login资源 使用Login这个类作作为视图类 */
"/login") (
public class Login extends HttpServlet {
// 重写doGet方法 处理get请求
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 在response中写入一个登录form
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE html>\n" +
"<html lang='en-US'>\n" +
"<head>\n" +
" <meta charset='utf-8'>\n" +
"</head>\n" +
"<body>\n" +
"<h1>login</h1>\n" +
"<form action='/postDeal' method='post'>\n" +
" <input type='text' name='user'>\n" +
"<br>" +
" <input type='text' name='password'>\n" +
"<br>" +
" <input type='submit'>\n" +
"</form>\n" +
"</body>\n" +
"</html>"
);
out.close();
}
}
表单 cookies session的处理1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46package servletPackage;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
"/postDeal") (
public class PostDeal extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 获取表单中的用户和密码
String user = req.getParameter("user");
String psw = req.getParameter("password");
// 使用刚刚数据库连接的类进行数据库查询 获取正确密码
FindPsw f = new FindPsw();
String rightPsw = f.getPsw(user);
System.out.println("right psw is " + rightPsw);
PrintWriter out = resp.getWriter();
// 如果密码正确
if (psw.equals(rightPsw)) {
// add cookies
Cookie login = new Cookie("login", "mylogin");
resp.addCookie(login);
// add session attribute
HttpSession session = req.getSession();
session.setAttribute("login", "this is my login session");
// add response text
out.println(
"<p>login successfully user " + user + " psw is " + psw + "</p>" +
"<a href='/checkSession'>this is a page to check whether set session attribute</a>"
);
}
else {
out.println("<p>psw is error</p>");
}
}
// 登录表单提交过来这个书图类之后 doPost函数首先接受到请求 随之转发给doGet函数 由doGet函数进行处理
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
doGet(req, resp);
}
}
检查session attribute是否被成功设置1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25package servletPackage;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
//这个视图用来测试客户端是否被成功设置了session attribute
"/checkSession") (
public class checkSession extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 获取客户端的session
HttpSession session = req.getSession();
// 获取session attribute
String login = (String) session.getAttribute("login");
System.out.println("login session is " + login);
PrintWriter out = resp.getWriter();
out.println("login session is " + login);
out.close();
}
}
效果
登录
登录成功
登录失败
检测session attribute