JavaWeb Servlet 学习笔记总结( 一 )

Posted IT_Holmes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb Servlet 学习笔记总结( 一 )相关的知识,希望对你有一定的参考价值。

1.Servlet 一些步骤

通过实现Servlet接口来实现Servlet程序。

Servlet的生命周期:
1.执行Servlet构造器方法。
2.执行init初始化方法。
3.执行service方法。
4.执行destroy销毁方法。

第1,2步:是在第一次访问时创建调用。
第3步:是每次访问时都会调用,(例如刷新客户端)。
第4步:web工程停止的时候调用。

package com.test01;
import java.io.IOException;

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

public class HelloServlet implements Servlet
	
	public HelloServlet() 
		System.out.println("1. 构造器方法");
	

	@Override
	public void destroy() 
		// TODO Auto-generated method stub
		System.out.println("4.destory方法");
	

	@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
		System.out.println("2. 初始化方法");
	

	//service方法是专门用来处理请求和响应的。
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException 
		System.out.println("3. service方法");
		
		//ServletRequest方法中没有getMethod()方法但是它的子接口HttpServletRequest中有。
		HttpServletRequest httpServletRequset = (HttpServletRequest)req;
		
		//获取到客户端请求的方式:
		String method = httpServletRequset.getMethod();
	
		if("GET".equals(method)) 
			doGet();
		else if("POST".equals(method)) 
			doPost();
		
	
	
	//该方法用来执行获取get请求后的操作
	public void doGet() 
		System.out.println("对于接受到GET请求后,该方法用来执行get方法后的请求操作。");
	
	
	//该方法用来执行post请求后的操作
	public void doPost() 
		System.out.println("对于接受到POST请求后,该方法用来执行POST方法后的请求操作。");
	

	


2.Servlet中的 service方法

GET和POST分发请求步骤:

//service方法是专门用来处理请求和响应的。
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException 
	System.out.println("3. service方法");
	
	//ServletRequest方法中没有getMethod()方法但是它的子接口HttpServletRequest中有。
	HttpServletRequest httpServletRequset = (HttpServletRequest)req;
	
	//获取到客户端请求的方式:
	String method = httpServletRequset.getMethod();

	if("GET".equals(method)) 
		doGet();
	else if("POST".equals(method)) 
		doPost();
	

3. 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_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>WebTest02</display-name>
  
  <!-- servlet标签给Tomcat配置Servlet程序  -->
  <servlet>
  
  		<!-- servlet-name 标签给Servlet程序起一个别名,一般设置为类名。 -->
 		<servlet-name>HelloServlet</servlet-name>
 		<!-- servlet-class 标签是Servlet程序的全类名。 -->
 		<servlet-class>com.test01.HelloServlet</servlet-class>
 		
  </servlet>
  
  <!-- servlet-mapping 标签给servlet程序配置访问地址 -->
  <servlet-mapping>
  
  		<!-- servlet-name 标签作用:告诉服务器,我当前配置的地址给哪个Servlet程序使用。与上面的name不能混淆 -->
  		<servlet-name>HelloServlet</servlet-name>
  		
  		<!-- url-pattern 标签作用:配置访问地址。 -->
  		<url-pattern>/hello</url-pattern>
  		
  </servlet-mapping>
  
