javaWEB基础-(servlet3)

Servlet中常用的接口、类、方法

Sun 公司提供了一系列的接口和类用于 Servlet 技术的开发,其中最重要的接口是 javax.servlet.Servlet。

1.Servlet接口

接口声明: public abstract interface Servlet

方法声明

功能描述

void init(ServletConfig config)

容器在创建好 Servlet 对象后,就会调用此方法。该方法接收一个 ServletConfig 类型的参数,Servlet 容器通过该参数向 Servlet 传递初始化配置信息

ServletConfig getServletConfig ()

用于获取 Servlet 对象的配置信息,返回 Servlet 的 ServletConfig 对象

String getServletInfo()

返回一个字符串,其中包含关于 Servlet 的信息,如作者、版本和版权等信息

void service (ServletRequest request,ServletResponse response)

负责响应用户的请求,当容器接收到客户端访问 Servlet 对象的请求时,就会调用此方法。
容器会构造一个表示客户端请求信息的 ServletRequest 对象和一个用于响应客户端的 ServletResponse 对象作为参数传递给 service() 方法。
在 service() 方法中,可以通过 ServletRequest 对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用 ServletResponse 对象的方法设置响应信息

void destroy()

负责释放 Servlet 对象占用的资源。当服务器关闭或者 Servlet 对象被移除时,Servlet 对象会被销毁,容器会调用此方法

针对 Servlet 的接口,Sun 公司提供了两个默认的接口实现类:GenericServletHttpServlet。其中,GenericServlet 是一个抽象类,该类为 Servlet 接口提供了部分实现,它并没有实现 HTTP 请求处理

public abstract class GenericServlet implements javax.servlet.Servlet, javax.servlet.ServletConfig, java.io.Serializable {
HttpServlet GenericServlet 的子类,它继承了 GenericServlet 的所有方法,并且为 HTTP 请求中的 GET 和 POST 等类型提供了具体的操作方法通常情况下,编写的 Servlet 类都继承自 HttpServlet,在开发中使用的也是 HttpServlet 对象。
public abstract class  HttpServlet  extends GenericServlet {

HttpServlet 类中包含两个常用方法

方法声明

功能描述

protected void doGet (HttpServletRequest req, HttpServletResponse resp)

用于处理 GET 类型的 HTTP 请求的方法

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

用于处理 POST 类型的 HTTP 请求的方法

例如:

package com.wangxing.servlet;

import java.io.IOException;

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

public class TestServlet implements Servlet{

	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("servlet初始化");
		
	}

	@Override
	public ServletConfig getServletConfig() {
		System.out.println("得到ServletConfig对象");
		return null;
	}

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		System.out.println("处理HTTP请求");
		
	}

	@Override
	public String getServletInfo() {
		System.out.println("得到servlet信息");
		return null;
	}

	@Override
	public void destroy() {
		System.out.println("销毁servlet");
		
	}
	
	

}

配置web.xml

<servlet>
  	<servlet-name>test</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>test</servlet-name>
  	<url-pattern>/test</url-pattern>
  </servlet-mapping>

2.ServletConfig接口

public  abstract  interface  ServletConfig

在运行 Servlet 程序时,可能需要一些辅助信息,例如,文件使用的编码、使用 Servlet 程序的共享信息等,这些信息可以在 web.xml 文件中使用一个或多个 <init-param> 元素进行配置。当 Tomcat 初始化一个 Servlet 时,会将该 Servlet 的配置信息封装到 ServletConfig 对象中,此时可以通过调用 init(ServletConfig config)方法将 ServletConfig 对象传递给 Servlet。

ServletConfig就是封装Servlet运行时的辅助信息的接口。

ServletConfig 接口中定义了一系列获取配置信息的方法。

方法说明

功能描述

String getInitParameter(String name)

根据初始化参数名返回对应的初始化参数值

ServletContext getServletContext()

返回一个代表当前 Web 应用的 ServletContext 对象

String getServletName()

返回 Servlet 的名字,即 web.xml 中 <servlet-name>元素的值

ServletConfig接口对象我们不需要自己手动获取,servlet接口的init方法已经传递有了。

例如:通过ServletConfig接口对象得到web.xml文件中配置的初始化参数值,和配置的

 <servlet>
 	<servlet-name>config</servlet-name>
 	<servlet-class>com.wangxing.servlet.ConfigServlet</servlet-class>
 	<init-param>
 		<param-name>config</param-name>
 		<param-value>test1</param-value>
 	</init-param>
 	<init-param>
 		<param-name>config</param-name>
 		<param-value>test2</param-value>
 	</init-param>
 	<init-param>
 		<param-name>username</param-name>
 		<param-value>zhangsan</param-value>
 	</init-param>
 </servlet>
 <servlet-mapping>
 	<servlet-name>config</servlet-name>
 	<url-pattern>/config</url-pattern>
 </servlet-mapping>
