1.Servlet:  
  

Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:
  1. 客户端发送请求至服务器端;
  2. 服务器将请求信息发送至 Servlet;
  3. Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
  4. 服务器将响应返回给客户端。
 
2.MyEclipse创建Servlet:
  首先创建Web Project项目:
 
         
  
  然后一直点击Next,直到这个界面,将Generate web.xml deployment  descriptor选中(内部创建形成一个web.xml文档),点击Finish结束
 
          
 
创建Servlet类:
  

package cn.zzsxt.lee.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* @description servlet也是一个普通的Java类 继承了HttpServlet就变的不普通 servlet是什么?-->Java类
* 用于在http协议中,进行数据的传递 干什么用的? 处理客户端发送的请求
* @author Seven Lee
* @date 2017年7月17日下午4:20:30
*
* servlet生命周期:(单例)(!!重要)
* 1.加载并实例化(创建servlet对象)
* 2.初始化(init)(只会被调用一次,第一次访问servlet的时候调用)
* 3.处理客户端的请求并响应(service)
* 4.自动销毁(destroy)(也只会被调用一次,在正常关闭以后会被调用)
*
*/
public class FirstServlet extends HttpServlet {
// 连接数据库,进行把用户的信息存储入数据,并返回用户是否存储成功 @Override
public void init() throws ServletException {
// init方法只会被调用一次,第一此访问servlet的时候会被调用
System.out.println("我是init方法,我被调用了");
} @Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// service方法每发送一次请求就被调用一次
// request-->请求:处理客户端发送到服务器的请求
// response-->响应:处理完请求以后,向客户端进行响应(404, 500...),如果成功200 OK
System.out.println("我是service方法,我被调用了");
// 设置编码格式
request.getRequestDispatcher("index.jsp").forward(request, response);
} @Override
public void destroy() {
// destroy方法也只会被调用一次
// 服务器关闭的时候,客户端关闭连接的时候,处理完所有客户端请求的时候(正常关闭),非正常关闭的情况下是不被调用的
System.out.println("我是destroy方法,我被调用了");
} }

