JavaWeb系列2: JSP与Servlet
本文是作者的读博客笔记和心得整理,部分内容来源于网络,如有侵权,请联系作者。
什么是JSP和Servlet
servlet:使得java可以通过HttpServletResponse对象输出HTML的内容.
JSP:JavaServer Pages,在静态的HTML内容中嵌入Java代码,执行后动态生成HTML的内容
各自缺点
JSP:HTML中混入大量业务逻辑,隔离性不好
Servlet:java生成html,可读性很差.
改良:MVC
MVC模式,是Model-View-Controller的简称,是软件工程中的一种软件架构模式,分为三个基本部分,分别是:模型(Model)、视图(View)和控制器(Controller):
Controller——负责转发请求,对请求进行处理
View——负责界面显示
Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现
1、Web浏览器发送HTTP请求到服务端,然后被Controller(Servlet)获取并进行处理(例如参数解析、请求转发)
2、Controller(Servlet)调用核心业务逻辑——Model部分,获得结果
3、Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容
4、动态生成的HTML内容返回到浏览器显示
Servlet详解
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
生命周期
1、Servlet 通过调用 init () 方法进行初始化。
2、Servlet 调用 service() 方法来处理客户端的请求。
3、Servlet 通过调用 destroy() 方法终止(结束)。
4、最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
经典面试题
1,不同的用户同时对同一个业务(如注册)发出请求,那这个时候容器里产生的有是几个servlet实例呢?
只有一个实例,同一个业务共享一个第一次被访问的时候创建的实例,但是不同业务不同的实例.
2,Servlet单实例多线程机制:
Servlet采用多线程来处理多个请求同时访问。servlet依赖于一个线程池来服务请求。线程池实际上是一系列的工作者线程集合。Servlet使用一个调度线程来管理工作者线程。
当容器收到一个Servlet请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作者线程,然后由该线程来执行Servlet的service方法。
当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求,容器并不关心这个请求是否访问的是同一个Servlet.当容器同时收到对同一个Servlet的多个请求的时候,那么这个Servlet的service()方法将在多线程中并发执行。
Servlet容器默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间,对于Tomcat可以在server.xml中通过元素设置线程池中线程的数目。
3,如何解决线程安全问题
实现SingleThreadModel接口
Public class Concurrent Test extends HttpServlet implements SingleThreadModel {
…………
}