补充:
servlet类产生的实例对像都是单例的,所以在servlet类中定义的成员变量如 int i=0;如果在doGet()方法中有i++
当我们每访问一次servlet时这个就要加1;此时如果把i定义成局部变量,如在doGet(int i=0;++i)此时每次访问也是1.
jsp工作原理
翻译阶段先把jsp翻译成servlet类
在这过程中当容器接受到客户端第一次jsp页面请求时,他会判断这个jsp页面是否存在,若不存在则返回404错误,若存在则翻译成servlet。
编译阶段servlet类编译成.class文件
将翻译成的servlet源文件编译成一个字节码文件,然后由容器将其装载进虚拟机并实例化
执行阶段
调用翻译后的Servlet的对应的init()、service ()、destroy()
补充:
1) 如果被请求的jsp源文件内容发生变化,
那么要重新将jsp翻译成Servlet,再编译、
装载和实例化,最后运行Servlet。
2) 如果第二次请求jsp时,
此时若被请求的jsp已经有对应的Servlet实例,
那么就直接运行该Servlet。
<%! javacode%>会放在转化成的servlet类的成员方法或变量
<%javacode%>会放在转化成的servlet类的service()方法里面
<%=表达式%>会放在转化成的servlet类的service()方法里面,将表达式(expression)输出到out(输出流)中,
out.println(表达式);
对于servlet路径的补充
在myeclipse、eclipse中产生的web项目时,虽然在src下生成servlet类但部暑到服 务器上还是放在WebRoot下的WEB-INF下的classes文件夹下所以在找路径的时候整个项目的路径是
本来servlet类是在: 项目名\src\***.java下的
实际只要找**.class所以在
项目名\WEB-INF\classes\***.class下找,在这里我们会忽略WebRoot文件名
在doc下编译java文件
javac -d [生成的class文件存放位置] -cp [要引入的jar包信置] 要编译的 java文件所在位置。
对于编译jsp文件时有些几个标签得注意的
〈jsp: forword page="index.jsp"></jsp:forword>这对标签不要换行,否则编译会出错
〈jsp:include>标签也是这样的
三种注释的区别:
servlet源文件 客户端页面源文件 浏览器显示
HTML/XML注释 出现 出现不显示 <!-- -->
隐藏注释 不出现 不出现 不显示 <%-- --%>
脚本注释 出现 不出现 不显示 <% //javacode
/*javacode*/
%>
HTML/XML注释
功能:被注释的信息在服务器端的原文件和客户端的原文件都会出现,但是在浏览器中不显示这些注释信息。
隐藏注释
功能:被注释的信息不会翻译进servlet中,也不会在客户端的原文件中出现,浏览器也不会显示。注意:这种注释可以注释任何内容。
脚本注释
功能:被翻译进servlet中,在服务器端可以看见,但是在客户端的原文件看不见,浏览器中也不会显示
语法:<%@page attribute="value"...%>
通过声明的属性可以和容器进行通信,这些属性会对整个jsp产生影响
2)、include
语法:<%@include file="url" %>
称为静态包含(静态导入)
在这种方式下,当将jsp翻译成servlet的时候会把file指定资源的内容直接嵌入到_jspService()方法,所以它工作在翻译阶段。
可以导入的资源:html、jsp、xml等
优点:执行效率高
缺点:当将file指定的内容嵌入到_jspService()中后,内容就不好改变了,如果要改变被导入文件的内容,那么当前的jsp必须重新编译。
动态导入(动态包含)
语法1:<jsp:include page="url" flush="true"/>
语法2: <jsp:include page="url" flush="true">
<jsp:param name="n1" value="v1"/>
<jsp:param name="n2" value="v2"/>
</jsp:include>
动态导入在servlet的运行阶段被执行,被导入的内容可以是静态的(html)或者动态的。
所谓动态就是可以传递一些参数给被导入得jsp,然后动态生成一个html嵌入到调用的jsp页面中,再将信息返回给客户端。
设置flush为true,就是说,如果你的缓冲区的内容很多了,就将数据读出,以免数据泄漏,造成错误。
<jsp:forward>(jsp实现web内跳转)
语法1:<jsp:forward page="url"/>
语法2:<jsp:forward page="url">
<jsp:param name="n1" value="v1"/>
</jsp:forward>
sendRedirect:(外部跳转)
forward和sendredirect的区别
Sendredirect Forward
是不同的request 虽然是不同的对象,但是,可以取到上一个页面的内容
send后的语句会继续执行,除非return forward后的语句不会继续发送给客户端
速度慢 速度快
需要到客户端的往返,可以转到任何页面, 服务器内部转换,
地址栏有变化 地址栏没有变化
可以传参数,直接写在url后面 可以传参数
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
jsp---->servlet 采用pageEncoding="UTF-8";
servlet--->.class不受我们控制由虚拟机决定,默认UTF-8;
.class-->html页面采用charset=UTF-8
对于这行只是html的一个书写标准可以不要<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
contentType="text/html;charset="UTF-8"
定义页面显示的MIME类型和jsp页面的编码
pageEncoding="type"
定义jsp页面的字符编码,跟charset实现的功能一致