Servlet JDBC数据库连接示例

时间:2020-02-23 14:41:52  来源:igfitidea点击:

Servlet JDBC数据库连接和Log4j集成是本教程的主题。
我们提供了许多有关Java Servlet的教程,该教程旨在使用所有这些信息来创建具有数据库连接性和log4j集成的完整Web应用程序以进行日志记录。

如果您不熟悉这些教程,我强烈建议您查看以下教程。
它们全部包含示例项目,您可以下载并运行它们以了解Servlet API的核心概念。

  • J2EE Web应用程序概述
  • Servlet教程
  • Servlet中的会话管理
  • Servlet过滤器
  • Servlet侦听器
  • Servlet异常处理
  • Servlet Cookie示例

Servlet JDBC示例

开发应具有以下功能的Web应用程序。

  • 用户可以注册,然后登录到该应用程序。

  • 用户信息应保存在数据库中。

  • 使用标准的日志记录框架log4j。

  • 该应用程序应支持会话管理,没有会话的任何JSP都不可见。
    用户可以随时从应用程序注销。

  • 如果应用程序出现任何异常或者其他常见错误(例如404),我们不应向用户显示应用程序和服务器的详细信息。

准备好基本应用程序后,便可以继续添加其他功能。

设计决策

  • 由于登录页面是应用程序的入口点,因此我们将有一个简单的login.html,用户可以其中输入其凭据;电子邮件和密码。
    我们不能依靠javascript验证,因此我们将进行服务器端验证,如果信息丢失,我们会将用户重定向到包含错误详细信息的登录页面。

  • 我们将提供一个register.html,用户可以从中注册到我们的应用程序,我们将在登录页面中为新用户提供其链接。
    用户应提供用于注册的电子邮件,密码,名称和国家/地区详细信息。
    如果缺少任何信息,则用户将停留在同一页面上,并显示错误消息。
    如果注册成功,用户将被引导到带有注册成功信息的登录页面,他们可以使用电子邮件和密码登录。

  • 我们将使用MySql数据库保存用户信息。
    我们将为我们的应用程序创建一个新的数据库,user和Users表。
    由于我们的应用程序完全依赖于数据库连接,因此我们将创建一个Servlet上下文侦听器来初始化数据库连接,并将其设置为其他Servlet的上下文属性。
    我们将通过部署描述符保持数据库配置细节的可配置性。
    我们还将MySql Java Connector jar添加到应用程序库中。

  • 由于我们要使用log4j并在使用前对其进行正确配置,因此我们将利用servlet上下文侦听器来配置log4j,并将log4j配置XML文件的位置保留在web.xml init参数中。
    我们将在单独的日志文件dbexample.log中编写应用程序日志,以便于调试。

  • 如果出现"数据库连接错误"或者404错误之类的异常,我们希望向用户展示一个有用的页面。
    我们将利用servlet异常处理,并编写我们自己的Exception Handler servlet,并在部署描述符中对其进行配置。

  • 一旦用户成功登录,我们将为该用户创建一个会话并将其转发到home.jsp,其中将显示该用户的基本信息。
    我们将有一个模型类User,它将用户数据存储到会话中。
    用户主页还提供注销按钮,该按钮将使会话无效并将其转发到登录页面。

  • 我们需要确保仅当用户具有有效的会话时,才能访问所有JSP和其他资源,而不是在所有资源中保留会话验证登录,我们将创建一个用于会话验证的Servlet过滤器,并在部署描述符中对其进行配置。

  • 我们将使用Servlet 3.0功能进行Servlet配置,侦听器和过滤器,而不是将所有这些功能都保留在部署描述符中。
    我们将使用Eclipse进行开发,并使用Tomcat 7进行部署。

基于上述要求和设计决策,我们将创建动态Web项目,其项目结构如下图所示。

让我们了解每个组件并了解其实现。

Servlet JDBC示例–数据库设置

我们将在MySql脚本下面使用新的数据库,用户和表设置,以在我们的应用程序中使用。

-- login with root to create user, DB and table and provide grants
 
