Java Web 回顾总结(六) - jsp - 简介

JSPservlet 的区别与使用

通常把servlet作为web应用中的控制器组件来使用
JSP技术作为数据显示模板来使用
原因是

程序的数据通常要美化后再输出:让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。
servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。

因此结合以后 ,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。

JSPJava Server Pages

它和servlet技术一样,都是SUN公司定义的一种用于开发动态web资源的技术

jsp 本质上是一个 Javahtml结合 的 技术,实现方式通过 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

概括如下

  1. 所有的请求交给WEB容器来处理
  2. 在容器中找到需要执行的*.jsp文件
  3. 之后*.jsp文件通过servlet转换变为*.java文件
  4. *.java文件经过编译后,形成*.class文件
  5. 最终服务器要执行形成的*.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这个Servletindex_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对象,requestresponse已经完成了实例化
而其它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>) %>
后面这些会一 一用到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值