什么是JSP?
JSP(Java Server Pages)是一种动态网页技术标准,JSP技术是以JAVA语言作为脚本语言,用于可支持跨平台的Java Web动态网页技术。在传统的HTML文件*.htm,.html 中加入Java程序片段(Scriptlet)和JSP标记(tag),就构成了JSP网页(.jsp)
JSP网页中的程序片段可以
- 操作数据库
- 重新定向网页
- 发生Email
- …
以一个实际JSP页面为例
Hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP</title>
</head>
<body>
<p>这是我们第一个JSP程序</p>
<%
String name="Jason";
%>
<br>
<p>HELLO,<%=name%></p>
</body>
</html>
- 会发现上面JSP页面程序与HTML语言相比,多了
<%String name="Jason";%>
这样的代码,那其实,一个JSP文件就是在传统的HTML文件中加入了以"<%“和”>"包含的Java程序片段形成的以jsp为后缀的文件,即 <%Java程序片段%>
JSP运行原理
- 当服务器上的一个JSP页面第一次被请求执行是,服务器上的Web容器首先将JSP页面转译成一个Java文件
- 再将这个Java文件编译生成字节码文件,然后通过执行字节码文件响应客户的请求
- 当这个JSP页面再次被请求执行时,Web容器将直接执行这个字节码文件来响应客户
JSP基本结构
JSP甚至还可以这样
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP</title>
</head>
<body>
<%
String a="Welcome";
%>
<br>
<p>HELLO,<%=a%></p>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP</title>
</head>
<body>
<%
String b="Jason";
%>
<%=b%>
</body>
</html>
- 一个JSP页面通常可以由HTML代码,变量和方法的声明,Java程序片段,表达式,JSP的注释,JSP指令标记,JSP动作标记等元素组成。但这些元素不一定都是必需的,像上图的例子,它包含了:HTML代码,JSP指令标记,变量的声明
变量和方法的声明
声明变量
JSP声明变量的基本格式:<%!声明变量的代码%>
<%!开始,%>结束,例如
<%!
int x=100;
String y="声明变量";
Date date;
%>
- 变量必须以分号 ; 结尾
- 变量作用范围是整个JSP页面,同时它只在一个JSP页面有效
**
声明方法
JSP声明方法的基本格式:<%!声明方法的代码%> 其实和声明变量的格式一样
<%!
String sayHello(){
return "Hello my dear friends";
}
%>
<%=sayHello()%>
声明类
格式同上
<%!
public class Friend{
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
%>
<%
Friend tom=new Friend();
tom.setName("Tom");
tom.setSex("boy");
%>
<br>
<%=tom.getName()+" is a "+tom.getSex()%>
Java程序片段
上面说过了 <%Java程序片段%>,Java程序片段是实现页面动态化的基础,上面例子很多了,用来输出的全部都是用程序片段输出的
表达式
格式:<%=表达式%>
表达式可以是任何JAVA语言的完整表达式,该表达式结果在JSP程序请求处理阶段会自动转化为字符串然后插到该表达式在JSP文件的位置
<%!
int a1=3;
int b1=3;
%>
<P>两数之和等于:<%=a1+b1%>
<P>两数之差等于:<%=a1-b1%>
<P>两数之积等于:<%=a1*b1%>
JSP注释
HTML注释
- HTML注释被叫做显示注释,注释部分不会被编译,表达式部分会被服务器编译执行,然后将结构发到客户端
格式:<!--注释(comment)[<%=表达式(expression)%>]-->
<!--当前时间为:<%=(new java.util.Date().toInstant())%>-->
在结果显示界面右击查看源文件 可以看到注释中的表达式被编译执行了
JSP注释
- JSP注释被叫做隐藏注释
格式:<%–注释(comment)[<%=表达式%>]–%>
<!--显示注释 当前时间为:<%=(new java.util.Date().toInstant())%>-->
<%--隐藏注释 当前时间为:<%=(new java.util.Date().toInstant())%>--%>
隐藏注释被隐藏了
page指令
基本格式:<%@page 的属性%>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
错误页的设置
- 当一个页面出错后,会自动跳转到一个页面上进行错误信息的提示,实现这个操作可以通过错误页来指定
错误页设置
- 指定错误出现时的跳转页
- 错误处理页必须有明确的标识,通过isErrorPage属性指定(true)
show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp"%>
<%--一旦出现错误跳转到error.jsp--%>
<html>
<head>
<title>Page指令</title>
</head>
<body>
<%!
int result=10/0;
%>
</body>
</html>
error.jsp
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>抱歉程序有错误 我们会尽快修复,这是跳转的errorPage</h1>
</body>
</html>
- 注意的是这里页面内容变了但地址栏还是 show.jsp,这样的跳转叫服务器端跳转。
- 与之对应的是客户端跳转,页面内容和地址栏都会变
- 以上错误页是在每一个JSP页面中指定的,当然也可以在整个虚拟目录中指定全局的错误处理,要想达到这个效果(全局),就要修改web.xml文件,在其中加入错误页操作
- 全局的错误处理主要两种错误,HTTP代码错误,404,500;或者是异常错误,NullPointerException,空指针异常等
-
在web.xml中加入
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
这行代码,即使show.jsp中没有指示errorPage 也可以跳转,亲测有效
包含指令
静态包含指令
格式:<%@ include file=filename%>
- 静态包含是指这个被包含的文件将被插入到JSP文件中<%@ include%>所在的地方,然后由JSP统一编译
jsp_demo.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%String a="baby";%>
<%=a%>
<%@ include file="jsp_demo_include.jsp"%>
</body>
</html>
jsp_demo_include.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String b="I like you";
%>
<%=b%>
</body>
</html>
动态包含指令
格式:<jsp:include page=filename flush=true|false/>或
<jsp:include page=filename flush=true|false>
</jsp:include>
<jsp:include>
动作标签的作用是让当前jsp页面动态地包含一个文件,即jsp页面运行时才将包含的文件加入;- 静态包含与动态包含的区别
- 静态包含:是指这个被包含的文件被插入到JSP文件中<%@include%>所在的地方,然后由JSP统一编译执行,
- 动态包含:在JSP编译JSP页面时,并不把JSP页面中包含的文件合并到JSP页面上来,而是由JSP容器单独编译执行这个文件,然后将执行结果包含到JSP页面,page用来指定包含文件,flush指示在读入包含文件之前是否清空现有的缓冲区
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%String a="baby";%>
<%=a%>
<p>静态包含</p>
<%@ include file="jsp_demo_include.jsp"%>
<br>
<p>动态包含</p>
<jsp:include page="jsp_demo_include.jsp" flush="true"></jsp:include>
</body>
</html>
跳转指令
格式:<jsp:forward page=url|“表达式”/>或
<jsp:forward page=url|“表达式”><jsp:param name=paramName value=paramValue>…</jsp:forward>
<jsp:forward>
动作标签的作用是根据客户端请求从一个JSP文件转发到另外一个文件,该文件可以是JSP,Servlet 或者静态资源文件。<jsp:param name=paramName value=paramValue>
name指定传递的参数名,value指定参数值。参数可以是一个或多个,这时候目标必须是动态文件。
动态传参说没有getParameter()方法 ,静态是可以的