你写的JSP最终会变成一个servlet在Web应用中运行。它与其他servlet非常相似,只不过这个servlet类会由容器为你编写。
容器拿到你在JSP中写的代码,把这些代码转换为一个servlet类源文件,然后再把这个源文件编译为Java Servlet类。
下面代码是一个Web应用:
先写一个普通计数器类:Counter.java
package foo;
public class Counter{
private static int count;
public static synchronized int getCount(){
count++;
return count;
}
}
再写JSP页面:BasicCounter.jsp
<html>
<body>
The page count is:
<%
out.println(Counter.getCount());
%>
</body>
</html>
运行页面报500,因为Counter类在foo包中,但是JSP不知道。
解决方法:导包
<%@ page import="foo.*" %>
或在代码中使用完全限定类名
out.println(foo.Counter.getCount());
Java代码放在带百分号的尖括号中间:<%和%>
指令会为元素开始记号再增加一个字符:@,以<%@开始的JSP代码,应该知道这是一个JSP指令。
上面的JSP代码还是有out.println()语句。引入JSP,部分原因就是为了避免大量的println()语句出现,有JSP表达式元素,表达式元素会自动打印放在标记之间的内容。
<%= Counter.getCount()%>//里面不加;
和
<%
out.println(Counter.getCount());
%>
作用相同
因为:容器拿到你在<%=和%>之间键入的所有内容,会把它作为参数传递给打印语句。上面的表达式会转换成下面这行代码:
out.println(Counter.getCount());
加上分号,就成为下面这样,就是错误的:
out.println(Counter.getCount(););
<%int count=0;%>
每次运行服务方法时这个变量都会重新初始化。这说明对于每个请求它都会重置为0。
JSP声明:声明的JSP元素
<%! int count=0; %>
方法声明。
<html>
<body>
<%!
int doubleCount(){
count = count*2;
return count;}
%>
<%! int count=1; %>
The page count is now:
<%= doubleCount() %>
</body>
</html>