概述
本文包含以下内容:
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方法输出到客户端。也就是说,这类注释对客户端来说是可见的。