您的位置:首页 > Web前端 > JavaScript

Jsp简介

2016-12-23 15:28 453 查看

为什么会出现JSP

我们在Servlet技术开发的时候,如果写太多的Html代码,是不是看着很头疼呢?因此就出现了Jsp技术,用Java语言(+Html语言)开发动态资源的技术。Jsp的本质就是Servlet。 Jsp的运行是交给Tomcat服务器运行的,tomcat的work目录,存放jsp运行时的临时文件。

为什么Jsp就是Servlet

//jsp被tomcat翻译为Java文件,继承HttpJSPBase类(该类继承自HttpServlet),
public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {

HttpJspBase类:

public abstract class org.apache.jasper.runtime.HttpJspBase extends javax.servlet.http.HttpServlet implements javax.servlet.jsp.HttpJspPage {


总结:Jsp本质就是Servlet。Servlet的技术可以在Jsp程序中使用,但是Jsp技术并不是全部适用于servlet程序

Jsp页面的执行过程

第一步:访问到hello.jsp页面,tomcat扫描到jsp文件,在%tomcat%/work把jsp文件翻译成java源文件(hello.jsp -> hello_jsp.java) (翻译)

第二歩: tomcat服务器把java源文件编译成class字节码文件 (编译)(hello_jsp.java -> hello_jsp.class)

第三歩: tomcat服务器构造hello_jsp类对象

第四歩: tomcat服务器调用hello_jsp类里面方法,返回内容显示到浏览器

总结:如果页面是第一访问Jsp,执行顺序为第一步,第二步,第三步,第四步。如果是第n次访问Jsp页面,则只执行第四步。

Jsp和Servlet的声明周期对比

Servlet的生命周期

构造方法(第1次访问)

init方法(第1次访问)

service方法

destroy方法

Jsp的生命周期

翻译: jsp->java文件

编译: java文件->class文件(servlet程序)

构造方法(第1次访问)

init方法(第1次访问):_jspInit()

service方法:_jspService()

destroy方法:_jspDestroy()

Jsp语法

Jsp表达式

Jsp脚本

Jsp声明

hello.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'hello.jsp' starting page</title>
</head>

<body>
<%--
Jsp脚本 :可以写Java代码
原理把脚本中java代码原封不动拷贝到_jspService方法中执行。
--%>
<%
String name="Tom";
%>

<%--
Jsp表达式: 向浏览器输出变量的值或表达式计算的结果
注意:
1)表达式的原理就是翻译成out.print(“变量” );通过该方法向浏览器写出内容
2)表达式后面不需要带分号结束。
--%>
<%=name%>

<%--
Jsp声明:声明变量或方法:变量翻译成成员变量,方法翻译成成员方法。
--%>
<%!
String hobby="play PingPong";
public String getHobby(){
return hobby;
}
%>
</body>
</html>


翻译后的hello.java

String hobby="play PingPong";
public String getHobby(){
return hobby;
}

public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
...........

String name="Tom";
........
out.print(name);
........
}


Jsp的三大指令

include指令

作用: 在当前页面用于包含其他页面
语法: <%@include file="common/header.jsp"%>
注意:
1)原理是把被包含的页面(header.jsp)的内容翻译到包含页面(index.jsp)中,合并成翻译成一                  个java源文件,再编译运行!,这种包含叫静态包含(源码包含)
2)如果使用静态包含,被包含页面中不需要出现全局的html标签了!!!(如html、head、                     body)


page指令

作用: 告诉tomcat服务器如何翻译jsp文件
<%@ page
language="java"      --告诉服务器使用什么动态语言来翻译jsp文件
import="java.util.*" --告诉服务器java文件使用什么包,导入包,多个包之间用逗号分割
pageEncoding="utf-8"  --告诉服务器使用什么编码翻译jsp文件(成java文件)
contentType="text/html; charset=utf-8" --服务器发送浏览器的数据类型和内容编码
注意:在开发工具中,以后只需要设置pageEncoding即可解决中文乱码问题
errorPage="error.jsp" --指定当前jsp页面的错误处理页面。
isErrorPage="false"   --是否是错误页面,即能否使用Exception内置对象
buffer="8kb"          --jsp页面的缓存区大小。
session="true"        --false,不能用session内置对象;true,可以使用session内置对象。
isELIgnored="false"   --是否使用El表达式
%>


全局配置错误页面

<!-- 全局错误处理页面配置 -->
<error-page>
<error-code>500</error-code>
<location>/common/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/common/404.html</location>
</error-page>


Jsp的内置对象

request HttpServletRequest

response HttpServletResponse

config ServletConfig

application ServletContext

session HttpSession

exception Throwable

page Object(this)

out JspWriter

pageContext PageContext

Out对象

out对象类型,JspWriter类,相当于带缓存的PrintWriter。PrintWriter的 wrier(内容)方法直接向浏览器写出内容。JspWriter的writer(内容)方法: 向jsp缓冲区写出内容。



当满足以下条件之一,缓冲区内容写出:

缓冲区满了

刷新缓存区

关闭缓存区

执行完毕jsp页面

pageContext对象

内置对象封装在service方法中,我们怎么在其他方法中使用这些内置对象呢?pageContext对象的类型是PageContext,叫jsp的上下文对象。

public class 01_hello_jsp {
public void _jspService(request,response){
创建内置对象
HttpSession session =....;
ServletConfig config = ....;
把8个经常使用的内置对象封装到PageContext对象中
PageContext pageContext  = 封装;
调用method1方法
method1(pageContext);
}
public void method1(PageContext pageContext){
希望使用内置对象
从PageContext对象中获取其他8个内置对象
JspWriter out =pageContext.getOut();
HttpServletRequest rquest =     pageContext.getRequest();
........
}
}


使用场景: 在自定义标签的时候,PageContext对象频繁使用到!!!

Jsp的四个域对象

ServletContext context域 只能在同一个web应用中使用。(全局的)

HttpServletRequet request域 只能在同一个请求中使用(转发)

HttpSession session域 只能在同一个会话(session对象)中使用(私有的)

PageContext page域 只能在当前jsp页面中使用(当前页面)

保存数据

1)默认情况下,保存到page域
pageContext.setAttribute("name");
2)可以向四个域对象保存数据
pageContext.setAttribute("name",域范围常量)

获取数据

1)默认情况下,从page域获取
pageContext.getAttribute("name")
2)可以从四个域中获取数据
pageContext.getAttribute("name",域范围常量)

域范围常量:

PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext..SESSION_SCOPE

3)自动在四个域中搜索数据
pageContext.findAttribute("name");
顺序: page域 -> request域 -> session域- > context域(application域)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: