呵呵呵5596

导航

JSP的语法

Jsp技术:
jsp和servlet一样都是来开发动态资源的。jsp就是HTML和java代码混合开发的一种技术。
1、如何开发jsp技术
创建.jsp页面即可。在页面里面定义java脚本即可。
<%
java代码
%>

2、jsp代码是如何运行的?
index.jsp 翻译成 index_jsp.java 源文件
将index_jsp.java 编译成index_jsp.class字节码文件。
jsp文件的执行流程:
(1、定义jsp
(2、翻译jsp文件 .jsp --> .java
(3、编译 .java --> .class
(4、构造对象
(5、通过构造函数初始化的对象去调用里面的方法
第一次调用: 1 2 3 4 5
第2 n次调用 5
jsp里面的代码发生了变化。1 2 3 4 5

3、结论:jsp就是servlet?(面试题)
打开翻译过后的jsp的java源文件。我们的源文件继承了HttpJspBase。
这个HttpJspBase在哪?在tomcat的lib目录下面的jasper.jar里面。我们解压这个jar包,这个包里面有一个HttpJspBase.class这个文件。
这个类:HttpJspBase extends HttpServlet。
所以我们认为:我们定义的jsp文件间接的继承了HttpServlet.所以我们说jsp就是servlet。

4、jsp语法:
jsp模板 <%=%> 输出一些数据 可以定义变量或者运算表达式
<%=1+4%> <%=name%>
jsp脚本 <%%>
<%
java代码
%>
jsp声明 <%!%>
<%!
声明变量或者方法
%>
注意: jsp模板、jsp脚本里面的java代码经过翻译之后,都定义在了jsp的service方法里面。
jsp声明,里面定义的变量或者方法,翻译之后,变量是成员变量(方法的外部,类的内部)。方法是成员方法

5、jsp指令:

<%@ %>

5.1 include指令 <%@ include file = "header.jsp"%>
在一个页面里面包含另外的页面。这是一种静态包含。
静态包含:将被包含的页面和主页面合并在一起翻译。
5.2 page指令 <%@ page %>
contentType:描述服务器向浏览器发送的数据格式类型 text/html
language: java 告诉服务器翻译jsp文件使用哪种语言翻译
import:导包
errorPage:当页面出现错误之后,为了不让这些错误直接抛给用户。我们可以定义一个错误页面。当jsp页面出现错误时,
将自动跳转到错误处理页面。
第一步:定义一个错误处理页面。
第二步:使用errorPage属性,引入错误处理页面。
<%@ page errorPage="common/error.jsp"%>
我们也可以全局配置错误处理页面。通过错误代码定义错误处理页面。
第一步:定义错误处理页面 404.jsp 500.jsp 403.jsp
第二步:在web.xml里面配置全局错误处理页面。

404
/error/404.jsp


1、jsp内置对象
我们经常会频繁使用的对象,为了我们很方便的使用这些对象,jsp提前帮我们初始化好了。
如何初始化的?
我们的jsp文件翻译成.java的源文件之后,在这个源文件的_jspService方法的内部,首先就是初始化这些对象。
2、9大内置对象:
pageContext 作用域 作用范围只能是当前的jsp页面 PageContext
request 请求对象,作用域,作用范围是当前的request请求 HttpServletRequest
response 响应对象 HttpServletResponse
application 域对象,作用范围最大,作用范围是当前的整个web应用。 ServletContext
session 会话对象 域对象 作用范围是当前的会话。 HttpSession
exception 异常对象,我们可以通过这个内置对象获取出现错误页面的异常信息 exception.getMessage(); Throwable
page 对当前jsp对象的描述 Page
out 输出对象,可以通过这个对象向页面输出一些内容 JspWriter
config 配置对象 ServletConfig
需要注意的是: 这些内置对象,是在_jspService方法中创建的。我们不能再jsp声明里面去直接使用这些对象。因为这些对象是
_jspService的局部变量。
如果想要在jsp声明里面去使用这些对象。那么我们可以通过PageContext对象去获取。
为什么?我们观察源码发现,其他的八大内置对象都是通过PageContext对象创建的。
<%!
public void testObject(PageContext pageContext){
Exception e = pageContext.getException();
......
}
%>
3、PageContext对象
3.1 基本使用
是一个域对象,作用范围只能是当前的jsp页面。
pageContext.setAttribute(String name,Object value); //向域对象里面存储数据
Object o = pageContext.getAttribute(String name);//从域对象取数据 默认是从自己的域对象里面取数据
如果我们在不同的域对象里面存储了名字相同的数据,我们也可以通过pageContext域对象去取别的域里面的数据
pageContext.getAttribute("name",pageContext.REQUEST_SCOPE);//pageContext在request作用域里面取数据
pageContext.getAttribute("name",pageContext.SESSION_SCOPE);//pageContext在session作用域里面取数据
pageContext.getAttribute("name",pageContext.APPLICATION_SCOPE);//pageContext在application作用域里面取数据
3.2 域对象还可以存储不同类型的数据
对象,数组,集合
pageContext.setAttribute("user",user);
3.3 可以el表达式去取数据(目的是尽量减少使用java脚本)。
el表达式的语法:\({参数名} el表达式可以取数据,也可以进行运算。 运算: \){1+1}
\({10>0} \){(10<9)?true:false}
\({str==null} \){str==""}
\({str eq null} \){empty str}
取值
\({name} 取基本类型的数据包括String \){user.username} ${user.age} \({user.address} 取对象里面的数据 \){arr[0].username} ${arr[0].age} \({arr[0].address} 取数组或单列集合里面的数据 \){map['key1'].username} ${map['key1'].age} ${map['key1'].address}
4 Jsp内置标签
jsp:forward 转发标签 我们可以在这个标签内部定义参数
<jsp:forward page="test04.jsp">
<jsp:param name = "aaa" value="aaa"></jsp:param>
<jsp:param name = "bbb" value="bbb"></jsp:param>
</jsp:forward>
如何获取这个参数
<%
String value = request.getParameter("aaa");
%>
jsp:include 包含标签 在一个页面的内部包含另外一个页面。 它的功能和include的指令的功能是一样的。
<jsp:include page="common.jsp">

</jsp:include>
jsp:include和<%@include file=""%>指令的区别:
相似点: 都是在一个页面里面包含另外一个页面。
不同点:1、include指令是静态包含。就是将被包含的页面和主页面合并在一起翻译。翻译之后只有1个java源文件。
include标签是动态包含。就是在翻译的时候,将主页面和被包含的页面分类独立翻译。最后有两个java源文件。在运行的时候,再
将这个两个源文件合并在一起。
2、include指令不能传递参数的。include标签是可以传递参数的。
<jsp:include page="common.jsp">
<jsp:param name = "" value=""></jsp:param>
</jsp:include>

posted on 2021-11-23 19:19  呵呵呵5596  阅读(83)  评论(0编辑  收藏  举报