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. vs11 微软下载地址

    https://www.microsoft.com/en-us/download/details.aspx?id=30679 vs11 微软的官方下载.最安全

  2. JAVA条件语句:if;switch case

    if(布尔表达式) { //如果布尔表达式为true将执行的语句 }   如果布尔表达式为true 执行里面的代码 if...else语句: if(布尔表达式){ //如果布尔表达式的值为true } ...

  3. java面向对象编程(五)--四大特征之抽象、封装

    1.抽象 我们在前面去定义一个类时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模版).这种研究问题的方法称为抽象. 2.封装 封装就是把抽象出来的数据和对数据的操作封装在一起 ...

  4. 前台的url通过 ActionName?var1=xx&var2=yy 的形式传给特定action

    本文对自己开发的基于lucene和J2EE技术的搜索引擎开发经验进行简单总结.今后可能会从性能的角度总结lucene开发经验.当数据上TB级别后,分布式lucene以及结合分布式文件系统(如HDFS) ...

  5. linux vi命令详解

    刚开始学着用linux,对vi命令不是很熟,在网上转接了一篇. vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指 ...

  6. 浅谈HTTP和HTTPS的区别

    这篇随笔我们从六个步骤来学习: 1.了解HTTP和HTTPS的基本概念 2.HTTPS诞生的目的 3.HTTP与HTTPS的区别 4.HTTP和HTTPS的工作原理 5.HTTPS的优缺点 6.如何将 ...

  7. EBS打补丁参考

    EBS Application打补丁参考:http://blog.csdn.net/cunxiyuan108/article/details/6009784 整体步骤: 0. 停止应用(注意确认FND ...

  8. linux环境下安装nginx步骤(不错)

    开始前,请确认gcc g++开发类库是否装好,默认已经安装. ububtu平台编译环境可以使用以下指令 apt-get install build-essential apt-get install ...

  9. 创建一个dynamics 365 CRM online plugin (三) - PostOperation

    上两节我们创建了一个 PreOperation的plugin 今天我们创建一个PostOpeartion的plugin和之前的plugin连接起来 当创建contact之后,我们要添加一个task给新 ...

  10. 【转】剖析异步编程语法糖: async和await

    一.难以被接受的async 自从C#5.0,语法糖大家庭又加入了两位新成员: async和await. 然而从我知道这两个家伙之后的很长一段时间,我甚至都没搞明白应该怎么使用它们,这种全新的异步编程模 ...