必威体育Betway必威体育官网
当前位置:首页 > IT技术

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

时间:2019-10-03 06:14:30来源:IT技术作者:seo实验室小编阅读:75次「手机版」
 

serverlet

前言:

web资源有两种分类:

*静态资源

HTML ,javaScript

*动态资源

Java server pages ,serverlet

serverlet介绍

作用:

  • 访问静态资源或者动态资源都要用到serverlet
  • serverlet用于接收和响应http的请求

    Servlet容器处理Servlet请求的简单流程图流程图:

    在这里插入图片描述

    UML类图如下图所示:

    在这里插入图片描述

    代码

  • 新建一个动态web工程。

    如果部署好了的项目tomcat会出现如下目录:

    在这里插入图片描述

    步骤

    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

<!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
  <servlet>
  <servlet-name>Myservlet</servlet-name>
  <servlet-class>com.serverlet.test.Myservlet</servlet-class>
  </servlet>
 <!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
 <servlet-mAPPing>
 <servlet-name>Myservlet</servlet-name>
 <url-pattern>/s</url-pattern>
 </servlet-mapping>

浏览器中输入地址:http://localhost:8080/ServletDome/

结果

在这里插入图片描述

在次输入后面给的虚拟地址:/s

结果(打印两次是因为我输了两遍)

在这里插入图片描述

(*要是对应的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中配置如下:

 <!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
  <servlet>
  <servlet-name>Myservlet2</servlet-name>
  <servlet-class>com.serverlet.test.Myseverlet2</servlet-class>
  </servlet>
  
   <!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
 <servlet-mapping>
 <servlet-name>Myservlet2</servlet-name>
 <url-pattern>/ss</url-pattern>
 </servlet-mapping>

运行结果

在这里插入图片描述

其实在运用中只经常使用的是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

结果

在这里插入图片描述

看出打印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配置如下

<!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
  <servlet>
  <servlet-name>Myserverlet3</servlet-name>
  <servlet-class>com.serverlet.test.Myserverlet3</servlet-class>
  </servlet>
  
   <!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
 <servlet-mapping>
 <servlet-name>Myserverlet3</servlet-name>
 <url-pattern>/sss</url-pattern>
 </servlet-mapping>

发布服务器地址栏输入:http://localhost:8080/ServletDome/sss

结果

在这里插入图片描述

重点小记

在其他浏览器继续输入该网址不能继续初始化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

结果

在这里插入图片描述

在回车

在这里插入图片描述

重点小记

只要客户端来了一个请求就执行这个方法

该方法可以执行多次 一次执行一个

3.

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

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

然后我们在server里面remove项目

在这里插入图片描述

结果

在这里插入图片描述

重点小记

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配置如下


 <!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
  <servlet>
  <servlet-name>Myserverlet3</servlet-name>
  <servlet-class>com.serverlet.test.Myserverlet3</servlet-class>
  <load-on-startup>2</load-on-startup>
  </servlet>
  
   <!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
 <servlet-mapping>
 <servlet-name>Myserverlet3</servlet-name>
 <url-pattern>/sss</url-pattern>
 </servlet-mapping>
 
 
 
 <!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
  <servlet>
  <servlet-name>Myserverlet4</servlet-name>
  <servlet-class>com.serverlet.test.Myserverlet4</servlet-class>
  <load-on-startup>4</load-on-startup>
  </servlet>
  
   <!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
 <servlet-mapping>
 <servlet-name>Myserverlet4</servlet-name>
 <url-pattern>/ssss</url-pattern>
 </servlet-mapping>

结果:在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配置如下:

 <!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
  <servlet>
  <servlet-name>Myserverlet5</servlet-name>
  <servlet-class>com.serverlet.test.Myservletconfig</servlet-class>
  
  </servlet>
  
   <!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
 <servlet-mapping>
 <servlet-name>Myserverlet5</servlet-name>
 <url-pattern>/sssss</url-pattern>
 </servlet-mapping>

结果:

在这里插入图片描述

//可以从打印输出中看到这个其实是获得servlet-name里面的文本内容

继续在doget方法中打印

代码

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

配置:

<!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
  <servlet>
  <servlet-name>Myserverlet5</servlet-name>
  <servlet-class>com.serverlet.test.Myservletconfig</servlet-class>
  <init-param>
  <param-name>address</param-name>
  <param-value>sichuang</param-value>
  </init-param>
  </servlet>
  
   <!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
 <servlet-mapping>
 <servlet-name>Myserverlet5</servlet-name>
 <url-pattern>/sssss</url-pattern>
 </servlet-mapping>

结果

在这里插入图片描述

可以看出init -param里面可以初始化参数并且方法getInitParameter(“xx”);可以获得某一个参数

继续下一个方法

代码:

在web.xml中有多个初始化对象那么怎么获得了

 <!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
  <servlet>
  <servlet-name>Myserverlet5</servlet-name>
  <servlet-class>com.serverlet.test.Myservletconfig</servlet-class>
  <init-param>
  <param-name>address</param-name>
  <param-value>sichuang</param-value>
  </init-param>
  
  <init-param>
  <param-name>age</param-name>
  <param-value>18</param-value>
  </init-param>
  </servlet>
  
   <!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
 <servlet-mapping>
 <servlet-name>Myserverlet5</servlet-name>
 <url-pattern>/sssss</url-pattern>
 </servlet-mapping>

方法:

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

结果

在这里插入图片描述

//可以获得所有参数名称

也可以传进去参数的值得到参数的值

总结:

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里面的各种方法详细介绍等…

相关阅读

Javaweb学习笔记3—Serverlet

今天来讲javaweb的第三个阶段学习。老规矩,首先先用一张思维导图来展现今天的博客内容。ps:我的思维是用的xMind画的,如果你对我的

serverlet快速入门

转载:http://blog.sina.com.cn/s/blog_85f5590f0100wm7q.html现在的JSP书籍有的是直接讲述JSP的使用,然后再讲解SERVERLET的使用;

分享到:

栏目导航

推荐阅读

热门阅读