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. css样式 + 特殊符号

    color控制字体颜色 十六进制值 #cc0066: font-size控制字体大小 单位 px / % / em / rem:像素 / 相对于父级元素 / 取决自己使用字体大小 / 取决于根元素ht ...

  2. tensorFlow 零散知识

    收集一些碰到的关于细节的函数在这里记录下 1.tf.flags.DEFINE_xxx() 读别人家的代码的时候经常看到这个,结果两三天不看居然忘记了,这脑子绝对上锈了,决定记下来免得老是查来查去的.. ...

  3. Javascript获取图片原始宽度和高度的方法详解

    前言 网上关于利用Javascript获取图片原始宽度和高度的方法有很多,本文将再次给大家谈谈这个问题,或许会对一些人能有所帮助. 方法详解 页面中的img元素,想要获取它的原始尺寸,以宽度为例,可能 ...

  4. 通过pid杀死进程

    bool ****::KillProcess(DWORD pid) { // When the all operation fail this function terminate the " ...

  5. ecmall 学习记录2

    1.ecmall 自带的写入日志方法:do_log4php("函数名","类名",$param);   $param是参数 在类里调用写入之日的方法 需要先加载 ...

  6. python 4

    一.列表相关操作 l = ['布偶猫', '小断腿', '大白'] # . append l.append('哎呀') print(l) # . insert l.insert(, '小猪佩琪') p ...

  7. python学习之路04——列表和字典

    列表和字典 python中的可变数据类型有:列表和字典 不可变类型:数字,字符串,元组 今天先讲列表和字典 一.列表 1.概念: 变量:使用变量存储数据,但是,变量存储数据每次只能存储一个数据 问题: ...

  8. ubuntu 初始安装完成后的一些设置

    处于安全考虑最好,使用普通用户登录. 首先以超级用户登入系统,然后执行以下步骤 第一步:设置普通用户 以下<user_name>代表普通用户的用户名 useradd -g users -d ...

  9. Kali安装虚拟机遇到的问题

    1.上官网下载了最新版的VMware 14.0版,安装的时候下一步下一步就是了. 2.最新版的官网激活码 FF590-2DX83-M81LZ-XDM7E-MKUT4 CG54H-D8D0H-H8DHY ...

  10. python的高阶函数式编程

    首先   函数式编程≠函数编程,就跟计算机≠计算,因为计算机基于硬件,计算基于算法,所以函数式编程是倾向于算法. 高阶函数定义: 一个函数接受的这个参数,而这个参数也是一个函数,称之为高阶函数 例如: ...