JavaWeb之servlet(2)

servlet(2)

ServletContext

servlet的上下文

每个jvm的虚拟机中的每个web工程都只有一个ServletContext工程,即在一个web工程中,无论写了多少个Java类只要获取该类对象,那么得到的该类对象都是同一个。

如何获取该类对象

ServletContext context = getServletContext();

通过servlet类的getServletContext()方法。

作用

1.获取全局配置参数

2.获取web工程中的资源

3.存取数据,servlet间共享数据,域对象

获取全局参数

public String getInitParameter(String name):返回包含指定上下文范围初始化参数值的 String
,如果参数不存在,则返回 null。 

获取的内容为:通过web.xml中的< context >元素中的的name值去获取中的value。其中< context >元素独立于 元素存在。

<context-param>
  	<param-name>gxwf</param-name>
  	<param-value>18</param-value>
  </context-param>
  <servlet>
    <description></description>
    <display-name>t1</display-name>
    <servlet-name>t1</servlet-name>
    <servlet-class>wf.t1</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>t1</servlet-name>
    <url-pattern>/t1</url-pattern>
  </servlet-mapping>

获取方式

ServletContext sc = this.getServletContext();
String s = sc.getInitParameter("gxwf");
System.out.println("name-gx = "+s);
out:
name-gx = 18

获取web应用中的properties配置文件中的信息

properties配置文件中的数据以 键 = 值

的方式存在,而Properties类会将文件解析为Java中的键值对形式

想要获取properties配置文件中的信息,先通过Properties获取该类对象

Properties p = new Properties();

再通过该对象载入properties配置文件的流对象。然后通过Properties类的getProperty()方法通过指定的键获取对应的值。

以下给出获取流对象的三种方法。

1.通过获取资源在tomcat里面的绝对路径

1.当我们要获取资源时需要先获取其绝对路径

public String getRealPath(String path):为给定虚拟路径返回包含实际路径的 String。例如,
可以通过对 "http://host/contextPath/index.html" 的请求使路径 "/index.html" 返回服务器
文件系统上的绝对文件路径,其中 contextPath 是此 ServletContext 的上下文路径。 

该方法在输入path为空字符串的情况下返回工程在tomcat里面的目录(E:javaapache-tomcat-7.0.52wtpwebappsservletcontesttest(servletcontesttest是项目名称))。而输入path为相对路径的情况下会返回工程目录 + 相对路径(E:javaapache-tomcat-7.0.52wtpwebappsservletcontesttest file es.properties ),由此看看出该方法的作用是:先获取web工程在tomcat下的绝对路径,然后再拼接上资源的相对路径,然后在将该字符串返回。

ServletContext sc = this.getServletContext();
Properties p = new Properties();
String s = sc.getRealPath("");
System.out.println("t1-path = "+s);
//E:javaapache-tomcat-7.0.52wtpwebappsservletcontesttest
String path = sc.getRealPath("file/res.properties");
System.out.println("real-path = "+path);
//E:javaapache-tomcat-7.0.52wtpwebappsservletcontesttestfile
es.properties
InputStream in = new FileInputStream(path);

2.通过(InputStream in = new FileInputStream(path);)new出一个流对象。

2.getResourceAsStream 获取资源 流对象
public java.io.InputStream getResourceAsStream(String path)
以 InputStream 对象的形式返回位于指定路径上的资源

该方法类似于1中两方法的相加。

ServletContext sc = this.getServletContext();
InputStream in2 = sc.getResourceAsStream("file/res.properties");
p.load(in2);
String s2 = p.getProperty("gx");
System.out.println(s2);
3.通过classloader去获取web工程下的资源
InputStream in3 = this.getClass().getClassLoader().getResourceAsStream("../../file/res.properties");

通过class方法调用类加载器中的getResourceAsStream()该方法同2中getResourceAsStream 方法相同是由一个内得到配置文件路径的getResource(name)和得到流对象的方法组合而成

public InputStream getResourceAsStream(String name) {
        URL url = getResource(name);
        try {
            return url != null ? url.openStream() : null;
        } catch (IOException e) {
            return null;
        }
    }

getResource(name)方法得到的是(/E:/java/apache-tomcat-7.0.52/wtpwebapps/servletcontesttest/WEB-INF/classes/)是tomcat下项目的WEB-INF/classes目录,而我们要得到(E:javaapache-tomcat-7.0.52wtpwebappsservletcontesttestfile es.properties)所以在使用时要先回到,项目的根目录。

InputStream in3 = this.getClass().getClassLoader().getResourceAsStream("../../file/res.properties");
完整的获取web应用中的properties配置文件中的信息代码

preperties文件内容

gx=18

代码

ServletContext sc = this.getServletContext();
		Properties p = new Properties();
