欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JSP002:JSP的运行原理,脚本元素,三大指令

程序员文章站 2022-04-25 16:51:09
...

前提:服务器必须开启,无限的等待请求。

  • 运行原理
  • 由客户端发起请求,当客户端浏览器输入URL以后,敲回车就是一个请求, 请求的URL里面包含ip地址和端口,浏览器通过ip地址能找到服务器,浏览器拿着用户输入的域名是不能找到服务器的,因为域名不是ip地址!浏览器会先找一个叫做DNS(域名解析服务器)的服务器找到域名对应的ip地址,然后再拿着这个ip找到真正的服务器
    JSP002:JSP的运行原理,脚本元素,三大指令
  • 此时,已经通过URL找到了服务器了,URL里面除了有ip地址,还有端口号,默认是80。进一步通过端口找到tomcat,最后根据URL中请求的应用名字,文件名字找到具体的一个web资源
  • 访问服务器端的资源时,先判断该资源是否存在,如果不存在,则服务器给浏览器发送404页面。如果找到,则再判断该jsp是不是第一次访问,或者是不是修改以后的第一次访问。如果是,则jsp引擎将jsp文件解析成一个java源文件。(这个源文件就在webapps的隔壁),然后java编译器再将这个源文件编译成字节码文件,这个字节码文件最后由jvm执行! 字节码执行的效果就是,把一连串的html代码通过out对象发送给客户端(谁请求发给谁!)
    (jsp存在的意义就是为了生成java源文件,切记,服务器不会执行jsp的代码。)
    JSP002:JSP的运行原理,脚本元素,三大指令
    其实刚才的原理中,少了一个步骤。刚才是这么说的,浏览器拿着域名先去找DNS服务器,其实不是!其实浏览器现在本地电脑上解析域名,问题来了,本地电脑是如何把域名变成ip 的呢?
    针对于window系统,浏览器会先找一个文件:
    C:\WINDOWS\system32\drivers\etc\host 用记事本打开,看到以下内容
    JSP002:JSP的运行原理,脚本元素,三大指令
    在这个文件中找的见,就不去DNS导致,真正的网页无法访问!
  • JSP基本语法:
    Jsp有3种元素。
    1.脚本元素
    (1)<% %> <%! %> <%= %> <%-- --%>
    2.指令元素
    3.动作元素
  • 脚本元素
  • <% %>这对符号之间是可以直接书写java代码的,中书写的java代码是存在于方法中的,所以方法中能写啥,这就能写啥,方法中不能写啥,这就不能写啥!
    案例:页面上写九九乘法表
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE >
<html>
  <head>
  </head>
  <body>
     <%
     for(int i=1;i<=9;i++){
        for(int j=1;j<=i;j++){
        out.print(j+"*"+i+"="+i*j+"&nbsp;&nbsp");
        }
        out.println("<br/>");
     }
      %>
  </body>
</html>

  • <%! %> 这里定义的内容出现在方法外,但是还在类里面! 所以 类里面能写啥,这就能写啥,类里面不能写啥,这就不能写啥!
  <%!
      private int a;//属性
      public void f1(){ //方法
      }
      { //代码块
      }
      static {//静态代码块
      }
      public f1(){ //构造器
      }
      class A{//内部类
      }
      %>
  • <%= %> 其实就是一个输出语句, =后面跟的就是print方法的参数。所以,参数能写什么,这里就能写什么,参数不能写什么,这就不能写什么!
  <%="大家好" %>
  • <%-- --%> 这是jsp注释
    注意:<%-- --%>所写的注释,并不会出现在生成的java源文件中,这个jsp注释会被jsp引擎(catalina)忽略!所以它连作为java源代码的注释的资格都没有!
    这句注释不会
<%="大家好" %>
     <%-- 这是注释 --%>

直接在 <% %>写的java源代码级别的注释,是会出现在生成的java源文件中的!

     <%out.print("大家好"); //大家好 %>
 注意:<!-- -->服务器解释不了,它根本不是java语言里的东西,这是html,
 凡是html的内容,都会发送给浏览器去解释!
 所以客户端的源代码中,能看到<!-- -->

