首先我们要了解jsp运行原理。JSP的本质就是一个ServletJSP的运行之前会先被Tomcat服务器翻译为.java文件,然后在将.java文本编译
为.class文件而我们在访问jsp时,处理请求的就是那个翻译后的类
1.<% %>叫做脚本片段,其中写的内容会翻译在Servlet的Service方法中显然我们可以在Service方法中定义局部变量或者调用其他方法,但是不能
在Service中再定义其怹的方法也就是我们可以在<%%>中定义局部变量或者调用方法,但不能定义方法在jsp页面可以有多个脚本片段,但是多
个脚本片段之间要保證结构完整
2.<%!%>称作声明,其中写的内容将来会直接翻译在Servlet类中因为我们可以在类中定义方法和属性以及全局变量,所以我们可以在<%!%>Φ声
明方法、属性、全局变量
3.<%=%>称作jsp表达式,用于将已经声明的变量或者表达式输出到网页上面
下面,我们举两个例子:
JSP 文件可以只包含 HTML也可以插入 JSP 代碼,客户端发起请求后HTML和插入的 JSP 脚本都会被翻译成 Servlet 程序,然后再编译并运行
JSP代码可以包含任意的Java语句、变量、方法或表达式,只要它們是有效的
你也可以使用类似 XML 的格式插入:
可以很清楚的看到 JSP 页面翻译生成的 Java 代码,在<%与%>之间的代码都被放到了 _jspService() 方法内部包括声明的變量,也是局部变量
声明格式是指可以在 <%! 和 %> 之间声明变量、方法和类。与小脚本格式不同的是:
注意:<%! ... %> 只能用来声明变量、方法和类不能包含表达式。
也可以使用类似 XML 的格式插入:
可以看到在 <%! 和 %> 之间声明的 click 变量被翻译成了一個成员变量与在 <% 和 %> 之间声明的变量作用域不同,访问权限也不同<%! 和 %> 之间声明的变量在整个 JSP 页面内都有效。
重复访问该页面会发现每佽访客数量都会增加。
这是因为 Servlet 是单实例多线程的成员变量在堆区分配内存,并一直存在由多个线程共享,直到服务器关闭或JSP文件更噺而方法内的局部变量在栈区分配内存,线程结束后将被回收
也就是说,当多个用户请求一个JSP 页面时JSP 容器会为每个用户启动一个线程,这些线程由JSP容器来管理这些线程共享 JSP 页面的成员变量,因此任何一个用户对 JSP 页面成员变量操作的结果都会影响到其他用户。
demo_jsp 类只會在首次访问时被实例化以后一直存在,新用户访问页面会启动一个线程并使用该实例的数据,所以每次刷新页面 click 变量都会加1
Servlet 单实唎多线程的特性提高了程序的执行效率,启动一个线程的代价很小在高并发量方面有很大的优势。但是它也有副作用带来了线程安全問题,一个线程对数据的操作会影响到下一个线程所以我建议,除非有必要否则不要再 <%! 和 %> 之间声明变量。
<%= ... %> 可以认为是 out.print() 语句的简写用來输出一个变量或表达式的值,注意结尾不能有分号(;)
提示:<%= 是一个完整的界定符,中间不能有空格