博主声明:
转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主 威威喵 原创,请多支持与指教。
本文首发于此 博主:威威喵 | 博客主页:https://blog.csdn.net/smile_running
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
Servlet生命周期
Servlet本身仅是一个接口,它并不是实现类。所以我们只能实现Servlet接口,通过接口里的方法来走一遍它的生命周期吧。
首先,我新建了一个 HelloServlet ,实现Servlet接口,载入接口提供的方法。代码如下:
package com.xww;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet implements Servlet{
@Override
public void destroy() {
System.out.println("destroy");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("service");
}
}
要想让它跑起来,我们还缺对它的配置。在 web.xml 中配置 Servlet 代码如下:
HelloServlet
com.xww.HelloServlet
HelloServlet
/hello
这里解释一下上面这几个属性的作用。
从上图可以看出我访问了 4 次,这样就可以得出Servlet的生命周期了。
Servlet的生命周期:
Servlet接口使用
介绍了Servlet接口,接下来是关于Servlet的一些常用方法。首先,是Servlet提供的 init() 方法,这个方法里有了一个
ServletConfig 参数,我们可以利用 ServletConfig 来获取一下关键信息。例如:
1. 先在 web.xml 文件中加入如下代码来设置 web 应用的全局参数(键值对方式)
username
admin
password
12345
2. 我们现在可以通过 ServletConfig 来获取这个参数了,在 init() 方法中写入如下代码:
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
ServletContext context = config.getServletContext();
String username = context.getInitParameter("username");
String password = context.getInitParameter("password");
System.out.println("username:" + username);
System.out.println("password:" + password);
}
借助 ServletContext 来获取 web 应用的全局参数值,其结果也如出一辙的打印到控制台
3. 到此为止,还没使用到请求。接着我新建了一个 login.html 文件,简单的利用表单提交方式来配合 servlet 的功能。 login.html代码如下:
login.html
Login page.
以上需要注意的是,action 内容要与配合调用的 servlet 的
4. 修改 HelloServlet 类,添加如下代码:
package com.xww;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet implements Servlet{
private ServletContext servletContext;
@Override
public void destroy() {
System.out.println("destroy");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
servletContext = config.getServletContext();
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("service");
// 获取请求的参数内容
String user = req.getParameter("user");
String pwd = req.getParameter("pwd");
System.out.println("请求:user:" + user);
System.out.println("请求:pwd:" + pwd);
// 获取 web 应用全局参数
String username = servletContext.getInitParameter("username");
String password = servletContext.getInitParameter("password");
System.out.println("配置:user:" + username);
System.out.println("配置:password:" + password);
PrintWriter out = res.getWriter();
if (username.equals(user) && password.equals(pwd)) {
out.println("login succeed");
}else{
out.println("login failed");
}
}
}
5. 验证是否能够登入成功,>当然可以登入了。
此类是 Servlet 接口的实现类,通过继承 HttpServlet 可以简化不需要的代码。比如, Servlet 接口中的 getServletConfig() 、
getServletInfo() 、destroy() 等方法都是不经常去使用的。我们继承自 HttpServlet 类的代码就很简单明了:
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
一般地,我们经常会用到的两种请求方式:Get 、Post,通常会覆盖 doGet() 、doPost() 这两种方法。所以,在之后我们就直接继承 HttpServlet 类而不需要去实现 Servlet接口了,大大的简化了不必要的代码。
通过如上的几个知识点的综合,我写了一个小案例。在 login.html 中提交表单到 LoginServlet 利用 JDBC 连接 MySQL数据库 进行比对。若数据库中含有该账户,则登入成功,否则失败。
Servlet代码:
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
Connection conn = null;
Statement statement = null;
ResultSet result = null;
PrintWriter out = resp.getWriter();
boolean isFind = false;
String user = req.getParameter("user");
String pwd = req.getParameter("pwd");
System.out.println("请求:user:" + user);
System.out.println("请求:pwd:" + pwd);
try {
conn = JdbcUtils.getConnection();
statement = conn.createStatement();
result = statement.executeQuery("SELECT * FROM user");
//循环遍历数据库,比对数据
while (result.next()) {
String db_user = result.getString("user");
String db_password = result.getString("password");
System.out.println("数据库:user:" + db_user);
System.out.println("数据库:pwd:" + db_password);
if (user.equals(db_user) && pwd.equals(db_password)) {
isFind = true;
break;
} else {
isFind = false;
}
}
if (isFind) {
out.println("find,login succeed");
} else {
out.println("not find,login failed");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.release(statement, conn, result);
}
}
}
连接数据库的代码:
public class JdbcUtils {
public static Connection getConnection() throws Exception {
/**
* 步骤:
* 1. 声明 driver、jdbcUrl、user、password 四个变量
* 2. 新建 jdbc.properties 配置文件,使其在不改源码情况下,变更数据库
* 3. 获取 jdbc.properties 文件参数,利用Java反射和输入流方式获取
* 4. Class.forName(driver);加载驱动
* 5. 获取连接实例
*/
String driver = null;
String jdbcUrl = null;
String user = null;
String password = null;
InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
properties.load(inputStream);
driver = properties.getProperty("driver");
jdbcUrl = properties.getProperty("jdbcUrl");
user = properties.getProperty("user");
password = properties.getProperty("password");
Class.forName(driver);
Connection conn = (Connection) DriverManager.getConnection(jdbcUrl, user, password);
return conn;
}
public static void release(Statement statement, Connection conn, ResultSet result) {
try {
if (statement != null) {
statement.close();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if (result != null) {
result.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
MySQL数据库 user 表
我们用 ‘李四’ 来测试一下,登入成功了。