一、JSP模板元素
JSP页面中的HTML内容就是模板元素。
二、JSP表达式
用于将程序数据输出到客户端。
语法格式: <%=变量或表达式%> ,如:显示当前时间<%=new java.util.Date() %>
三、JSP脚本片段
1、用于在JSP页面中嵌入多行JAVA代码。
<%
多行java代码
%>
注意:脚本片段中只能写java代码,不能出现其他模板元素。
2、一个JSP页面中可以有多个脚本片段,在两个或多个脚本片段之间可以嵌入文本、HTML标记或者其他JSP元素。
<%
int x=10;
out.print(x);
%>
<p>大家好</p>
<%
int y =20;
out.print(y);
%>
3、多个脚本片段中的java代码可以互相访问,犹如将所有代码放进一个脚本片段一样。
4、单个脚本片段中的java代码可以不完整,但是,多个脚本片段组合后的java代码应该是完整的。
<%
for(int i=0;i<10;i++)
{
%>
<H1>www.baidu.com</H1>
<%
}
%>
四、jsp声明
1、如下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 '3.jsp' starting page</title>
</head>
<body>
<%
public void run(){}
%>
</body>
</html>
不行的。因为<% 、%>中间的内容会被服务器放到一个servlet的service方法中去。而一个方法中不能嵌套定义方法。
写一个jsp如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My First JSP page</title>
</head>
<body>
<br>当前时间是为:
<%
Date date = new Date();
out.write(date.toLocaleString());
%>
</body>
</html>
查看服务器把它转换成的servlet(D:\arron\Tomcat6.0\work\Catalina\localhost\day08\org\apache\jsp下的_1_jsp.java)
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
public final class _1_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
private static java.util.List _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.AnnotationProcessor _jsp_annotationprocessor;
public Object getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
}
public void _jspDestroy() {
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
out.write("<html>\r\n");
out.write(" <head> \r\n");
out.write(" <title>My First JSP page</title>\r\n");
out.write(" </head>\r\n");
out.write(" \r\n");
out.write(" <body> \r\n");
out.write("\t<br>当前时间是为: \r\n");
out.write(" ");
Date date = new Date();
out.write(date.toLocaleString());
out.write("\r\n");
out.write(" \r\n");
out.write(" </body>\r\n");
out.write("</html>\r\n");
out.write("\r\n");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
看看public void _jspService(HttpServletRequest request, HttpServletResponse response)
方法中有:
out.write("\t<br>当前时间是为: \r\n");
out.write(" ");
Date date = new Date();
out.write(date.toLocaleString());
2、JSP页面中编写的所有代码默认会翻译到servlet的service方法中去,
但是,jsp声明中的java代码会被翻译到servlet的service方法外面去。
所以,如果声明中定义了一个和转换成的servlet中的某个方法同名的话,就会覆盖那个方法。
语法如下:
<%!
java代码
%>
所以,jsp声明可以用于定义jsp页面转换成的servlet程序的静态代码块、成员变量和方法。
多个静态代码块、变量和方法可以在一个jsp中声明,也可以在多个jsp中声明。
jsp中的隐式对象只左右在service方法中,所以,jsp声明中不能使用这些隐式对象。
对于1、 中的代码,改变如下即可:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP '3.jsp' starting page</title>
</head>
<body>
<%!
public void run(){}
%>
</body>
</html>
打开转换成的servlet(D:\arron\Tomcat6.0\work\Catalina\localhost\day08\org\apache\jsp下的_3_jsp.java)
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
public final class _3_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
public void run(){}
private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
private static java.util.List _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.AnnotationProcessor _jsp_annotationprocessor;
public Object getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
}
public void _jspDestroy() {
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
out.write("<html>\r\n");
out.write(" <head>\r\n");
out.write(" <title>My JSP '3.jsp' starting page</title>\r\n");
out.write(" </head>\r\n");
out.write(" \r\n");
out.write(" <body>\r\n");
out.write("\t\r\n");
out.write("\t");
out.write("\r\n");
out.write(" </body>\r\n");
out.write("</html>\r\n");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
我们发现了一个run方法在service方法外面。
五、JSP注释
1、jsp注释:<%-- --%>
2、html注释:<!-- -->
写一个4.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 '4.jsp' starting page</title>
</head>
<body>
//jsp注释
<%-- aaa --%>
//html注释
<!-- bbb -->
</body>
</html>
输出://jsp注释 //html注释
查看网页源代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP '4.jsp' starting page</title>
</head>
<body>
//jsp注释
//html注释
<!-- bbb -->
</body>
</html>
可以发现HTML注释被直接输出了。
所以以后jsp的注释不要用html的,否则会产生额外的数据,增加网站负担。
六、JSP指令
Jsp指令是为Jsp引擎设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理Jsp页面中的其余部分。在Jsp2.0规范中共定义了三个指令: page指令 、 include指令、 taglib指令
1、page指令:
<% @page
[language="java" ]
[extends= "package.class"] // 翻译成的servlet继承什么
[import="java.util.Date,java.sql.*"] //导入包;默认导入 java.lang.*; java.servlet.*; java.servlet.jsp; 等等 可以导入多个包,用逗号隔开
[session="true/false"] 当置为true时, 转换成的servlet中 会多出一行代码 HttpSession session = null;
[buffer="none| 8kb | sizekb "] //缓冲, out写数据到浏览器,不是直接写,而是先写到缓冲区,在flush就可以写入。
[autoFlush="true"]
[isThreadSafe=" true/false"] // JSP是否线程安全, 注意false为安全。
[info="text"]
[errorPage=" relative_url "] // JSP错误处理界面
[isErrorPage="true|false"] //是不是错误页面
[ contentType="text/html; charset=ISO-8859-1"]
[ isELIgnored="false|ture"] // 默认false, 就是不忽略EL表达式
>
2、当jsp页面中代码出现异常时候,会产生无法访问的不好看的页面
如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"
session="true" isThreadSafe="false"
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP page</title>
</head>
<body>What is dota functioning? Dota as you like !<br>
<%
if(true){
int x=100/0;
}
%>
</body>
</html>
输入http://localhost:8088/day08/5.jsp
结果为:
为此,我们要在页面中加入错误处理页面,让用户有更好的体验。如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"
session="true" isThreadSafe="false"
errorPage="/errors/error.jsp"
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP page</title>
</head>
<body>What is dota functioning? Dota as you like !<br>
<%
if(true){
int x=100/0;
}
%>
</body>
</html>
error.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 'error.jsp' starting page</title>
</head>
<body>
对不起,出错了!!!
</body>
</html>
当我们访问http://localhost:8088/day08/5.jsp时,因为,100/0会出错,所以会跳到页面。
结果为: 对不起,出错了!!!
3、在web.xml中配置错误页面,对整个web应用都起作用。
web.xml中添加:
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/errors/error.jsp</location>
</error-page>
这样整个web应用中出现java.lang.ArithmeticException的话,都会跳转到errror.jsp页面。
4、如果在浏览器中输入http://localhost:8088/day08/hjkhjkhkhjkdhfkdsagfkdafgaksdhfads,即乱输入的情况下,浏览器会报出 404错误
在web.xml中添加
<error-page>
<error-code>404</error-code>
<location>/errors/404.jsp</location>
</error-page>
编写404.jsp(主要内容要多点,不然不跳转。)
再在浏览器中输入http://localhost:8088/day08/hjkhjkhkhjkdhfkdsagfkdafgaksdhfads
跳转到404.jsp
5、jsp九大隐式对象
先写个jsp如下(会有错误,跳到错误页面)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"
session="true" isThreadSafe="false"
errorPage="/errors/error.jsp"
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP page</title>
</head>
<body>What is dota functioning? Dota as you like !<br>
<%
if(true){
int x=100/0;
}
%>
</body>
</html>
错误页面如下, 记住要设置 session="true" isErrorPage="true",不然隐式对象看不全。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"
session="true"
isErrorPage="true"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'error.jsp' starting page</title>
</head>
<body>
对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
</body>
</html>
打开转换成的servlet,其核心代码如下:
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
PageContext pageContext = null;
HttpSession session = null;
Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
我们可以从中找到九大隐式对象:
request 、 response、 pageContext 、session 、exception、 application 、config 、out 、page
七、JSP标签
Jsp标签也称为Jsp Action元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写Java代码,造成Jsp页面难以维护。
八、JSP内置对象
九、查找JSP页面错误的方法