Eclipse创建第1个Servlet

一、配置相关服务

1.修改tomcat的server.xml文件

注意:tomcat的文件,都要以utf-8格式保存

配置server.xml文件,创建一个虚拟主机

其中:docBase="F:\Java codes\JavawebDemo\webcontent"  设置虚拟主机的根路径。

通过http://www.openbox.com/test/index.html ,访问

2.在Eclipse中创建项目文件和目录

classes存放servlet编译好的文件,必须先改变输出文件路径

3.导入Servlet-api.jar包

找到tomcat的lib目录下,sevlet-api.jar包,复制到Eclipse项目中的lib目录下

并且增加到Build path中去。

4.导入Servlet-api源代码

没有导入源代码时,无法看到源代码的定义

之前下载的tomcat源代码, 在这里引入。

 导入后,就可以查看servlet接口的定义

二、编写一个servlet通用类:MyGenericServlet

该类实现Servlet,ServletConfig,Serializable 接口,覆盖接口中的方法.并将其中的service方法抽象化,由其子类来完成

package com.openbox.servlet;

import java.io.IOException;
import java.io.Serializable;
import java.util.Enumeration;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

abstract public class MyGenericServlet implements Servlet,ServletConfig,Serializable{

	private static final long serialVersionUID = 6638201833260435498L;
	
	//定义一个ServletConfig的成员变量
	private ServletConfig config;
	
	//--------Servlet接口的覆盖方法-----------//
	@Override
	public void init(ServletConfig config) throws ServletException {
		//将tomcat容器中获得的ServletConfig对象赋给成员变量,方便下面的方法调用
		this.config=config;
		
	}


	/**
	 * 为了让子类service方法处理请示,
	 * 让子类必须重写方该法,将其定义为一个抽象方法
	 * 子类获取参数,可以通过getServletConfig方法获得
	 */
	@Override
	abstract public void service(ServletRequest req, ServletResponse res) 
			throws ServletException, IOException; 
	
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public ServletConfig getServletConfig() {
		// 公共方法可以获得当前的ServletConfig对象
		return this.config;
	}

	
	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}
	
	//--------ServletConfig接口的覆盖方法-----------//
	//因为此处已经有ServletConfig对象config,可以直接调用它的方法
	@Override
	public String getServletName() {
		// TODO Auto-generated method stub
		return config.getServletName();
	}

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

	@Override
	public String getInitParameter(String name) {
		// TODO Auto-generated method stub
		return config.getInitParameter(name);
	}

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

}

2.编写一个Helloword 子类,继承 MyGenericServlet类,覆盖父类的init和service方法

service方法获得web.xml配置文件中的servlet的参数

package com.openbox.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

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

public class Helloword extends MyGenericServlet{

	/**
	 * 子类的初始化操作,覆盖父类的init方法
	 * 此时只执行子类中的init方法,不会执行父类中的init方法:
	 * 1.因此,子类的init方法中要用,super.init(config);调用父类初始化方法
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		super.init(config);
	}
	
	
	/**
	 * 覆盖父类的服务方法
	 */
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		//1.设置请求字符集编码
		req.setCharacterEncoding("UTF-8");
		
		//2.设置响应的输出类型和字符集编码
		res.setContentType("text/html;charset=utf-8");
		PrintWriter out ;
		
		String string=super.getServletConfig().getInitParameter("encoding");
		System.out.println(string);
		
		System.out.println("-------所有参数---------");
		//获得所有参数名
		Enumeration<String> initParameterNames = super.getInitParameterNames();
		
		while (initParameterNames.hasMoreElements()) {
			String name = initParameterNames.nextElement();
			String value=super.getInitParameter(name);
			System.out.println("name: " + name+ " value: " +value);
			out=res.getWriter();
			out.println("name: " + name+ " value: " +value);
			out.print("<br>");
			
		}
		
				
	}
	
	

}

页面响应

 3.web.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	version="3.1" metadata-complete="true">
	<!-- 如果设置metadata-complete="false",则不需要以下注册servlet过程,只要在java代码中使用@WebServlet("/hello")标签声明,就可以访问 -->

	<!-- 配置tomcat管理servlet对象 -->
	<servlet>
		<servlet-name>Helloward</servlet-name>
		<servlet-class>com.openbox.servlet.Helloword</servlet-class>
		<!-- 配置servlet的初始化参数 -->
		<init-param>
			 <param-name>encoding</param-name>
			 <param-value>UTF8</param-value>
		</init-param>
		<init-param>
			 <param-name>info</param-name>
			 <param-value>by test</param-value>
		</init-param>
		
	</servlet>
			
    <!-- 配置外部访问的资源名称 -->
    <servlet-mapping>
    	<servlet-name>Helloward</servlet-name>
    	<url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
</web-app>

三、servlet执行过程

Tomcat容器中有Servlet的实例缓冲池(用Map存储),如果池中找不到,就创建新的。如果有,就直接调用。

Servlet的请求流程:
   1:浏览器先发送请求:http://www.openbox.com/test/hello.
   2:DNS解析域名(忽略)
   3:Tomcat解析请求:/test/hello.
       上下文路径:/test
       资源的名称:/hello
   4:解析Tomcat根/conf/server.xml文件,获取其中所有的<Context/>元素,并找到path属性为/day3的元素.
      <Context docBase="F:\Java codes\JavawebDemo\webcontent" path="test"/>.

      再读取该<Context/>元素,再获取docBase属性值,该属性值就是当前访问的WEB项目的根路径.

   5:从该web的根路径/WEB-INF下找到web.xml文件.
   6:读取web.xml文件,获取所有的<url-patten>元素,并判断哪一个<url-pattern>的文本内容为:/hello.
      找不到: 报404错误.
      找  到: GOTO 7.
   7:通过/hello,找到当前Servlet的全限定名.com.openbox.servlet.Helloword

   8:从Servlet的实例缓冲池中去获取com.openbox.servlet.Helloword对应的对象.
      Map<String,Servlet> cache = .....;
      Servlet obj = cache.get("com.openbox.servlet.Helloword");
      if(obj == null{
           //第一次请求:GOTO 9.
      }else{
           //非第一次请求:GOTO 12;
      }

    9:使用反射创建Servlet对象.
      Servlet obj = Class.forName("com.openbox.servlet.Helloword").newInstance();

    10.把创建的Servlet对象,存储到Servlet实例缓存池中,供下一次请求使用.
        cache.put("com.openbox.servlet.Helloword",obj);

    11:容器创建ServletConfig对象,并调用init方法,来完成初始化操作.
       obj.init(config);

    12:容器创建ServletRequest和ServletResponse对象,并调用service方法,处理请求.
       obj.service(req,resp);

猜你喜欢

转载自blog.csdn.net/openbox2008/article/details/84865593