create user 'hyman'@'localhost' identified by 'hyman123';

grant all on *.* to 'hyman'@'localhost' identified by 'hyman123';

create database UserDB;

use UserDB;

CREATE TABLE `Users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL DEFAULT '',
`email` varchar(20) NOT NULL DEFAULT '',
`country` varchar(20) DEFAULT 'USA',
`password` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

登录和注册HTML页面

登录和注册HTML页面是简单的页面,具有用于提交用户信息的表单,其代码如下所示。

login.html代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="US-ASCII">
<title>Login Page</title>
</head>
<body>
<h3>Login with email and password</h3>
<form action="Login" method="post">
User Email:<input type="text" name="email"><br>
Password:<input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
<br>
If you are new user, please <a href="register.html">register</a>.
</body>
</html>

register.html代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="US-ASCII">
<title>Register Page</title>
</head>
<body>
<h3>Provide all the fields for registration.</h3>
<form action="Register" method="post">
Email ID:<input type="text" name="email"><br>
Password:<input type="password" name="password"><br>
Name:<input type="text" name="name"><br>
Country:<input type="text" name="country"><br>
<input type="submit" value="Register">
</form>
<br>
If you are registered user, please <a href="login.html">login</a>.
</body>
</html>

部署描述符和log4j配置

我们将在WEB-INF文件夹中拥有log4j配置文件,它将与应用程序WAR文件打包在一起。

log4j.xml代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="https://jakarta.apache.org/log4j/"
	debug="false">
	<appender name="dbexample" class="org.apache.log4j.RollingFileAppender">
		<param name="File" value="${catalina.home}/logs/dbexample.log"
		<param name="Append"            value="true" 
		<param name="ImmediateFlush"    value="true" 
		<param name="MaxFileSize"       value="20MB" 
		<param name="MaxBackupIndex"    value="10" 
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-4r [%t] %-5p %c %x - %m%n" 
		</layout>
	</appender>
	
	<logger name="com.theitroad" additivity="false">
		<level value="DEBUG" 
		<appender-ref ref="dbexample"
	</logger>
	
	<root>
		<level value="debug" 
		<appender-ref ref="dbexample" 
	</root>
	
</log4j:configuration>

我们的部署描述符(web.xml)如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>ServletDBLog4jExample</display-name>
<welcome-file-list>
  <welcome-file>login.html</welcome-file>
</welcome-file-list>
<context-param>
  <param-name>dbUser</param-name>
  <param-value>hyman</param-value>
</context-param>
<context-param>
  <param-name>dbPassword</param-name>
  <param-value>hyman123</param-value>
</context-param>
<context-param>
  <param-name>dbURL</param-name>
  <param-value>jdbc:mysql://localhost:3306/UserDB</param-value>
</context-param>
<context-param>
  <param-name>log4j-config</param-name>
  <param-value>WEB-INF/log4j.xml</param-value>
</context-param>

<error-page>
  <error-code>404</error-code>
  <location>/AppErrorHandler</location>
</error-page>
<error-page>
  <exception-type>java.lang.Throwable</exception-type>
  <location>/AppErrorHandler</location>
</error-page>

<filter>
  <filter-name>AuthenticationFilter</filter-name>
  <filter-class>com.theitroad.servlet.filters.AuthenticationFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>AuthenticationFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>

请注意web.xml配置中的以下几点。

  • 在"欢迎文件"列表中提供了login.html欢迎文件。

  • 数据库连接参数可配置,并作为servlet上下文初始化参数保存。

  • log4j配置文件的位置也是可配置的,相对位置作为上下文初始化参数提供。

  • 我们的自定义异常处理程序Servlet AppErrorHandler配置为处理应用程序代码和404错误引发的所有异常。

  • AuthenticationFilter配置为过滤对应用程序的所有传入请求,这是我们拥有会话验证逻辑的地方。

模型类和数据库连接管理器类

User.java是一个简单的Java Bean,它将用户信息保存为会话属性。

package com.theitroad.util;

import java.io.Serializable;

public class User implements Serializable{
	
	private static final long serialVersionUID = 6297385302078200511L;
	
	private String name;
	private String email;
	private int id;
	private String country;
	
	public User(String nm, String em, String country, int i){
		this.name=nm;
		this.id=i;
		this.country=country;
		this.email=em;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public void setId(int id) {
		this.id = id;
	}

	public void setCountry(String country) {
		this.country = country;
	}

	public String getName() {
		return name;
	}

	public String getEmail() {
		return email;
	}

	public int getId() {
		return id;
	}

	public String getCountry() {
		return country;
	}
	
	@Override
	public String toString(){
		return "Name="+this.name+", Email="+this.email+", Country="+this.country;
	}
}

DBConnectionManager.java是MySql数据库连接的实用程序类,它具有返回连接对象的方法。
我们将使用此类进行数据库连接,然后将连接对象设置为其他servlet可以使用的servlet上下文属性。

package com.theitroad.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnectionManager {

	private Connection connection;
	
	public DBConnectionManager(String dbURL, String user, String pwd) throws ClassNotFoundException, SQLException{
		Class.forName("com.mysql.jdbc.Driver");
		this.connection = DriverManager.getConnection(dbURL, user, pwd);
	}
	
	public Connection getConnection(){
		return this.connection;
	}
}

Servlet JDBC示例–上下文侦听器

AppContextListener.java是servlet上下文侦听器实现,它将在初始化应用程序上下文时初始化数据库连接,并且还使用其配置xml文件配置log4j。
注意,将上下文初始化参数用于数据库连接和log4j配置。

当上下文将被销毁时,我们将在contextDestroyed()方法中关闭数据库连接。

由于我们使用的是Servlet 3,因此无需在web.xml中对其进行配置,而只需使用@WebListener注释对其进行注释。

package com.theitroad.servlet.listeners;

import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.xml.DOMConfigurator;

import com.theitroad.util.DBConnectionManager;

@WebListener
public class AppContextListener implements ServletContextListener {

  public void contextInitialized(ServletContextEvent servletContextEvent) {
  	ServletContext ctx = servletContextEvent.getServletContext();
  	
  	//initialize DB Connection
  	String dbURL = ctx.getInitParameter("dbURL");
  	String user = ctx.getInitParameter("dbUser");
  	String pwd = ctx.getInitParameter("dbPassword");
  	
  	try {
			DBConnectionManager connectionManager = new DBConnectionManager(dbURL, user, pwd);
			ctx.setAttribute("DBConnection", connectionManager.getConnection());
			System.out.println("DB Connection initialized successfully.");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
  	
  	//initialize log4j
  	String log4jConfig = ctx.getInitParameter("log4j-config");
  	if(log4jConfig == null){
  		System.err.println("No log4j-config init param, initializing log4j with BasicConfigurator");
			BasicConfigurator.configure();
  	}else {
			String webAppPath = ctx.getRealPath("/");
			String log4jProp = webAppPath + log4jConfig;
			File log4jConfigFile = new File(log4jProp);
			if (log4jConfigFile.exists()) {
				System.out.println("Initializing log4j with: " + log4jProp);
				DOMConfigurator.configure(log4jProp);
			} else {
				System.err.println(log4jProp + " file not found, initializing log4j with BasicConfigurator");
				BasicConfigurator.configure();
			}
		}
  	System.out.println("log4j configured properly");
  }

  public void contextDestroyed(ServletContextEvent servletContextEvent) {
  	Connection con = (Connection) servletContextEvent.getServletContext().getAttribute("DBConnection");
  	try {
			con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
  }
	
}

异常和错误处理程序

AppErrorHandler.java是在部署描述符中配置的我们的应用程序异常处理程序servlet,它在出现404错误或者应用程序级异常的情况下向用户提供有用的信息,并提供超链接以转到应用程序的登录页面。

package com.theitroad.servlet.errorhandler;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/AppErrorHandler")
public class AppErrorHandler extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		processError(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		processError(request, response);
	}
	
	private void processError(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		//Analyze the servlet exception
		Throwable throwable = (Throwable) request
				.getAttribute("javax.servlet.error.exception");
		Integer statusCode = (Integer) request
				.getAttribute("javax.servlet.error.status_code");
		String servletName = (String) request
				.getAttribute("javax.servlet.error.servlet_name");
		if (servletName == null) {
			servletName = "Unknown";
		}
		String requestUri = (String) request
				.getAttribute("javax.servlet.error.request_uri");
		if (requestUri == null) {
			requestUri = "Unknown";
		}
		
		//Set response content type
	      response.setContentType("text/html");
	 
	      PrintWriter out = response.getWriter();
	      out.write("<html><head><title>Exception/Error Details</title></head><body>");
	      if(statusCode != 500){
	    	  out.write("<h3>Error Details</h3>");
	    	  out.write("Status Code:"+statusCode+"<br>");
	    	  out.write("Requested URI:"+requestUri);
	      }else{
	    	  out.write("<h3>Exception Details</h3>");
	    	  out.write("<ul><li>Servlet Name:"+servletName+"</li>");
	    	  out.write("<li>Exception Name:"+throwable.getClass().getName()+"</li>");
	    	  out.write("<li>Requested URI:"+requestUri+"</li>");
	    	  out.write("<li>Exception Message:"+throwable.getMessage()+"</li>");
	    	  out.write("</ul>");
	      }
	      
	      out.write("<br>");
	      out.write("<a href=\"login.html\">Login Page</a>");
	      out.write("</body></html>");
	}
}

Servlet过滤器

AuthenticationFilter.java是我们的Filter实现,我们在这里验证用户会话。

package com.theitroad.servlet.filters;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

@WebFilter("/AuthenticationFilter")
public class AuthenticationFilter implements Filter {

	private Logger logger = Logger.getLogger(AuthenticationFilter.class);
	
	public void init(FilterConfig fConfig) throws ServletException {
		logger.info("AuthenticationFilter initialized");
	}
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		
		String uri = req.getRequestURI();
		logger.info("Requested Resource::"+uri);
		
		HttpSession session = req.getSession(false);
		
		if(session == null && !(uri.endsWith("html") || uri.endsWith("Login") || uri.endsWith("Register"))){
			logger.error("Unauthorized access request");
			res.sendRedirect("login.html");
		}else{
			//pass the request along the filter chain
			chain.doFilter(request, response);
		}	
	}

	public void destroy() {
		//close any resources here
	}
}

请注意,@ WebFilter注释的使用,我们也可以在此处提供用于过滤器的URL模式,但有时最好在web.xml中轻松禁用过滤器。

Servlet类

LoginServlet资源用于验证用户输入的登录信息,并将其转发到主页或者数据丢失的情况下,向用户提供有用的信息。

package com.theitroad.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.RequestDispatcher;
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 org.apache.log4j.Logger;

import com.theitroad.util.User;

@WebServlet(name = "Login", urlPatterns = { "/Login" })
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	static Logger logger = Logger.getLogger(LoginServlet.class);
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String email = request.getParameter("email");
		String password = request.getParameter("password");
		String errorMsg = null;
		if(email == null || email.equals("")){
			errorMsg ="User Email can't be null or empty";
		}
		if(password == null || password.equals("")){
			errorMsg = "Password can't be null or empty";
		}
		
		if(errorMsg != null){
			RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.html");
			PrintWriter out= response.getWriter();
			out.println("<font color=red>"+errorMsg+"</font>");
			rd.include(request, response);
		}else{
		
		Connection con = (Connection) getServletContext().getAttribute("DBConnection");
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = con.prepareStatement("select id, name, email,country from Users where email=? and password=? limit 1");
			ps.setString(1, email);
			ps.setString(2, password);
			rs = ps.executeQuery();
			
			if(rs != null && rs.next()){
				
				User user = new User(rs.getString("name"), rs.getString("email"), rs.getString("country"), rs.getInt("id"));
				logger.info("User found with details="+user);
				HttpSession session = request.getSession();
				session.setAttribute("User", user);
				response.sendRedirect("home.jsp");;
			}else{
				RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.html");
				PrintWriter out= response.getWriter();
				logger.error("User not found with email="+email);
				out.println("<font color=red>No user found with given email id, please register first.</font>");
				rd.include(request, response);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			logger.error("Database connection problem");
			throw new ServletException("DB Connection problem.");
		}finally{
			try {
				rs.close();
				ps.close();
			} catch (SQLException e) {
				logger.error("SQLException in closing PreparedStatement or ResultSet");;
			}
			
		}
		}
	}

}

LogoutServlet很简单,它使用户会话无效并将其转发到登录页面。

package com.theitroad.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

@WebServlet(name = "Logout", urlPatterns = { "/Logout" })
public class LogoutServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	static Logger logger = Logger.getLogger(LogoutServlet.class);
     
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  	response.setContentType("text/html");
  	Cookie[] cookies = request.getCookies();
  	if(cookies != null){
  	for(Cookie cookie : cookies){
  		if(cookie.getName().equals("JSESSIONID")){
  			logger.info("JSESSIONID="+cookie.getValue());
  			break;
  		}
  	}
  	}
  	//invalidate the session if exists
  	HttpSession session = request.getSession(false);
  	logger.info("User="+session.getAttribute("User"));
  	if(session != null){
  		session.invalidate();
  	}
  	response.sendRedirect("login.html");
  }

}

用户使用RegisterServlet注册到应用程序,然后将其转发到带有注册成功消息的登录页面。

package com.theitroad.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.servlet.RequestDispatcher;
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 org.apache.log4j.Logger;

@WebServlet(name = "Register", urlPatterns = { "/Register" })
public class RegisterServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	static Logger logger = Logger.getLogger(RegisterServlet.class);
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String email = request.getParameter("email");
		String password = request.getParameter("password");
		String name = request.getParameter("name");
		String country = request.getParameter("country");
		String errorMsg = null;
		if(email == null || email.equals("")){
			errorMsg = "Email ID can't be null or empty.";
		}
		if(password == null || password.equals("")){
			errorMsg = "Password can't be null or empty.";
		}
		if(name == null || name.equals("")){
			errorMsg = "Name can't be null or empty.";
		}
		if(country == null || country.equals("")){
			errorMsg = "Country can't be null or empty.";
		}
		
		if(errorMsg != null){
			RequestDispatcher rd = getServletContext().getRequestDispatcher("/register.html");
			PrintWriter out= response.getWriter();
			out.println("<font color=red>"+errorMsg+"</font>");
			rd.include(request, response);
		}else{
		
		Connection con = (Connection) getServletContext().getAttribute("DBConnection");
		PreparedStatement ps = null;
		try {
			ps = con.prepareStatement("insert into Users(name,email,country, password) values (?,?,?,?)");
			ps.setString(1, name);
			ps.setString(2, email);
			ps.setString(3, country);
			ps.setString(4, password);
			
			ps.execute();
			
			logger.info("User registered with email="+email);
			
			//forward to login page to login
			RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.html");
			PrintWriter out= response.getWriter();
			out.println("<font color=green>Registration successful, please login below.</font>");
			rd.include(request, response);
		} catch (SQLException e) {
			e.printStackTrace();
			logger.error("Database connection problem");
			throw new ServletException("DB Connection problem.");
		}finally{
			try {
				ps.close();
			} catch (SQLException e) {
				logger.error("SQLException in closing PreparedStatement");
			}
		}
		}
		
	}

}

JSP主页

home.jsp是成功登录后用户的主页,我们仅在此处显示一些用户信息,并为他们提供注销选项。

home.jsp代码:

<%@page import="com.theitroad.util.User"%>
<%@ page language="java" contentType="text/html; charset=US-ASCII"
  pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Home Page</title>
</head>
<body>
<%User user = (User) session.getAttribute("User"); %>
<h3>Hi <%=user.getName() %></h3>
Your Email: <%=user.getEmail() %><br>
Your Country: <%=user.getCountry() %><br>
<br>
<form action="Logout" method="post">
<input type="submit" value="Logout" >
</form>
</body>
</html>

由于我们没有使用JSP标记,因此JSP页面仍然包含许多Java代码,我们将在JSP教程中对此进行研究。
截至目前,请忍受这一点。

运行Servlet JDBC示例应用程序

我们的应用程序可以执行了,我建议将其导出为WAR文件,然后部署到tomcat,而不是将其直接从Eclipse部署到Tomcat服务器,以便您可以轻松地查看log4j日志文件以进行调试。

log4j日志文件:

dbexample.log:

0    [localhost-startStop-1] INFO  com.theitroad.servlet.filters.AuthenticationFilter  - AuthenticationFilter initialized
1    [localhost-startStop-1] INFO  com.theitroad.servlet.filters.AuthenticationFilter  - AuthenticationFilter initialized
37689 [http-bio-8080-exec-3] INFO  com.theitroad.servlet.filters.AuthenticationFilter  - Requested Resource::/ServletDBLog4jExample/
37689 [http-bio-8080-exec-3] ERROR com.theitroad.servlet.filters.AuthenticationFilter  - Unauthorized access request
37693 [http-bio-8080-exec-4] INFO  com.theitroad.servlet.filters.AuthenticationFilter  - Requested Resource::/ServletDBLog4jExample/login.html
51844 [http-bio-8080-exec-5] INFO  com.theitroad.servlet.filters.AuthenticationFilter  - Requested Resource::/ServletDBLog4jExample/register.html
77818 [http-bio-8080-exec-7] INFO  com.theitroad.servlet.filters.AuthenticationFilter  - Requested Resource::/ServletDBLog4jExample/Login
77835 [http-bio-8080-exec-7] INFO  com.theitroad.servlet.LoginServlet  - User found with details=Name=hyman Kumar, [email protected], Country=San Franceco
77840 [http-bio-8080-exec-8] INFO  com.theitroad.servlet.filters.AuthenticationFilter  - Requested Resource::/ServletDBLog4jExample/home.jsp
98251 [http-bio-8080-exec-9] INFO  com.theitroad.servlet.filters.AuthenticationFilter  - Requested Resource::/ServletDBLog4jExample/Logout
98251 [http-bio-8080-exec-9] INFO  com.theitroad.servlet.LogoutServlet  - JSESSIONID=367DE255789AC02F7C0E0298B825877C
98251 [http-bio-8080-exec-9] INFO  com.theitroad.servlet.LogoutServlet  - User=Name=hyman Kumar, [email protected], Country=San Franceco
98254 [http-bio-8080-exec-10] INFO  com.theitroad.servlet.filters.AuthenticationFilter  - Requested Resource::/ServletDBLog4jExample/login.html
109516 [http-bio-8080-exec-10] INFO  com.theitroad.servlet.filters.AuthenticationFilter  - Requested Resource::/ServletDBLog4jExample/Register
109517 [http-bio-8080-exec-10] INFO  com.theitroad.servlet.RegisterServlet  - User registered with [email protected]
127848 [http-bio-8080-exec-10] INFO  com.theitroad.servlet.filters.AuthenticationFilter  - Requested Resource::/ServletDBLog4jExample/Login
223055 [http-bio-8080-exec-2] INFO  com.theitroad.servlet.filters.AuthenticationFilter  - Requested Resource::/ServletDBLog4jExample/Login
223056 [http-bio-8080-exec-2] INFO  com.theitroad.servlet.LoginServlet  - User found with details=Name=hyman Kumar, [email protected], Country=San Franceco
223059 [http-bio-8080-exec-2] INFO  com.theitroad.servlet.filters.AuthenticationFilter  - Requested Resource::/ServletDBLog4jExample/home.jsp
231931 [http-bio-8080-exec-2] INFO  com.theitroad.servlet.filters.AuthenticationFilter  - Requested Resource::/ServletDBLog4jExample/invalidurl.jsp