深入理解Servlet原理
Servlet介绍:
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:
使用案例:
<servlet>
<!-- 给当前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>
/**
* 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
<!--
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
//从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 {
super.service(req, res);
}
//...
}
2. 调用父类,并将HttpServletRequest、HttpServletResponse两个参数传入:
public class HttpServlet {
3. doGet()和doPost()默认的代码直接抛出了异常,为了强制开发者去重写他们。若要调用它们,就必须重写;
4. service()内去掉super.service()的目的就是不掉用它们,从而避免异常;
深入理解Servlet原理的更多相关文章
- 详细理解servlet实现的几种方式和生命周期
现在很多的开发都是用的框架,然后很多同学学习的时候又是直接接触的框架,对于底层的一些开发,完全没有任何的了解.虽然对于业务上面来说,没有什么问题.但是很多时候当你被面试问到,或者是想要了解框架底层原理 ...
- 详细理解servlet实现的三种方式和生命周期
阅读目录 开发servlet的三种方式 理解实现servlet接口的方式,理解servlet生命周期 Servlet接口有五个方法 继承GenericServlet 继承HttpServlet 现在很 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- Atitit 图像处理 深刻理解梯度原理计算.v1 qc8
Atitit 图像处理 深刻理解梯度原理计算.v1 qc8 1.1. 图像处理 梯度计算 基本梯度 内部梯度 外部梯度 方向梯度1 2. 图像梯度就是图像边缘吗?2 1.1. 图像处理 梯度计算 ...
- 深入理解PHP原理之变量作用域
26 Aug 08 深入理解PHP原理之变量作用域(Scope in PHP) 作者: Laruence( ) 本文地址: http://www.laruence.com/2008/08/26 ...
- 深入理解PHP原理之变量分离/引用
19 Sep 08 深入理解PHP原理之变量分离/引用(Variables Separation) 作者: Laruence( ) 本文地址: http://www.laruence.com/20 ...
- 《深入理解mybatis原理》 MyBatis事务管理机制
MyBatis作为Java语言的数据库框架,对数据库的事务管理是其很重要的一个方面.本文将讲述MyBatis的事务管理的实现机制. 首先介绍MyBatis的事务Transaction的接口设计以及其不 ...
- 《深入理解mybatis原理》 Mybatis初始化机制具体解释
对于不论什么框架而言.在使用前都要进行一系列的初始化,MyBatis也不例外. 本章将通过下面几点具体介绍MyBatis的初始化过程. 1.MyBatis的初始化做了什么 2. MyBatis基于XM ...
- 《深入理解mybatis原理》 MyBatis的架构设计以及实例分析
作者博客:http://blog.csdn.net/u010349169/article/category/2309433 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简 ...
随机推荐
- numpy.where() 用法详解
numpy.where (condition[, x, y]) numpy.where() 有两种用法: 1. np.where(condition, x, y) 满足条件(condition),输出 ...
- Codeforces Round #207 (Div. 1) A. Knight Tournament (线段树离线)
题目:http://codeforces.com/problemset/problem/356/A 题意:首先给你n,m,代表有n个人还有m次描述,下面m行,每行l,r,x,代表l到r这个区间都被x所 ...
- [Spring Boot]什么是Spring Boot
<Spring Boot是什么> Spring Boot不是一个框架 是一种用来轻松创建具有最小或零配置的独立应用程序的方式 用来开发基于Spring的应用,但只需非常少的配置. 它提供了 ...
- 二进制安装MySQL数据库
今天安装的是二进制的mysql包5.7.21的包,在配置文件的时候采了好多坑,左后还是搞定了,来和大家分享一下 二进制msyql5.7.21版本的主从复制安装 新建/picclife目录 mkdir ...
- Linux学习之路——文件查找:find
使用权限:所有角色 用法:find [ options ] [ expression ]( find path -expression [ -print ] [ -exec | -ok command ...
- Python学习之路基础篇--02Python基础+小作业
1 变量 变量就是将一些运算的中间结果暂存到内存中,以便后续代码调用.必须由数字,字母,下划线任意组合,且不能数字开头.不能是python中的关键字,如['and', 'as', 'assert', ...
- python 的排名,已经python的简单介绍
我在今天看了一篇文章,是简书的全网程序猿写的,Java已经退出神坛,python稳居第一. python是由龟叔写的,它在英文的意思是蟒蛇. 根据编程语言流行指数排行榜2019年2月的榜单 据了解,目 ...
- linux shell 指令搜索顺序
在linux shell 中输入一个命令,如果有多个同名指令,shell需要按照一定规则去取优先级高的一个执行,shell命令的搜索顺序为: 1.别名,使用alias创建的命令. 2.关键字,如if, ...
- 隔离级别简介 (mysql)
隔离级别:一个事务必须与由其他事务进行的资源或数据更改相隔离的程度.隔离级别从允许的并发副作用(例如,脏读或虚拟读取)的角度进行描述. 定义 编辑 事务指定一个隔离级别,该隔离级别定义一个事务必须与由 ...
- python------面向对象进阶 异常处理
一. 异常处理 try: pass except KeyError as e : #注3.x用as ,except KeyError, e ,2.x 用逗号. print("No this ...