JSP学习-第一节-JSP基础

 JSP(java server page )是运行子啊服务器端的页面,是动态网页。是在静态html基础上插入java代码和JSP标签形成的一种文件。JSP是跨平台的。
 JSP本质是Servlet,但是JSP只用于页面展示,不参与业务逻辑处理,。JSP由于继承servlet,也是单例多线程的。
 当客户端第一次访问jsp页面时,Tomcat有一个内置的jsp翻译器,将jsp先翻译成servlet的.Java文件,然后再将其编译为.class文件。(所以第一次加载jsp页面时会速度较慢)
 编译完的文件在workspace中存储在apache-tomcat\work\Catalina\localhost\JSPProject\org\apache\jsp中
 jsp的注释有2种.一种为HTML注释,用表示.
 另一种为jsp注释,用<%--   --%>表示.
 区别为:html注释会在编译为java文件时保留,在客户端页面也可以看到html注释.
 而jsp注释会在编译时被忽略.
 所以:需要在客户端页面上可以看到的用HTML注释
 
 不希望客户看到的注释需要使用jsp注释.
 JSP中,可以插入Java代码块,使用<%     %> 标识. JSP编译为Servlet时,会将标识符之间的代码完全写进生成Servlet文件的Service方法中,直接以代码形式出现.而标识符之外的HTML代码会以字符串形式输出.
 举例:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%
	int i = 25;
 %>


  
    
    My JSP 'index.jsp' starting page
	
	
	<%--
	这是JSP注释
	 --%>
  
  <%
  	int j = 2;
   %>
  
    Test JSP Page
<% System.out.println(i/j); %>

上面插入了JSP注释和HTML注释各一段,Java代码3段(且再不同位置),然后编译完成的java为:
 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');
      out.write('\n');

	int i = 25;
 
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("  \r\n");
      out.write("    \r\n");
      out.write("    My JSP 'index.jsp' starting page\r\n");
      out.write("\t\r\n");
      out.write("\t\r\n");
      out.write("\t");
      out.write("\r\n");
      out.write("  \r\n");
      out.write("  ");

  	int j = 2;
   
      out.write("\r\n");
      out.write("  \r\n");
      out.write("    Test JSP Page
\r\n"); out.write(" \r\n"); out.write(" "); System.out.println(i/j); out.write("\r\n"); out.write("\r\n"); } 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); } }
对照上面结果可知,编译完成时,html注释会留下,但是JSP注释会被忽略.
并且,JSP页面中Java块里的Java语句,被直接写入Service方法中了.其他不在Java代码块中的代码会被视为字符串进行输出.

所以,各个代码块之间间隔的的其他html代码或注释对java代码毫无影响.(在代码块中可以写java注释...而且会被编译进Java文件中)

所以JSP页面中Java块里代码,可以理解成:整个页面只有Java块中代码会被编译到Servlet的Service方法中.
由于代码全部在方法中,所以应该注意如下问题:
1.每段Java代码必须有";"结尾,否则直接报错.
2.声明变量不可以加权限修饰符,因为都是方法中的局部变量.
3.代码块中不能再添加方法,因为编译后的代码本身就在一个Service方法中,不能再再方法中另写方法.
4.不能定义静态的语句块或变量,因为静态块在生成类时就已经生成,但是此时方法还未调用.明显矛盾
   此外,JSP中还有声明语句块,用<%!   %>标识,比java代码块多了个叹号,这个编译的时候不会编译进Service方法,而是会被编译到
这个页面对应类的下面.此时块中声明的变量就是这个页面类的成员变量,也可以使用权限修饰符了.也可以在此中添加方法并被以后的Java语句块中调用.甚至可以使用静态语句块.

但是!此时由于在单例多线程的servlet中如果添加静态块的话,会产生线程安全问题,需要谨慎使用!尽量不要使用!
JSP中有表达式块:
 用<%=   %>表达式块中可以直接写Java代码块中有变量.会直接将该变量输出在页面上.表达式块中变量不需要加";"结尾.
编译时会将代码块中变量直接输出在标准输出流中.
 如:
Java块:<%    int number = 100;%>
JSP表达式块:<%=  number %>
编译后:
out.print("number");

结果会直接在页面上输出100.

你可能感兴趣的:(JSP学习-第一节-JSP基础)