Servlet——Servlet简介和使用——史上最烂篇

1:Servlet简介

Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法, Servlet和客户的通信采用“请求/响应"的模式
Servlet可完成如下功能:

  • 创建并返回基于客户请求的动态HTML页面。

  • 创建可嵌入到现有HTML页面中的部分HTML页面( HTML片段)。

  • 与其它服务器资源(如数据库或基于Java的应用程序)进行通信。

1.1 Servlet容器响应客户请求的过程

在这里插入图片描述
1:Servlet引擎检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第:4步,否则,执行第2步。
2:装载并创建该Servlet的一个实例对象,调用该Servlet的构造器
3:调用Servlet实例对象的init()方法。
4:创建一个用于封装请求的ServletRequest对象和一个代表响应消息的ServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
5:WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet ,并在卸载之前调用Servlet的destroy()方法。

2:Servlet的HelloWorld演示

步骤如下:
1:创建一个HelloServlet类继承Servlet类

public class HelloServlet implements Servlet{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("destroy......");
		
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		System.out.println("getServletConfig.....");
		return null;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		System.out.println("getServletInfo.");
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		System.out.println("init....");
		// TODO Auto-generated method stub
		
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("service.");
		
	}
	public HelloServlet() {
		
		System.out.println(" servlet constructor....");
	}

}

2:在web.xml中配置和映射Servlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>JavaWebDemo</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 配置和映射Servlet -->
  <servlet>
  <!-- Servlet注册名字 -->
      <servlet-name>helloServlet</servlet-name>
        <!-- Servlet全类名 -->
      <servlet-class>com.atstudying.zlj.HelloServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <!-- 需要和某一个servlet节点的servlet-name子节点的文本节点一致-->
  
       <servlet-name>helloServlet</servlet-name>
         <!-- 映射具体方法的访问路径:/表示当前Web应用的根目录 -->      
       <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

启动Servers,在浏览器中输入http://localhost:8880/JavaWebDemo/hello观察控制台结果
在这里插入图片描述
原理解释
在这里插入图片描述

  • Servlet程序必须通过Servlet容器来启动运行,并且储存目录有特殊要求,通需要存储在<WEB应用程序目录>\WEB-INF\classes\目录中。Servlet程序必须在WEB应用程序的web.xml文件中进行注册和映射其访问路径,才可以被Servlet引擎加载和被外界访问。
  • 一个< servlet >元素用于注册一个Servlet,它包含有两个主要的子元素:< servlet-name >和< servlet-class > ,分别用于设置Servlet的注册名称和Servlet的完整类名。
  • 一个< servlet-mapping >元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素: < servlet-name >和< url-pattern >,分别用于指定Servlet的注册名称和Servlet的对外访问路径。

3:Servlet的配置和生命周期

在这里插入图片描述
从上面运行结果可以知道如下结论:
Servlet容器:运行Servlet,JSP,Filter等的软件环境

  • 可以来创建Servlet,并调用Servlet的相关生命周期方法

Servlet生命周期的方法:以下方法都是由Serlvet容器负责调用

  • 构造器:只被调用一次,只有第一次清求Servlet时,创建Servlet 的实例。调用构造器,.説明Serlvet的単突例的!!!
  • init方法:只被调用一次。在创建好实例后立即被调用。用于初始化当前Servlet.
  • service:被多次调用。毎次请求都会调用service方法。实际用于响应请求的
  • destroy: 只被调用一次,在当前Servlet 所在的WEB应用被卸载前调用。用于释放当前Servlet 所占用的资源.

3.1 load-on-startup参数

配置在web.xml文件的servlet节点参数中

<servlet>
       <servlet-name>secondServlet</servlet-name>
        <!-- Servlet全类名 -->
      <servlet-class>com.atstudying.zlj.SecondServlet</servlet-class>
      <!-- 可以指定Servlet被创建的时机 -->
      <load-on-startup>2</load-on-startup>
  
  </servlet>

load-on-startup:可以指定Servlet被创建的时机。若为负数,则在第一次请求时被创建。若为0或正数,则在当前Web应用被Servlet容器加载时创建实例,且数组越小越早被创建。

