天天看点

web_day35_ServletContext介绍一、ServletConfig 二、ServletContext四、案例:记录用户登录成功的访问次数

一、ServletConfig

1、作用

  • ServletConfig对象代表的是当前Servlet的配置信息
  • ServletConfig对象在初始化期间将信息传递给 servlet

2、常用方法

说明
ServletContext getServletContext() 获取ServletContext对象
String getInitParameter(String name) 获取初始化参数的值
Enumeration getInitParameterNames() 获取所有初始化参数的名称
String getServletName() 获取当前servlet的名字
web_day35_ServletContext介绍一、ServletConfig 二、ServletContext四、案例:记录用户登录成功的访问次数
package com.itheima.web.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

//演示ServletConfig对象的方法
public class DServlet implements Servlet {

	public DServlet() {
	}

	@Override
	public void init(ServletConfig config) throws ServletException {

		// 获得ServletContext对象
		ServletContext servletContext = config.getServletContext();
		System.out.println(servletContext);

		// 获得初始化参数值
		String username = config.getInitParameter("username");
		System.out.println(username);

		// 获得web.xml文件中配置的Servlet名称
		String servletName = config.getServletName();
		System.out.println(servletName);

		// 获得所有的初始化参数的名称
		Enumeration<String> initParameterNames = config.getInitParameterNames();
		while (initParameterNames.hasMoreElements()) {
			String name = (String) initParameterNames.nextElement();
			String value = config.getInitParameter(name);
			System.out.println(name+"\t"+value);
		}

	}

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
	}

	@Override
	public void destroy() {
	}

	@Override
	public ServletConfig getServletConfig() {
		return null;
	}

	@Override
	public String getServletInfo() {
		return null;
	}

}
           

web_day35_ServletContext介绍一、ServletConfig 二、ServletContext四、案例:记录用户登录成功的访问次数
二、ServletContext

1、ServletContext是什么?

  • ServletContext对象代表着一个WEB应用的上下文环境,通过它可以获得与这个应用相关的很多资源内容
  • 每个 Java虚拟机的每个“Web应用程序”,都有一个上下文

2、注意

  • 一个项目有且仅有一个ServletContext对象,多个项目使用的是不同ServletContext对象
  • 同一个项目下所有的Servlet都共享这个ServletContext对象

3、作用

通过ServletContext可以获得与这个应用相关的很多资源内容

应用场景:主要用于网站浏览的统计工作

web_day35_ServletContext介绍一、ServletConfig 二、ServletContext四、案例:记录用户登录成功的访问次数

4、ServletConetxt对象获取(创建)

  • 方式一:使用servletConfig.getServletContext();
  • 方式二:如果一个类继承了GenericServlet,那么可以直接获得 this.getServletContext();
  • 方式三:如果一个类继承了HttpServlet,那么可以直接获得 this.getServletContext();

5、ServletContext对象的生命周期

创建

服务器启动的时候,ServletContext对象被创建

销毁

服务器关闭的时候,ServletContext对象被销毁

同一个项目下的Servlet,共享一个ServletContext的资源

6、ServletContext对象作为域对象使用

域的范围:只在当前的这个WEB应用,它的范围比较大,只有正常关闭服务器,域对象里面存储的数据才获取不到

域对象的方法

方法 说明
setAttribute(String name, Object obj); 向域对象中设置值
getAttribute(String name); 从域对象获取值
removeAttribute(String name); 从域对象中删除值

应用场景:主要用于网站浏览的统计工作

7、ServletContext对象的相关方法

方法 说明
public String getContextPath(); 获得项目的路径
public String getRealPath(String path) 获得文件的真实路径
public InputStream getResourceAsStream(String path) 获得资源文件
public String getMimeType(String fileName); 获得文件的MIME类型
public String getInitParameter(String name); 初始化参数(当前应用)的方法
web_day35_ServletContext介绍一、ServletConfig 二、ServletContext四、案例:记录用户登录成功的访问次数
package com.itheima.web.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public AServlet() {
		super();
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");

		// 1.获得一个ServletContext对象
		ServletContext servletContext = this.getServletContext();
		// 获得项目的路径:
		String contextPath = servletContext.getContextPath();
		System.out.println(contextPath);

		// 获得文件的真实路径:(相对路径:带/<相对的是tomcat的webapps目录【你把这个/当做webapps目录】>)【得到的结果是一个绝对路径】
		String realPath = servletContext.getRealPath("/web_day35/WEB-INF/classes/db.properties");
		System.out.println(realPath);

		// 获得资源文件:(相对路径,不带/<相对的是当前项目>)
		InputStream is = servletContext.getResourceAsStream("WEB-INF/classes/db.properties");
		Properties pp = new Properties();
		pp.load(is);
		System.out.println(pp.getProperty("username"));

		// 获得文件的MIME类型:
		String fileName = "a.avi";// 以后是获取到的
		String mimeType = servletContext.getMimeType(fileName);
		System.out.println(mimeType);

		// 初始化参数(当前应用)的方法
		String initParameter = servletContext.getInitParameter("age");
		System.out.println(initParameter);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
           

四、案例:记录用户登录成功的访问次数

1、案例执行流程

web_day35_ServletContext介绍一、ServletConfig 二、ServletContext四、案例:记录用户登录成功的访问次数

2、案例实现

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>登录案例</title>
	</head>
	<body>
		<form action="http://localhost:8080/web_day35/LoginServlet">
			用户名:<input type="text" name="username" /><br/>
			密码:<input type="password" name="password" /><br/>
			<input type="submit" value="登录"/>
		</form>
	</body>
</html>
           

 web层

package com.itheima.web.servlet;

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.itheima.domain.User;
import com.itheima.service.UserService;

public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public LoginServlet() {
		super();
	}

	@Override
	public void init() throws ServletException {
		// 1.定义一个变量进行初始化
		int count = 0;
		// 2.获取ServletContext域对象
		ServletContext servletContext = this.getServletContext();
		// 3.将变量保存到域对象中
		servletContext.setAttribute("count", count);
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 处理中文乱码
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		// 1.获取请求参数
		String username = request.getParameter("username");
		String password = request.getParameter("password");

		// 2.封装数据
		User user = new User();
		user.setUsername(username);
		user.setPassword(password);

		// 3.调用service层方法
		UserService service = new UserService();
		User existUser = null;
		try {
			existUser = service.login(user);
			// 4.对查询结果进行判断
			if (existUser != null) {
				// 5.获取ServletContext对象
				ServletContext servletContext = this.getServletContext();
				// 6.从ServletContext域对象中获取值
				int count = (int) servletContext.getAttribute("count");
				// 7.自增
				count++;
				// 8.给出提示信息
				System.out.println("亲,您是第" + count + "次登录...");
				// 9.放入域对象中
				servletContext.setAttribute("count", count);
			} else {
				System.out.println("登录失败");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
           

service层

package com.itheima.service;

import java.sql.SQLException;

import com.itheima.dao.UserDao;
import com.itheima.domain.User;

public class UserService {

	public User login(User user) throws SQLException {
		UserDao dao = new UserDao();
		return dao.login(user);
	}

}
           

dao层

package com.itheima.dao;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import com.itheima.domain.User;
import com.itheima.utils.C3P0Utils;

public class UserDao {

	public User login(User user) throws SQLException {
		// 1.获得QueryRunner核心对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.编写SQL语句
		String sql = "select * from user where username=? and password=?";
		// 3.设置实际参数
		Object[] params = { user.getUsername(), user.getPassword() };
		// 4.执行查询操作
		return qr.query(sql, new BeanHandler<>(User.class), params);
	}

}
           
web