JSP学习笔记之JSP基本语法

概述

本文包含以下内容:

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方法输出到客户端。也就是说,这类注释对客户端来说是可见的。

猜你喜欢

转载自guoying252166655.iteye.com/blog/2041870