3.2 Servlet映射的细节

  • 同一个Servlet可以被映射到多个URL上,即多个< servlet-mapping>元素的< servlet-name >子元素的设置值可以是同一个Servlet的注册名。
  • 在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式: 一种格式是 ( * .扩展名),另一种格式是以正斜杠(/)开头并以(/ *)结尾。
 <servlet-mapping>
      <servlet-name>secondServlet</servlet-name>
      <url-pattern>/*</url-pattern>
       <!-- <url-pattern>*.html</url-pattern>-->

  </servlet-mapping>
  <servlet-mapping>
    <!-- 需要和某一个servlet节点的servlet-name子节点的文本节点一致-->
  
       <servlet-name>helloServlet</servlet-name>
         <!-- 映射具体方法的访问路径:/表示当前Web应用的根目录 -->      
       <url-pattern>/hello</url-pattern>
  </servlet-mapping>

3.3 ServletConfig接口的使用

servlet容器用于在初始化期间向servlet传递信息的servlet配置对象

1:设置Servlet节点里的初始化参数
web.xml

  <servlet>
       <servlet-name>secondServlet</servlet-name>
        <!-- Servlet全类名 -->
      <servlet-class>com.atstudying.zlj.SecondServlet</servlet-class>
      <!-- 配置Servlet的初始化参数,且节点必须在 load-on-startup节点的前面-->
      <init-param>
           <param-name>user</param-name>
           <param-value>root</param-value>
      
      </init-param>
      
      <init-param>
           <param-name>password</param-name>
           <param-value>123</param-value>
      
      </init-param>
      
      <!-- 可以指定Servlet被创建的时机 -->
      <load-on-startup>2</load-on-startup>
  
  </servlet>

2:获取Servlet的节点里的初始化参数

 java.lang.String getInitParameter(java.lang.String name) 
# 获取具有给定名称的初始化参数的值。

 java.util.Enumeration<java.lang.String> getInitParameterNames() 
 # 返回servlet初始化参数的名称,作为字符串对象的枚举,如果servlet没有初始化参数,则返回一个ation。

 java.lang.String getServletName() 
 # 返回此servlet实例的名称。

SecondServlet .java

public class SecondServlet implements Servlet{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
		System.out.println(" secondservlet init....");
		String user=arg0.getInitParameter("user");
		String password=arg0.getInitParameter("password");

		System.out.println("user:"+user);
		System.out.println("password:"+password);
		
		Enumeration< String> names=arg0.getInitParameterNames();
		while (names.hasMoreElements()) {
			String string = (String) names.nextElement();
			System.out.println("name:"+string);
			
		}
		
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println(" secondservlet service.");

		
	}
	
     public SecondServlet() {
		
		System.out.println(" SecondServlet constructor....");
	}

}

在这里插入图片描述

3.4 ServletContext接口的使用

  • Servlet引擎为每个WEB应用程序都创建一个对应的 ServletContext对象, SenvletContext对象被包含在ServletConfg对象中,调用ServetConfg getServletContext方法可以返回ServletContext对象的引用。
  • 由于一个WEB应用程序中的所有Senvlet都共享同一个,ServletContext对象。所以,ServletContext对象被称之为application对象( Web应用程序对象)。
  • 功能:
    一获取WEB应用程序的初始化参数
    一记录日志
    一apliation域范围的属性。访问资源文件:
    一获取虚拟路所映射的本地路径
    一WEB应用程序之间的访问。
    —SenvetContex的其他方法

设置初始化参数:可以为所有的Servlet所获取,而Servlet节点的初始化参数只用那个Servlet节点可以获取

# 获取与给定虚拟路径对应的实路径。
java.lang.String getRealPath(java.lang.String path) 
 
 # 参数返回一个字符串,该字符串包含指定的上下文范围的初始化参数的值,如果不存在,则返回null。
 java.lang.String getInitParameter(java.lang.String name) 
 
 # 将上下文的初始化参数的名称作为字符串对象的枚举返回,如果上下文没有初始化参数,则返回空枚举。
 java.util.Enumeration<java.lang.String> getInitParameterNames()  
 
 # .返回web应用程序的上下文路径。(web应用名称)
 java.lang.String getContextPath() 

# 以InputStream对象的形式返回位于指定路径上的资源。
java.io.InputStream getResourceAsStream(java.lang.String path) 
 
  • 获取当前web应用的初始化参数
# 参数返回一个字符串,该字符串包含指定的上下文范围的初始化参数的值,如果不存在,则返回null。
 java.lang.String getInitParameter(java.lang.String name) 
 
 # 将上下文的初始化参数的名称作为字符串对象的枚举返回,如果上下文没有初始化参数,则返回空枚举。
 java.util.Enumeration<java.lang.String> getInitParameterNames()  
 

1:设置当前web应用的初始化参数

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>JavaWebDemo</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- 配置当前web应用的初始化参数 -->
  <context-param>
      <param-name>driver</param-name>
      <param-value>com.mysql.jdbc.Driver</param-value>
  
  </context-param>
    <context-param>
      <param-name>jdbcurl</param-name>
      <param-value>jdbc:mysql/localhost:8080</param-value>
  
  </context-param>
   <servlet>
       <servlet-name>secondServlet</servlet-name>
        <!-- Servlet全类名 -->
      <servlet-class>com.atstudying.zlj.SecondServlet</servlet-class>
      <!-- 配置Servlet的初始化参数,且节点必须在 load-on-startup节点的前面-->
      <init-param>
           <param-name>user</param-name>
           <param-value>root</param-value>
      
      </init-param>
      
      <init-param>
           <param-name>password</param-name>
           <param-value>123</param-value>
      
      </init-param>
      
      <!-- 可以指定Servlet被创建的时机 -->
      <load-on-startup>2</load-on-startup>
  
  </servlet>
 
  <servlet-mapping>
    <!-- 需要和某一个servlet节点的servlet-name子节点的文本节点一致-->
  
       <servlet-name>secondServlet</servlet-name>
         <!-- 映射具体方法的访问路径:/表示当前Web应用的根目录 -->      
       <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  
</web-app>

2:获取当前web应用的初始化参数

public class SecondServlet implements Servlet{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
		System.out.println(" secondservlet init....");

		
		ServletContext servletContext=arg0.getServletContext();
		String driver=servletContext.getInitParameter("driver");
		String url=servletContext.getInitParameter("jdbcurl");
		System.out.println("driver:"+driver);
		System.out.println("url:"+url);
		Enumeration< String> name=servletContext.getInitParameterNames();
		while (name.hasMoreElements()) {
			String string = (String) name.nextElement();
			System.out.println("name:"+string);
			
		}
		
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println(" secondservlet service.");

		
	}
	
     public SecondServlet() {
		
		System.out.println(" SecondServlet constructor....");
	}

}

在这里插入图片描述

  • 获取当前web应用的某一个文件在服务器上的绝对路径,而不是部署前的路径
# 获取与给定虚拟路径对应的实路径。
java.lang.String getRealPath(java.lang.String path) 

1:

public class SecondServlet implements Servlet{

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
		System.out.println(" secondservlet init....");
		ServletContext servletContext=arg0.getServletContext();
		
		String string=servletContext.getRealPath("web.xml");
		System.out.println(string);
	
	}
	//.......

}

在这里插入图片描述

  • 获取当前web应用的某一个文件对应的输入流
# 以InputStream对象的形式返回位于指定路径上的资源。
java.io.InputStream getResourceAsStream(java.lang.String path) 
# path的/为当前web应用的根目录
public class SecondServlet implements Servlet{

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
		System.out.println(" secondservlet init....");
		ServletContext servletContext=arg0.getServletContext();
		
	//两种方法获取当前web应用的某一个文件对应的输入流
		InputStream inputStream=servletContext.getResourceAsStream("/WebContent/NewFile.html");
        System.out.println("1:"+inputStream);
        
        ClassLoader classLoader=getClass().getClassLoader();
        InputStream inputStream2=classLoader.getResourceAsStream("");
        System.out.println("2:"+inputStream2);
	}
	//.......

}

4:HTTP

4.1 HTTP简介

  • WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议
  • HTTP是hypertext transfer protocol (超文本传输协议)的简写,它是TCP/IP协议集中的一个应用层协议用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式。
  • HTTP协议的版本HTTP/1.0、HTTP/1.1. HTTP-NG

4.2 HTTP会话方式

在这里插入图片描述

  • 浏览器与WEB服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一个页面的访问,浏览器与WEB服务器都要建立一次单独的连接。
  • 浏览器到WEB服务器之间的所有通讯都是完全独立分开的请求和响应对。
  • 浏览器访问的多图网页过程

在这里插入图片描述

4.3 HTTP消息

  • 响应消息的实体内容就是网页文件的内容,也就是在浏览器中使用查看源文件的方式所看到的内容。
  • 一个使用GET方式的请求消息中不能包含实体内容,只有使用POST、PUT和DELETE方式的请求消息中才可以包含实体内容。

4.3.1 HTTP请求消息

请求消息结构:
一个请求行,若干消息头,以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开

在这里插入图片描述

4.3.2 HTTP响应消息

响应消息结构:
一个状态行,若干消息头,以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开
在这里插入图片描述

4.3.3 Get和Post传递参数比较

  • 使用GET方式传递参数:
    1:在浏览器地址栏中输入某个URL地址或单击网页上的一一个超链接时,浏览器发出的HT TP请求消息的请求方式为GET.
    2:如果网页中的< form>表单元素的method属性被设置为了“GET",浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET
    3:使用GET请求方式给WEB服务器传递参数的格式: http: //www. atguigu . com/ counter .jsp?name=lc&pas sword=123
    4:使用GET方式传送的数据量一般限制在1KB以下。
  • 使用POST方式传递参数:
    1: POST请求方式主要用于向WEB服务器端程序提交FORM表单中的数据: form表单的method 置为POST
    2:POST方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大得多。

5:ServletRequest使用

  • 定义向servlet提供客户端请求信息的对象servlet容器创建一个ServletRequest对象,并将其作为参数传递给servlet的服务方法ServletRequest对象提供的数据包括参数名称和值、属性和输入流。扩展ServletRequest的接口可以提供其他特定于协议的数据(例如HTTP数据)由 HttpServlet 请求 ID。(封装了请求信息,可以从中获取到任何的请求信息)
# 以字符串形式返回请求参数的值
 java.lang.String getParameter(java.lang.String name) 

# 返回一个java.util.Map映射此请求的参数。
java.util.Map<java.lang.String,java.lang.String[]> getParameterMap() 
 
 # 返回字符串对象的枚举,其中包含此请求中包含的参数的名称。
  java.util.Enumeration<java.lang.String> getParameterNames() 

# 返回一个字符串对象数组,其中包含给定请求参数的所有值,如果该参数不存在,则返回null。
java.lang.String[] getParameterValues(java.lang.String name)  

5.1 HttpServletRequest使用

  • 扩展ServletRequest接口,为HTTP servlet提供请求信息。
    servlet容器创建一个HttpServletRequest对象,并将其作为参数传递给servlet的服务方法(doGet、doPost等)。
# 在HTTP请求的第一行中,从协议名到查询字符串返回此请求的URL的一部分。
java.lang.String getRequestURI()  

# 返回路径后请求URL中包含的查询字符串。
java.lang.String getQueryString() 
 
 # 返回发出此请求的HTTP方法的名称,例如GET、POST或PUT。
  java.lang.String getMethod()  

# 返回请求URL中调用servlet的部分。
 java.lang.String getServletPath()  
 

举例:
NewFile.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="login" method="get">
 user: <input type="text" name="user"/>
 password:<input type="password" name="password"/>
interesting
<input type="checkbox" name="interesting" value="reading"/>Reading
<input type="checkbox" name="interesting" value="game"/>Game
<input type="checkbox" name="interesting" value="party"/>party
<input type="checkbox" name="interesting" value="shopping"/>shopping
<input type="checkbox" name="interesting" value="sport"/>sport
<input type="checkbox" name="interesting" value="tv"/>tv

<input type="submit" value="submit"/>
</form>

</body>
</html>

login.java

public class Login implements Servlet {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("请求来了。。。");
		System.out.println(req);
		//获取请求参数的名字
		String user=req.getParameter("user");
		String password=req.getParameter("password");
		
		System.out.println(user+","+password);
		
		//获取请求中多个参数
		String []strings=req.getParameterValues("interesting");
		for (int i = 0; i < strings.length; i++) {
                System.out.println(strings[i]+",");
			
		}
		
		Map<String, String[] > map=req.getParameterMap();
		for(Map.Entry<String, String[]> entry:map.entrySet()) {
			System.out.println("**"+entry.getKey()+","+Arrays.asList(entry.getValue()));
		}
		
		HttpServletRequest httpServletRequest=(HttpServletRequest) req;
		String requestURI=httpServletRequest.getRequestURI();
		System.out.println(requestURI);
		
		String method=httpServletRequest.getMethod();
		System.out.println(method);
		
		
		String queryString=httpServletRequest.getQueryString();
		System.out.println(queryString);
		
		String requestpath=httpServletRequest.getServletPath();
		System.out.println(requestpath);

		System.out.println("getServerName()"+req.getServerName()+","+"getServerPort()"+req.getProtocol());

	}
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>JavaWebDemo</display-name>
  
  <servlet>
     <servlet-name>login</servlet-name>
     <servlet-class>com.atstudying.zlj.Login</servlet-class>
  
  </servlet>
  
  <servlet-mapping>
    <!-- 需要和某一个servlet节点的servlet-name子节点的文本节点一致-->
  
       <servlet-name>login</servlet-name>
         <!-- 映射具体方法的访问路径:/表示当前Web应用的根目录 -->      
       <url-pattern>/login</url-pattern>
  </servlet-mapping>
</web-app>

启动tomacat
在这里插入图片描述
在这里插入图片描述

6:ServletResponse使用

  • 定义一个对象来帮助servlet向客户机发送响应。servlet容器创建一个ServletResponse对象,并将其作为参数传递给servlet的服务方法。(封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现)
# 返回一个可以向客户端发送字符文本的PrintWriter对象。
java.io.PrintWriter getWriter()  

# 如果尚未提交响应,则设置发送到客户机的响应的内容类型。
 void setContentType(java.lang.String type) 
 

6.1 HttpServletResponse使用

  • 扩展ServletResponse接口,在发送响应时提供特定于http的功能。例如,它有访问HTTP头文件和cookie的方法。
  • servlet容器创建一个HttpServletResponse对象,并将其作为参数传递给servlet的服务方法(doGet、doPost等)。
# 使用指定的重定向位置URL向客户端发送临时重定向响应并清除缓冲区。
 void sendRedirect(java.lang.String location)  

Login.java
html和web.xml和上面一个例子一样

public class Login implements Servlet {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("请求来了。。。");
		//ServletResponse的使用
		PrintWriter printWriter=res.getWriter();
		printWriter.println("sucess");
		
	}

}

在这里插入图片描述

7:GenericServlet使用

  • 定义一个通用的、独立于协议的servlet。要编写一个用于Web的HTTP servlet,可以扩展HttpServlet。
  • GenericServlet实现Servlet和ServletConfig接口。GenericServlet可以由servlet直接扩展,尽管扩展特定于协议的子类(如HttpServlet)更为常见。
  • GenericServlet简化了servlet的编写。它提供了生命周期方法的简单版本,init和destroy以及ServletConfig接口中的方法。GenericServlet还实现了在ServletContext接口中声明的日志方法。
    要编写通用servlet,只需覆盖抽象服务方法。

举例:在web . xml文件中设置两个WEB应用的初始化参数,user, password。定义一个login. htm, 里边定义两个请求字段: user, password. 发送请求到loginServlet,在创建一个LoginServlet类, 在其中获取请求的user, password. 比对其和web .xml 文件中定义的请求参数是若一致,响应Hello:xxx,若不一致,响应Sorry; xxx xxx为userxx

login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
   <form action="loginServlet" method="post">
      
      user:<input type="text" name="username" />
      password:<input type="password" name="password" />
      <input type="submit" value="submit"/>

   </form>
</body>
</html>

LoginServlet .java

public class LoginServlet extends MyGenericServlet{

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		//1: 获取请求参数:username,password
		String usernameforhtml=req.getParameter("username");
		String passwordforhtml=req.getParameter("password");

		
		//2:获取当前web应用的初始化参数:username,password字符串
		ServletContext servletContext=getServletConfig().getServletContext();
		String usernameforweb=servletContext.getInitParameter("user");
		String passwordforweb=servletContext.getInitParameter("password");

		
		//3:比对
		//4:打印响应
		PrintWriter out=res.getWriter();

		if (usernameforweb.equals(usernameforhtml)&&passwordforweb.equals(passwordforhtml)) {
			
			out.println("hello:"+usernameforhtml);
			
		}else {
			
			out.println("sorry:"+usernameforhtml);

			
		}
	}

}

MyGenericServlet .java

/**
 *    自定义的一个Servlet接口实现类:让开发的任何Servlet都继承该类。简化开发
 * @author 86180
 *
 */
