目录
零. 基本配置
00. 纯手工写的第一个Servlet类(Eclipse工具)
- 编写一个类,继承HttpServlet
- 重写里面的doGet(),doPost()方法
- 编写web.xml里的Servlet映射关系
Servlet类---->WelcomeServlet
public class WelcomeServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
网页代码只有body部分:index.jsp
<body>
<a href="WelcomeServlet">WelcomeServlet</a>
<!--超链接默认get -->
<!--表单默认get -->
<form action="WelcomeServlet" method="post">
<input type="submit">
</form>
</body>
Web.xml添加的代码
<servlet>
<servlet-name>WelcomeServlet</servlet-name>
<servlet-class>org.lianqiao.servlet.WelcomeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WelcomeServlet</servlet-name>
<url-pattern>/WelcomeServlet</url-pattern>
</servlet-mapping>
项目结构:
01. Servlet流程(xml):
- 请求----->
url-patting
url-patting
根据servlet-mapping
里的servlet-name
去匹配servlet
中的servlet-name
- 匹配成功,然后找到对应的
servlet-class
,将请求交给servlet-class
执行
servlet-name
一般用对应类名,一对之间要相同
url-patting
里是 请求前加 /
02. Servlte类规范
Java类必须符合一定的 规范:
- 必须继承 javax.servlet.http.HttpServlet
- 重写其中的 doGet()或doPost()方法
doGet(): 接受 并处理 所有get提交方式的请求
doPost():接受 并处理 所有post提交方式的请求
(1). / 符号的作用,项目根目录
- 项目根目录:WebConcent, src(所有的构建路径,构建路径可以是多个的,不止一个src,可以通过Sorce Folder新建)
例如:
Webconcent中有一个文件index.jsp(目录下直接有一个文件)
ser中有一个Servlet.java - 如果:index.jsp中请求
<a href="abc">...</a>
,则 寻找范围:既会在src根目录中找 也会在WebContent根目录中找 - 如果:index.jsp中请求
<a href="a/abc"></a>
,寻找范围:先在src或WebContent中找a目录,然后再在a目录中找abc / 代表的功能
:web.xml中的 /
:代表项目根路径http://localhost:8080/Servlet2.5Project/
jsp中的/
: 服务器根路径(返回上一级)http://localhost:8080/
(2).自动生成Servlte
借助于Eclipse快速生成Servlet
直接新建Servlet即可!(继承、重写、web.xml 可以借助Eclipse自动生成)
一.Servlte2.5与Servlte3.0
- Servlte2.5 要在web.xml中配置(自动生成的类在web.xml中已经配置好)
- Servlet3.0不需要在web.xml中配置,但 需要在 Servlet类的定义处之上编写 注解@WebServlet(“url-pattern的值”)
- Servlet3.0匹配流程:请求地址 与@WebServlet中的值 进行匹配,如果匹配成功 ,则说明 请求的就是该注解所对应的类
Servlet3.0:
@WebServlet("/WelcomeServlet")
public class WelcomeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("3.0");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("3.0");
}
}
在新建项目时,可以选择不同的Servlte版本,这样自动生成的Servlte类就会不同:
二. Servlet生命周期:五个阶段
由谁来控制的 ?----由容器(Tomcat,Jboss,Weblogic,glassfish等) 不需要我们去实例化和调用的
Servlet接口(系统):
package javax.servlet;
public interface Servlet {
void init(javax.servlet.ServletConfig servletConfig) throws javax.servlet.ServletException;
javax.servlet.ServletConfig getServletConfig();
void service(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws javax.servlet.ServletException, java.io.IOException;
java.lang.String getServletInfo();
void destroy();
}
- 加载
容器通过构造方法完成实例化,一次,单例的。注意:serlvet的请求和响应使用的多线程。
- 初始化 :init() ,该方法会在Servlet被加载并实例化的以后执行
init有两个重载的方法,有参和无参,执行一次(2个都重写,执行有参)
- 服务:service()–>doGet(),doPost()
在service方法中,获取请求的method,来调用doGet和doPost
- 销毁:destroy(), Servlet被系统回收时执行,关闭
- 卸载
加载,卸载Servlet()容器自动处理
@WebServlet(value = "/Servlet1" ,loadOnStartup = 1)
// 默认 loadOnStartup 是-1
public class Servlet1 extends HttpServlet {
@Override
// 初始化
public void init() throws ServletException {
System.out.println("-----------Servlet1初始化");
}
// 销毁,关闭服务器
@Override
public void destroy() {
System.out.println("============销毁");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("----------------service()");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
注意:
- init(): 只执行一次
- service ->doGet(),doPost():调用几次,则执行几次
public abstract void service(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws javax.servlet.ServletException, java.io.IOException;
- destroy():关闭tomcat服务时,执行一次
- config用来获取初始化配置,web.xml中的配置(注解中)
(1) init()
默认第一次
访问 Servlet时会被执行 (只执行这一次)可以修改为 Tomcat启动时
自动执行,默认 loadOnStartup 是-1
- Servlet2.5: web.xml
<servlet>
...
<load-on-startup>1</load-on-startup>
</servlet>
其中的“1”代表一个比较数字
。(应该是按照由小到大顺序初始化)
- Servlet3.0
@WebServlet( value="/WelcomeServlet" ,loadOnStartup=1 )
当有多个Servlet 时,顺序要不相同
,几个Servlet初始化顺序,虽然没有发现相同时出现什么错误!(0,1,2,3…)
servlet实例化和初始化时间?
a.默认
情况下,第一次被请求
时
b.可以配置,在服务器启动时
,进行实例化和初始化,启动配置为-1,表示不随服务器启动(第一次被访问时加载)。
如果大于等于0时,按数字有小到大的顺序,依次启动
。
@WebServlet(value = "/WelcomeServlet" ,loadOnStartup = 0)
public class WelcomeServlet extends HttpServlet {
public void init() throws ServletException {
System.out.println("-----------WelcomeServlet初始化");
}
}
@WebServlet(value = "/Servlet1" ,loadOnStartup = 1)
// 默认 loadOnStartup 是-1
public class Servlet1 extends HttpServlet {
@Override
// 初始化
public void init() throws ServletException {
System.out.println("-----------Servlet1初始化");
}
}
启动Tomcat(部分代码):
一月 17, 2020 1:42:11 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 85 ms
Connected to server
[2020-01-17 01:42:11,975] Artifact WebServlet:war exploded: Artifact is being deployed, please wait...
一月 17, 2020 1:42:12 下午 org.apache.catalina.deploy.WebXml setVersion
警告: Unknown version string [4.0]. Default version will be used.
-----------WelcomeServlet初始化
-----------Servlet1初始化
[2020-01-17 01:42:12,437] Artifact WebServlet:war exploded: Artifact is deployed successfully
[2020-01-17 01:42:12,437] Artifact WebServlet:war exploded: Deploy took 462 milliseconds