JSP基础
JSP基础
/*print和write都是输出内容到客户端
*共同点:两者都不会刷新页面,都是在原来的基础上继续增加内容
*两个方法都重写了抽象类里面的write方法
*不同点:print方法可以将各种数据类型转换为字符串进行输出,write方法只能输出字符串,字符,字符数组等
*/
out.print("1");
out.print(1);
//print输出的所有内容都会转换成字符串型
out.write("2");
out.write(2);
//write方法只能输出字符和字符串,第二个2不会显示
Java server page:服务器端动态网页技术
jsp实际上就是在html里面嵌套java代码,将其分为模版和脚本
servlet的缺陷:
- servlet的编码部署和调试任务繁琐
- 生成动态网页繁琐,不利于项目分工
采用JSP技术编写动态页面
- 由HTML语言和嵌套在其中的Java代码组成的一个普通文本文件
- JSP页面的扩展名必须为.jsp
JSP运行机制-页面翻译
Web容器第一次接收到对某个JSP页面的请求后,首先自动将该JSP页面翻译成为Servlet代码
tomcat将翻译后的代码放在tomcat安装目录的/work子目录下
所有JSP页面本质上就是一个Servlet程序:jsp继承了HttpJspBase。HttpJspBase又继承了HttpServlet
JSP执行流程
- jsp引擎将jsp页面变成java代码。jsp引擎是容器自动配置的。
*.jsp,*.jspx都由引擎来处理 - 将生成的java代码编译成字节码
- 将字节码加载到容器里面
- 实例化
- 初始化
- service方法调用
- 销毁
- 整个过程编译和翻译只执行一次
JSP通常用于简化创建产生文本的servlet,而servlet更适合于发送原生字节到客户端或需要用java源代码完全控制源代码的场合。二者可以很好的分开
在jsp里面嵌套java代码
<!-- 在jsp里面嵌套java代码的第一种:脚本声明:<%!%>声明静态块,静态变量,常量,方法 默认会将声明的内容变成全局的-->
<%!
int i = 0;
static{
int j=0;
}
%>
<%!
public void add(){
}
%>
this is jsp
<!--第二种: 脚本片段:在jsp里面写常规的java代码,所有代码默认放在service方法里面,定义的变量是局部变量
片段中不能出现模版元素,语法必须是java语法,一段代码可以拆分成多个部分
-->
<%
for(i=0;i<4;i++){
%>
<h1>h1</h1> 这里会在网页循环打印4个h1标签
<%} %>
<!-- 第三种:脚本表达式,动态将内容输出到客户端,用来替换out.write或out.print -->
<%="这是脚本表达式输出的内容,后面不能加分号" %>
JSP注释
jsp中可以使用三种注释:
jsp注释<%-- 内容--%>
java代码注释// /**/ /** */
html注释<!-- neirong -->
JSP指令
jsp中有三种类型的指令:
- page指令:为当前页面提供处理指令
- include指令:用于把另一个文件包含在jsp中
- taglib指令:指定如何包含和访问自定义标签库
page指令
设定整个jsp页面的属性和相关功能 属性名:
language、info、contenType、import、buffer、autoFLush、session、isThreadSafe、errorPage、isErrorPage
include指令
inclde指令表示在JSP编译的时候插入一个包含文本或者代码的文件
把文本中的文本静态的包含过去
语法格式为:
<%@ include file="relativeURL" %>,relativeURL为要包含进来的文件,可以是HTML也可以是jsp,还可以是普通的文本文件。在引入的过程中,属于包含内容,先将外部文件所有内容包含进来,再通过jsp引擎转换成一个servlet,所以说文件里面不能出现变量相同的情况。所以称include包含为静态包含。
包含的文件如果有重复java代码会报错,但是如果网页结构有重复,会以主文件为准
taglib
倒入标签库
JSP动作
用于在jsp页面里面提供的业务逻辑功能,避免了在jsp里面写过多的java代码造成难以维护的局面
<jsp:include>
动作是一种动态的包含(包含结果):包含的 的如果是动态的网页,先生成多个servlet,再把结果包含进来,如果包含的是普通的文本文件,就相当于静态包含
定义了同样的变量,不会报错
<jsp:include page="footer.jsp"></jsp:include>
<jsp:forward> </jsp:forward>
用于将请求转发给另一个资源
JSP隐式对象
在jsp中操作请求,相应,绘画以及其他servlet中使用的对象
九大隐式对象:
request,response,pageContext,session,application,out,config,page,exception
pageContext
pageContext是jsp中非常重要的一个对象,代表了jsp的运行环境,范围大到可以单独作为一个容器
它的功能主要是用来保存数据,并且还包含了其他八个隐式对象(封装了其他八个对象的引用),它还封装了web中的一些操作(动作):如引用其他资源(include),控制页面跳转
pageContext提供了getAttribute()方法,只会从自身去找键,获取值。 pageContext.findAttribute(),首先也是从自身去找,自身没有键,从其他对象里面获取值。
从小到大的一个范围获取内容page-request-session-application
如果键不存在,则返回null
通过pageContext实现跳转,pageContext类中定义了很多方法,例如forward:替代了servlet的request。getRequestDispacher.forward()
<%
pageContext.forward("header.jsp");
%>