Java 24---Servlet

导读

1.第一个Servlet项目
2.servlet生命周期
3.部署后的应用结构

第一个Servlet项目

方法一、写一个java类,实现servlet接口
方法二、继承javax.servet.GenericServlet类(适配器模式)
方法三、继承javax.servlet.http.HttpServlet类(模板方法设计模式)

方法一:

这种方法是单实例,多线程的,即init方法只在第一次启动时调用,而之后只调用service方法,并且若频繁访问会保留线程
Java 24---Servlet
ServletDemo1.java文件

package com.hala.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 ServletDemo1 implements Servlet {
	
	public void sayHi(String str) {
		System.out.println(Thread.currentThread().getName()+":"+str);
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		//  初始化方法
		sayHi("init");
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		// 响应方法
		sayHi("service");
	}
	
	@Override
	public void destroy() {
		// 销毁方法
		sayHi("destory");
	}

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

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


}

因为浏览器不认识.java文件,所以要为它写一个配置文件
web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>javaWeb</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- servlet和servlet-mapping是配置的标签 -->
  <servlet>
	  <!-- 自己起的名字 -->
  	<servlet-name>Haha</servlet-name>
  	<!-- .java文件的路径 /javaWeb/src/com/hala/servlet/ServletDemo1.java这个写法不对 -->
  	<servlet-class>com.hala.servlet.ServletDemo1</servlet-class>
  	
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>Haha</servlet-name>
  	<!-- url-pattern是区分大小写的,自己起的名字,必须以/开头 -->
  	<url-pattern>/doS1</url-pattern>
  </servlet-mapping>
</web-app>

⚠️复制路径的快捷方式
Java 24---Servlet

方法二:

与第一种方法比,这种方法运用了适配器模式,第一种方法实现了Servlet接口,所以要强制实现里边所有的抽象方法,而此种方法先用一个javax.servet.GenericServlet类实现了Servlet接口,然后再继承这个方法,只有部分方法需要强制实现更加便捷,需要哪个方法实现哪个

Java 24---Servlet

ServletDemo2.java

package com.hala.servlet;

import java.io.IOException;

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

public class ServletDemo2 extends GenericServlet {
	
	public void sayHi(String str) {
		System.out.println(Thread.currentThread().getName()+":"+str);
	}
	
	@Override
	public void init() throws ServletException {
	//  初始化方法,非强制
		sayHi("init");
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		// 响应方法,强制
		sayHi("service");
	}
	
	@Override
	public void destroy() {
		// 销毁方法,非强制
		sayHi("destory");
	}

}

配置文件与方法一相同,只是java文件路径不同

方法三:

这种是更为常用的方法

Java 24---Servlet

ServletDemo3.java

package com.hala.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 ServletDemo3 extends HttpServlet{
	
	public void sayHi(String str) {
		System.out.println(Thread.currentThread().getName()+":"+str);
	}
	
	@Override
	public void init() throws ServletException {
		sayHi("init");
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		sayHi("doGet");
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		sayHi("doPost");
	}
	
	@Override
	public void destroy() {
		sayHi("destroy");
	}

}

配置文件的写法与前两种一致

模版写法

Java 24---Servlet

⚠️常见错误:

classNotFound解决办法 :

1.servlet-class的路径写错了,改正
2.eclipse的插件奔溃了,关闭服务器,重启eclipse
3.关闭服务器,移除服务器下的项目,看服务器能否启动,不能-重新配服务器
能-创建一个空白项目,重写一个动态资源看能否启动执行,不能-重启计算机
能-检查工程中的问题,重新换一个workspace

404错误

未找到资源

500错误

服务端代码错误

servlet生命周期

实例化–>初始化–>服务->销毁
出生:(实例化–>初始化init)第一次访问Servlet就出生(默认情况下)
活着:(服务service)应用活着,servlet就活着
死亡:(销毁destroy)应用卸载了servlet就销毁。

部署后的应用结构

应用名
–WEB-INF:不能通过客户端直接访问的
----1)classes:编译好的类,Servlet类
----2)lib:第三方jar包
----3)web.xml:配置文件
静态资源:
–index.html
–pic01.png