HTTP&Servlet

HTTP&Servlet

HTTP&Servlet

Http协议介绍

Http协议

演示客户端如何与服务器端通信

Http请求数据解释

1.请求的数据里面包含三个部分内容:请求行,请求头,请求体.

Http响应数据解析

响应行,响应头,响应体

Web资源解释

在http协议当中,规定了请求和响应双方,客户端和服务器端.与web相关的资源

有两种分类:

1.静态资源

html,js,css

2.动态资源

servlet/jsp

servlet

servlet是什么?

servlet 是运行在 Web 服务器中的小型 Java 程序。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。

更多的是配合动态资源来做,当然静态资源也需要使用到servlet.只不过是Tomcat里面自带一个DefaultServlet

Hello,Servlet!

1.得写一个web工程,要有一个服务器

2.测试运行web工程

3.新建一个类,然后实现Servlet接口.

4.配置Servlet,用意:告诉服务器,我们的应用有这么些个Servlet.

在webContent/WEB-INF/web.xml中添加一下内容:

<!--   向Tomcat注册Servlet,名字叫做HelloServlet,具体路径是com.nike.servlet.HelloServlet -->
  <servlet>
  	<servlet-name>HelloServlet</servlet-name>
  	<servlet-class>com.nike.servlet.HelloServlet</servlet-class>
  </servlet>
<!--   注册servlet的映射.servlet-name:找到上面注册具体的Servlet,url-pattern:在地址栏上的path,一定要以/打头 -->
  <servlet-mapping>
  	<servlet-name>HelloServlet</servlet-name>
  	<url-pattern>/Hi</url-pattern>
  </servlet-mapping>

5.在地址栏上输入http://localhost:8080/HelloServlet/Hi

com.nike.servlet.HelloServlet.java:

package com.nike.servlet;

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 HelloServlet 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
		
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("helloServlet....");
		
	}

}

Servlet通用写法

Servlet(接口)
    |
    |
GenericServlet
    |
    |
HttpServlet(用于处理http请求)
package com.nike.servlet;

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 HelloServlet02 extends HttpServlet {

	/*@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		System.out.println("HelloServlet02------------");
	}*/
	
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doGet(req, resp);
		System.out.println("get-___");
	}
	
	
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
		System.out.println("post-____");
	}
	
	
}

Servlet生命周期

从创建到销毁:

生命周期方法:

从创建到销毁,所调用的那些方法:

init方法:

在创建servlet的实例时,就执行该方法.

一个servlet只会初始化一次,init方法只会执行一次;

默认情况下:初次访问该servlet,才会创建实例

service方法:

只要客户端来了一个请求,那么就会执行这个方法了.

该方法可以被执行多次,一次请求,对应一次service方法的调用

destroy方法:

servlet销毁的时候,就会执行该方法

1.该项目从Tomcat的里面移除;

2.正常关闭tomcat就会执行 shutdown.bat

doGet 和 doPost不算生命周期方法,所谓生命周期方法是指,从对象创建到销毁一定会执行的方法,但是这两个方法不一定会执行.

让servlet创建实例的时机提前

1.默认情况下,只有在初次访问servlet的时候才会执行init方法.有的时候,我们可能需要在这个方法里面执行一些初始化工作,甚至是一些比较耗时的逻辑.

2.那么这个时候,初次访问,可能会在init方法中逗留太久的时间,那么有没有方法可以让这个初始化的时机提前一点

3.在配置的时候,使用元素来指定,给定的数字越小,启动的时机越早.

ServletConfig

servlet的配置,用过这个对象,可以获取servlet在配置的时候的一些信息

package com.nike.servlet;

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

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

public class ServletConfig extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		//ServletConfig 可以获取servlet在配置的一些信息
		//1.得到servlet配置对象,专门用于在配置servlet的信息.
		javax.servlet.ServletConfig sCon = getServletConfig();
		//获取到的是配置servlet里面servlet-name的文本内容.
		String servletName = sCon.getServletName();
		String address = sCon.getInitParameter("address");
		
		System.out.println("servletName:"+servletName+"address"+address);
		System.out.println("----------------------");
		//获取所有的参数名称
		Enumeration<String> initParameterNames = sCon.getInitParameterNames();
		//遍历取出所有的参数名称
		while (initParameterNames.hasMoreElements()) {
			String name = (String) initParameterNames.nextElement();
			System.out.println(name+"---"+sCon.getInitParameter(name));
		}
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req,resp);
	}
}
<servlet>
  	<servlet-name>ServletConfig</servlet-name>
  	<servlet-class>com.nike.servlet.ServletConfig</servlet-class>
  	<!-- 可以添加初始化参数 -->
  	<init-param>
  		<param-name>address</param-name>
  		<param-value>beijing</param-value>
  	</init-param>
  	<init-param>
  		<param-name>name</param-name>
  		<param-value>zhangsan</param-value>
  	</init-param>
  	<init-param>
  		<param-name>age</param-name>
  		<param-value>12</param-value>
  	</init-param>
  </servlet>
  <servlet-mapping>
  	<servlet-name>ServletConfig</servlet-name>
  	<url-pattern>/SC</url-pattern>
  </servlet-mapping>

为什么需要有这个ServletConfig

1.未来我们自己开发的一些应用,使用到了一些技术,或者一些代码,我们不会,但是有人写出来了.

他的代码放置在自己的servlet类里面

2.刚好这个servlet里面需要一个数字或者变量值.但是这个值不能是固定的了.所以要求使用到这servlet的公司,在注册servlet的时候,必须要在web.xml里面,声明init-params参数.

 

posted on 2018-12-11 20:02  野犬  阅读(136)  评论(0编辑  收藏  举报