深入理解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框架,它的功能很强大,然而其实现却比较简 ...
随机推荐
- vs11 微软下载地址
https://www.microsoft.com/en-us/download/details.aspx?id=30679 vs11 微软的官方下载.最安全
- JAVA条件语句:if;switch case
if(布尔表达式) { //如果布尔表达式为true将执行的语句 } 如果布尔表达式为true 执行里面的代码 if...else语句: if(布尔表达式){ //如果布尔表达式的值为true } ...
- java面向对象编程(五)--四大特征之抽象、封装
1.抽象 我们在前面去定义一个类时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模版).这种研究问题的方法称为抽象. 2.封装 封装就是把抽象出来的数据和对数据的操作封装在一起 ...
- 前台的url通过 ActionName?var1=xx&var2=yy 的形式传给特定action
本文对自己开发的基于lucene和J2EE技术的搜索引擎开发经验进行简单总结.今后可能会从性能的角度总结lucene开发经验.当数据上TB级别后,分布式lucene以及结合分布式文件系统(如HDFS) ...
- linux vi命令详解
刚开始学着用linux,对vi命令不是很熟,在网上转接了一篇. vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指 ...
- 浅谈HTTP和HTTPS的区别
这篇随笔我们从六个步骤来学习: 1.了解HTTP和HTTPS的基本概念 2.HTTPS诞生的目的 3.HTTP与HTTPS的区别 4.HTTP和HTTPS的工作原理 5.HTTPS的优缺点 6.如何将 ...
- EBS打补丁参考
EBS Application打补丁参考:http://blog.csdn.net/cunxiyuan108/article/details/6009784 整体步骤: 0. 停止应用(注意确认FND ...
- linux环境下安装nginx步骤(不错)
开始前,请确认gcc g++开发类库是否装好,默认已经安装. ububtu平台编译环境可以使用以下指令 apt-get install build-essential apt-get install ...
- 创建一个dynamics 365 CRM online plugin (三) - PostOperation
上两节我们创建了一个 PreOperation的plugin 今天我们创建一个PostOpeartion的plugin和之前的plugin连接起来 当创建contact之后,我们要添加一个task给新 ...
- 【转】剖析异步编程语法糖: async和await
一.难以被接受的async 自从C#5.0,语法糖大家庭又加入了两位新成员: async和await. 然而从我知道这两个家伙之后的很长一段时间,我甚至都没搞明白应该怎么使用它们,这种全新的异步编程模 ...