public abstract class MyGenericServlet implements Servlet,ServletConfig{

	/**
	 * 以下方法是Servlet实现方法
	 */
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return servletconfig;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}

	private ServletConfig servletconfig;
	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		this.servletconfig=arg0;
	}

	@Override
	public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException;

	/**
	 * 以下方法为ServletConfig接口的方法
	 * @param arg0
	 * @return
	 */
	@Override
	public String getInitParameter(String arg0) {
		// TODO Auto-generated method stub
		return servletconfig.getInitParameter(arg0);
	}

	@Override
	public Enumeration<String> getInitParameterNames() {
		// TODO Auto-generated method stub
		return servletconfig.getInitParameterNames();
	}

	@Override
	public ServletContext getServletContext() {
		// TODO Auto-generated method stub
		return servletconfig.getServletContext();
	}

	@Override
	public String getServletName() {
		// TODO Auto-generated method stub
		return servletconfig.getServletName();
	}

}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>JavaWebDemo1</display-name>
  
  <context-param>
     <param-name>user</param-name>
     <param-value>zlj</param-value>
  
  </context-param>
  
  <context-param>
     <param-name>password</param-name>
     <param-value>123</param-value>
  
  </context-param>
  
  <servlet>
     <servlet-name>loginservlet</servlet-name>
     <servlet-class>com.atstudying.zlj.LoginServlet</servlet-class>
  
  </servlet>
  <servlet-mapping>
     <servlet-name>loginservlet</servlet-name>
     <url-pattern>/loginServlet</url-pattern>
  </servlet-mapping>
  
  
 </web-app>

