这几天学习了下Log4j,但只是在main 函数里测试用。我自己在想,log4j是否可以结合Web使用呢?举个简单的例子,就像一个用户登录系统一样,如果只是简单的登录验证,那也太简单了。自己试着想,如果可以把用户登录的信息,记录到数据库里或者写入某个文件里,那不是很好么?至少方便以后查询。所以,就决定开始行动了。
心动不如行动!
=================================我是华丽的分割线===============================
A)创建数据库及数据表
create database test;
创建 user 表:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) DEFAULT NULL, `password` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
创建 log 表:
CREATE TABLE `log` ( `id` int(4) NOT NULL AUTO_INCREMENT COMMENT '自增id号', `username` varchar(45) NOT NULL DEFAULT '' COMMENT '用户名', `msg` varchar(555) DEFAULT NULL COMMENT '日志信息', `level` varchar(45) DEFAULT NULL COMMENT '当前日志的级别', `createTime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8;
好了,数据库及数据表创建完成。
B)创建项目工程 TestLog4j
- 打开myeclipse 创建一个Web Project 取名 TestLog4j
- 引入jar包,此处我们使用 log4j-1.2.14.jar 和 commons-logging.jar ,数据库jar包 mysql-connector-java-5.0.8-bin.jar
- 而后创建视图login.jsp 、 fail.jsp 、 success.jsp,其中会用到css,还有部分图片。此处就免了。
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>登录界面</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <link rel="stylesheet" type="text/css" href="css/style.css"> </head> <body> <div class="login"> <h2>登录界面</h2> <form action="LoginServlet" method="post"> <form method="post"> 用户名:<input type="text" name="username"><br> 密 码:<input type="password" name="password"><br> <input type="submit" value="登陆"> <input type="reset" value="重置"> </form> </div> </body> </html>
fail.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>失败页面</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <link rel="stylesheet" type="text/css" href="css/style.css"> </head> <body> <div class="login"> 对不起,登录失败! <a href="login.jsp">重新登录</a><br> <img width="200px" height="200px" src="images/cry.jpg"> </div> </body> </html>
success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>成功页面</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <link rel="stylesheet" type="text/css" href="css/style.css"> </head> <body background="images/suc.jpg"> <div class="login"> 恭喜您,登录成功! <br> <img width="200px" height="200px" src="images/smile.jpg"> </div> </body> </html>
- 接着创建我们的model层。model层中包含了UserBean 、 UserBeanBO、ConnDB三个类。
- 而后创建控制层即servlet层。 里面含有Log4jInit.java LoginServlet.java 两个类
附上Log4jInit.java代码
package com.whf.control; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.PropertyConfigurator; public class Log4jInit extends HttpServlet { /** * Constructor of the object. */ public Log4jInit() { super(); } /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the GET method"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the POST method"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } /** * Initialization of the servlet. <br> * * @throws ServletException if an error occurs */ public void init() throws ServletException { //从web.xml配置读取,名字一定要和web.xml配置一致 String file =this.getInitParameter("log4j"); if(file != null){ PropertyConfigurator.configure(file); } } }
附上LoginServlet.java代码
package com.whf.control; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.apache.log4j.MDC; import org.apache.log4j.PropertyConfigurator; import com.whf.model.UserBeanBO; public class LoginServlet extends HttpServlet { private final static String DEFAULT_USERNAME="anonymous"; /** * Constructor of the object. */ public LoginServlet() { super(); } /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); //如果直接 className.class 日志输出到全局的 即rootLogger 指定的文件中 Logger logger = Logger.getLogger(LoginServlet.class); //得到用户名和密码,验证用户是否合法 String u=request.getParameter("username"); String p=request.getParameter("password"); //System.out.println("u="+u+" "+"p="+p); //验证用户 UserBeanBO ubo=new UserBeanBO(); if(ubo.checkUser(u, p)){ //用户合法 MDC.put("username", u); logger.info("用户登录成功"); request.getRequestDispatcher("success.jsp").forward(request, response); }else{ //用户不合法 MDC.put("username", DEFAULT_USERNAME); logger.warn("非法用户登录"); request.getRequestDispatcher("fail.jsp").forward(request, response); } } /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); this.doGet(request, response); } /** * Initialization of the servlet. <br> * * @throws ServletException if an error occurs */ public void init() throws ServletException { //do nothing } }
- 在 web.xml 中,还需要配置。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.whf.control.LoginServlet</servlet-class> </servlet> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>Log4jInit</servlet-name> <servlet-class>com.whf.control.Log4jInit</servlet-class> <init-param> <param-name>log4j</param-name><!-- 这个是名字是下边路径配置的标识(好像KEY一样) --> <param-value>/WEB-INF/classes/log4j.properties</param-value><!--这是容器初始化时候加载log4j配置文件的路径(这好像一个value);--> </init-param> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/LoginServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Log4jInit</servlet-name> <url-pattern>/Log4jInit</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app>
C)创建 log4j.properties 文件
#定义3个输出端 log4j.rootCategory=INFO,A1,A2,A3 #定义A1输出到控制器 log4j.appender.A1=org.apache.log4j.ConsoleAppender #定义A1的布局模式为PaternLayout log4j.appender.A1.layout=org.apache.log4j.PatternLayout # 定义A1的输出格式 log4j.appender.A1.layout.ConversionPattern=%4p [%t] (%F:%L) - %m%n #定义A2输出到文件 log4j.appender.A2=org.apache.log4j.RollingFileAppender #定义A2输出到哪个文件 log4j.appender.A2.File=./log.txt #定义A2输出文件的最大长度 log4j.appender.A2.MaxFileSize = 3KB #定义A2的备份文件数 log4j.appender.A2.MaxBackupIndex = 3 #定义A2的布局模式为PatternLayout log4j.appender.A2.layout=org.apache.log4j.PatternLayout #定义A2的输出模式 log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n #定义A3输出到数据库 log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender log4j.appender.A3.URL=jdbc:mysql://localhost:3306/test log4j.appender.A3.driver=com.mysql.jdbc.Driver log4j.appender.A3.user=root log4j.appender.A3.password= #定义A3的布局和执行的SQL语句 log4j.appender.A3.layout=org.apache.log4j.PatternLayout log4j.appender.A3.layout.ConversionPattern=Insert into log(username,msg,level,createTime) values('%X{username}','%m','%-5p','%d{yyyy-MM-dd hh:mm:ss}')
D)发布项目
启动Tomcat,将项目发布到空间即可。
如果还有什么疑问,可以在博客留言。欢迎转载。