今天没事情做,就重温下servlet方面的知识,以作记录。在最开始接触J2EE时,也没花太多时间再这块,跟着教学视频,现在都有点淡忘了,不过这块是面试时考官喜欢问到的地方,考察基本功。
Servlet
Servle是一个特殊的java类,没有main方法,不能独立运行,也就是讲它需要其他容器或者工具来启动。Servlet是运行在客户端处理请求并作出相应的程序。简单来讲,用户若想用使用一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
1、编写一个Java类,继承httpServlet。
2、把开发好的Java类部署到web服务器中。
3、修改web.xml,配置访问改serlvet的映射地址。
Servlet生命周期
生命周期这个概念,怎么说呢,以下是个人理解,很重要但是在开发中好像用到的不是特别多吧,而且现在框架这么多,无需花精力去关注这块。不过作为基础熟悉下,后续还会有学Andriod时同样需要生命周期。Servlet生命周期,简单概括主要包括四个环节:servlet类加载-----》实例化-----》服务-----》销毁。
1、加载和实例化
Servlet容器启动时,读取web.xml配置文件中信息,构造指定的servlet对象,创建servletConfig对象,并且将servletConfig对象作为参数来调用servlet对象的init方法;用代码比较容易理解,分别为init()方法和带参数的init()方法,init()在生命周期中只会执行一次:
<span style="font-family:Times New Roman;">@Override public void init() throws ServletException { System.out.println("====== init without parameter ====== "); super.init(); } @Override public void init(ServletConfig config) throws ServletException { System.out.println("====== init with parameter====== "); super.init(config); }</span>
输出结果是:
====== init with parameter ======
====== init without parameter ======
====== service method ======
查看源码不难发现,带参数的init(ServletConfig config)方法最终又显示调用了不带参数init()方法,在init方法里面我们可以构造一些逻辑代码,在Servlet实例化之前进行相关初始化操作。究竟是如何加载的呢?
加载方式
在项目的web.xml中配置Servlet如下:<servlet>和<servlet-mapping>需配对出现,前者主要定义了servlet的命名和代码包路径,<load-on-startup>标签含义总结情况下,
如果没有配置<>load-on-start>则调用时才实例化servlet;分三种情况:
1、loadOnStartup < 0
即负数的情况下,web容器启动的时候不做实例化处理,servlet首次被调用时做实例化。这种情况和没有设置loadOnStartup是一样的。
2、loadOnStartup > 0
web容器启动的时候做实例化处理,顺序是由小到大,正整数小的先被实例化
3、loadOnStartup = 0
web容器启动的时候做实例化处理,相当于是最大整数,因此web容器启动时,最后被实例化。
而mapping中<url-pattern>是用来做路径映射的;比例下面代码中为/test/,那么访问路径就为:http://localhost:8080/项目命名/test,即可访问servlet;同理在struts2中struts.xml中分别定义package,action名称,访问方式相同。
<span style="font-family:Times New Roman;"><servlet> <servlet-name>demoServlet</servlet-name> <servlet-class>com.niuxl.servlet.DemoServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>demoServlet</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping></span>
2:进入服务
当有请求提交时,Servlet将调用service()方法进行处理,常用的是service根据请求类型调用doGet()或者doPost()方法进行处理;在service()方法中,Servlet可以通过ServletRequest接受客户的请求,也可以利用ServletResponse设置响应信息。
3:销毁
当web容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()方法,以便让该实例释放掉所占用的资源。
4:卸载
当一个Servlet调用完destroy()方法后,次实例将等待被垃圾收集器所回收,如果需要再次使用此Servlet时,会重新调用init()方法初始化。
注意:在生命周期中,init()和service()方法都只调用一次,整个过程都只有一个servlet对象,采用的是单例模式。一般我们写servlet时候,只需要复写doGet()和doPost()即可。
Jsp(Java Server Page)
Jsp是一种用于开发动态web资源的技术,最大特别就在jsp页面中嵌套java代码。
Jsp本质也是一个Servlet,运行时需要依赖其他容器。Jsp是Servlet的扩展,从而可以看出来JSP主要是由两部分组成:
静态部分:标准的HTML标签、静态的页面内容,这些内容与静态HTML页面相同.
动态部分:Java程序控制的内容,这些内容由Java程序来动态生成。
当一个JSP文件第一次被请求的时候,JSP引擎(本身也是一个Servlet)首先会把这个JSP文件转换成一个Java源文件。在转换过程中如果发现JSP文件有语法错误,转换过程将中断,并向服务端和客户端输出出错信息;
在 MVC 架构模式中,就 JSP 和 Servlet 而言,controller通常由 Servlet 充当,View通常由 JSP 来充当。
JSP的工作原理可以简单总结为如下几条:
1.Jsp需依赖web容器才能运行,如流行的Web容器Tomcat/Weblogic/JBoss等等.
2.Jsp需编辑成Servlet才能被服务器响应给客户端。
3.Jsp页面的访问者无须安装任何客户端,甚至不需要可以运行Java的运行环境,因为JSP页面输送到客户端的是标准HTML页面。