在这里插入图片描述
在这里插入图片描述

8:HttpServlet介绍

  • 提供要子类化的抽象类,以创建适合于Web站点的HTTP servlet。HttpServlet的子类必须覆盖至少一个方法,通常是其中之一:
doGet,如果servlet支持HTTP GET请求
doPost,用于HTTP POST请求
doPut,用于HTTP PUT请求
doDelete,用于HTTP删除请求
init and destroy,以管理servlet生命周期中保留的资源
getServletInfo, servlet使用它来提供关于自身的信息
  • 几乎没有理由重写服务方法。服务通过将标准HTTP请求分派给每个HTTP请求类型的处理程序方法来处理它们(上面列出的doXXX方法)。同样,几乎没有理由重写doOptions和doTrace方法。
    servlet通常运行在多线程服务器上,因此请注意servlet必须处理并发请求,并小心同步对共享资源的访问。共享资源包括内存中的数据(如实例或类变量)和外部对象(如文件、数据库连接和网络连接)。

从HttpServlet底层源码分析,自己定义了MyHttpServlet 类

public class MyHttpServlet extends MyGenericServlet {

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		// TODO Auto-generated method stub
		if (arg0 instanceof HttpServletRequest) {
			
			HttpServletRequest request=(HttpServletRequest)arg0;
			if (arg1 instanceof HttpServletResponse) {
				
				HttpServletResponse response=(HttpServletResponse)arg0;
				service(request, response);
				
			}
		}
	}
	
	public void service(HttpServletRequest request,HttpServletResponse response) {
		
		//1:获取请求方式
		String method=request.getMethod();
		
		//2:根具请求方式在调用对应的处理方法
		if ("GET".equalsIgnoreCase(method)) {
			
			doGet(request,response);
			
		}else if ("POST".equalsIgnoreCase(method)) {
			
			doPost(request,response);
			
		}
		
	}

	private void doPost(HttpServletRequest request, HttpServletResponse response) {
		// TODO Auto-generated method stub
		
	}

	private void doGet(HttpServletRequest request, HttpServletResponse response) {
		// TODO Auto-generated method stub
		
	}

}

发布了195 篇原创文章 · 获赞 230 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_44891295/article/details/104368622