一、jsp知识点组成:
1、静态内容: html+css+js
2、小脚本(任意java代码): <% %>
3、表达式(输出): <%= %>
4、声明:<%! %>
5、3个指令:page include taglib
6、标准动作(只有容器才能识别的标签,是官方提供的):<jsp:XXX>
7、标准标签库: JSTL
8、EL表达式: ${}
9、自定义标签
10、JSP的内置对象
二、分述
1、表达式(输出): <%= %>
注web-inf这个文件夹里的内容是不对外公开的,为了安全起见,在浏览器中访问不到,只能在服务器内部转发用
通常为了分门别类也可以自己建css\js\img文件夹来存放不同的内容。jsp内容最后是提交到tomcat服务器中,用户通过浏览器向服务器发送请求,服务器响应请求后将对应的内容返给用户!
注:提交页面后tomcat会自动把jsp页面上的代码转成java代码。
2、小脚本(任意java代码): <% %>
专门用来写java代码的区域--不常用(了解)
3、声明:<%! %>
专门用来定义java方法 --jsp提交之后会被tomcat 翻译成java类-类中有方法, 所以jsp页面必然也能定义方法
问题:我们的项目在部署在tomcat里后在什么地方呢?(JSP的原理或执行过程?)
我们在启动tomcat服务器后在右边的标签栏里看见有一个servers的文件夹
因为eclipse集成了tomcat 在项目部署的时候,没有直接放在tomcat的安装目录中而是拷贝了一份放在 wtpwebapps文件夹中 这个文件夹是运行tomcat后生成的临时目录
注意:java文件名的变化....jsp变成java文件后所有的静态内容都是用输入输出流的方式响应到客户端的;对于浏览器来说向服务器请求就是输入流,服务器响应浏览器就是输出流。
进一步理解浏览器和服务器之间的关系:
tomcat 将jsp的内容通过浏览器请求响应到客户端 本质就是通过输入输出流向页面响应了一段内容...当然中间还会有许多的过程....
理解JSP的原理(执行过程):
翻译(*.jsp->*.java)-编译(*.java->*.class)-执行(_jspService方法)
第一次访问 第一次访问 每次请求都调用详细描述:jsp的内部方法jspInit(),_jspService(),jspDestroy()
jspInit(){}:jsp Page被初始化的时候调用该方法,并且该方法仅在初始化时执行一次,所以可以在这里进行一些初始化的参数配置等一次性工作,由作者创建。
jspDestroy(){}: jsp Page由于某种原因被关闭的时候调用该方法,由作者创建。
jspService(){}:由jsp容器自动创建的处理jsp Page的方法,由jsp容器创建,不能由作者定义。
当jsp文件第一次被处理时,他会被转化成一个servlet。jsp引擎首先把jsp文件转化成一个java源文件,如果在转化过程中发生错误的话,会立刻中止,同时向服务器端和客户端发送错误信息报告;如果转化成功了,就会产生一个class类。
然后再创建一个Servlet对象,首先执行jspInit()方法进行初始化操作,由于整个执行过程jspInit()方法只执行一次,所以可以在这个方法中进行一些必要的操作比如连接数据库,初始化部分参数等等,接着执行_jspService()方法,
对客户端的请求进行处理,对每一个请求会创建一个线程,如果同时有多个请求需要处理的话就会创建多个线程,由于servlet长期贮存与内存中,所以执行速度快,但是由于初始化需要编译,所以第一次执行还是比较慢的,如果由于某种原因导致jsp网页关闭或者销毁的话会执行jspDestroy()方法。
jspInit()和jspDestroy()必须写在<%! %>里,注意这里有!符号。
<%!
public void jspInit(){
super.jspInit();
System.out.println("jsp初始化了");
}
%>
注意以上这种写法,如果eclipse工具中,Validation配置中,JSP Syntax Validator项build时执行的选项被勾选,则在build时验证JSP语法会报错,提示super.jspInit()没有这个方法。因为JSP页面继承自HttpServlet 类,而HttpServlet中确实没有jspInit()方法,jspInit()方法存在于接口JspPage中。
工具认为这样是错误的,而super.jspInit()这样的写法在实际运行环境中是不会出错的。在build时验证JSP语法还存在另一个问题,如果一个jsp文件include了另一个jsp页面,被include的jsp页面中直接使用主jsp页面中的局部变量时,会提示局部变量未定义,而这在运行时是可以的。同时为了减少
build的时间,一般build时的验证都可设为关闭。
方法:启动MyEclipse->Project->Properties->MyEclipse->Validation->取消JSP Syntax Validation的Build标记即可。
补充:小脚本与html混编?