package com.wangxing.servlet;

import java.io.IOException;

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

/**
 * 测试ServletConfig接口 ServletConfig就是封装Servlet运行时的辅助信息的接口。 ServletConfig
 * 接口中定义了一系列获取配置信息的方法
 * 
 * @author 14336
 *
 */
public class ConfigServlet extends HttpServlet {
	private transient ServletConfig config;
	
	/*
	 * 在运行 Servlet 程序时,可能需要一些辅助信息, 例如,文件使用的编码、使用 Servlet 程序的共享信息等, 这些信息可以在
	 * web.xml 文件中使用一个或多个 <init-param> 元素进行配置。 当 Tomcat 初始化一个 Servlet 时,会将该
	 * Servlet 的配置信息封装到 ServletConfig 对象中, 此时可以通过调用 init(ServletConfig
	 * config)方法将 ServletConfig 对象传递给 Servlet。
	 */
	// String getInitParameter(String name) 根据初始化参数名返回对应的初始化参数值

	// ServletContext getServletContext() 返回一个代表当前 Web 应用的 ServletContext 对象

	// String getServletName() 返回 Servlet 的名字,即 web.xml 中 <servlet-name>元素的值

	// ServletConfig接口对象我们不需要自己手动获取,servlet接口的init方法已经传递有了。
	// 或者我们可以通过HttpServlet接口的父类GenericServlet抽象类中的getServletConfig()方法获得
	
	 //public ServletConfig getServletConfig() { return config; }
	 

	// 1.要测试我们首先需要配置web.xml文件
	/*
	 * <servlet> <init-param> <param-name>标签名</param-name>
	 * <param-value>通过标签名可以得到的数据值</param-value> </init-param> <servlet>
	 * 若是param-name名相同则只会获得第一个的value
	 * 初始化的辅助信息需要放在与之相关的servlet实例对象配置的<servlet></servlet>中
	 */

	// 2.第二步我们需要得到ServletConfig对象
	// 方法一:可以通过重写init方法获得ServletConfig对象
	// init()方法是接口Servlet中的方法,它的实现类是抽象类GenericServlet,
	// GenericServlet类继承并重写了init()方法将ServletConfig作为参数传递给了init()方法,并在重写后的init方法中调用了继承的init方法

	@Override
	public void init(ServletConfig config) throws ServletException {
		String Parameterval = config.getInitParameter("config");
		String Parameterval2 = config.getInitParameter("config");
		String Parameterval3 = config.getInitParameter("username");
		String servletname = config.getServletName();
		System.out.println("Parameterval=" + Parameterval);
		System.out.println("Parameterval2=" + Parameterval2);
		System.out.println("Parameterval3=" + Parameterval3);
		System.out.println("servletname=" + servletname);
		
		this.config = config;
		System.out.println("将config对象保存");
		 
		}
	
   
	//方法二:使用HttpServlet接口的父类GenericServlet的getServletConfig()方法获得ServletConfig对象
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
		System.out.println("提交方式位GET");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		   ServletConfig  config = this.getServletConfig();
			ServletConfig config = this.config;
			String username = config.getInitParameter("username");
			String username2 = config.getInitParameter("username");
			String servletname = config.getServletName();
			System.out.println("username=" + username);
			System.out.println("username2=" + username2);
			System.out.println("servletname=" + servletname);
			//因为Servlet容器会先调用init()方法,在源程序中GenericServlet的init()方法将获得的ServletConfig对象传递给了
			//暂时的config变量,然后我们使用getServletConfig()返回这个变量
			
			//而在这个程序中由于我们重写了init方法程序会调用我们写的init()方法,所以在后来使用getInitParameter获得ServletConfig对象时会空指针
			//所以我们这里使用自己定义的变量
	}
	
	
		
}

3.ServletContext接口

当 Tomcat 启动时,Tomcat 会为每个 Web 应用创建一个唯一的 ServletContext 对象代表当前的 Web 应用,该对象封装了当前 Web 应用的所有信息。可以利用该对象获取 Web 应用程序的Servlet版本,初始化信息、读取资源文件等

ServletConfig接口

ServletContext getServletContext()

返回一个代表当前 Web 应用的 ServletContext 对象

方法说明

功能描述

int getMajorVersion()

得到servlet规范的主版本号

int getMinorVersion()

得到servlet规范的次版本号

String  getInitParameter(String)

得到指定的初始化信息<context-param>

Enumeration<String> getInitParameterNames()

得到包含所有初始化信息名的Enumeration对象

 

配置web.xml

