一个web应用程序注册的JBDC驱动程序[com.mysql.jdbc.Driver],但Web应用程序时停止时未能注销。为了防止内存泄漏,JDBC驱动程序已被强行注册。

一个web应用程序注册的JBDC驱动程序[com.mysql.jdbc.Driver],但Web应用程序时停止时未能注销。为了防止内存泄漏,JDBC驱动程序已被强行注册。

2.ServletContext的监听器ContextLoaderLinener

    我是用这种方式解决我的代码问题的,之前可能是因为多次创建容器导致内存泄漏问题。

在xml文件中注册监听器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>18-spring-web-2</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 注册ServletContext的监听器
  完成两件工作:
    1)在ServletContext被创建时,创建Spring容器对象
    2)将创建好的Spring容器对象放入到ServletContext的域属性空间
   -->
  <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  
  
  <servlet>
    <description></description>
    <display-name>RegisterServlet</display-name>
    <servlet-name>Register-Servlet</servlet-name>
    <servlet-class>com.sjc.servlets.RegisterServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Register-Servlet</servlet-name>
    <url-pattern>/registerServlet</url-pattern>
  </servlet-mapping>
  
  
  <servlet>
    <description></description>
    <display-name>LoginServlet</display-name>
    <servlet-name>Login-Servlet</servlet-name>
    <servlet-class>com.sjc.servlets.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Login-Servlet</servlet-name>
    <url-pattern>/loginServlet</url-pattern>
  </servlet-mapping>
  
  
</web-app>

在测试类中

package com.sjc.servlets;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.ApplicationContext;
import org.springframework.web.context.WebApplicationContext;

import com.sjc.beans.Student;
import com.sjc.service.IStudentService;



public class RegisterServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String name = request.getParameter("name");
		String ageStr = request.getParameter("age");
		Integer age = Integer.valueOf(ageStr);
		//int age = Integer.parseInt(ageStr);  也可以用这种转换方式
		
		Student student = new Student(name,age);
		
		//可以看一下ContextLoader的源码,里面有一个initWebApplicationContext()方法
		//ContextLoaderListener继承自ContextLoader,调用了initWebApplicationContext()方法
		//initWebApplicationContext()方法,里面创建了容器,并将容器放入到ServletContext中,与web应用生命周期同步,里面还有捕获时间等
		//我用这种方法解决了问题
		String acKey = WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE;
		ApplicationContext ac = (ApplicationContext) this.getServletContext().getAttribute(acKey);
		System.out.println("ac==="+ac);
		
		IStudentService service = (IStudentService) ac.getBean("studentService");
		
		
		service.addStudent(student);
		
		request.getRequestDispatcher("/welcome.jsp").forward(request, response);
	}
	

}

你可能感兴趣的:(BUG,java)