Servlet实现

Servlet介绍

什么是Servlet?

Servlet是JavaWeb服务器的三大组件之一,主要的作用是接收请求、处理请求、反馈请求。把它想象成某些公司的客服人员就比较好理解一些,如听取客户问题、处理客户问题、给客户反馈处理的结果。

并且每个Servlet在服务器端是不一样的,各自有各自处理请求的内容。

Servlet接口和类的介绍

1.实现Servlet接口

三个周期方法:对象由服务器创建并调用相应的方法

方法 作用
void init(ServletConfig) Servlet对象创建之后,马上进行初始化,只调用一次
void Server(Request , Response) 每处理一次请求调用一次
void destory() Servlet对象销毁之前,调用一次
package 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 ServletDemo1 implements Servlet {

	//生命周期方法
	@Override
	public void destroy() {
		// TODO 自动生成的方法存根
		System.out.println("destroy");
	}

	//获取Servlet配置信息
	@Override
	public ServletConfig getServletConfig() {
		// TODO 自动生成的方法存根
		System.out.println("getServletConfig");
		return null;
	}

	//获取Servlet信息
	@Override
	public String getServletInfo() {
		// TODO 自动生成的方法存根
		System.out.println("getServletInfo");
		return null;
	}

	//生命周期方法
	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO 自动生成的方法存根
		System.out.println("init");
	}

	//生命周期方法
	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		// TODO 自动生成的方法存根
		System.out.println("service");
	}

}

从浏览器访问到Servlet:在web.xml添加如下配置信息(浏览器访问url:http://localhost:8080/Servlet/ServletDemo1)

<?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_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<servlet>
		<servlet-name>Servlet Test</servlet-name><!-- 随意起名 -->
		<servlet-class>servlet.ServletDemo1</servlet-class><!-- 实现Servlet的具体类路径 -->
	</servlet>
	
	<servlet-mapping>
		<servlet-name>Servlet Test</servlet-name><!-- 与<servlet>中的<servlet-name>中名称相同即可 -->
		<url-pattern>/ServletDemo1</url-pattern><!-- 必须以/开头,后边信息随意,之后访问需要这个路径 -->
	</servlet-mapping>
</web-app>

特性:

1).一个Servlet类只有一个对象,当然可以存在多个Servlet类

2).线程不安全的,但是效率是非常高的

ServletConfig介绍:

方法 作用
String getInitParameter(String name) 获取初始化指定name的value值
Enumeration getInitParameter() 获取初始化所有参数的value值集合
String getServletName() 获取Servlet的name值
ServletContext getServletContext() 获取Servlet的上下文
<servlet>
		<servlet-name>Servlet Test</servlet-name><!-- 随意起名 -->
		<servlet-class>servlet.ServletDemo1</servlet-class><!-- 实现Servlet的具体类路径 -->
		<init-param>
			<param-name>n1</param-name>
			<param-value>v1</param-value>
		</init-param>
		<init-param>
			<param-name>n2</param-name>
			<param-value>v2</param-value>
		</init-param>
</servlet>
public void init(ServletConfig servletConfig) throws ServletException {
		// TODO 自动生成的方法存根
		System.out.println("init");
		
		System.out.println(servletConfig.getServletName());
		
		System.out.println(servletConfig.getInitParameter("n1"));
		System.out.println(servletConfig.getInitParameter("n2"));
		
		Enumeration e= servletConfig.getInitParameterNames();
		
		while(e.hasMoreElements()) {
			System.out.println(e.nextElement());
		}
	}

2.继承GenericServlet类

package servlet;

import java.io.IOException;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/*
 * 继承GenericServlet类只需要重写service方法,其他方法在GenericServlet已经实现
 * 
 * 其它方法init destroy依照具体情况实现
 * 不会覆盖掉父类的init destroy等方法,在GenericServlet中有具体的空类可供实现
 */

public class ServletDemo2 extends GenericServlet {

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		// TODO 自动生成的方法存根
		System.out.println("处理请求");
	}
}

3.继承HttpServlet类

package servlet;

import java.io.IOException;

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

/*
 * 这两个方法doGet() doPost()是必须实现的,虽然不是抽象方法
 * doGet doPost方法是浏览器以Get或Post方式访问必须调用的方法
 * 若访问时没有doGet doPost这两个方法,将会出现405错误
 */

public class ServletDemo3 extends HttpServlet {
//	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("doGet");
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("doPost");
	}
}

Servlet细节

预防线程安全的三个小方法:

1.不要再Servlet中创建成员变量,创建局部变量即可

2.可以创建无状态成员变量

3.可以创建有状态成员变量,但状态必须为只读的

服务器启动时创建Servlet

<servlet>
		<servlet-name>Servlet Test2</servlet-name><!-- 随意起名 -->
		<servlet-class>servlet.ServletDemo3</servlet-class><!-- 实现Servlet的具体类路径 -->
		<load-on-startup>0</load-on-startup><!-- 服务器启动时创建,非负数整数,数字越小就先启动 -->
</servlet>

ServletContext介绍

ServletContext:整个web项目中只存在一个ServletContext对象,主要作用是在Servlet间传递数据,生命周期和服务器(服务器开启到关闭)生命周期相同。并且是四大域对象之一,其它三大域对象分别是HttpSession、PageContext、ServletRequest,域对象就是用来在多个Servlet间传递数据,并且域对象必须有存数据和取数据的功能。

获取ServletContext对象

在void init(ServletConfig config)中:ServletContext context = config.getServletContext();ServletConfig类中含有getServletContext()方法。

在GenericServlet和HttpServlet中获取对象:ServletContext context = this.getServletContext();

域对象的功能

其它方法:removeAttribute(String name)移除此键值对

package servlet;

import java.io.IOException;

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

@WebServlet("/ServletDemo4")
public class ServletDemo4 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获取ServletContext对象
		ServletContext context = this.getServletContext();
		
		//进行赋值
		context.setAttribute("name", "zhangsan");
	}

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

}
package servlet;

import java.io.IOException;

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

@WebServlet("/ServletDemo5")
public class ServletDemo5 extends HttpServlet {

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

		// 创建ServletContext对象
		ServletContext context = this.getServletContext();

		// 获取值
		System.out.println((String) context.getAttribute("name"));
	}

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

	}
}

获取应用初始化值

context-param>
  	<param-name>name</param-name>
  	<param-value>value</param-value>
</context-param>
package servlet;

import java.io.IOException;

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

@WebServlet("/ServletDemo6")
public class ServletDemo6 extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		ServletContext context = this.getServletContext();

		String s = context.getInitParameter("name");

		System.out.println(s);
	}

}

获取资源相关方法

package servlet;

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

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

@WebServlet("/ServletDemo1")
public class ServletDemo1 extends HttpServlet {

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

		ServletContext context = this.getServletContext();

		// 获取资源路径
		String path = context.getRealPath("//index.jsp");

		System.out.println(path);

		// 获取资源路径对应的输入流,先获取路径,在创建输入流对象
		InputStream is = context.getResourceAsStream("//index.jsp");

		// 或取WEB-INF下的所有文件,必须以“/”开头
		Set set = context.getResourcePaths("/WEB-INF");

		System.out.println(set);
	}

}

猜你喜欢

转载自blog.csdn.net/weixin_42061805/article/details/81700103
今日推荐