首页 > 代码库 > JSP Servlet学习笔记
JSP Servlet学习笔记
在面试Java程序员工作时,经常会被问到JSP Servlet中相关的知识。这些知识都是JSP Servlet的基础,这篇文章主要梳理一下JSP Servlet比较基础但是又比较重要的知识。
1 service方法调用过程
在Servlet接口中有一个service方法,这个方法不是有人手动的调动,而是在运行时由tomcat自动调用的。GenericServlet抽象类实现了Servlet接口,当然它也重写了service方法,但是它也没有具体实现。到了HttpServlet类中,service方法有了具体实现,它调用的是该类的protected service方法。具体的如下:
2 Servlet的生命周期
最重要的一条:在Servlet为客户端提供服务的整个过程中,只有一个Servlet对象。当有用户同时访问时,是通过多线程方式完成的,线程有一个线程池。
生命全过程如下:
a、加载 classLoader
b、实例化 new(第一次客户端过来时被实例化,整个生命过程中,只被实例化一次)
c、初始化 init(ServletConfig) (整个生命过程中,只被实例化一次)
d、处理请求 service()、 doGet()、 doPost() (以多线程方法执行)
e、退出服务 destroy() (web应用程序退出时、重新加载时、自动重新加载时都会调用该方法)
具体实例如下:
运行结果如下:
3 为何会有两个init方法
在GenericServlet类中定义了两个init方法:
首先看GenericServlet源码。在GenericServlet类中,init(ServletConfig config)的源码为:
因此,如果没有两个init方法时,我们程序员可以重写init(ServletConfig config)方法,但如果程序员忘了写了this.config = config一句话,就会出现错误。所以,程序员只要重写那个不带参数的init方法就行,不需要在意init(ServletConfig config)方法,系统会自动调用init(ServletConfig config)方法方法,通过该方法会调用到用户自定义的init()方法。
4 JSP的内置对象
JSP的内置对象是可以在jsp代码中不需要新建就可以直接用常用的内置对象,比如out对象,它就是JSP的一个内置对象,此外还有request、response、session、application、cookie、config、page、exception等。
5 JSP的动态包含和静态包含
静态包含
静态包含的语法:<%@ include … %>
静态包含的饿功能:意思是包含另一个网页,方便重用。
静态包含的特点:
a、被包含页面在编译之前就已经包含进来。
b、它转换的结果是转换为一个class文件。(动态包含是两个class)
c、这种包含不能传参数,例如:代码<%@include file="TitleBar.jsp?user=liguohui" %>就不行,这里传的参数user=liguohui是没有意义的,因为在编译期间传参数是没有意义的。
d、包含页面和被包含页面访问的是同一个request对象,即不论是TileBar.jsp还是TestBar.jsp页面都能调用“request.getParamter();”函数,且他们调用的是同一个对象,得到同一个结果。
e、包含页面和被包含页面里的字符集必须是相同的,例如,如果在TileBar.jsp代码里面定义的字符集为:<%@page contentType="text/html;charset=gbk"%>;而在TestBar.jsp代码里面定义的字符集为:<%@pagecontentType="text/html;charset=gb2312"%>,那么就会出错。(但是这只是tomcat的特点,不是所有容器的共同特点)。
f、在被包含页面里面没有必要写<html></html>标签。
静态包含的具体事例:
动态包含
动态包含的语法:<jsp:include page="date.jsp"/>
静态包含的具体事例:
运行结果为:
动态包含和静态包含还有一个巨大的区别是:静态包含时,后台只会编译出一个class文件,而动态包含是后台会编译出两个class文件。6 sendRedirect和forward实现页面跳转
sendRedirect
利用sendRedirect方法可以将页面转到另一个地方去,例如下面代码,可以将当前页面转到forforward1.jsp页面去,同时可以传一个参数name=liguohui。
当在地址栏里面输入地址:http://127.0.0.1/my/forward/test.jsp?name=zhumingyun&oldName=hui,同时给这个页面传两个参数,会发现如下结果:
可见name=zhumingyun&oldName=hui参数被丢弃,而sendRedirect里面的参数name=liguohui被保留。
后台打印出了一句话,可见,当sendRedirect指令发出后,后面的话继续执行。
forward
Forward是动态的转向,代码如下:
客户端输入地址:http://127.0.0.1/my/forward/forward.jsp?name=liguohui,并传一参数name=liguohui,如下图所示:首先,它的地址栏没变;其次,它能取到两个页面的参数,且同名参数时,后面的覆盖前面的
总结sendRedirect和forward的区别如下(下图表格部分摘自北京尚学堂辅导机构视频)
7 JSP中乱码问题
解决方式大致如下:
全文完。转账请注明出处。
JSP Servlet学习笔记