配置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>first_servlet</display-name>
<servlet>
<servlet-name>servlet</servlet-name><!-- servlet-name是随意规定的,没有任何限制,命名规则同样遵循Java的驼峰命名规则 -->
<servlet-class>cn.zzsxt.lee.servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet</servlet-name><!-- servlet-mapping中servlet-name要和<servlet>中的一模一样 -->
<!-- <url-pattern>/reg</url-pattern> --><!-- 就是访问servlet的路径,只有通过这个路径才能访问servlet -->
<url-pattern>*.aaa</url-pattern><!-- 以aaa结尾的方式进行匹配servlet -->
<!-- <url-pattern>/ccc/*</url-pattern> --><!-- 以ccc开头来匹配servlet -->
<url-pattern>/*</url-pattern><!-- 所有的路径都要被servlet进行拦截 -->
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> </web-app>

 

localhost:8080/项目名:查看index.jsp

localhost:8080/项目名/reg(各种访问方式) :通过访问网页对将数据传送到后端控制台

3.Servlet Life Cycle:

  A:加载Servlet
      加载一般是在运行tomcat容器时来完成,将servlet类加载到tomcat中,或者是客户端发来请求时也可以。
    web容器负责加载Servlet,当web容器启动时或者是在第一次使用这个Servlet时,容器会负责创建Servlet实例,但是用户必须通过   部署描述符(web.xml)指定Servlet的位置,也就是Servlet所在的类名称,成功加载后,web容器会通过反射的方式对Servlet进行实例化。
  
  B:初始化
当一个Servlet初始化后,容器将调用init()方法初始化这个对象,初始化的目的是为了让Servlet在处理客户端请求前完成一些初始化的工作,如建立数据库连接,读取资源文件信息等,如果初始化失败,则次Servlet将被直接卸载。
 
  C:进入服务
当有请求提交时,Servlet将调用service()方法进行处理,常用的是service根据请求类型调用doGet()或者doPost()方法进行处理;在service()方法中,Servlet可以通过ServletRequest接受客户的请求,也可以利用ServletResponse设置响应信息。
  
  D:销毁
当web容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()方法,以便让该实例释放掉所占用的资源。
 
  E:卸载
当一个Servlet调用完destroy()方法后,次实例将等待被垃圾收集器所回收,如果需要再次使用此Servlet时,会重新调用init()方法初始化。
 
 
 
  注意:
  在正常情况下,Servlet只会初始化一次,而处理服务会调用多次,销毁也只会调用一次;但是如果一个Servlet长时间不使用的话,也会被容器自动销毁,而如果需要再次使用时会重新进行初始化的操作,即在特殊情况下初始化可能会进行多次,销毁也可能进行多次。
 
  对于service()方法,一般来说这个方法是不需要重写的,因为在HttpServlet中已经有了很好的实现,它会根据请求的方式,调用doGet(),doPost()方法,也就是说service()是用来转向的,所以我们一般写一个Servlet,只需要重写doGet()或者doPost()就可以了。如果重写了service()方法,那么Servlet容器就会把请求交给这个方法来处理,倘若你重写的service()方法没有调用doXXX(),即使你在Servlet中又重写了其它doGet(), doPost()等也是不会被调用的,因为Servlet的service()被自动调用(就像init()和destory()方法一样),所以如果你由于某种需要,需要重写service()方法,并且根据不同的method调用doPost(),doGet()方法时,就要在末尾加上一句super.service(),这样就可以解决问题了。
 
4.交互式:
 
5.Tomcat文件分析:
 
 
6.单例安全模式:
  这种写法被称为“双重检查锁”,顾名思义,就是在getInstance()方法中,进行两次null检查。看似多此一举,但实际上却极大提升了并发度,进而提升了性能。在单例中new的情况非常少,绝大多数都是可以并行的读操作。因此在加锁前多进行一次null检查就可以减少绝大多数的加锁操作,执行效率提高的目的也就达到了。
package cn.zzsxt.lee.servlet.single;

import java.util.UUID;

/**
* @description 懒汉模式 特点:当外部调用getInstance方法时,才会被创建对象
* @author Seven Lee
* @date 2017年7月19日上午9:41:34
*
*/
public class LazySingleton extends Single { private static LazySingleton lazySingleton = null; // 首先要把构造方法私有化
private LazySingleton() {
System.out.println("我是懒汉模式,我被创建了" + UUID.randomUUID());
} // 给外部提供获得对象的方法
public static LazySingleton getInstance() {
// double check
if (lazySingleton == null) {// 十个线程看到的对象都为空
synchronized (LazySingleton.class) {// 在这被锁拦住了
if (lazySingleton == null) {// 第一个线程进来了,看到lazySingleton仍然为空
lazySingleton = new LazySingleton();// 就开始创建对象
init("系统加载的配置");
}
}
}
return lazySingleton;
} @Override
protected void service(String method) throws Exception {
// 开始处理请求
System.out.println(Thread.currentThread().getId());
} @Override
protected void destroy() {
System.out.println("请开始你的遗憾");
// 调用gc,给Java虚拟机回应一下,说我快不行了,你赶紧收拾收拾跑路吧
} }
 

