一 : JSP简介
JSP
-> Java Server Page ,是建立在Servlet规范上的动态网页开发技术,在JSP文件中,HTML代码与Java代码共同存在,其中HTML
代码用来显示网页中静态内容的显示,Java代码用来实现网页中动态内容的显示. 为了与传统HTML有所区别,JSP扩展名为.jsp
二 : JSP特性
跨平台 : 由于JSP是java语言编写的,可以使用Java API,所以是跨平台的,可以应用于不同的系统中,如Windows,Linux,MacOS等,从一个平台移植到另一个平台时,
JSP
和JavaBean
的代码并不需要重写编译,因为java字节码与平台无关,一次编译,到处运行.业务代码相分离 : 在使用JSP技术开发WEB应用时,可以将界面的开发与应用程序的开发分离开.开发人员使用HTML来设计界面,使用JSP标签和脚本来动态生成页面上的内容.在服务器端,
JSP引擎
(Tomcat)负责解析JSP标签和脚本程序,生成所请求的内容,并将执行结果以HTML页面的形式返回到浏览器.组件重用 : JSP可以使用JavaBean编写业务组件,也就是使用一个JavaBean类封装业务处理代码或者作为一个数据存储模型,在JSP页面中,甚至整个项目中,都可以重复使用这个
JavaBean
,同时JavaBean也可以应用到其他的Java应用程序中预编译 : 预编译就是在用户
第一次
通过浏览器访问JSP页面时,服务器将对JSP页面代码进行编译,并且仅执行一次编译.编译好的代码将被保存,用户下一次访问时,会直接执行编译好的代码.节省了服务器的CPU资源,提升了客户端的访问速度.
二 : JSP原理
JSP
本质就是一个Servlet
,JSP的工作模式是请求/响应模式
用户在第一次访问的时候--->xxx.jsp--->xxx_jsp.java编译运行--->返回给用户看.
xxx.jsp文件被转换/翻译文件在 tomcat->work->Catalina->localhost->web项目->org->apache->jsp下
三 : JSP脚本与注释可见级别
通过上述原理可知.jsp
最终会被翻译成.java
的sevlet,所以我们写的脚本也最终会被翻译,接下来分析一下,具体会会被怎样的翻译
1. jsp脚本 :
<%java代码%> : 内部的java代码翻译到service方法的内部
<%=java变量或者表达式> : 会被翻译成service方法内部out.print()
<%!java代码%> : 会被翻译成servlet的成员的内容
测试与证明 :
在.jsp中写下如下代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="domain.*" %>
设置session
<%= 5+5
%>
<%!
int a = 10;
%>
<%
User user = new User();
user.setId(100);
user.setUsername("雪芙");
user.setPassword("123");
session.setAttribute("user", user);
%>
然后我们去对应生成的.java文件中去找一下
2. jsp注释可见级别
HTML注释 : < !--注释内容-->可见范围
jsp源码
,翻译后的servlet,页面显示html源码java注释 : //单行注释, /多行注释/ -- 可见范围jsp源码,翻译后的servlet
jsp注释 : <%--注释内容--%>---可见范围jsp源码可见
四 : jsp指令
jsp的指令是指导jsp翻译和运行的命令
-
page指令 :
属性最多的指令 (实际开发中page指令默认)
根据不同的属性,指导整个页面特性.
格式 :<%@ page 属性名1 = "属性值1" 属性名2 = "属性名2"...%>
language --- jsp脚本中可以嵌入的语言种类(事实证明sun公司想多啦,没人用,所以只有java一种)
pageEncoding ---当前jsp文件本身编码,内部可以包含contentType
contentType ---response.setContentType(text/html;charset=UTF-8)同理
session ---是否jsp在翻译时自动创建session
import ---导入java的包
errorPage---当前页面出错后跳转到哪个页面
isErrorPage---当前页面是一个处理错误的页面
-
include指令 :
页面包含(静态包含)指令, 可以将一个jsp页面包含到另一个jsp页面中
格式 : <%@ include file = "被包含的文件地址"%>
-
taglib指令
在jsp页面中引入标签库(jstl标签库,struts2标签库)
格式 : <%@ taglib uri="标签地址" prefix="前缀"%>
五 : JSP内置对象
jsp被翻译成servlet之后, service方法中有9个对象定义,并初始化完毕,我们在jsp脚本中可以直接使用这9个对象
名称 | 类型 | 描述 |
---|---|---|
out | javax.servlet.jsp.JspWriter | 用于页面输出 |
request | javax.servlet.http.HttpServletRequest | 得到用户请求信息 |
response | javax.servlet.http.HttpServletResponse | 服务器向客户端的回应信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 |
application | javax.servlet.ServletContext | 所有用户的共享信息 |
page | java.lang.Object | 指当前页面转换后的Servlet类的实例 |
pageContext | javax.servlet.jsp.PageContext | JSP的页面容器 |
exception | java.lang.Throwable | 表示JSP页面所发生的异常,在错误页中才起作用 |
out
对象 :
就是向客户端输出内容,out.write("dfdf")
out缓冲区默认8kb,可以设置成0代表关闭out缓冲区,内容直接写到response缓冲区
pageContext
对象
jsp页面的上下文对象,page对象与pageContext对象不是一个东西.
pageContext是一个域对象
setAttribute(String name,Object obj)
getAttribute(String name)
removeAttrbute(String name)
pageContext可以向指定的其他域中存取数据
pageContext.setAttribute("name", "lisi", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("name", "wangwu", PageContext.SESSION_SCOPE);
pageContext.setAttribute("name", "王八", PageContext.APPLICATION_SCOPE);
findAttribute(String name)
依次从pageContext域,request域,session域,application域中获取属性,在某个域中获取后将不在向后寻找
pageContext
可以获得其他8大隐式对象
pageContext.getRequest()
pageContext.getSession()
六 : jsp标签动作
-
请求转发
-
动态包含
七 : out缓冲区与response缓冲区
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
out顺序
雪芙雪芙雪芙
<%
out.write("思思思思思思思思思思");
response.getWriter().write("美美美美美美美美");
%>
<%="可可可可可可可可可可可可可可" %>
显示顺序 :
解析 :
Tomcat从response中读出数据,OUT缓冲区的数据最后也要放在response缓冲区,设置0代表关闭out缓冲区,内容直接写到response缓冲区
八 : 静态与动态包含
静态包含
: 当前页面和被包含页面合并后产生一个servlet源码
动态包含
: 当前页面和被包含页面,分别产生servlet源码和字节码,运行时,tomcat进行合并输出
九 : 四大作用域范围
page
域:当前jsp页面范围
reques
t域:一次请求
session
域:一次会话
application
域:整个web应用