Java 24---Servlet
导读
1.第一个Servlet项目
2.servlet生命周期
3.部署后的应用结构
第一个Servlet项目
方法一、写一个java类,实现servlet接口
方法二、继承javax.servet.GenericServlet类(适配器模式)
方法三、继承javax.servlet.http.HttpServlet类(模板方法设计模式)
方法一:
这种方法是单实例,多线程的,即init方法只在第一次启动时调用,而之后只调用service方法,并且若频繁访问会保留线程
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>
⚠️复制路径的快捷方式
方法二:
与第一种方法比,这种方法运用了适配器模式,第一种方法实现了Servlet接口,所以要强制实现里边所有的抽象方法,而此种方法先用一个javax.servet.GenericServlet类实现了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文件路径不同
方法三:
这种是更为常用的方法
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");
}
}
配置文件的写法与前两种一致
模版写法
⚠️常见错误:
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