java:Servlet(Create,LifeCycle,ServletWeb.xml文件的配置,交互式,Tomcat文件分析,单例安全模式)的更多相关文章

  1. 关于web.xml的welcome-file-list 配置与tomcat的关系:

    关于web.xml的welcome-file-list 配置与tomcat的关系: 2018年04月18日 10:17:13 守望dfdfdf 阅读数:377 标签: welcome-file-lis ...

  2. web.xml文件中配置<mime-mapping>下载文件类型

    TOMCAT在默认情况下下载.rar的文件是把文件当作text打开,以至于IE打开RAR文件为乱码,如果遇到这种情况时不必认为是浏览器的问题,大多数浏览器应该不会死皮赖脸地把二进制文件当作文本打开,一 ...

  3. 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类

    static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...

  4. 《Effective Java》 读书笔记(三) 使用私有构造方法或枚举实现单例类

    1.单例类到现在为止算是比较熟悉的一种设计模式了,最开始写单例模式是在C#里面,想要自己实现一个单例类,代码如下: public class Instance { private static rea ...

  5. Java Servlet的配置文件web.xml配置内容和具体含义

    文件名:“SimpleServlet.java” package cn.mldn.lxh.servlet ;//定义包 import java.io.* ; // HttpServlet属于javax ...

  6. eclipse : java项目中的web.xml( Deployment Descriptor 部署描述文件 )配置说明

    context-param.listener.filter.servlet  首先可以肯定的是,加载顺序与它们在 web.xml 配置文件中的先后顺序无关.即不会因为 filter 写在 listen ...

  7. web.xml文件中配置mime下载文件类型(转)

    转自:http://5aijava.iteye.com/blog/166600 TOMCAT在默认情况下下载.rar的文件是把文件当作text打开,以至于IE打开RAR文件为乱码,如果遇到这种情况时不 ...

  8. 前端上传图片回显并用base64编码,后端做解码储存,存储图片路径在.properties文件中配置(以上传身份证照片为例)

    前端页面:<form id="kycForm" enctype="multipart/form-data"> <input type=&quo ...

  9. Java基础 static限定符的使用 以及【 static实现的 singleton(单例)设计模式】

    static实现的 singleton(单例)设计模式 /** static实现的 singleton设计模式 , 使得一个类只能够创建一个static对象 */ 模板设计结构: package Co ...

随机推荐

  1. 【2019银川网络赛】L:Continuous Intervals

    题目大意:给定一个长度为 N 的序列,定义连续区间 [l, r] 为:序列的一段子区间,满足 [l, r] 中的元素从小到大排序后,任意相邻两项的差值不超过1.求一共有多少个连续区间. 题解:单调栈 ...

  2. Java多线程1:使用多线程的几种方式以及对比

    前言 Java多线程的使用有三种方法:继承Thread类.实现Runnable接口和使用Callable和Future创建线程,本文将对这三种方法一一进行介绍. 1.继承Thread类 实现方式很简单 ...

  3. python和CSV

    lines=[]; 表头数据 lines.append(list(retlist[0].keys())) 明细数据 for city in city_list: { lines.append(list ...

  4. django之路由层(反向解析)总结

    表关系的建立方式 表与表之间的关系就三种 一对一 OneToOne(to='') # to后面可以跟字符串的表名 也可以直接跟变量名表名(该表名必须在上面提前定义出来) 一对多 ForeignKey( ...

  5. 01-01 Web应用

    一 Web应用的组成 接下来我们学习的目的是为了开发一个Web应用程序,而Web应用程序是基于B/S架构的,其中B指的是浏览器,负责向S端发送请求信息,而S端会根据接收到的请求信息返回相应的数据给浏览 ...

  6. react -搭建服务

    import 'whatwg-fetch'; import 'es6-promise'; require('es6-promise').polyfill(); import * as common f ...

  7. SpringBoot项目中,获取配置文件信息

    1.在配置文件中设置信息,格式如下 wechat: mpAppId: wxdf2b09f280e6e6e2 mpAppSecret: f924b2e9f140ac98f9cb5317a8951c71 ...

  8. php上传大文件1G

    前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...

  9. LOJ #2718. 「NOI2018」归程 Dijkstra+可持久化并查集

    把 $Noi2018$ day1t1 想出来还是挺开心的,虽然是一道水题~ 预处理出来 1 号点到其它点的最短路,然后预处理边权从大到小排序后加入前 $i$ 个边的并查集. 这个并查集用可持久化线段树 ...

  10. Scrapy学习(二)、安装及项目结构

    一.安装 1.安装pywin32,下载地址:https://sourceforge.net/projects/pywin32/files/pywin32/ 我选择的是Build 221,点进去,根据自 ...