OCP开发原则:扩展是开放的,修改是关闭的。
1.JSP是什么?
-javaSErver Pages
-基于java语言实现的服务器端页面
-JSP是JavaEE规范之一
2. JSP文件通常存放在什么位置?
-JSP可以放倒WEB-INF目录外,目前我们是这样做的
-在实际开发中,有很多项目是将JSP放倒WEB-INF目录中,保护JSP
-WEB-INF目录中的数据是相对安全的。
3.jsp文件后缀是什么?
-默认是.jsp
-但是jsp文件的后缀也是可以修改的额,通过修改CATALINA_HOME/conf/web.xml文件(在哪修改呢在凯特琳(Tomcat服务器)啊的home,conf里面的web.xml文件里面修改)
4. JS和JSP的区别?
-JS:JavaScript,运行在浏览器中,和服务器没有关系,和java也没有关系
-JSP:JavaServer Pages,运行在服务器中,JSP底层就是java程序,运行在JVM中
(在Tomcat中有work目录,它里面存放的是jsp翻译生成的java程序存放的位置)
5.JSP的执行原理?
-浏览器上访问的路径虽然是以.jsp结尾,访问的是某个jsp文件,其实底层执行的是jsp对应的java程序
-Tomcat服务器负责将.jsp文件翻译生成.java源文件,并且将java源文件编译生成.class字节码文件
-访问jsp,其实底层还是执行了.class文件中的程序
-Tomcat服务器内置了一个JSP翻译引擎,专门负责翻译JSP文件,编译java源文件
-index.jsp会被翻译生成index_jsp.java,编译生成index_jsp.class
-index_jsp这个类继承了HttpJspBase,而HTTPJsBase继承了HttpServlet
-jsp就是Servlet,只不过职责不同,JSP的强项做页面展示
6.在JSP文件中编写的所有的HTML、CSS、JavaScript,对JSP来说,只是普通的字符串,被翻译到:out.write(“翻译到这里”);
例如:在jsp文件中编写html代码
<html>
<title>idnex page</index>
<body>
index page!
System.out.println("Hello world");
</body>
</html>
其实都被翻译成这样了
out.write("<html>\r\n");
out.write("<title>index page</title>\n\t");
out.write("System.out.println("helloword")");
注意:想要在jsp中写java程序,学jsp语法,学jsp语法你写的东西才能翻译到java程序的位置上
<% System.out.println("sfsf") %> 翻译到servlet方法里面作为java语句
<% ! System.out.println("sfsf") %> 翻译到servlet类体里面
如果啥也没写则被翻译到servlet方法里面的out.print("dd")里面
JSP的生命周期和Servlet生命周期一样。
Servlet 主要负责数据的接收和业务逻辑的处理。而JSP主要负责前端页面展示。
JSP是服务器端呢基于java语言实现的页面
7.jsp文件修改之后,不需要重新部署,也不需要重新启动Tomcat服务器
8.jsp文件第一次访问的时候为什么非常慢?
-启动JSP翻译引擎
-需要一个翻译的过程
-需要一个编译的过程
-需要Servlet对象的创建过程
-init方法调用
-service方法调用
为什么第2+次访问JSP的时候非常快?
-不需要翻译
-不需要编译
-不需要创建Servlet对象
-直接调用Servlet对象的service方法
jsp也是单实例多线程环境下运行的一个Servlet对象
9.jsp文件在什么时候会被重新翻译?
-jsp文件被修改之后会被重新的翻译
-怎么确定jsp文件修改了呢?Tomcat服务器会记录jsp文件的最后修改时间。
第二节-----------JSP小脚本------------------
打开JSP快的方式--MyEclipse JSP Editor---
可以设置这种默认的方式Preferences -----输入file as (文件关联)file associations---jsp---MyEclipse JSP Editor--default--OK就可以了。
<%----%> 1.这是JSP的专业注释,使用这种注释方式,不会编译到java源文件中
2. 在JSP文件中所编写的所有的html、CSS、javascript 都会被自动翻译到Servlet的service方法中的out.write("翻译到这里")
3.关于JSP的小脚本scriiptlet:
<%
java语句;
java语句;
%>
4.小脚本中的java语句被翻译到Servlet的service方法中,所以小脚本中必须编写“java语句”,java语句以分号结尾。
5. 所谓JSP规范,就是SUN制定号的一些翻译规则,按照翻译规则进行翻译,生成对应的java源程序,不同的web服务器,翻译的结果是完全相同的,因为这些服务器在翻译的时候,都遵守了JSP翻译规范
6.小脚本的数量随意,可以多个
7.小脚本中编写java程序出现在service方法中,service方法的代码是有执行顺序的,所以小脚本中的程序也是有顺序的。
面试题:
8 .JSP的声明语法格式:
<%!
实例变量;
静态变量
方法;
静态语句块;
构造函数;
注:声明语法中的java程序会被JSP翻译引擎翻译到service方法之外
声明块中不能直接编写java语句,除非是变量的声明(下面有说明,java语句不能出现在类体中)
%>
<%!
//java语句不能直接出线在类体中
//System.out.println("hello World") ;
%>
<%%>带!号翻译在serverce方法外,否则翻译在serverce里面。
9.关于JSP的九大内置对象
1.什么是内置对象?
可以直接在JSP文件中拿来使用的引用
<%因为它翻译到了servlet方法里面,所以servlet里面的request对象,responson对象都可以使用
如:request.getContentPaht
%>
2.九大内置对象都有哪些?
内置对象名称 完整类名
pageContext javax.servlet.jsp.pageContext 页面范围
request javax.servlet.http.HttpServletRequest。请求范围
session javax.servlet.http.HttpSession。 会话范围
application javax.servlet.ServletContext 应用范围
out Javax.servlet.jsp.JspWriter。 响应对象
response Javax.servlet..http.HttpServletResponse 标准输出流
config Javax.servlet.ServletConfig Servlet配置信息对象
exception Java.lang.Throwable 异常引用(isErrorPage=“true”)
page Java.lang.object[page = this;] 很少用
3)以上内置对象只能在service方法中“直接”使用,在其它反复中无法“使用”使用,可以间接使用(传值)
<% out.print(); %>等同于<%= %> // 表达式语法具有输出功能,输出到浏览器。
登陆成功,欢迎<%=username%>回来。
第三节------------------page指令---------------------------------
关于JSP的指令:
1.指令的作用,是指导JSP的翻译引擎如何翻译JSP代码。
*page 页面指令
*include 包含指令
*taglib 标签库指令
2.指令的使用语法格式:
<%@指令名 属性名=属性值 属性名=属性值......%>
3.关于JSP的page指令,page指令中常用的属性:
*contentType 设置JSP的相应内容类型,同时在响应的内容类型后面也可以指定响应的字符编码方式。
*pageEncoding 设置JSP响应时的字符编码方式
*import 组织导入。<%@page import="java.util.Date"%> <%@page import="java.util.*"%>也可以
<%@page import="java.util.*,java.text.SimpleDateFormat"%>
*session 设置当前JSP页面中是否可以直接使用session内置对象
关于page指令中的session属性:
-session=”true“ 表示在当前JSP中可以直接使用内置对象session,程序执行的时候获取当前的session会话对象,若获取不到则新建session对象
-session =“false”
表示在当前JSP中不能直接使用内置对象session
*但是有一些业务可能要求在当前JSP页面中获取当前的session对象,没有获取到则不新建session对象,此时需要
若session这个属性没有指定,默认是true
*errorPage 错误页面
*isErrorPage 是否是错误页面
关于page指令中的isErrorPage属性:
-isErrorPage = “false”表示内置对象exception无法使用(缺省情况下是false)
-isErrorPage = “true” 表示内置对象exception可以使用。
使用内置对象exception打印异常堆栈追踪信息
exception引用指向了抛出的异常
exception.printStackTrace();
*isELIgnored 是否忽略EL表达式[后期讲]
关于JSP的include指令
1.a.jsp可以将b.jsp包含进来,当然被包含的资源不一定是jsp,也可能是其它的网络资源
2.include作用:
<%@ include file="/index2.jsp"%>
在网页中有一些主体框架,例如:网页头、网页脚,这些都是固定不变的,
我们可以将网页头,网页脚等固定不变的单独写到某个JSP文件中,
在需要页面使用include指令包含进来
优点:代码量少了。 便于维护[修改一个文件就可以作用于所有的页面]
3.在一个jsp中可以使用多个include指令
4.include实现原理:
4.1 编译期包含
4.2 a.jsp包含b.jsp,底层公生成一个java源文件,一个class字节码文件,
翻译期包含/编译期包含/静态联编
5.静态联编的时候,多个jsp中可以共享一个局部变量。
因为最终翻译之后service方法只有一个。
第四节------------------动作forward(转发,转寄)----------------------------
关于JSP中的动作:
语法格式:<jsp:动作名 属性名=属性值 属性名=属性值.....></jsp:动作名>
<jsp:forward page=""></jsp:forward>
关于JSP中的include动作:
1.a.jsp包含b.jsp,底层会分别生成两个java源文件,两个class字节码文件
2.编译阶段并没有包含,编译阶段是两个独立的class字节码文件,生成两个Servlet,两个独立的service方法
3.使用include动作属性运行阶段包含,实际上是在运行阶段a中service方法调用了b的service方法,达到了包含效果
4. a.jsp包含b.jsp,若两个jsp文件中有重名的变量,只能使用动态包含,其余都可以使用静态包含。
5.include 动作完成的动态包含,被称为动态联编
<jsp:include page="/b.jsp"></jsp:include>
关于JSP中的九大内置对象
内置对象名称 完整类名
pageContext javax.servlet.jsp.pageContext 页面范围
request javax.servlet.http.HttpServletRequest。请求范围
session javax.servlet.http.HttpSession。 会话范围
application javax.servlet.ServletContext 应用范围
out Javax.servlet.jsp.JspWriter。 响应对象
response Javax.servlet..http.HttpServletResponse 标准输出流
config Javax.servlet.ServletConfig Servlet配置信息对象
exception Java.lang.Throwable 异常引用(isErrorPage=“true”)
page Java.lang.object[page = this;] 很少用