每天分享技术栈,开发工具等

天天学,应该把这些基本spring底层概念了解下,更好的理解我们常用框架的套路。

1.Servlets是SUN公司指定的一套开发动态网页的技术。一般JavaEE相关的类,都是以javaX开头

2. Servlet规范核心类图,他们之间的关系如图下:

Servlet详解(一)之基本概念_java

1. 编写一个Servlet案例应用的基本过程:

a) 建立一个标准的JavaWeb应用目录:

比如:

|--MyWebApp:

|--WEB-INF

|--classes:用来存放java运行的class文件

|--lib:存放web应用中需要的jar包

web-xml:配置文件,通常配置servlet类的访问映射

|--jsp css js等网页文件

b) 进入classes目录,建立一个java扩展名文件,这些java文件统称为Servlet,它们都必须间接或直接实现javax.servlet.Servlet接口。例如以下代码:

package com.lsh.itcast;
import java.io.*;
import javax.servlet.*;
public class ServerletDemo extends GenericServlet{
public void service(ServletRequest req,ServletResponse rep)
throws ServletException, IOException{
System.out.println("执行service方法");
OutputStream out=rep.getOutputStream();
out.write("hello my servlet".getBytes());
out.close();
}
}

a) 进入classes目录,对我们编写的类进行编译。

首先是Tomcat的lib目录下的servlet-api.jar,部署到当前的classpath环境变量中。在dos命令行的临时配置法是:

set classpath=%classpath%;C:\apache-tomcat-6.0.35\lib\servlet-api.jar

然后在dos命令行使用cd命令进入到classes目录下,编译Servlet类

编译命令​javac -d . 类名.java

b) 修改web应用中WEB-INF目录下的web.xml,对servlet类进行url地址映射,配置​如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">


<servlet>
<servlet-name>ServerletDemo</servlet-name>
<servlet-class>com.lsh.itcast.ServerletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServerletDemo</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>

a) 把已建立好的web应用配属到Tomcat中,并启动服务器

b) 访问地址是:http://localhost:8080/MyWebApp/test

看到写的Servlet类的输出结果,表示Servlet操作成功


1. Servlet的生命周期:在内存中一个Servlet只有一个实例,针对不同的的用户请求,容器采用多线程的机制来调用Service方法。容器什么时候开始装载Servlet呢?在以下四种情况下,Servlet被启动,容器装载Servlet的时刻。

a) 容器启动时会自动的装载某些需要的Servlet

b) 在容器启动后,客户首次向Servlet发出请求

c) Servlet的类文件被更新后,重新装载Servlet

d) Servlet被装载后,Servlet容器创建一个Servlet实例并调用init()方法进行初始化。在Servlet的整个生命周期中,init方法只会调用一次。

如果在web.xml中加上:​<load-on-startup>2</load-on-startup>。作用在于:

某些Servlet在web.xml文件中只有<servlet>元素而没有<servley-mapping>元素,这样我们就无法通过url地址的方式访问这个Servlet了,这种Servlet通常会在<servlet>元素中配置一个<load-on-startup>子元素,让容器在启动的时候自动加载该Servlet,并且调用其init方法完成一些全局性的初始化工作。

Servlet的生命周期的常用方法:

a) public void init(ServletCOnfig config):对Servlet进行初始化,Servlet类被实例化后就执行,且执行一次。由容器调用。默认情况下,只有第一次方访问时才执行,且执行一次。

b) public void destroy():在内存中销毁了Servlet对象。

Servlet详解(一)之基本概念_生命周期_02

1. Servlet的生命周期:在内存中一个Servlet只有一个实例,针对不同的的用户请求,容器采用多线程的机制来调用Service方法。容器什么时候开始装载Servlet呢?在以下四种情况下,Servlet被启动,容器装载Servlet的时刻。

a) 容器启动时会自动的装载某些需要的Servlet

b) 在容器启动后,客户首次向Servlet发出请求

c) Servlet的类文件被更新后,重新装载Servlet

d) Servlet被装载后,Servlet容器创建一个Servlet实例并调用init()方法进行初始化。在Servlet的整个生命周期中,init方法只会调用一次。

如果在web.xml中加上:​<load-on-startup>2</load-on-startup>。作用在于:

某些Servlet在web.xml文件中只有<servlet>元素而没有<servley-mapping>元素,这样我们就无法通过url地址的方式访问这个Servlet了,这种Servlet通常会在<servlet>元素中配置一个<load-on-startup>子元素,让容器在启动的时候自动加载该Servlet,并且调用其init方法完成一些全局性的初始化工作。

Servlet的生命周期的常用方法:

a) public void init(ServletCOnfig config):对Servlet进行初始化,Servlet类被实例化后就执行,且执行一次。由容器调用。默认情况下,只有第一次方访问时才执行,且执行一次。

b) public void destroy():在内存中销毁了Servlet对象。

1. 关于web-xml文件的Servlet的配置:

a) 一个Servlet可以被映射到多个URL地址上,即配置两个URL去映射一个Servlet,这两个URl都可以去访问这个Servlet。

b) URL地址映射支持通配符*。即*代表只要这个URL是字母,都可以去访问映射的Servlet,

i. 以*开头,以扩展名结尾。比如<url-pattern>*.do</url-pattern>

ii. 以/前缀开头,以*结尾。比如<url-pattern>/action/*</url-pattern>

iii. 如果一个Servlet的映射为一个"/",就称之为默认的Servlet,它负责处理没有映射路径的URL请求的响应。

但当一个web.xml有多个使用通配符时,会遵循一定的优先级规则。

a) 绝对匹配:以"/"开头(方式二)要比"*"开头(方式一)优先级高

b) 都以"/"开头,还是有多个匹配,找最匹配的

c) 以"/"开头(方式二)要比"*"开头(方式一)优先级高

2. Servlet的多线程同步问题:​Servlet本身是单实例的,这样当有多个用户同时访问某个Servlet时,会访问该唯一的Servlet实例中的成员变量,如果对成员变量进行写入操作,那就会导致Servlet的多线程问题,即数据不一致。

解决办法​去除成员变量,使用局部变量.或者是使用同步代码块。

建议:​在Servlet中定义变量时,除非特殊要求,尽量使用局部变量,当如果有需要实例变量时,应做同步处理,且同步代码块尽量包围少的代码。


​java——零基础10天教程  附完整视频+工具+面试简历模板   强力推荐2020-10-20Servlet详解(一)之基本概念_xml_03


​猿们你们开发是用的这些软件吗?必备软件。建议收藏!2020-10-19

Servlet详解(一)之基本概念_生命周期_04

​脚手架——一套简单,通用的后台管理系统,建议收藏​

​2020-10-18​

Servlet详解(一)之基本概念_生命周期_05

END
如果看到这里,说明你喜欢这篇文章,请 转发、点赞。同时本公众号可以第一时间接受到博文推送。