Servlet介绍:

1. 如何返回一个网页:

a. 静态网页

>新闻页、百度百科

>服务器保存一份HTML,直接返回给浏览器即可

b. 动态网页

>淘宝、QQ空间、微博

>服务器保存一个组件,通过它动态拼一个HTML

>在Java中这个组件就是Servlet

2. Servlet特征:

a. Servlet是服务器端组件,必须保存在服务器上。

b. Servlet可以动态拼资源(HTML/IMG等),即处理HTTP协议。

c. Servlet必须满足Sun的规范。

d. Servlet是什么:Servlet是Sun推出的,用来在服务器端处理HTTP协议的组件。

服务器:

1. 名称:Java 服务器、Java Web 服务器、Servlet 容器;

2. 本质:是一个软件,需要安装在硬件上才能用和浏览器是平级的关系;

3. 举例:Tomcat(Apache)、JBOSS、WebLogic、WebSphere。

Tomcat使用:

1. 启动Tomcat:

-Linux:打开/tomcat/bin,终端输入命令./startup.sh

-Windows:打开/tomcat/bin,双击startup.bat

2. 关闭Tomcat:

-Linux:打开/tomcat/bin,终端输入命名./shutdown.sh

-Windows:打开/tomcat/bin,双击shutdown.bat

Servlet开发步骤:

1.创建WEB项目

>目录:webapp/WEB-INF/web.xml

2.导入jar包

>通过maven导入jar包,搜javaee

>使用服务器自带的jar包,右键项目->target runtime->勾选tomcat

3.创建Servlet

>实现Servlet接口

>也可以继承HttpSevlet,此类已实现了Servlet接口

>实现/重写service(),在此方法内动态拼HTML

4.注册Servlet

>注册Servlet,并声明别名

>通过别名,给此Servlet注册网名(以/开头)

5.部署项目

>在Servers下选择Tomcat,右键Add and Remove

>在弹出框内左侧选中项目,双击移动到右侧

>部署:就是拷贝

6.访问Servlet

>启动Tomcat

>浏览器输入地址 http://ip:port/项目名/Servlet网名

7.重新部署

>修改代码后,需要重新部署并重启Tomcat才有效

>点击Servers下面的Tomcat7,右键publish

>可以手动关闭Tomcat,再启动它

>也可以等待Eclipse自动重启Tomcat(Reloading...)

Servlet执行原理:

HTTP协议:

1. 什么是HTTP协议:它规定了浏览器和服务器如何通信,以及通信时的数据格式。

2. 如何通信:

>建立连接

>发送请求

>接收响应

>关闭连接

3. 数据格式:

a. 请求数据包

>请求行:请求方式、Servlet网名、协议类型

>消息头:数据的描述信息

>实体内容:浏览器发送给服务器的数据

b. 响应数据包

>状态行:协议类型、状态码、状态

>消息头:数据的描述信息

>实体内容:服务器给浏览器发送的数据

4. 对开发的要求

-通信的方式已经由浏览器和服务器完成;

-请求数据的打包由浏览器实现;

-响应数据的打包由服务器实现;

-开发需要提供浏览器发送给服务器的数据,以及服务器返回的数据;

-服务器通过request对象接收请求数据;

-服务器通过response对象向浏览器发送数据;

注册案例:

1. form的action属性要写上Servlet的访问路径(网名);

2. 在表单空间上,使用name属性给该控件的数据命名,可以调用request的getParameter("name的指")来获取值;

3. radio和checkbox需要设置value属性的值,就是要传递给服务器的具体的值;

Servlet原理图:

请求方式:

1. 介绍:浏览器向服务器发送数据的方式;

2. GET:

>默认情况下所有的请求都是GET请求

>采用路径传参,即通过路径携带参数

>传参过程中参数可见,隐私性差

>因为路径大小有限制,所以能够传递的参数很小

3. POST:

>method="post"

>采用实体内容传参

>在传参的过程中,路径上看不到参数,隐私性好

>实体内容专门用于传递数据,因此大小不受限制

4. 使用场景:

>浏览器向服务器索取(查询)数据用GET请求

>浏览器向服务器提交(保存)数据用POST请求

解决乱码问题:

重定向:

1. 格式:res.sendRedirect("findEmp");//findEmp是网名

2. 原理图如下:

项目路径:

URI和URL:

1. 狭义(Java):

- URI:绝对路径;

- URL:完整路径;

- URL包含了URI;

2. 广义(Java/.net/php):

- URI:资源的名称;

- URL:资源的真名;

- URI包含了URL;

Servlet路径的配置方式及用途:

1. 精确匹配(/test):

- 只有这唯一的路径可以可以访问此Servlet

- 该Servlet只能处理一个请求

