前言
为什么写这篇文章:我的一篇学习笔记,同时分享给大家,互帮互助共同进步。
适宜人群:java初学者
你将学习到:servlet相关知识
条件:java开发相关环境(jdk、mysql、Tomcat、idea)
资料参考:网络,https://blog.csdn.net/qq_19782019/article/details/80292110
注意:本文仅供学习使用,如有侵权,请联系作者删除。
一、servlet知识点梳理
1.什么是servlet
servlet是用Java编写的服务器端程序,其主要功能在于交互式地浏览和修改数据,生成动态Web内容。Servlet技术的核心是Servlet,它是所有Servlet类必须直接或者间接实现的一个接口。
2.servlet是如何工作的?
- 客户端发送请求到服务器
- 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
- 服务器将响应返回客户端
3.servlet的工作原理
用户请求致使Servlet容器调用Servlet的Service()方法,并传入一个ServletRequest对象和一个ServletResponse对象。ServletRequest对象和ServletResponse对象都是由Servlet容器(例如TomCat)封装好的,并不需要程序员去实现,程序员可以直接使用这两个对象。ServletRequest中封装了当前的Http请求,因此,开发人员不必解析和操作原始的Http数据。ServletResponse表示当前用户的Http响应,程序员只需直接操作ServletResponse对象就能把响应轻松的发回给用户。
4.servlet接口中定义的5个方法
- init():只有在servlet第一次被请求时会调用此方法,调用这个方法时,Servlet容器会传入一个ServletConfig()对象进来从而对Servlet对象进行初始化。
- getServletConfig:这个方法会返回Servlet的一段描述,可以返回一段字符串。
- service():每当请求Servlet时,Servlet容器就会调用这个方法。
- getServletInfo():返回Servlet的一段描述,返回由Servlet容器传给init( )方法的ServletConfig对象。
- destroy():当Servlet被销毁时,Servlet容器就会调用这个方法,一般在这个方法中会写一些清除代码。
5.servlet的生命周期
init( ),service( ),destroy( )是Servlet生命周期的方法。代表了Servlet从“出生”到“工作”再到“死亡 ”的过程。
1.init( ),当Servlet第一次被请求时,Servlet容器就会开始调用这个方法来初始化一个Servlet对象出来,但是这个方法在后续请求中不会在被Servlet容器调用,就像人只能“出生”一次一样。我们可以利用init( )方法来执行相应的初始化工作。调用这个方法时,Servlet容器会传入一个ServletConfig对象进来从而对Servlet对象进行初始化。
2.service( )方法,每当请求Servlet时,Servlet容器就会调用这个方法。就像人一样,需要不停的接受老板的指令并且“工作”。第一次请求时,Servlet容器会先调用init( )方法初始化一个Servlet对象出来,然后会调用它的service( )方法进行工作,但在后续的请求中,Servlet容器只会调用service方法了。
3.destory,当要销毁Servlet时,Servlet容器就会调用这个方法,就如人一样,到时期了就得死亡。在卸载应用程序或者关闭Servlet容器时,就会发生这种情况,一般在这个方法中会写一些清除代码。
6.ServletRequset接口
Servlet容器对于接受到的每一个Http请求,都会创建一个ServletRequest对象,并把这个对象传递给Servlet的Sevice( )方法。其中,ServletRequest对象内封装了关于这个请求的许多详细信息。
方法:
7.ServletResponse接口
ServletResponse接口表示一个Servlet响应,在调用Servlet的Service( )方法前,Servlet容器会先创建一个ServletResponse对象,并把它作为第二个参数传给Service( )方法。ServletResponse隐藏了向浏览器发送响应的复杂过程。
方法:
8.ServletContext对象
有了ServletContext对象,就可以共享从应用程序中的所有资料处访问到的信息,并且可以动态注册Web对象。
方法:
9.解决Request的乱码问题
post提交方式:
request.setCharacterEncoding("UTF-8");
get提交的方式:
parameter = newString(parameter.getbytes("iso8859-1"),"utf-8");
10.解决Response的乱码问题
response.setContentType("text/html;charset=utf-8");
上面这行代码做了两件事情:设置HttpServletResponse使用utf-8编码,通知浏览器使用utf-8编码。
11.会话跟踪技术(cookie和session)
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
(1)什么是cookie
可以理解为服务器给客户端们颁发一个通行证,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了
(2)什么是session
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
(3)cookie和session的区别
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- 安全性方面来说,session要比cookie安全。
- 存储容量方面,单个cookie保存的数据不能超过4K,Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型。
- 生存周期不同,一个是IE启动到IE关闭.(浏览器页面一关 ,session就消失了),一个是预先设置的生存周期,或永久的保存于本地的文件。(cookie)
二、基于servlet+jdbc的登录案例
1.需求分析
(1)编写login.html登录页面,username & password两个输入框
(2)使用原生JDBC操作数据库
(3)登录成功,跳转到Success页面,显示“登陆成功。用户名,欢迎您”
(4)登录失败,跳转到Fail页面,显示“登录失败,用户名或密码错误”
2.准备以下文件
(1)login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/servlet/loginServlet" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
注意路径,form表单里的action属性对应自己的
(2)jdbc.properties
url=jdbc:mysql:///servlet
user=root
password=root
driver=com.mysql.jdbc.Driver
这里的servlet为我的数据库
(3)相关jar包
链接:https://pan.baidu.com/s/1MHayI9JG3XcMqaUlzwUC_w
提取码:c9hc
复制这段内容后打开百度网盘手机App,操作更方便哦
(4)创建数据库环境
CREATE DATABASE servlet;
USE servlet;
CREATE TABLE user(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32) UNIQUE NOT NULL,
password VARCHAR(32) NOT NULL
);
数据库创建好后,可以自己添加一两行测试数据
3.创建新的javaEE项目
4.将login.html复制到web目录下,将jdbc.properties复制到src下
5.导入jar包
链接:https://pan.baidu.com/s/1VTTv4tF0Oxa_UXDoE3Sdxw
提取码:3c92
复制这段内容后打开百度网盘手机App,操作更方便哦
6.编写Dao
public class UserDao {
/**
* 登录方法
*
* @param username
* @param password
* @return
*/
public boolean login(String username, String password) {
if (username == null || password == null) {
return false;
}
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//获取连接
conn = JDBCUtils.getConnection();
//定义SQL
String sql = "select * from user where username = ? and password = ?";
//获取执行SQL的对象
pstmt = conn.prepareStatement(sql);
//给问号赋值
pstmt.setString(1,username);
pstmt.setString(2,password);
//执行查询,获取结果集对象
rs = pstmt.executeQuery();
//判断结果
return rs.next();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.close(rs, pstmt, conn);
}
return false;
}
}
7.创建JDBC工具类
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
/**
* jdbc.properties文件的读取
*/
static {
try {
Properties pro = new Properties();
//获取src路径下的文件
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
pro.load(new FileReader(path));
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取连接
*
* @return
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
/**
* 释放资源
*
* @param stmt
* @param conn
*/
public static void close(Statement stmt, Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
8.编写LoginServlet类
(1)LoginServlet
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码
req.setCharacterEncoding("utf-8");
//获取请求参数
String username = req.getParameter("username");
String password = req.getParameter("password");
//调用UserDao的login方法
boolean flag = new UserDao().login(username, password);
//判断
if (flag) {
//存储数据
req.setAttribute("username",username);
//转发
req.getRequestDispatcher("/successServlet").forward(req,resp);
} else {
req.getRequestDispatcher("/failServlet").forward(req,resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
(2)SuccessServlet
@WebServlet("/successServlet")
public class SuccessServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取request域中共享的数据
String username = (String) request.getAttribute("username");
//设置编码
response.setContentType("text/html;charset=utf-8");
//输出
response.getWriter().write("登录成功!"+username+"欢迎你。");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
(3)FailServlet
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码
response.setContentType("text/html;charset=utf-8");
//输出
response.getWriter().write("登录失败,用户名或密码错误");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
9.启动Tomcat展示结果
\