关于jsp
一.JSP原理:
(Web服务器是如何调用并执行一个jsp页面的?)
1. 浏览器向服务器发请求,不管访问的是什么资源,其实都是在访问Servlet,所以当访问一个jsp页面时,其实也是在访问一个Servlet,服务器在执行jsp的时候,首先把jsp翻译成一个Servlet,所以我们访问jsp时,其实不是在访问jsp,而是在访问jsp翻译过后的那个Servlet。
原因分析:
当我们通过浏览器访问1.jsp时,服务器首先将1.jsp翻译成一个_1_jsp.class,在Tomcat服务器的work\Catalina\localhost\项目名\org\apache\jsp
目录下可以看到_1_jsp.class的源代码文件_1_jsp.java
我们可以看到,_1_jsp这个类是继承 org.apache.jasper.runtime.HttpJspBase这个类的,通过查看Tomcat服务器的源代码,可以知道在apache-tomcat-8.0.36-src\java\org\apache\jasper\runtime目录下存在HttpJspBase这个类的源代码文件,如下图所示:
HttpJspBase类是继承HttpServlet的,所以HttpJspBase类是一个Servlet,而_1_jsp又是继承HttpJspBase类的,所以_1_jsp类也是一个Servlet,所以当浏览器访问服务器上的1.jsp页面时,其实就是在访问_1_jsp这个Servlet,_1_jsp这个Servlet使用_jspService这个方法处理请求。
二。
Tomcat服务器的执行流程?
第一次执行:
- 客户端通过计算机连接服务器,因为是请求是动态的,所以所有的请求交给WEB容器来处理。
- 在容器中找到需要执行的
*.jsp
文件。 - 之后
*.jsp
文件通过转换变为*.java
文件。 *.java
文件经过编译后,形成*.class
文件。- 最终服务器要执行形成的
*.class
文件。
第二次执行:
- 因为已经存在了
*.class
文件,所以不在需要转换和编译的过程。
修改后执行:
- 源文件已经被修改过了,所以需要重新转换,重新编译。
三。JSP基础语法:
1.JSP脚本表达式
<%= 变量或表达式 %> 作用:脚本表达式,它的作用就是向浏览器输出数据
2.脚本片段:
<% 多行java代码 %> 在<% %>
中可以定义变量、编写语句,但不能定义方法
3.JSP声明:
<%! java代码%> JSP页面中编写的所有代码,默认会翻译到servlet的service方法中, 而Jsp声明中的java代码被翻译到_jspService方法的外面
3.jsp指令(3个)
(1) page 指令 include指令 taglib指令
(2) JSP指令的基本语法格式: %@ 指令 属性名="值" %>
(3). page指令
page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,
为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置
属性:
import属性
errorPage属性
(4).include指令:
- @include指令 静态包含
<jsp:include>指令 动态包含
静态包含和动态包含有什么区别?
面试题:静态包含和动态包含有什么区别? 答:静态包含是在编译时包含,会把包含到的所有jsp编译成一个Servlet。而动态包含是运行时包含,包含过程中,涉及到的所有jsp对应单独的一个Servlet。而且静态包含性能好的多。
(5)..taglib指令
taglib指令用于在JSP页面中导入标签库。
4.使用page指令解决jsp中文乱码问题:
注意:
- 使用Eclipse集成开发工具编写程序时,无须担心JSP文档是以什么码表编码的,它是非常聪明的,只要你指定了 pageEncoding属性的值,那么JSP文档就是以什么码表编码的。
四.jsp运行原理和九大隐式对象
1.运行原理:
每个JSP页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。
2.九大隐式对象:
No. | 内置对象 | 类型 |
---|---|---|
1 | pageContext | javax.servlet.jsp.PageContext |
2 | request | javax.servlet.http.HttpServletRequest |
3 | response | javax.servlet.http.HttpServletResponse |
4 | session | javax.servlet.http.HttpSession |
5 | application | javax.servlet.ServletContext |
6 | config | javax.servlet.ServletConfig |
7 | out | javax.servlet.jsp.JspWriter |
8 | page | java.lang.Object |
9 | exception | java.lang.Throwable |
五。* jsp属性范围
- 当前页:一个属性只能在一个页面中取得,跳转到其他页面无法取得。
- 一次服务器请求:一个页面中设置的属性,只要经过了服务器跳转,则跳转之后的页面可以继续取得。
- 一次会话:一个用户设置的内容,只要是与此用户相关的页面都可以访问(一个会话表示一个人,这个人设置的东西只要这个人不走,就依然有效)
- 上下文中:在整个服务器上设置的属性,所有人都可以访问。
-
*属性的操作方法
No. 方法 描述 1 public void setAttribute(String name,Object value) 设置属性 2 public object getAttribute(String name) 取得属性 3 public void removeAttribute(String name) 删除属性 *JSP四种属性范围的具体介绍
page属性范围(pageContext):在一个页面设置的属性,跳转到其他页面就无法访问了。习惯上(pageContext)。
request属性范围: request属性范围表示在一次服务器跳转中有效,只要是服务器跳转,则设置的request属性可以一直传递下去。
注意: 在requestDemo1.jsp这个页面设置的属性经过超链接这种客户端跳转到别的页面时别的页面是无法取得requestDemo1.jsp中设置的属性的。 - session属性范围: session设置的属性不管如何跳转,都可以取得的。当然,session只针对一个用户。
-
application属性范围:因为application属性范围是在服务器上设置的一个属性,所以一旦设置之后任何用户都可以浏览到此属性。
* jsp四种属性范围的使用场合
- request
如果客户向服务器发请求,产生的数据,用户看完就没用了,像这样的数据就存在request域,像新闻数据,属于用户看完就没用的。 - session
如果客户向服务器发请求,产生的数据,用户用完了等一会儿还有用,像这样的数据就存在session域中,像购物数据,用户需要看到自己购物信息,并且等一会儿,还要用这个购物数据结帐。 - application(servletContext)
如果客户向服务器发请求,产生的数据,用户用完了,还要给其它用户用,像这样的数据就存在application(servletContext)域中,像聊天数据等。
- request
-
JSP标签介绍:
JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。 - Jsp常用标签:
-
<jsp:include>
标签-
其语法为:
<jsp:include page="relativeURL | <%=expression %>" flush="true|false" />
<jsp:forward>
标签-
其语法为:
<jsp:forward page="relativeURL | <%=expression%>" />
<jsp:param>
标签-
-
语法1
<jsp:include page="relativeURL | <%=expression%>"> <jsp:param name="parameterName" value="parameterValue|<%= expression %>" /> </jsp:include>
- 1
- 2
- 3
-
语法2
<jsp:forward page="relativeURL | <%=expression%>"> <jsp:param name="parameterName" value="parameterValue|<%= expression %>" /> </jsp:include>
-