介绍
jsp (java server page),用于动态开发web资源。
相比HTML,jsp可以嵌套java代码,为用户提供动态的数据。
相比servlet,jsp会很容易的对页面进行排版。
servlet回传html页面是一件非常麻烦的事情,主要是为了解决这个问题。
web服务器调用并执行jsp
第一次访问jsp文件,web服务器会把它翻译成一个servlet,再将其编译成一个class文件,然后再把class文件加载到内存,以后访问就直接访问内存中的实例。我们去查看jsp执行后的文件,不难发现,jsp的实质就是一个servlet。
jsp九大内置对象
它们都一一对应servlet的相关类,jsp本质就是servlet。
- out 向客户端输出数据,字节流
- request 接受客户端的http请求
- response 封装jsp产生的回应
- session 用于保存用户的信息,跟踪用户的行为
- application 多个用户共享该对象,可以做计数器
- pageContext jsp页面的上下文,也是一个域对象,存放的数据只能在当前页面使用
- exception 运行时的异常
- page 代表这个jsp的实例本身
- config jsp对应的servlet的配置,可以得到web.xml的参数
当jsp页面中所有代码执行完成后会做一下两个操作:
1.执行out.flush()操作,会把out缓冲区的数据追加到response缓冲区的末尾。
2.然后才response的刷新操作,把全部数据写给客户端。
<%
out.write("out输出1<br>");
out.flush();
out.write("out输出2<br>");
response.getWriter().write("response输出1<br>");
response.getWriter().write("response输出2<br>");
%>
执行这段代码,会得到以上结果,上面很好的解释了这个现象。
我们查看jsp翻译后的class文件,都是使用out来进行输出,所以一般用out输出,避免输出内容的顺序被打乱。
但是out有两个输出方法:
out.write();
out.print();
out.write()输出字符串没有任何问题,输出整型会出错。
out.print()输出任意数据都没有问题,它会将其他数据类型都转化成字符串类型后,再调用write方法输出。
所以,我们输出要用out.print()
四大域对象
pageContext (当前jsp页面范围内有效)
application (整个web工程运行时都有效)
session (一个会话范围内有效)
request ( 一次请求内有效)
域对象可以存取数据
四个域对象的功能基本一样,不同的是数据的存取范围。
jsp语法
- 指令元素
用于jsp发送一个信息到容器,设置全局变量,文字编码,引入包了
page指令:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
属性:
language
表示jsp翻译后是什么语言,暂时只支持java
contentType
表示jsp返回的数据类型。response.setcontentType()参数值
pageEncoding
当前jsp文件的字符集
import
和java一样,用于导包导类
session=true/false
是否在jsp页面给你获取session对象,默认是true
errorPage=" "
当页面出错时,跳转到指定jsp页面
以下属性为out输出流使用
autoFlash
buffer满后,是否自动刷新浏览器,默认是true
buffer
=none/8k/指定大小
给out对象使用的缓冲区是多大,默认8k
contentType="text/html ;charset= utf-8"和 pageEncoding="UTF-8区别
前者只能指定网页以什么形式显示页面
后者指定servlet引擎用什么方式翻译jsp,并指定网页以什么形式显示页面
include指令:
<%@ include file="文件路径" %>
该指令用于引入一个文件
- 脚本元素
声明脚本:<%! %>
可以声明类属性,类方法,内部类
java代码脚本:
<% java片段 %>
翻译后java文件中jspservice()内的代码都可以写
和表达式脚本一起用,输出数据到页面。
表达式脚本:在jsp页面上输出数据
<%=表达式 %>
表达式可以是整型,浮点型,字符串,对象,最后不要写分号
所有表达式脚本都会翻译到 jspservice()方法中
表达式脚本最后都会被翻译成为out.print()输出
jspservice()方法中的对象都可以直接使用(request,response,session)
一个小案例:
<%! int i=10; %>
out.println();
<%
int j=20;//局部变量
out.println("i="+(++i)+"j="+(++j));
%>
第一次访问结果i=11 j=21
第二次访问结果i=12 j=21
第三次访问结果i=13 j=21
- 动作元素
请求转发
<jsp:forward page=" "></jsp:forward>
<jsp:forward file= >
在开发jsp中,我们通常把jsp放入web-inf目录,可以增强安全性,设置入口,跳转进来。
<jsp:include file= “文件路径”> 和 <%@ include file=“文件路径” %>区别
前者时候动态引入,后者是静态引入,这两个常常用来解决很多页面共同的部分的内容。
静态引入把两个jsp翻译成一个servlet,动态引入把两个jsp分别翻译。
动态引入可以传递参数
<jsp:include page="">
<jsp:param value="" name=""/>
</jsp:include>
不过,现在一般使用静态包含。
jsp文件注释
- <!-内容–>
- <%–内容–%>