小总结: < !-- -->是客户端注释,客户端的源代码能看到!
<%-- --%>和 // 和 /* */ 是服务器端注释。客户端源代码中看不到!

每次客户端请求一个jsp资源时,其实是一个服务器端的对象(这个对象是服务器创建好的,程序员不用管!),在调用_jspService方法,在方法里面,通过out把数据从服务器端发给了客户端!如果是第一次请求一个jsp,则服务器会创建一个对象,对象调用方法进行响应。
那么第二次又有一个客户端访问同一个jsp,则使用的就是第一次访问jsp时生成的那个对象!所以说,这是单例模式!

由此,我们可以统计 页面访问次数

 <%! int count; %>
 您是第   <%=++count%>个访问者" 

这个例子证明了,这是单例模式,属性并不是static,而属性值却被各个客户端共享!

  • 下面我们实现一个ip地址,只能算一个访问量!
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE >
<html>
  <head>
  </head>
  <body>
  <%!
  Set set=new HashSet(); %>
  <%
  //获取客户端IP地址,谁请求这个jsp,就获取谁的IP
  String ip=request.getRemoteAddr();
  set.add(ip);
   %>
   你是第<%=set.size() %>个访客
  </body>
</html>

  • 指令元素有3种:

这些指令元素是针对JSP引擎的,并不会产生任何看得见的输出
指令元素包含在<%@ %>里,两个主要的指令是page与include,taglib在使用标签库编程的时候才使用

page指令
Include指令
taglib指令

  • Page: 首先一个jsp文件可以没有任何一个page指令元素,如果有,也可以用多个!
    下面学习page指令元素的属性:
    Language:表明当前jsp所使用的脚本语言,目前只能是java
    Import :用于引入资源(导包)
    注意,一个page可以分写成多个,多个page也能合成一个!

isThreadSafe:如果为true,则支持并发
<%@ page isThreadSafe=“true|false” %>
默认值为true
isThreadSafe=false模式表示它是以Singleton模式运行。
该模式implements了接口SingleThreadMode,
该模式同一时刻只有一个实例,不会出现信息同步与否的概念。
若多个用户同时访问一个这种模式的页面,
那么先访问者完全执行完该页面后,后访问者才开始执行。
isThreadSafe=true模式表示它以多线程方式运行

<%@ page isThreadSafe="true|false" %>

errorPage: 当前页面发生“运行时异常时”的跳转页面!
JSP002:JSP的运行原理,脚本元素,三大指令
一旦发生运行时错误,页面跳转到index.jsp界面
JSP002:JSP的运行原理,脚本元素,三大指令

isErrorPage,控制当前jsp页面是否能使用exception内置对象,我们现在接触到的内置对象是out! 为什么out能不声明就直接使用,因为服务器帮我们声明过了!
当isErrorPage取值为true时,就会生成exception内置对象在源代码中! 反之,不生成
(在D:\Tomcat6.0\work\Catalina\localhost\Frist\org\apache\jsp下查看)

contentType:这是是服务器用来告诉浏览器我发的是什么格式的数据!

思考,浏览器是不是只能打开html文件? 不是,还能打开视频,音频,图片,doc,xls,ppt都能打开
JSP002:JSP的运行原理,脚本元素,三大指令
JSP002:JSP的运行原理,脚本元素,三大指令
下载不同格式的文件:
JSP002:JSP的运行原理,脚本元素,三大指令
include指令元素:
静态包含,这种包含的特点是,先包含,后编译!
先把三个jsp的源代码合并为一个,然后再生成java源文件,所以源文件只有一个,而字节码也只有一个!

include指令用于在JSP页面中包含另外一个文件的内容
<%@ include file=“URL” %>
include指令只有一个属性:file。
include指令将会在JSP编译时插入被包含文件的内容,被包含的文件内容常常是代码片段。
include包含过程是静态的.也就是静态包含

<%@ include file="header.jsp" %>
正文:
大家好,我是偶像练习生,喜欢唱跳rap篮球
<%@ include file="footer.jsp" %>

taglib指令:
taglib指令是能够让用户使用自定义新的标签
taglib指令只有在使用标签库编程时才会用到,后续章节会详细讲解

相关标签: web编程