Serverlet 动态web资源详解(包含生命周期等) no 10.

前言:
web资源有两种分类:
*静态资源
HTML ,JavaScript
*动态资源
Java server pages ,Serverlet

serverlet介绍

作用:

  • 访问静态资源或者动态资源都要用到serverlet
  • serverlet用于接收和响应http的请求
    Servlet容器处理Servlet请求的简单流程图流程图:
    Serverlet 动态web资源详解(包含生命周期等) no 10._第1张图片
    UML类图如下图所示:
    Serverlet 动态web资源详解(包含生命周期等) no 10._第2张图片
    代码:
  • 新建一个动态web工程。
    如果部署好了的项目tomcat会出现如下目录:
    Serverlet 动态web资源详解(包含生命周期等) no 10._第3张图片
    步骤
    1.新建一个动态web工程
    2.建立一个Myservlet类 让他实现 implements serverlet.(其实serverlet就是一个interface
    *我们在重写的 service方法中让他打印一个hello world
package com.serverlet.test;

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 Myservlet 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 arg0, ServletResponse arg1) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.print("hello world");
		
	}

}

3.配置一个serverlet(作用是告诉服务器我们的serverlet有以下作用)
*打开WebContent->WEB-INF->web.xml(这个web.xml创建web动态项目的时候应该勾选上去)

配置如下:
类路径可以鼠标右键 copy quailifile name


  
  Myservlet
  com.serverlet.test.Myservlet
  
 
 
 Myservlet
 /s
 

在浏览器中输入地址:http://localhost:8080/ServletDome/
结果
Serverlet 动态web资源详解(包含生命周期等) no 10._第4张图片
在次输入后面给的虚拟地址:/s
结果(打印两次是因为我输了两遍)
Serverlet 动态web资源详解(包含生命周期等) no 10._第5张图片
(*要是对应的servlet和servlet mapping两个不一样的话可能会报错,那么我们要注意 tomcat启动里面报错打印的信息 根据报错的信息修改相应内容)
总结过程:

  1. 找到tomcat应用
  2. 找到项目
  3. 找到web.xml ,然后在里面找到url-pattern,找到patter里面内容是/s的
  4. 找到servlet-mapping中的 servlet-name里面的Myservlet(这个名字在创建的时候可以随便写)
  5. 找到上面定义的servlet元素中的servlet-name 中的 myservlet
  6. 找到servlet-class然后开始创建该类的实例
  7. 继而执行该servlet中的service方法

servlet的通用写法
看一下 servlet的 方法结构
servlet(接口)---->GenericServlet------>HttpServlet–>或者其他自己定义的方法
所以可以写成其他定义的方法
例子:
首先先写一个类继承httpservlet,我写的是myservlet2.java

package com.serverlet.test;

import java.io.IOException;

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

public class Myseverlet2 extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("hello servlet");
		
	}

}

xml中配置如下:

 
  
  Myservlet2
  com.serverlet.test.Myseverlet2
  
  
   
 
 Myservlet2
 /ss
 

运行结果
Serverlet 动态web资源详解(包含生命周期等) no 10._第6张图片
其实在运用中只经常使用的是doget 和 dopost 所以我们把service注释掉重写do’get和 dopost:
代码如下:

package com.serverlet.test;

import java.io.IOException;

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

public class Myseverlet2 extends HttpServlet{
//	@Override
//	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		// TODO Auto-generated method stub
//		System.out.println("hello servlet");
//		
//	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("dopost...");
	}
	@Override
		protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			// TODO Auto-generated method stub
		System.out.println("doget servlet2...");
		}

}

在继续输入地址为回车:http://localhost:8080/ServletDome/ss
结果
Serverlet 动态web资源详解(包含生命周期等) no 10._第7张图片
看出打印doget servlet2…所以//如果是doget请求就会打印这个方法

Servlet生命周期

新建class 为Myserverlet3实现servlet方法

1.
在init方法中打印servlet初始化
代码如下:

package com.serverlet.test;

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 Myserverlet3 implements Servlet{
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("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 service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
	}

}

web.xml配置如下


  
  Myserverlet3
  com.serverlet.test.Myserverlet3
  
  
   
 
 Myserverlet3
 /sss
 

发布服务器地址栏输入:http://localhost:8080/ServletDome/sss
结果
Serverlet 动态web资源详解(包含生命周期等) no 10._第8张图片
重点小记
在其他浏览器继续输入该网址不能继续初始化init 因为一个servlet在创建后就初始化 并且只能初始化一次.
2.
给service方法一个打印hello service…

//2.只要客户端来了一个请求就执行这个方法
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("hello service...");
		
	}

重启给地址:http://localhost:8080/ServletDome/sss
结果
Serverlet 动态web资源详解(包含生命周期等) no 10._第9张图片
在回车
Serverlet 动态web资源详解(包含生命周期等) no 10._第10张图片
重点小记
只要客户端来了一个请求就执行这个方法
该方法可以执行多次 一次执行一个

