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;
 %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>My JSP 'index.jsp' starting page</title>
	<!--
	这是html注释
	-->
	
	<%--
	这是JSP注释
	 --%>
  </head>
  <%
  	int j = 2;
   %>
  <body>
    Test JSP Page<br>
  </body>
  <%
  	System.out.println(i/j);
   %>
</html>

上面插入了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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
      out.write("<html>\r\n");
      out.write("  <head>\r\n");
      out.write("    \r\n");
      out.write("    <title>My JSP 'index.jsp' starting page</title>\r\n");
      out.write("\t<!--\r\n");
      out.write("\t这是html注释\r\n");
      out.write("\t-->\r\n");
      out.write("\t\r\n");
      out.write("\t");
      out.write("\r\n");
      out.write("  </head>\r\n");
      out.write("  ");

  	int j = 2;
   
      out.write("\r\n");
      out.write("  <body>\r\n");
      out.write("    Test JSP Page<br>\r\n");
      out.write("  </body>\r\n");
      out.write("  ");

  	System.out.println(i/j);
   
      out.write("\r\n");
      out.write("</html>\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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值