前提:服务器必须开启,无限的等待请求。
- 运行原理
- 由客户端发起请求,当客户端浏览器输入URL以后,敲回车就是一个请求, 请求的URL里面包含ip地址和端口,浏览器通过ip地址能找到服务器,浏览器拿着用户输入的域名是不能找到服务器的,因为域名不是ip地址!浏览器会先找一个叫做DNS(域名解析服务器)的服务器找到域名对应的ip地址,然后再拿着这个ip找到真正的服务器
- 此时,已经通过URL找到了服务器了,URL里面除了有ip地址,还有端口号,默认是80。进一步通过端口找到tomcat,最后根据URL中请求的应用名字,文件名字找到具体的一个web资源
- 访问服务器端的资源时,先判断该资源是否存在,如果不存在,则服务器给浏览器发送404页面。如果找到,则再判断该jsp是不是第一次访问,或者是不是修改以后的第一次访问。如果是,则jsp引擎将jsp文件解析成一个java源文件。(这个源文件就在webapps的隔壁),然后java编译器再将这个源文件编译成字节码文件,这个字节码文件最后由jvm执行! 字节码执行的效果就是,把一连串的html代码通过out对象发送给客户端(谁请求发给谁!)
(jsp存在的意义就是为了生成java源文件,切记,服务器不会执行jsp的代码。)
其实刚才的原理中,少了一个步骤。刚才是这么说的,浏览器拿着域名先去找DNS服务器,其实不是!其实浏览器现在本地电脑上解析域名,问题来了,本地电脑是如何把域名变成ip 的呢?
针对于window系统,浏览器会先找一个文件:
C:\WINDOWS\system32\drivers\etc\host 用记事本打开,看到以下内容
在这个文件中找的见,就不去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+"  ");
}
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: 当前页面发生“运行时异常时”的跳转页面!
一旦发生运行时错误,页面跳转到index.jsp界面
isErrorPage,控制当前jsp页面是否能使用exception内置对象,我们现在接触到的内置对象是out! 为什么out能不声明就直接使用,因为服务器帮我们声明过了!
当isErrorPage取值为true时,就会生成exception内置对象在源代码中! 反之,不生成
(在D:\Tomcat6.0\work\Catalina\localhost\Frist\org\apache\jsp下查看)
contentType:这是是服务器用来告诉浏览器我发的是什么格式的数据!
思考,浏览器是不是只能打开html文件? 不是,还能打开视频,音频,图片,doc,xls,ppt都能打开
下载不同格式的文件:
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指令只有在使用标签库编程时才会用到,后续章节会详细讲解