<context-param>
  	<param-name>contextvalue</param-name>
  	<param-value>true</param-value>
  </context-param>
  <context-param>
  	<param-name>contextid</param-name>
  	<param-value>1</param-value>
  </context-param>
  <servlet>
  	<servlet-name>mycontext</servlet-name>
  	<servlet-class>com.wangxing.servlet.ContextServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>mycontext</servlet-name>
    <url-pattern>/context</url-pattern>
  </servlet-mapping>

读取 Web 应用下的资源文件

在实际开发中,有时会需要读取 Web 应用中的一些资源文件,如配置文件和日志文件等。为此,在 ServletContext 接口中定义了一些读取 Web 资源的方法,这些方法是依靠 Servlet 容器实现的。Servlet 容器根据资源文件相对于 Web 应用的路径,返回关联资源文件的 I/O 流或资源文件在系统的绝对路径等。
ServletContext 接口中用于获取资源路径的相关方法。

方法说明

功能描述

InputStream getResourceAsStream(String path)

返回映射到某个资源文件的 InputStream 输入流对象。参数 path 的传递规则和 getResource() 方法完全一致

1.在项目的 src 目录中创建一个名称为xxxxx.properties 的文件

userid = 1
username = zhangsan
useraddress = 西安

2.编写读取xxxxx.properties 的文件的Servlet处理类。

package com.wangxing.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Enumeration;
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;



/**
 * 測試ServletConfig接口中的getServletContext()方法的返回值ServletContext接口
 * @author 14336
 *
 */
public class ContextServlet extends HttpServlet{


/*
 * 当 Tomcat 启动时,Tomcat 会为每个 Web 应用创建一个唯一的 ServletContext 对象代表当前的 Web 应用
 * ,该对象封装了当前 Web 应用的所有信息。
 * 可以利用该对象获取 Web 应用程序的Servlet版本,初始化信息、读取资源文件等。
 * */
	//ServletContext接口中的方法
	//1.int getMajorVersion()	得到servlet规范的主版本号
	//2.int getMinorVersion()	得到servlet规范的次版本号
	//3.String  getInitParameter(String)	得到指定的初始化信息<context-param>
	//4.Enumeration<String> getInitParameterNames()	得到包含所有初始化信息名的Enumeration对象
	//5.//InputStream getResourceAsStream(String path)	返回映射到某个资源文件的 InputStream 输入流对象。
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//ServletContext---对象封装了当前 Web 应用的所有信息
		//得到ServletContext
		ServletContext context = this.getServletContext();
		//ServletContext context2=this.getServletConfig().getServletContext();
		
		//得到Servlet版本
		//int getMajorVersion()	得到servlet规范的主版本号
		//int getMinorVersion()	得到servlet规范的次版本号
		int majorVersion = context.getMajorVersion();
		int minorVersion = context.getMinorVersion();
		System.out.println("主版本号:"+majorVersion+" 次版本号:"+minorVersion);
		//String  getInitParameter(String)	得到指定的初始化信息<context-param>
		String info = context.getInitParameter("contextid");
		String info2 = context.getInitParameter("contextvalue");
		System.out.println("contextid="+info+"  contextvalue="+info2);
		// 得到包含所有初始化信息名的Enumeration对象
		Enumeration<String>	paramNames = context.getInitParameterNames();
		while(paramNames.hasMoreElements()){
			String paramname  = paramNames.nextElement();
			String value = context.getInitParameter(paramname);
			System.out.println("name="+paramname+" value="+value);
		}
		
		//读取 Web 应用下的资源文件
		//InputStream getResourceAsStream(String path)	返回映射到某个资源文件的 InputStream 输入流对象。
		/*
		InputStream inputStream = context.getResourceAsStream("/WEB-INF/classes/test.properties");
		BufferedReader bufferedReader= new BufferedReader(new InputStreamReader(inputStream,"unicode"));
		String msg = null;
		while((msg = bufferedReader.readLine())!= null){
			String msg2 = msg.getBytes("unicode").toString();
			System.out.println(msg2);
		}
		bufferedReader.close();
		inputStream.close();
		*/
		InputStream inputStream = context.getResourceAsStream("/WEB-INF/classes/test.properties");
		Properties properties= new Properties();
		properties.load(new InputStreamReader(inputStream,"utf-8"));
		String userid = properties.getProperty("userid");
		String username = properties.getProperty("username");
		String useraddress = properties.getProperty("useraddress");
		System.out.println("userid="+userid+" username="+username+" useraddress="+useraddress);
		//设置test.properties文件的编码格式以"utf-8"保存可以显示中文
		inputStream.close();
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
	
	
	
}

猜你喜欢

转载自blog.csdn.net/weixin_52192654/article/details/114993068
今日推荐