</web-app>`

4. 通过继承HttpServlet实现Servlet程序


除了实现Servlet接口,还能通过继承HttpServlet实现Servlet程序。

  • 1.编写一个类继承HttpServlet类。
  • 2.根据业务需要重写doGet或doPost方法。
  • 3.到web.xml中的配置Servlet程序的访问地址。

平时创建servlet程序,我们直接可以在IDEA或eclise中直接new一个servlet程序,定义好各个配置信息即可,注意的是3.0版本后是注解版本,2.5之前是xml版本别混淆。

5. Servlet 接口, GenericServlet 类, HttpServlet 类之间的关系


注意的是: HttpServlet类中有service()方法,并且里面会有判断例如是get还是post,从而执行doGet或doPost方法,这样我们只需要继承HttpServlet,重写doGet和doPost即可。

6. ServletConfig

6.1 ServletConfig类和ServletContext类区别


ServletConfig和ServletContext(容器)是相反的.
ServletConfig都是内测私用的,定义在那个servlet中,那个servlet就能获取上面参数值;
而ServletContext容器则是共享的,设置在webapp主目录下的!所有的servlet都可以调用。

6.2 ServletConfig类 使用


ServletConfig类是Servlet的配置信息类。

它有三大作用:
可以获取Servlet程序的别名,servlet-name的值。
获取初始化参数init-param。
获取ServletContext对象。


该类一般都在init()方法中:

package com.test01;
import java.io.IOException;

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

public class HelloServlet implements Servlet
	
	public HelloServlet() 
		System.out.println("1. 构造器方法");
	

	@Override
	public void destroy() 
		System.out.println("4.destory方法");
	

	@Override
	public ServletConfig getServletConfig() 
		return null;
	

	@Override
	public String getServletInfo() 
		return null;
	

	@Override
	public void init(ServletConfig config) throws ServletException 
		System.out.println("2. 初始化方法");
		
		//1.获取servlet-name别名值:
		System.out.println("别名为:"+config.getServletName());
		
		//2.获取初始化参数init-name:
		System.out.println("初始化参数username的值是:"+config.getInitParameter("username"));
		System.out.println("初始化参数url的值:"+config.getInitParameter("url"));
		
		//3.获取ServletContext对象
		System.out.println(config.getServletContext());
	

	//service方法是专门用来处理请求和响应的。
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException 
		System.out.println("3. service方法");
		
		//ServletRequest方法中没有getMethod()方法但是它的子接口HttpServletRequest中有。
		HttpServletRequest httpServletRequset = (HttpServletRequest)req;
		
		//获取到客户端请求的方式:
		String method = httpServletRequset.getMethod();
	
		if("GET".equals(method)) 
			doGet();
		else if("POST".equals(method)) 
			doPost();
		
	
	
	//该方法用来执行获取get请求后的操作
	public void doGet() 
		System.out.println("对于接受到GET请求后,该方法用来执行get方法后的请求操作。");
	
	
	//该方法用来执行post请求后的操作
	public void doPost() 
		System.out.println("对于接受到POST请求后,该方法用来执行POST方法后的请求操作。");
	


ServletConfig对象可以自己定义一个,不一定非要使用init方法中的形参。

ServletConfig con = getServletConfig();
String str = con.getInitParameter("[对应init-param的别名]");

上面对应web.xml的init-param标签如下:

<?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_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>WebTest02</display-name>
  
  <!-- servlet标签给Tomcat配置Servlet程序  -->
  <servlet>
  
  		<!-- servlet-name 标签给Servlet程序起一个别名,一般设置为类名。 -->
 		<servlet-name>HelloServlet</servlet-name>
 		<!-- servlet-class 标签是Servlet程序的全类名。 -->
 		<servlet-class>com.test01.HelloServlet</servlet-class>
 		
 		<!-- init-param作用是初始化参数 -->
 		<init-param>
 			<!-- 参数名 -->
 			<param-name>username</param-name>
 			<!-- 参数值 -->
 			<param-value>root</param-value>
 		</init-param>
 		<init-param>
 			<!-- 参数名 -->
 			<param-name>url</param-name>
 			<!-- 参数值 -->
 			<param-value>jdbc:mysql://localhost:3306/test</param-value>
 		</init-param>
 		
  </servlet>
  
  <!-- servlet-mapping 标签给servlet程序配置访问地址 -->
  <servlet-mapping>
  
  		<!-- servlet-name 标签作用:告诉服务器,我当前配置的地址给哪个Servlet程序使用。与上面的name不能混淆 -->
  		<servlet-name>HelloServlet</servlet-name>
  		
  		<!-- url-pattern 标签作用:配置访问地址。 -->
  		<url-pattern>/hello</url-pattern>
  		
  </servlet-mapping>
  
  
  <servlet>
  		<servlet-name>HelloServlet02</servlet-name>
  		<servlet-class>com.test01.HelloServlet02</servlet-class>
  </servlet>
  <servlet-mapping>
  		<servlet-name>HelloServlet02</servlet-name>
  		<url-pattern>/hello2</url-pattern>
  </servlet-mapping>
  
</web-app>

总结起来就是:Servlet程序 和ServletConfig对象都是由Tomcat创建的,我们负责使用而已。

Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象。


在别的方法中通过getServletConfig()也可以获得当前Servlet程序的ServletConfig对象。

package com.test01;

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;

public class HelloServlet02 extends HttpServlet
	
	@Override
	public void init(ServletConfig config) throws ServletException 
		// TODO Auto-generated method stub
		super.init(config); //
		System.out.println("重写了init方法,主要注意一定要继承一下父类的init方法,传递config参数!!!"
				+ "不然下面的getServletConfig()方法就会报错!");
		//为什么这样,看源码就懂了。
	

	/*
	 * doGet()方法是在get请求的时候调用。
	 */
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		System.out.println("HelloServlet2 的doGet方法");
		
		//在别的方法中通过getServletConfig()也可以获得当前Servlet程序的ServletConfig对象。
		ServletConfig sc = getServletConfig();
		System.out.println(sc);
	
	
	/*
	 * doPost()方法是在Post请求的时候调用。
	 */

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		System.out.println("HelloServlet2的doPost方法");
	
	


需要注意,一个Servlet程序只有一个ServletConfig对象,他们是一一对应的关系,不要混淆。

7. ServletContext类

7.1 ServletConfig类和ServletContext类区别


这里我在强调一下两者区别:

ServletConfig和ServletContext(容器)是相反的.
ServletConfig都是内测私用的,定义在那个servlet中,那个servlet就能获取上面参数值;
而ServletContext容器则是共享的,设置在webapp主目录下的!所有的servlet都可以调用。

7.2 什么是ServletContext?

ServletContext是一个接口,他表示Servlet上下文对象。

一个web工程,只有一个ServletContext对象实例(单例设计)。

ServletContext对象是一个域对象。
(什么是域对象,是像map一样,可以存储数据的对象,叫做域对象。这里的域指的是存取数据的操作范围。)

7.3 ServletContext的作用?

前面也说了ServletContext就相当于一个共享操作,所有的servlet程序都可以使用,里面的属性值。

context-param配置如下:(它是配置在webapp标签中!)

<context-param>
	<param-name>username</param-name>
	<param-value>context</param-value>
 </context-param>

同样也是使用getServletContext()方法调用:

ServletContext servletContext = getServletContext();
String initParameter = servletContext.getInitParameter("jdbc.driver");
System.out.println(initParameter);

//ServletContext servletContext2 = getServletConfig().getServletContext();
//这个方法和上面没啥不同,看源码就知道了。

1.获取web.xml中配置的上下文参数context-param。
2.获取当前工程路径,格式:/工程路径。
3.获取工程部署后在服务器硬盘上的绝对路径。
4.像map一样可以存储数据。


前三步的操作:

package com.test01;

import java.io.IOException;

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 ContextServlet extends HttpServlet

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		
		//1.获取web.xml中配置的上下文参数context-param。
		ServletContext context = getServletConfig().getServletContext();
		String name = context.getInitParameter("username");
		System.out.println("context-param参数username的参数值为:"+ name);
		System.out.println("context-param参数password的参数值为:"+context.getInitParameter("password"));
		
		//2.获取当前工程路径,格式:/工程路径。
		System.out.println("获取当前工程路径:"+context.以上是关于JavaWeb Servlet 学习笔记总结( 一 )的主要内容,如果未能解决你的问题,请参考以下文章

JAVAWEB学习笔记13_servlet

javaweb学习总结 - - Servlet开发

JAVAWEB学习总结 SERVLET开发

JavaWeb学习总结_Servlet开发

JAVAWEB学习笔记23

JavaWeb学习笔记之Servlet