Java EE入门教程系列第二章JSP(二)——JSP脚本

2.2 JSP脚本

2.2.1 JSP脚本的基本形式

JSP脚本就是使用Java语言写成的代码块,不同于一般脚本,它可以在代码中混合使用HTML标记语言,使页面动静结合。

阅读一下下面的代码:

<body>
<p>这是第三个JSP页面
<%
for(int i=1;i<=5;i++){
%>
<H<%=i %>>精彩JSP!</H<%=i %>><br>
<%} %>
</body>

其中<%=i%>是JSP特有的表达式,作用是输出i的值,用上面的代码修改前一篇博客的程序,运行结果如下:

这个例子很好地说明了“动静结合”,在浏览器端查看源代码会发现页面脚本代码已经完全被翻译成了标记语言的形式,这是因为JSP被服务器编译成.class文件后,内容被解释运行成了静态脚本的形式发送给客户端浏览器,浏览器才呈现出最后的内容。客户端执行的是已经被解释执行后的Java文件。

2.2.2 对象的声明

通过在"<%!"和"%>"标记符号之间声明变量、方法和类,可以把脚本代码中生命的对象的作用范围扩大到整个JSP文件,而不仅仅是脚本自身,所以可以放在任意位置,但是为了规范性,还是在前面声明比较好。

1、声明变量

变量类型可以是Java允许的任何数据类型,将这些变量称为JSP页面的成员变量,这些变量的内存空间直到服务器关闭才释放。当多个客户请求同一个JSP页面时,JSP引擎为每个客户请求一个线程,这些线程共享页面的成员变量,被JSP引擎服务器管理,因此任何一个用户对JSP页面成员变量的操作结果都会影响其他用户(这也是可能会导致系统混乱的原因之一)

举例一:声明变量

<%!
int a,b=10,c;
String tom=null,jerry="love JSP";
Date date;
%>

举例二:Count1.jsp网站计数器

通过rename可以很方便给文件改名,你也可以照之前的方法新建一个Count1.jsp,以后的博客不再详细介绍

代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%! int i=0; %>
<%
i++;
%>
<p>您是第<%=i %>位访问本站的客户
</body>
</html>

当我第一次运行时结果是:

再次运行时:

因为我只能在我的电脑上模拟一下多次访问的情况,但是想一想如果有客户同时访问、同时修改一定会出现错误,所以对代码进行改进,将线程共享的变量放入一个synchronized块或者将修改该变量的方法用synchronized修饰。

Count2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%! Integer number=new Integer(0); %>
<%
synchronized(number){
	int i=number.intValue();
	i++;
	number=new Integer(i);
}
%>
<p>您是第
<%=number.intValue() %>
位访问本站的客户
</body>
</html>

补充知识点:https://www.cnblogs.com/doubleqsweet/p/6962945.html

2、声明方法

方法是整个JSP页面有效,但是方法中的变量只在该方法中有效。

举例:Count3.jsp计数器(这里我看的教材上好像错了,教材是下面第一个图,我自己认为的第二个图,如果是我理解错了,多多指正啊~~)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%! int number=1; %>
<p>您是第
<%=countPeople() %>
位访问本站的客户
<%!
synchronized int countPeople(){
return number++;
}
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<p>您是第
<%=countPeople() %>
位访问本站的客户
<%!

synchronized int countPeople(){
	int number=1;
return number++;
}
%>
</body>
</html>

这个时候服务器重启就会刷新计数器,不管是第几次运行,结果都是:

扫描二维码关注公众号,回复: 4037110 查看本文章

3、声明类

举例:Circle.jsp 使用自定义类计算圆的面积和周长

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<p>请输入圆的半径:<br>
<form action="Circle.jsp" method=get name=form>
<input type="text" name="cat" value="">
<input type="submit" value="开始计算" name="submit">
</form>
<%!
public class Circle
{
    double r;
    Circle(double r){this.r=r;}
    double area(){return Math.PI*r*r;}
    double circum(){return Math.PI*2*r;}
    
}
%>
<%
String str=request.getParameter("cat");
double r;
if(str!=null)
{r=Double.valueOf(str).doubleValue();}
else{r=1;}
Circle circle=new Circle(r);
%>
<P>圆的面积是:<br>
<%=circle.area() %><br>
<%=circle.circum() %>
</body>
</html>

在文本框输入2,得到结果:

补充知识:valueof、 intvalue等比较相似的方法辨析,以及可以研究一下上图中地址栏。

2.2.3  输出表达式

前面的例子以及涉及到好几次了,在<%=(不要有空格)和%>之间插入一个能求值的表达式。可以借助前面的例子就很好理解了。

2.2.4 注释的使用

(1)HTML注释:<!— — 注释内容 — —>,客户通过浏览器查看源代码时可以看见。

(2)JSP注释:<%— — 注释内容 — —%>,JSP编译时会忽略这种注释。

就拿上面的例子加注释看一下结果

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- HTML注释1 -->
<p>请输入圆的半径:<br>
<!-- HTML注释2 -->
<form action="Circle.jsp" method=get name=form>
<input type="text" name="cat" value="">
<input type="submit" value="开始计算" name="submit">
</form>
<%-- JSP注释1 --%>
<%!

public class Circle
{
    
    double r;
    Circle(double r){this.r=r;}
    double area(){return Math.PI*r*r;}
    double circum(){return Math.PI*2*r;}
    
}
%>
<%-- JSP注释2 --%>
<%
String str=request.getParameter("cat");
double r;
if(str!=null)
{r=Double.valueOf(str).doubleValue();}
else{r=1;}
Circle circle=new Circle(r);
%>
<P>圆的面积是:<br>
<%=circle.area() %><br>
<%=circle.circum() %>
</body>
</html>

查看源代码,结果为:

写完真的好累呀,日常喊累结尾~~~

猜你喜欢

转载自blog.csdn.net/qq_40996041/article/details/83960006