JSP
与 servlet
的区别与使用
通常把servlet
作为web
应用中的控制器组件来使用
把JSP
技术作为数据显示模板来使用
原因是
程序的数据通常要美化后再输出:让
jsp
既用java
代码产生动态数据,又做美化会导致页面难以维护。
让servlet
既产生数据,又在里面嵌套html
代码美化数据,同样也会导致程序可读性差,难以维护。
因此结合以后 ,servlet
只负责响应请求产生数据,并把数据通过转发技术带给jsp
,数据的显示jsp
来做。
JSP
— Java Server Pages
它和servlet
技术一样,都是SUN
公司定义的一种用于开发动态web
资源的技术。
jsp
本质上是一个 Java
和 html
结合 的 技术,实现方式通过 servlet
完成.
弥补了
html
只能为用户提供静态数据的缺点 使得 变为动态数据。
JSP
页面工作原理
浏览器向服务器发请求,首先访问 的其实都是Servlet
,之后servlet
按照 代码执行 跳转,或 返回.
当访问一个jsp
页面时,本质上是在访问一个Servlet
,服务器在执行jsp
的时候,首先把jsp
翻译成一个Servlet
所以我们访问jsp
时,其实不是在访问jsp
,而是在访问jsp
翻译过后的那个Servlet
过程:
当我们通过浏览器访问某一个jsp
文件时 ,如index.jsp
文件时
例:
服务器首先将index.jsp
文件翻译成一个index_jsp.class
文件
在Tomcat
服务器的work\Catalina\localhost\项目名\org\apache\jsp
目录下可以看到编译后 的index_jsp.class
和 源代码文件index_jsp.java
概括如下
- 所有的请求交给WEB容器来处理
- 在容器中找到需要执行的
*.jsp
文件 - 之后
*.jsp
文件通过servlet
转换变为*.java
文件 *.java
文件经过编译后,形成*.class
文件- 最终服务器要执行形成的
*.class
文件
后面除了修改jsp
文件 其余时刻:
因为已经存在了*.class
文件,所以不在需要转换和编译的过程 ,直接返回,加快反应速度
修改后 需要重新编译 执行
分析
index_jsp
这个类是继承 org.apache.jasper.runtime.HttpJspBase
这个类的,通过查看Tomcat
服务器的源代码,在apache
的源代码中 可发现 存HttpJspBase
这个类的源代码文件
而HttpJspBase
类是继承HttpServlet
的,所以HttpJspBase
类是一个Servlet
,而index_jsp
又是继承HttpJspBase
类的,所以index_jsp
类也是一个Servlet
,所以当浏览器访问服务器上的index.jsp
页面时,其实就是在访问index_jsp
这个Servlet
,index_jsp
这个Servlet
使用_jspService
这个方法处理请求。
Jsp
页面处理其中的html
标签方法
在
jsp
中编写的java
代码和html
代码都会被翻译到_jspService
方法中去,在jsp
中编写的java
代码会原封不动地翻译成java
代码,如<%out.print("Hello Jsp");%>
直接翻译成out.print("Hello Jsp");
而HTML
代码则会翻译成使用out.write("<html标签>\r\n");
的形式输出到浏览器。
在jsp
页面中编写的html
排版标签都是以out.write("<html标签>\r\n");
的形式输出到浏览器,浏览器拿到html
代码后才能够 按字符 解析执行html
代码。
Jsp
页面处理其中的java
代码方法
在jsp
中编写的java
代码会被翻译到_jspService
方法中去,当执行_jspService
方法处理请求时,就会执行在jsp
编写的java
代码
jsp
提供的java对象
在 _jspService
方法中 可以看到
Web
服务器在调用jsp
时,会给Jsp
提供
如下的8个java
对象
PageContext pageContext;
HttpSession session;
ServletContext application;
ServletConfig config;
JspWriter out;
Object page = this;
HttpServletRequest request,
HttpServletResponse response
其中page
对象,request
和response
已经完成了实例化
而其它5个没有实例化的对象通过下面的方式实例化
pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
例:<% out.print(<p1>hello world!</p1>) %>
后面这些会一 一用到