天天看點

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