3.
给destory一个方法打印输出hello destory被调用了

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("hello destory被调用了...");
		
	}

然后我们在server里面remove项目
Serverlet 动态web资源详解(包含生命周期等) no 10._第11张图片
结果
Serverlet 动态web资源详解(包含生命周期等) no 10._第12张图片
重点小记
servlet销毁的时候就执行这个方法
项目从服务器 tomcat移除的时候就执行这个方法
正常关闭服务器就会执行该方法

Servlet生命周期总结:

init方法 --创建实例时候就初始化 ,只执行一次
service方法—每请求一次 就执行一次
destory方法–关闭服务器就执行


让servlet初始化时机提前
意义:默有的时候在初次访问servlet的时候,才会执行init方法,有的时候,我们需要在这个方法里面执行一些初始化工作,甚至做一些比较耗时的逻辑,那么这个时候,初次访问,可能会在init方法中逗留太久时间,那么我们就想办法让初始化的时机提前一点
继续新建Mysevlet4的class
代码如下:

package com.serverlet.test;

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 Myserverlet4 implements Servlet{
	@Override
	
	//1.一个servlet在创建后就初始化 并且只能初始化一次.
	public void init(ServletConfig config) throws ServletException {
		System.out.println("servlet 初始化....");
		
	}
	//2.只要客户端来了一个请求就执行这个方法
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("hello service...");
		
	}
	//3.servlet销毁的时候就会执行该方法
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("hello destory被调用了...");
		
	}
	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return null;
	}

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

	



}

web.xml配置如下


 
  
  Myserverlet3
  com.serverlet.test.Myserverlet3
  2
  
  
   
 
 Myserverlet3
 /sss
 
 
 
 
 
  
  Myserverlet4
  com.serverlet.test.Myserverlet4
  4
  
  
   
 
 Myserverlet4
 /ssss
 

结果:在load-on-startup2里面就先初始化了
总结:在元素load-on-startup里面只要数字越小就越先执行(如果数字相同就是随机选择)一般不写负数 但是要从2开始(因为1在tomcat conf web.xml已经先被使用来访问各种静态资源,可以打开web.xml里面来看到详细信息)

servlet config:配置servlet

新建一个Myservletconfig类
代码如下

package com.serverlet.test;

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;

import jdk.nashorn.internal.runtime.regexp.joni.Config;

public class Myservletconfig extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		ServletConfig config=getServletConfig();
		String ServletName=config.getServletName();
		System.out.println("ServletName"+ServletName);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
	}

}

web.xml配置如下:

 
  
  Myserverlet5
  com.serverlet.test.Myservletconfig
  
  
  
   
 
 Myserverlet5
 /sssss
 

结果:
Serverlet 动态web资源详解(包含生命周期等) no 10._第13张图片
//可以从打印输出中看到这个其实是获得servlet-name里面的文本内容
继续在doget方法中打印
代码

String getaddress=config.getInitParameter("address");
System.out.println("address:"+getaddress);

配置:


  
  Myserverlet5
  com.serverlet.test.Myservletconfig
  
  address
  sichuang
  
  
  
   
 
 Myserverlet5
 /sssss
 

结果
Serverlet 动态web资源详解(包含生命周期等) no 10._第14张图片
可以看出init -param里面可以初始化参数并且方法getInitParameter(“xx”);可以获得某一个参数

继续下一个方法
代码:
在web.xml中有多个初始化对象那么怎么获得了

 
  
  Myserverlet5
  com.serverlet.test.Myservletconfig
  
  address
  sichuang
  
  
  
  age
  18
  
  
  
   
 
 Myserverlet5
 /sssss
 

方法:

	
		Enumeration getAllinitparam=config.getInitParameterNames();
		while (getAllinitparam.hasMoreElements()) {
			String AllName = (String) getAllinitparam.nextElement();
			System.out.println("Allparam:"+AllName);
			
		}

结果
Serverlet 动态web资源详解(包含生命周期等) no 10._第15张图片
//可以获得所有参数名称
也可以传进去参数的值得到参数的值
总结:
config三个方法new 对象接收并且输出

	ServletConfig config=getServletConfig();
  1. 获得servlet 名字的方法:getServletName();
  2. 获得某一个参数的方法:getInitParameter(“address”);
  3. 获得所有参数的方法:getInitParameterNames();
    用意:
    例如
ServletConfig config=getServletConfig();
		String number=config.getInitParameter("unber");
		if (number==null) {
			throw new IllegalArgumentException("servlet 在创建的时候一定要写这个参数");
		}else {
			System.out.println("number...");
		}
	

打印出number…
总结:
假如开发一些应用的时候使用到的一些技术,或者一些代码,我们不会,但是有人写出来了,他的代码放置在自己的servlet类里面,刚好这个servlet里面的公司在注册servlet的时候,必须要在web.xml里面,生命init-params

大总结

servlet配置web.xmlservlet元素servlet生命周期servletconfig里面的各种方法详细介绍等…

你可能感兴趣的:(编程语言开发专栏)