概述
本文包含以下内容:
1、JSP表达式 2、JSP声明 3、JSP脚本 4、JSP注释
这是first.jsp文件:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%=3.1415926 %>
<br>
<%
//这是Java注释
count = count + 1;
out.println(count);
out.println("<br>");
String info = getInfo();
out.println(info);
%>
<%!
int count = 0;
public String getInfo(){
return "这是jsp声明中定义的方法";
}
%>
<%--这是jsp注释 --%>
<!-- 这是html注释 -->
</body>
</html>
这是由first.jsp编译生成的first_jsp.java文件:
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class first_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
int count = 0;
public String getInfo(){
return "这是jsp声明中定义的方法";
}
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.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\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("\t");
out.print(3.1415926 );
out.write("\r\n");
out.write("\t<br>\r\n");
out.write("\t");
//这是Java注释
count = count + 1;
out.println(count);
out.println("<br>");
String info = getInfo();
out.println(info);
out.write('\r');
out.write('\n');
out.write(' ');
out.write('\r');
out.write('\n');
out.write(' ');
out.write("\r\n");
out.write("\t<!-- 这是html注释 -->\r\n");
out.write("</body>\r\n");
out.write("</html>");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.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);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
以下关于JSP基本语法的介绍均以以上2个文件为例。
一、JSP表达式
//Java表达式后面不能加“;”
<%=3.1415926 %>
在<%= %>中的java表达式的返回值被转换成字符串后,直接插入到JSP返回给客户端的静态页面中。
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
//......
//......
try {
//......
out.write("<body>\r\n");
//java表达式被插入_jspxService(...),作为out.print(...)方法的参数
out.print(3.1415926 );
//......
out.write("</body>\r\n");
out.write("</html>");
} catch (java.lang.Throwable t) {
//......
}
从上述代码可以看出,<%= %>中的java表达式相当于out.print(...)方法的参数(所以java表达式不能以“;”结尾)。
因为out.print(...)方法被插入了_jspxService(...)方法,所以JSP表达式也会被插入_jspxService(...)方法。
二、JSP声明
<%!
int count = 0;
public String getInfo(){
return "这是jsp声明中定义的方法";
}
%>
public final class first_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
//JSP声明被转换成Servlet类的成员变量和成员方法
int count = 0;
public String getInfo(){
return "这是jsp声明中定义的方法";
}
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
}
}
从上述代码可以看出,JSP声明将会转换成Servlet的成员变量和成员方法。
由于JSP声明语法定义的变量和方法对应于Servlet类的成员变量和成员方法,所以JSP声明部分定义的变量和方法可以使用private 、public等访问控制符修饰,也可以使用static修饰,将其变成类属性和类方法。但是不能使用abstract修饰声明部分的方法,因为抽象方法将导致JSP对应的Servlet变成抽象类,从而导致无法实例化。
三、JSP脚本
<%
//这是Java注释
count = count + 1;
out.println(count);
out.println("<br>");
String info = getInfo();
out.println(info);
%>
JSP脚本里可以包含任何可执行的java代码,这些代码必须满足java的语法规范(如每条语句必须使用“;”作为结束标记 )。
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
//... ...
try {
//... ...
out.write("<body>\r\n");
//... ...
//JSP脚本被转换成_jspxService(...)方法中的可执行代码
count = count + 1;
out.println(count);
out.println("<br>");
String info = getInfo();
out.println(info);
//... ...
out.write("</body>\r\n");
} catch (java.lang.Throwable t) {
//... ...
}
} finally {
//... ...
}
}
从上述代码可以看出,JSP脚本将转换成Servlet里_jspxService(...)方法的可执行代码。这意味着在JSP脚本部分也可以声明变量,但这些变量只是_jspxService(...)方法的局部变量,局部变量是不能用static、private、public等修饰符修饰的。
注意:
1、一个JSP页面中可以在任何位置使用<% %>插入java代码,<% %>可以有任意多个。每一个<% %>中的代码可以不完整,但是这个<% %>中的内容和JSP页面中的一个或多个<% %>中的内容组合起来必须是完整的。如下所示:
<%
for(int i = 0; i < 10; i++){
out.print(i);
%>
<br>
<%} %>
<%
int n = 10;
if(n < 10){
%>
small
<%
}else if(n < 20){
%>
middle
<%
}else{
%>
large
<%} %>
2、将一条完整的语句分成多个<% %>时,建议使用{}将属于这些语句的子句括起来。
这是因为虽然从JSP代码中看时只是一条语句,但JSP编译器在转换时可能会生成多条java代码。
比如上面的if-else if-else语句,如下所示:
int n = 10;
if(n < 10){
out.write("\r\n");
out.write("\tsmall\r\n");
out.write("\t");
}else if(n < 20){
out.write("\r\n");
out.write("\tmiddle\r\n");
out.write("\t");
}else{
out.write("\r\n");
out.write("\tlarge\r\n");
out.write("\t");
}
四、JSP注释
//JSP注释
<%-- --%>
//Java注释,该注释只能用在JSP脚本和JSP声明中
/**/
//
//HTML注释
<!-- -->
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
try {
//这是Java注释
count = count + 1;
out.println(count);
out.println("<br>");
String info = getInfo();
out.println(info);
out.write("\t<!-- 这是html注释 -->\r\n");
} catch (java.lang.Throwable t) {
} finally {
}
}
对于JSP注释,JSP编译器在处理JSP代码时,会忽略它。也就是说,JSP注释不会再由JSP生成的Servlet源代码中留下任何痕迹,该注释只是为了时JSP代码更容易理解而存在。
对于java注释,JSP编译器将java注释和java代码一同插入到由JSP生成的Servlet源代码中。
对于HTML注释,它将被当成JSP代码中的静态内容处理。JSP编译器将它们和其他JSP静态内容一起使用write方法输出到客户端。也就是说,这类注释对客户端来说是可见的。