2. 通配符(/*):

- 所有的路径都是可以访问此Servlet

- 该Servlet可以处理所有请求

3. 后缀匹配(*.test):

- 所有以.test为后缀的路径都可以访问此Servlet

- 该Servlet可以处理很多请求

注:

a. 必须先通过规范约定正确的路径;

b. 按照规范判断路径,处理请求。对于不满足规范的路径,认为是用户输入的错误路径,统一报错;

Servlet生命周期:

1. 第1、2、4步只能执行一次,第3步可以执行多次;

2. 因为Servlet被Tomcat自动创建一次,因此它在Tomcat内是单例的(只有1个实例),即Servlet满足单例模式;

3. 默认情况下,首次访问Servlet时,Tomcat会创建它,也可以修改配置文件web.xml,使得Tomcat启动时就直接创建Servlet;

4. 启动时创建Servlet,数字1代表创建的次序:<load-on-startup>1</load-on-startup>;

ServletConfig和ServletContext:

1. Context:上下文,理解为环境。环境可以给其内部的个体提供资源。从编程的角度来说可以给内部的对象提供数据;
2. ServletConfig:它是Servlet的私有环境,可以为某一个Servlet提供数据;
3. ServletContext:它是Servlet的公有环境,可以为所有Servlet提供数据;
4. 使用ServletConfig和ServletContext给Servlet预置数据,不用写单独的配置文件,直接使用web.xml即可;另外这两个对象可以在初始化Servlet之前自动读取web.xml中的预置数据;
5. Servlet特殊用法:
    - 可以使用此对象存取一些变量;
    - 即在程序运行阶段随时向此对象存取数据;
    - 获取对象:ServletContext ctx = getServletContext();
    - 取:ctx.getAttribute("user");
    - 存:ctx.setAttribute("user","admin");
 6. 通常在Tomcat启动时,都要调用某Servlet重写init(ServletConfig config)方法,专门用来在此阶段初始化项目所需要的一些变量。

使用案例:

1. ServletConfig案例:
  a. 配置文件web.xml 

<servlet>

<servlet-name>login</servlet-name>
<servlet-class>web.LoginServlet</servlet-class>

<!-- 给当前Servlet预置一个数据 -->

<init-param>

<param-name>maxOnline</param-name>

<param-value>2000</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>login</servlet-name>

<url-pattern>/login</url-pattern>

</servlet-mapping>

  b. 在Servlet类中读取参数
 

/**

* 1.Tomcat在创建此Servlet后,会自动创建ServletConfig对象。

* 2.Tomcat会调用此对象,读取web.xml中给当前Servlet所配置的参数。

* 3.Tomcat会自动调用init方法,并传入已创建好的ServletConfig对象。

* 归纳:调用init方法前,创建config并读取数据。在init及其后面的方法内可以使用config。

*/

@Override

public void init(ServletConfig config) throws ServletException {

super.init(config);

String mo = config.getInitParameter("maxOnline");

System.out.println(mo);

}

@Override

protected void service(

HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

//从web.xml中读取参数

ServletConfig cfg = getServletConfig();

String mo = cfg.getInitParameter("maxOnline");

System.out.println(mo);

}

2. ServletContext案例:

a. 配置文件web.xml

 

<!--

给所有的Servlet预置一个数据。
1.Tomcat启动时会自动创建ServletContext对象。

2.Tomcat调用context读取此参数。

由于这件事是在调用Servlet之前完成的,所以在service()中可以通过context读取参数。

-->

<context-param>

<param-name>size</param-name>

<param-value>10</param-value>

</context-param>

<servlet>

<servlet-name>findDept</servlet-name>

<servlet-class>web.FindDeptServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>findDept</servlet-name>

<url-pattern>/findDept</url-pattern>

</servlet-mapping>

b. 在Servlet类中读取参数

 

@Override

protected void service(
HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

//从web.xml中读取分页条件

ServletContext ctx = getServletContext();

String size = ctx.getInitParameter("size");

//分页查询

System.out.println(size);

}

线程安全:

1. 成员变量:

    - 成员变量存于堆内;

    - 堆内数据只有一份;

    - 多线程共用一份数据;

    - 存在并发问题;

2. 局部变量:

    - 成员变量存于栈内;

    - 栈内数据是多份;

    - 每个线程都有一份自己的数据;

    - 没有并发问题;

3. 解决方案:

   - 不用成员;

   - 枷锁synchronized (this) {//TODO};

HttpServlet:

1. 自定义的类继承HttpServlet类,重写service方法,Tomcat将HttpServletRequest,HttpServletResponse传入此方法:

public class TestServlet extends HttpServlet {

@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

super.service(req, res);

}

//...

}

2. 调用父类,并将HttpServletRequest、HttpServletResponse两个参数传入:

public class HttpServlet {

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res= (HttpServletResponse) response;
this.service(req, res);
}
public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
String m = req.getMethod();
if(m.equals("GET")) {
doGet(req, res);
}else if(m.equals("POST")) {
doPost(req, res);
}
}
private void doPost(HttpServletRequest req, HttpServletResponse res) {
// TODO
}
private void doGet(HttpServletRequest req, HttpServletResponse res) {
// TODO
}
//...
}

