4、Servlet

前面聊的HTML、CSS、JS和jQuery都是静态资源,接下来聊下Servlet和JSP这两种动态资源,这里先聊下Servlet。
(1)Servlet是什么?
Sun公司提供的一个动态资源开发的技术,本质上就是一个java文件,需要先编译后执行,而且需要存储在servlet容器中,所以Servlet就是运行在Web服务器或者应用服务器上的程序,那servlet容器有哪些?比如tomcat,既是servlet容器也是web容器。Servlet能够访问所有的Java API,包括访问企业级数据库的JDBC API。
Servlet为创建基于web的应用程序提供了基于组件、独立于平台的方法,可以不受CGI(Common Gateway Interface,公共网关接口)程序的性能限制,那怎么使用Java Servlet来开发基于web的应用程序?
(2)Servlet怎么用?
在聊Servlet怎么用之前提下Servlet有什么用?它是作为客户端和数据库之间的中间层,所以可以收集来自网页表单的用户输入,呈现来自数据库的记录,还可以动态创建网页。CGI也可以作为中间层,从而实现这些功能,但相比于CGI,Servlet有以下几点优势:
A、性能明显更好;
B、Servlet是在Web服务器的地址空间内执行,所以就没有必要再创建一个单独的进程来处理每个客户端请求;
C、因为Servlet是用Java写的,所以可以独立于平台,即有Java的“一次编译,到处运行”的特性;
D、Servlet更安全也更可信;
E、Servlet可以使用Java类库的所有功能,所以可以通过sockes和RMI机制和applets、数据库或者其他软件进行交互。
1)如何实现Servlet?
法1:手写
第一步:创建一个类,实现servlet接口(这里具体是继承HttpServlet类,因为实现servlet接口要重写所有方法,比较麻烦,而且HttpServlet类多了doGet和doPost方法。)并重写service方法,就可以变成一个servlet文件。
第二步:在cmd窗口用javac编译这个java文件然后把编译后的文件放到class目录中。
第三步:为servlet添加配置文件,即添加servlet映射。
法2:用Myeclipse直接创建,不需要手写
WebProject——Servlet——Tomcat——浏览器访问
2)Servlet的继承结构
本来应该实现servlet接口,但这样就要重写这个接口里所有方法,比较麻烦,所以一般是继承HttpServlet类,只重写service方法。
继承HttpServlet类的好处还有就是这个类添加了和HTTP协议相关的内容,更善于HTTP协议相关开发。
3)Servlet的运行过程
主要从以下几个问题展开:
A、Servlet如何找到Tomcat服务器?
通过hosts文件把localhost解析成本机地址,然后通过Tomcat服务器默认端口80找到Tomcat服务器,这个端口可以改,但不能改成已有的服务器的端口。
B、如何确定当前服务器上的哪台虚拟主机(也就是哪个网站)?
请求头host,如果这个为空,那就默认访问缺省虚拟主机。
C、如何确定是当前虚拟主机中哪一个web应用?
请求资源名称部分。
D、如果确定访问的是当前web应用的哪一个web资源?
也是请求资源名称部分。
E、如何确定使用哪一个web资源提供服务?
通过web.xml文件可以确定(倒着来,具体是3421),也就是法1手写里的第三步。
上面合起来就是五步:先用Hosts文件解析出localhost的本地地址,然后根据端口号80访问Tomcat服务器,再根据请求头Host访问这个服务器里某个虚拟主机,然后根据请求资源名称部分确定访问哪个web应用和web资源,最后由web.xml文件决定具体哪个web资源提供服务。
当然,这五步还没完,还有一步是servlet返回的结果会放到response缓冲区中,然后组织成一定结构后,再发送到浏览器中。
4)Servlet的生命周期
初次访问servlet的时候,它会在Tomcat内存中创建并且驻留一个servlet对象,一个servlet只有这一个对象,所以如果再次访问同一个servlet则会使用内存中已有的servlet对象。
在创建servlet对象的时候会调用init方法完成初始化操作,然后每次访问这个servlet对象,其实就是想调用这个对象上的service方法,从而获得该方法提供的服务,那什么时候这些方法不能提供服务?servlet所在的web应用被tomcat移除,或者tomcat服务器关闭的时候servlet就会销毁,那这些方法就不能提供服务了,servlet比较灵性的一点是在被销毁之前会自动调用destroy方法来完成一些善后的操作。
5)Servlet的细节
A、为什么要在web.xml里写servlet和servlet-mapping这两个标签?
在这里插入图片描述
这个问题需要从下往上看才能理解,对应1-2-3-4,即先根据servlet-mapping标签里第二个参数即浏览器访问地址然后找到servlet标签里第二个参数即对应的class文件(包名+类名),二者如何关联?通过各自标签里第一个参数。
注:还有,web.xml 的 / 表示的是http://localhost:8080/ + 工程名
而.jsp页面的action,加了/表示绝对路径http://localhost:8080/ ,没有加 / 表示的是相对路径。
B、缺省servlet负责静态资源和没人用的资源,直接用/即可。
C、线程安全问题:
如果多个客户端访问同一个Servlet时,那web服务器就会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,所以如果service方法访问同一个资源的话,就可能会引发线程安全问题。
怎么解决servlet多线程问题?
一是多使用局部变量,少使用成员变量和静态变量,因为成员变量和静态变量都会引发线程安全问题;
二是合理加锁,但一定要锁住关键部分代码,否则会降低代码的执行效率。
面试题:
1)Tomcat的优化经验
法1:去掉对web.xml的监视,把JSP提取编辑成Servlet;
法2:如果物理内存富余,则加大Tomcat使用的JVM内存。
2)什么是servlet?
动态资源技术,从代码和web.xml两方面展开;
3)Servlet的生命周期?
4)Servlet的基本架构?初始化方法、service方法(doGet、doPost)、销毁方法
5)Servlet API中的forward()和redirect()的区别?
浏览器地址变化:请求转发不变化,请求重定向会变化;
资源共享:请求转发资源共享,请求重定向资源不共享;
效率:请求转发效率比较高仅发生在服务器端,而请求重定向效率低相当于再一次请求。
6)什么情况下调用doGet()和doPost()?
默认是调用doGet()方法(类比大部分是GET提交一样),如果是表单采用POST提交的时候,才调用doPost()方法。
7)request.getParameter()和request.getAttribute()的区别?
获取的类型不同:前者是String,后者是Object;
获取的值不同:前者是URL或许POST提交中的参数,后者是容器里的对象;
注:上面提到CGI,那CGI、Servlet和JSP有什么区别?
先说下CGI和Servlet,这两个都是客户端和数据库之间的中间件,可以收集网页表单的用户输入和呈现来自数据库或者其他源的记录,但Servlet比CGI的优势主要体现在两点:一是Servlet是在web服务器的容器里执行,只需要初始化一次,即一个进程然后多个线程执行service方法即可,而CGI需要每次单独创建一个进程来处理每个客户端请求,服务完就要销毁,所以Servlet的效率明显高于CGI;二是Servlet是用Java编写的,所以独立于平台而且可以使用Java类库,可实现的功能更多。
再说下Servlet和JSP的关联,二者都是中间件,那为什么没有谁取代谁?因为二者是各司其职,Servlet偏向于数据库,对应于MVC模型中的Controller层,即侧重于解决运算和业务逻辑问题,而JSP偏向于客户端,对应MVC模型中的View层,即侧重于解决展示问题。
那为什么要JSP?因为JSP是直接在HTML中输出,明显这样输出比在Servlet里一个个printf简单。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值