//方法1
//		String s = sc.getRealPath("");
//		System.out.println("t1-path = "+s);
//		//E:javaapache-tomcat-7.0.52wtpwebappsservletcontesttest
//		String path = sc.getRealPath("file/res.properties");
//		System.out.println("real-path = "+path);
//		//E:javaapache-tomcat-7.0.52wtpwebappsservletcontesttestfile
es.properties
//		InputStream in = new FileInputStream(path);
//		p.load(in);
//		String s1 = p.getProperty("gx");
//		System.out.println(s1);
		
//方法2
//		InputStream in2 = sc.getResourceAsStream("file/res.properties");
//		p.load(in2);
//		String s2 = p.getProperty("gx");
//		System.out.println(s2);
		
//方法3
		URL s3 = this.getClass().getClassLoader().getResource("");
		//file:/E:/java/apache-tomcat-7.0.52/wtpwebapps/servletcontesttest/WEB-INF/classes/
		System.out.println(s3);
		InputStream in3 = this.getClass().getClassLoader().getResourceAsStream("../../file/res.properties");
		p.load(in3);
		String s4 = p.getProperty("gx");
		System.out.println(s4);

使用ServletContext存取数据。

1.定义一个html页面定义一个form表单,命名login.html

form表单中的action表示了该页面信息传入的位置(即信息传入了哪一个servlet,此处为传入t1)

注意:此处的t1不是表示下面的servlet名称t1,而是在web.xml文件配置中url-pattern中的名称

<servlet>
    <description></description>
    <display-name>t1</display-name>
    <servlet-name>t1</servlet-name>
    <servlet-class>wf1.t1</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>t1</servlet-name>
      <!--目标位置-->
    <url-pattern>/t1</url-pattern>
  </servlet-mapping>
  <servlet>
<body>
<h2>请输入账号与密码</h2>
    
<form action="t1" method = "get">
账号:<input type="text" name = "username"/><br>
密码:<input type="text" name = "password"/><br>
<input type="submit" name = "登陆"/><br>
</form>
</body>

2.定义一个servlet,名为t1

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	/*
		 * HttpServletRequest request:请求对象,包含从浏览器传入的信息
		 * HttpServletResponse response:响应对象,通过该对象返回信息给浏览器
		 */
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		System.out.println("username = "+username);
		System.out.println("password = "+password);
		//response.getWriter()创建一个流对象,通过该对象可以向浏览器打印字符串
		PrintWriter out = response.getWriter();
  		//做判断,看传入的值是否为我们想要的
		if("admin".equals(username)&& "123".equals(password)) {
            //在控制台打印
//			System.out.println("登陆成功");
            //在浏览器端打印(此处的字符串应为英文,若输入中文会产生乱码,该问题后面解决)打印的东西会覆盖以前的信息
//			out.write("login success...");
			
            //此处为计算该servlet被访问的次数
            //getServletContext().getAttribute("count");该类返回一个object对象。如果对应count的值不存在,则返回null。
			Object obj = getServletContext().getAttribute("count");
			int oldnum = 0;
            //判断obj是否为null,为null就说明该servlet第一次被访问oldnum值不变,不为null就把obj转为int并赋值给oldnum
			if(obj != null) {
				oldnum = (int)obj;
			}
			System.out.println("网站访问次数 = "+oldnum);
            //将新的count与对应的值oldnum + 1设置到文件中
			![servletcontext01](C:UserswfDesktop笔记
esourseservletcontext01.png)
			//通过响应一个状态码303,使网页跳转到新的页面。login_success.html
			response.setStatus(303);
			response.setHeader("Location", "login_success.html");
			
		}else {
//			System.out.println("登录失败");
			out.write("login filed...");
		}
	}

3.编写新的html页面显示成功后的网页, 命名login_success.html

将跳转页面设置为t2

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>登陆成功</h2>
<a href = "t2">查看网站登陆次数</a>
</body>
</html>

4.再编写一个servlet命名t2对成功后操作

public class log_success extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //向网页打印访问次数
		Integer a = (int) getServletContext().getAttribute("count");
		PrintWriter out = response.getWriter();
		//System.out.println("登陆次数 : "+a);
		out.write(a.toString() +"--" + 4);
		out.write(99);

	}

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

}

ServletContext存取值分析

在这里插入图片描述

细节:

	<!-- 	
	A路径: Servlet的路径
		http://localhost:8080/Demo4/login
	
	B路径: 当前这个html的路径:
		http://localhost:8080/Demo4/login.html -->

	<form action="login" method="get">
		账号:<input type="text" name="username"/><br>
		密码:<input type="text" name="password"/><br>
		<input type="submit" value="登录"/>
	</form>

ServletContext的创建和销毁时期

创建:服务器在启动时,会为托管的每一个web应用程序,创建一个ServletContext对象

销毁:从服务器中移除托管,或关闭web应用程序所在的服务器

servletContext的作用范围

只要在同一个项目中都可以使用。

原文地址:https://www.cnblogs.com/wf614/p/11673840.html