3. doGet()和doPost()默认的代码直接抛出了异常,为了强制开发者去重写他们。若要调用它们,就必须重写;

4. service()内去掉super.service()的目的就是不掉用它们,从而避免异常;

深入理解Servlet原理的更多相关文章

  1. 详细理解servlet实现的几种方式和生命周期

    现在很多的开发都是用的框架,然后很多同学学习的时候又是直接接触的框架,对于底层的一些开发,完全没有任何的了解.虽然对于业务上面来说,没有什么问题.但是很多时候当你被面试问到,或者是想要了解框架底层原理 ...

  2. 详细理解servlet实现的三种方式和生命周期

    阅读目录 开发servlet的三种方式 理解实现servlet接口的方式,理解servlet生命周期 Servlet接口有五个方法 继承GenericServlet 继承HttpServlet 现在很 ...

  3. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  4. Atitit 图像处理 深刻理解梯度原理计算.v1 qc8

    Atitit 图像处理 深刻理解梯度原理计算.v1 qc8 1.1. 图像处理  梯度计算  基本梯度 内部梯度 外部梯度 方向梯度1 2. 图像梯度就是图像边缘吗?2 1.1. 图像处理  梯度计算 ...

  5. 深入理解PHP原理之变量作用域

    26 Aug 08 深入理解PHP原理之变量作用域(Scope in PHP)   作者: Laruence(   ) 本文地址: http://www.laruence.com/2008/08/26 ...

  6. 深入理解PHP原理之变量分离/引用

    19 Sep 08 深入理解PHP原理之变量分离/引用(Variables Separation) 作者: Laruence(   ) 本文地址: http://www.laruence.com/20 ...

  7. 《深入理解mybatis原理》 MyBatis事务管理机制

    MyBatis作为Java语言的数据库框架,对数据库的事务管理是其很重要的一个方面.本文将讲述MyBatis的事务管理的实现机制. 首先介绍MyBatis的事务Transaction的接口设计以及其不 ...

  8. 《深入理解mybatis原理》 Mybatis初始化机制具体解释

    对于不论什么框架而言.在使用前都要进行一系列的初始化,MyBatis也不例外. 本章将通过下面几点具体介绍MyBatis的初始化过程. 1.MyBatis的初始化做了什么 2. MyBatis基于XM ...

  9. 《深入理解mybatis原理》 MyBatis的架构设计以及实例分析

    作者博客:http://blog.csdn.net/u010349169/article/category/2309433 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简 ...

随机推荐

  1. sql多表查询(单表查询略过)

    表library: 表borrow: 表reader: 1.等值连接:(常用) 原理:将多张表组合成一个逻辑大表,即字段相加记录相乘(笛卡尔积). 语法:select * from 表A,表B whe ...

  2. LINUX 录制屏幕制作gif动态图工具peek

    sudo add-apt-repository ppa:peek-developers/stable sudo apt update sudo apt install peek linux 压缩工具改 ...

  3. WEB学习笔记1-综述

    WEB前端基本技术:HTML.CSS.JavaScript 概念: 从职责上讲,Web前端开发要涉及网站开发的方方面面,从前端UI到和后端的数据交互都属于前端开发的范畴.Web前端开发是兼具艺术气息和 ...

  4. Js/如何操作div下面的span元素或者是img之类的标签元素

    $("div[name='MatTypeName']").click(function (e) { $("div[name='MatTypeName']").e ...

  5. 测试那些事儿—selenium自动化实战之登录验证码处理

    登陆时经常出现验证码自动化测试如何处理呢? 一般有如下几种处理思路: 1.通过接口请求,拿到对应验证码信息 2.让开发配合把验证码改成万能验证码 3.注入cookies 如何通过注入cookies的方 ...

  6. Linq分组查询统计

    这里介绍Linq使用Group By和Count得到每个CategoryID中产品的数量,Linq使用Group By和Count得到每个CategoryID中断货产品的数量等方面. 学经常会遇到Li ...

  7. win10的linux子系统安装及使用

    最近需要用到linux但是又不想装双系统,正好win10推出了linux子系统,省事了,自己也是煞费苦心才整明白 1.首先你要是很新的win10版本(1607及已上),这样才有下面的步骤 依次在 设置 ...

  8. Excel中的数据与DataSet的互换

    using System;using System.Collections.Generic;using System.Data;using System.Drawing;using System.IO ...

  9. 在子页面操作父页面元素和iframe说明

    实现功能:在子页面操作父页面元素. 在实际编码的过程中,大家一定有这种需求:在父级页面有一个<iframe scrolling='auto'></iframe>内联框架,而我们 ...

  10. ios-微信支付登录分享-notification通知

    // //  AppDelegate.m //  NewAppBase // //  Created by ENERGY on 2018/5/17. //  Copyright © 2018年 ENE ...