深入理解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框架,它的功能很强大,然而其实现却比较简 ...
随机推荐
- css样式 + 特殊符号
color控制字体颜色 十六进制值 #cc0066: font-size控制字体大小 单位 px / % / em / rem:像素 / 相对于父级元素 / 取决自己使用字体大小 / 取决于根元素ht ...
- tensorFlow 零散知识
收集一些碰到的关于细节的函数在这里记录下 1.tf.flags.DEFINE_xxx() 读别人家的代码的时候经常看到这个,结果两三天不看居然忘记了,这脑子绝对上锈了,决定记下来免得老是查来查去的.. ...
- Javascript获取图片原始宽度和高度的方法详解
前言 网上关于利用Javascript获取图片原始宽度和高度的方法有很多,本文将再次给大家谈谈这个问题,或许会对一些人能有所帮助. 方法详解 页面中的img元素,想要获取它的原始尺寸,以宽度为例,可能 ...
- 通过pid杀死进程
bool ****::KillProcess(DWORD pid) { // When the all operation fail this function terminate the " ...
- ecmall 学习记录2
1.ecmall 自带的写入日志方法:do_log4php("函数名","类名",$param); $param是参数 在类里调用写入之日的方法 需要先加载 ...
- python 4
一.列表相关操作 l = ['布偶猫', '小断腿', '大白'] # . append l.append('哎呀') print(l) # . insert l.insert(, '小猪佩琪') p ...
- python学习之路04——列表和字典
列表和字典 python中的可变数据类型有:列表和字典 不可变类型:数字,字符串,元组 今天先讲列表和字典 一.列表 1.概念: 变量:使用变量存储数据,但是,变量存储数据每次只能存储一个数据 问题: ...
- ubuntu 初始安装完成后的一些设置
处于安全考虑最好,使用普通用户登录. 首先以超级用户登入系统,然后执行以下步骤 第一步:设置普通用户 以下<user_name>代表普通用户的用户名 useradd -g users -d ...
- Kali安装虚拟机遇到的问题
1.上官网下载了最新版的VMware 14.0版,安装的时候下一步下一步就是了. 2.最新版的官网激活码 FF590-2DX83-M81LZ-XDM7E-MKUT4 CG54H-D8D0H-H8DHY ...
- python的高阶函数式编程
首先 函数式编程≠函数编程,就跟计算机≠计算,因为计算机基于硬件,计算基于算法,所以函数式编程是倾向于算法. 高阶函数定义: 一个函数接受的这个参数,而这个参数也是一个函数,称之为高阶函数 例如: ...