关于java:Servlet详解一之基本概念

41次阅读

共计 3659 个字符,预计需要花费 10 分钟才能阅读完成。

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

1.Servlets 是 SUN 公司指定的一套开发动静网页的技术。个别 JavaEE 相干的类,都是以 javaX 结尾

2. Servlet 标准外围类图,他们之间的关系如图下:

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.35libservlet-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 对象。

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 中定义变量时,除非特殊要求,尽量应用局部变量,当如果有须要实例变量时,应做同步解决,且同步代码块尽量突围少的代码。

如果看到这里,阐明你喜爱这篇文章,请 转发、点赞。同时 标星(置顶)本公众号能够第一工夫承受到博文推送。

本文由博客群发一文多发等经营工具平台 OpenWrite 公布

正文完
 0