JavaWeb开发之详解Servlet及Servlet容器
自JavaEE诞生伊始,Servlet容器和Servlet技术,就构成了JavaEE应用的核心,配合其它组件,它们完善了Java企业级开发的全套解决方案。小到一个静态博客网站,大到分布式的集群应用,都离不开Servlet底层的支持。大约从Java 5开始,Java企业级开发就分为了两个不同的方向,一个是基于EJB、JSF、JPA等为主的传统Java企业级系统开发方案,另一套则是基于Struts、Hibernate、Spring、Spring MVC、MyBatis等为主JavaWeb开发模式。时至今日,移动互联网的蓬勃发展下,产生了一大批的电商、新零售、在线游戏、社交网站等各式应用。JavaWeb在时代洪流中反而得到越来越大的发展:分布式、集群、中间件、大数据……给Java带来了蓬勃生机。
而这些互联网应用的基础,都有Servlet的影子。那么Servlet到底是什么???
在StackOverflow上就有这么个问题,题主搞了很久都搞不明白Servlet到底是什么,希望有人能用浅显直白的语言一语中的地回答他。排名第一的高票答案是这么说的:
A servlet is simply a class which responds to a particular type of network request - most commonly an HTTP request. Basically servlets are usually used to implement web applications - but there are also various frameworks which operate on top of servlets (e.g. Struts) to give a higher-level abstraction than the "here's an HTTP request, write to this HTTP response" level which servlets provide.
Servlets run in a servlet container which handles the networking side (e.g. parsing an HTTP request, connection handling etc). One of the best-known open source servlet containers is Tomcat.
粗鲁翻译一下就是:Servlet说白了就是一个处理网络请求(很多时候是Http请求)的类,用于实现Web应用的。另外也有很多的框架比如Struts是以它为底子,搭建了一个更高抽象(的解决方案),而不是让你挽起袖子直接干“HTTP请求来了,快给回复”这种层级的粗活。Servlet是运行在处理网络请求的Servlet容器中的,比如最知名的Tomcat。
Web应用概述
JavaWeb规范
JavaWeb应用因为是容器式开发,因此会有一个模板规范,一个基本Web应用的架势是:
<WebDemo> //这是Web应用的名称
|---WEB-INF //此文件夹对外不可见
| |---web.xml //web应用配置文件(Servlet3.0可不要,但建议保留)
| |---classes //保存*.class文件
| |---lib //保存jar包
|---<a. jsp> 保存jsp文件等
web.xml
1. 配置和管理Servlet、Listener、Filter、JSP、JSP属性、标签库
2. Web应用首页、资源引用、JAAS授权引用、metadata-complete(选true表示不加载注解资源)
Servlet
Servlet开发
Servlet,说白了就是个Java的类。曾几何时,Servlet甚至被用来写Web界面,所有的HTML标签,都采用类似out.write("<head>\r\n")这种形式,繁琐可想而知。自MVC架构规范以后,Servlet就专注于做控制层了。
Servlet的作用就是处理网络请求。开发Servlet需继承HttpServlet,并通过以下方法处理请求:
doGet:响应Get请求
doPOST:响应POST请求
doPut:响应Put请求
doDelete:响应delete请求
init:创建Servlet实例时,初始化Servlet资源(一般不使用,需要初始化的时候,第一行调用super.init())
destory:销毁Servlet实例时,自动回收资源(一般不使用,除非需要手动回收资源如数据库连接)
开发步骤
1. 编写Servlet类
2. 配置
2.1 Servlet3.0新增的@WebServlet配置
2.2 web.xml文件配置
Servlet/JSP生命周期
1. 创建:单例模式,只创建并初始化一个Servlet实例
- 客户端第一次请求某个Servlet时,Web容器创建该Servlet实例。
- Web应用启动时立即创建,即load-on-startup Servlet。这种Servlet一般是提供基础服务的后台Servlet。
2. 初始化:Web容器调用Servlet的init方法初始化
3. 响应请求:初始化后,将一直在容器中,响应客户请求
4. 销毁:Web容器决定销毁Servlet,会调用destroy方法。通常是关闭Web应用时销毁
注意:Servlet容器中对同一个Servlet类,只会创建和初始化其实例一次,为单例。容器会维护一个线程池,对每一个请求提供一个工作线程去处理。如果请求过多达到线程池峰值,则请求会被放入一个队列,等待可用线程。
Servlet本身是线程不安全的,因此不建议设置成员变量或类变量,而使用局部变量避免线程问题。
Servlet参数配置
可以用在比如配置数据库连接参数的场景,实现多个Servlet之间的可重用。
1. 配置
- 通过@WebServlet的initParams属性指定
- 通过web.xml的<servlet>元素中添加<init-params>子元素
2. 访问
通过ServletConfig对象的getInitParameter(String name)访问。
注意区分ServletContext,两者方法相同,但ServletConfig是当前Servlet的配置参数;ServletContext是获取当前Web应用的配置参数。
ServletContext和HTTPSession由于是多个Servlet中共享信息,因此也是线程不安全的。
MVC中Servlet作为Controller的角色
JSP-Servlet-JavaBean的第一代MVC架构
在遥远的古代,曾经使用Servlet作为页面视图解决方案,开发难度可想而知。因此,在第一代的MVC方案里,使用JSP做V,JavaBean做M和Servlet作为Controller的方案应运而生。
一个充斥于各种学生管理系统的典型使用场景是:
- 收集用户请求参数
- 将应用的处理结果返回
JSP
JSP的本质就是Servlet,处理用户请时会被翻译为Servlet被Web容器执行。Servlet与JSP区别是:
1. 没有内置对象,JSP中的内置对象需要显示创建、
2. 对于静态页面标签,都要使用页面输出流逐行输出。
JSP由静态HTML页面内容和动态JSP脚本两部分组成
四种基本语法
- 注释:<%-- JSP注释 --%>
- 声明:<%! 声明部分 %>
- 表达式:<%=表达式%>
- 脚本
3个编译指令
JSP编译指令是通知JSP的消息,不直接输出。包括
- page:针对当前页面的指令。如声明JSP脚本种类、继承的父类、导包、是否开启HTTPSession、错误页面、网页文件格式和字符编码等。
- include:指定包含另一个页面。既包括静态文本,也包括动态JSP页面。此指令融合被include的页面
- taglib:用于定义和访问自定义标签。
7个动作指令
编译指令是通知Servlet引擎的消息,在JSP编译成Servlet时起作用;动作指令则可替换成JSP脚本,是JSP脚本的标准化写法
- jsp:forward:执行页面转向,将请求处理转发到下个页面
- jsp:param:传递参数,与include、forward、plugin指令合用
- jsp:include:动态引入JSP页面
- jsp:plugin:下载JavaBean或Applet到客户端执行
- jsp:useBean:创建一个JavaBean实例
- jsp:setProperty:设置JavaBean实例的属性值
- jsp:getProperty :输出JavaBean实例的属性值
9个内置对象
这9个内置对象其实都是Servlet接口的实例,在JSP的使用中被默认初始化,可以直接使用。
- application:ServletContext的实例,代表应用本身,可用于多个JSP和Servlet之间传递信息。
- config:ServletConfig的实例,代表该JSP的配置信息。JSP中比较少用,常用于Servlet
- exception:Throwable的实例,只有本页面是错误处理页面时,才能使用。
- out:JspWriter的实例,表示页面输出流。
- page:代表页面本身,相当于Servlet的this,没什么用。
- pageContext:PageContext,代表页面上下文,有方法getServletContext()和getServletConfig()
- request:HttpServletRequest的实例,表示一次请求
- response:HttpServletResponse的实例,表示一次回复。通常很少使用该对象直接响应,而是使用out。常用于重定向
- session:HttpSession实例,代表一次会话(开始于客户端与服务器连接,终止于关闭浏览器)
JSP2的自定义标签
1. 开发自定义标签类
- 继承SimpleTapSupport父类
- 重写doTag()方法
- 如果有成员变量,需要getter和setter方法
2. 建立TLD文件
3. 使用标签库
<% taglib uri="tagliburi" prefix="tagPrefix" %>
Filter
Filter是Servlet的加强版,用于对用户请求进行预处理或后处理。一个典型的应用场景是:Filter对用户请求进行预处理,接着交给Servlet进行处理并响应,最后Filter再进行后处理。
预处理:拦截和检查HttpServletRequest,可以修改请求头和数据
后处理:拦截和检查HttpServletResponse,可以修改响应头和数据
Filter常用于检查用户请求、过滤非法请求、日志记录、请求解码、处理XML等
Filter也被用于实现网站的伪静态,以优化SEO。
开发过滤器
1. 创建Filter类:实现Filter接口,重写init、destory和doFilter(ServletRequest request, ServeletResponse response, FilterChain chain)方法
2. 配置
Listener
使用监听器
1. 定义Listener实现类
2. 配置
JavaWeb开发之详解Servlet及Servlet容器的更多相关文章
- Thrift实现C#调用Java开发步骤详解
概述 Thrift实现C#调用Java开发步骤详解 详细 代码下载:http://www.demodashi.com/demo/10946.html Apache Thrift 是 Facebook ...
- 《Tomcat与Java Web开发技术详解》思维导图
越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 ...
- Axis2开发webservice详解
Axis2开发webservice详解 标签: javawebserviceAxis2 2015-08-10 10:58 1827人阅读 评论(0) 收藏 举报 分类: JAVA(275) 服务器 ...
- 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING
<Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th 2014 Email:skyseraph00@163.com 更多精彩请直接 ...
- C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解
之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...
- Extjs MVC开发模式详解
Extjs MVC开发模式详解 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式, ...
- Cocos2d-x 3.X手游开发实例详解
Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...
- 《Node.js开发实战详解》学习笔记
<Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...
- 免费的HTML5连载来了《HTML5网页开发实例详解》连载(二)
最近新浪.百度.腾讯.京东.大众点评.淘宝等流行的网站都加大了招聘HTML5的力度,HTML5开发人员成了抢手货,本次连载的是由大众点评前端工程师和一淘网前端工程师基情奉献的<HTML5网页开发 ...
随机推荐
- OpenCV——Harris、Shi Tomas、自定义、亚像素角点检测
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...
- Waymo在美国推出自动驾驶汽车共享服务
导读 经过数月的测试和数百万英里的无人驾驶汽车技术开发,Waymo 正式在美国推出了具有商业性质的自动驾驶汽车的共享服务. 该公司的 Waymo One 项目将为客户提供 24 小时自动驾驶汽车服务. ...
- CSS中的before和:after伪元素深入理解
1.定义: “伪元素”,顾名思义.就是它创建了一个虚假的元素,并且将其虚假的元素插入到目标元素的内容之前或之后. 2:特点: a.它在实际文档中不改变什么,但是对用户可见,可以通过css控制,源码中看 ...
- zabbix部署(1)(lnmp转)
1.lnmp 首先 确保CentOS7上网络配置正确,可以正常访问互联网. 确保已经关闭了iptables. CentOS7上是firewall,关闭命令: 1 2 # systemctl stop ...
- 学会如何使用Github进行托管代码和用markdown撰写心得
这次作业是学会如何使用Github进行托管代码和用markdown撰写心得. 1.掌握使用Git进行代码版本,使用github进行代码托管.(git使用,推荐imooc公开课: 公开课 ) 登录 gi ...
- 1.5《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——清屏
使用命令行时,使用clear命令清除屏幕非常方便: $ clear 键盘简写为^L.(Ctrl + L) 同样地,使用完终端当前窗口或标签页,使用exit命令退出进程: $ exit 键盘简写为^D ...
- 大数据入门第二十一天——scala入门(一)并发编程Actor
注:我们现在学的Scala Actor是scala 2.10.x版本及以前版本的Actor. Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃 一. ...
- 20155223 实验5 MSF基础应用
20155223 实验5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode? exploit:漏洞攻击.一个exploit程序肯定会触发系统的一个或多个漏 ...
- 20155227《网络对抗》Exp3 免杀原理与实践
20155227<网络对抗>Exp3 免杀原理与实践 实践内容 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等 ...
- 20155234 Exp2 后门原理与实践
Windows获得Linux Shell 1.查看ip 2.监听端口 3.实验成功如下图 Linux获得Win Shell 1.查看虚拟机ip 2.监听端口 3.实验成功如下图 使用NC传输数据 1. ...