JSP 文件可以只包含 HTML,也可以插入 JSP 代码,客户端发起请求后,HTML和插入的 JSP 脚本都会被翻译成 Servlet 程序,然后再编译并运行。

小脚本格式(scriptlet)

小脚本格式是指可以在 之间插入 JSP 代码:

// JSP Code

%>

JSP代码可以包含任意的Java语句、变量、方法或表达式,只要它们是有效的。

你也可以使用类似 XML 的格式插入:

// JSP Code

文本、HTML标签等都必须写在 JSP 的外边,例如:

演示页面

1+2+3+...+99+100 =

int result = 0;

for(int i=1; i<=100; i++){

result += i;

}

out.print(result);

%>

将上面的代码保存到 demo.jsp 并放到站点根目录,假设你为当前虚拟主机分配了 www.jspdemo.com 域名,访问 www.jspdemo.com:8080/demo.jsp,就可以看到输出内容。

图1  演示页面

打开 $CATALINA_HOME\\work\Catalina\www.jspdemo.com\_\org\apache\jsp 目录,你会看到由 JSP 翻译生成的 Servlet 程序 demo_jsp.java,部分代码如下所示:

package org.apache.jsp;

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

// demo.jsp 页面的内容被转换为 demo_jsp 类

public final class demo_jsp extends org.apache.jasper.runtime.HttpJspBase

implements org.apache.jasper.runtime.JspSourceDependent {

public void _jspInit() {

// 初始化

}

public void _jspDestroy() {

// 销毁

}

// 处理 http 请求,生成 html 代码

public void _jspService(final javax.servlet.http.HttpServletRequest request,

final javax.servlet.http.HttpServletResponse response)

throws java.io.IOException, javax.servlet.ServletException {

out.write("\r\n");

out.write("\r\n");

out.write("

\r\n");

out.write(" \r\n");

out.write("

演示页面\r\n");

out.write("\r\n");

out.write("

\r\n");

out.write("

\r\n");

out.write(" 1+2+3+...+99+100 = \r\n");

out.write(" ");

int result = 0;

for(int i=1; i<=100; i++){

result += i;

}

out.print(result);

out.write("\r\n");

out.write("

\r\n");

out.write("\r\n");

out.write("");

}

}

可以很清楚的看到 JSP 页面翻译生成的 Java 代码,在之间的代码都被放到了 _jspService() 方法内部,包括声明的变量,也是局部变量。

声明格式(declaration)

声明格式是指可以在 之间声明变量、方法和类。与小脚本格式不同的是:

声明的是局部变量,会被放到 _jspService() 方法内部。

不能声明方法,因为Java规定方法不能嵌套声明。

之间声明的是成员变量,由多线程共享。

注意: 只能用来声明变量、方法和类,不能包含表达式。

也可以使用类似 XML 的格式插入:

// JSP Code

示例代码:

演示页面

int click = 0;

%>

1+2+3+...+99+100 =

int result = 0;

for(int i=1; i<=100; i++){

result += i;

}

out.print(result);

click++;

%>

你是第位访客

生成的 demo_jsp.java 部分代码如下:

package org.apache.jsp;

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

public final class demo_jsp extends org.apache.jasper.runtime.HttpJspBase

implements org.apache.jasper.runtime.JspSourceDependent {

int click = 0;

public void _jspInit() {

// 初始化

}

public void _jspDestroy() {

// 销毁

}

public void _jspService(final javax.servlet.http.HttpServletRequest request,

final javax.servlet.http.HttpServletResponse response)

throws java.io.IOException, javax.servlet.ServletException {

out.write("\r\n");

out.write("\r\n");

out.write("

\r\n");

out.write(" \r\n");

out.write("

演示页面\r\n");

out.write("\r\n");

out.write("

\r\n");

out.write("\r\n");

out.write("

\r\n");

out.write(" 1+2+3+...+99+100 = \r\n");

out.write(" ");

int result = 0;

for(int i=1; i<=100; i++){

result += i;

}

out.print(result);

click++;

out.write("\r\n");

out.write("

\r\n");

out.write("

你是第");

out.print( click );

out.write("位访客

\r\n");

out.write("\r\n");

out.write("");

}

}

可以看到在 之间声明的 click 变量被翻译成了一个成员变量,与在 之间声明的变量作用域不同,访问权限也不同, 之间声明的变量在整个 JSP 页面内都有效。

重复访问该页面,会发现每次访客数量都会增加。

这是因为 Servlet 是单实例多线程的,成员变量在堆区分配内存,并一直存在,由多个线程共享,直到服务器关闭或JSP文件更新。而方法内的局部变量在栈区分配内存,线程结束后将被回收。

也就是说,当多个用户请求一个JSP 页面时,JSP 容器会为每个用户启动一个线程,这些线程由JSP容器来管理,这些线程共享 JSP 页面的成员变量,因此任何一个用户对 JSP 页面成员变量操作的结果,都会影响到其他用户。

demo_jsp 类只会在首次访问时被实例化,以后一直存在,新用户访问页面会启动一个线程,并使用该实例的数据,所以每次刷新页面 click 变量都会加1。

Servlet 单实例多线程的特性提高了程序的执行效率,启动一个线程的代价很小,在高并发量方面有很大的优势。但是它也有副作用,带来了线程安全问题,一个线程对数据的操作会影响到下一个线程。所以我建议,除非有必要,否则不要再 之间声明变量。

表达式格式(expression)

前面的JSP代码,输出IP地址时用到了 out.print() 语句:

其实还有一种简写,更加方便:

示例代码:

演示页面

你的IP地址是:

也可以使用类似 XML 的格式:

// JSP Code

可以认为是 out.print() 语句的简写,用来输出一个变量或表达式的值,注意结尾不能有分号(;)。

提示:

html添加java代码_在HTML中插入JSP代码相关推荐

  1. latex附录中放python代码_在Latex中插入Python代码

    这里指的插入是指最终能在生成的pdf中显示高亮的Python代码. 在Latex中插入Python代码,需要一个第三发的宏包pythonhighlight: https://github.com/ol ...

  2. iframe视频代码_在Excel中创建IFRAME代码

    iframe视频代码 If you want to embed a YouTube video on your website, YouTube will create some IFRAME cod ...

  3. 在Latex中插入Python代码

    这里指的插入是指最终能在生成的pdf中显示高亮的Python代码. 在Latex中插入Python代码,需要一个第三发的宏包pythonhighlight: https://github.com/ol ...

  4. 太实用了!在Java的Word 文档中插入或读取艺术字

    太实用了!在Java的Word 文档中插入或读取艺术字 简直不能太实用! 扫码关注<Java学研大本营>,加入读者群,分享更多精彩 艺术字是一组文本样式,允许您向文本添加设计元素,例如填充 ...

  5. PPT 中插入域代码公式的方法

    PPT 中插入域代码公式的方法 插入对象,选择  Word * Document,或  OpenDocument 都可以: 在新打开的页面中,选择 插入 文档部件,再选择  域代码: 在域代码选项中, ...

  6. 如何在html中定义字段文字,如何在自定义字段中插入html代码和标签|动易Cms

    如何在自定义字段中插入html代码和标签 在自定义字段里面直接插入html代码还有标签是解析不出来的. 但是我们可以通过以下的方法来实现. 1. 添加一个自定义字段.命名为MY_zdy 修 改 字 段 ...

  7. Java程序向MySql数据库中插入的中文数据变成了问号

    找到mysql的安装目录,修改my.ini文件 (1)如何找到my.ini文件 如果my.ini文件不在MySQL的安装目录下,可能放在隐藏目录,要先去找到ProgramData,(这里要先打开显示隐 ...

  8. MarkDown中插入的代码块无法自动识别换行

    MarkDown中插入的代码块无法自动识别换行 1.插入代码块的两种方式 单行的代码,就一个 ` 多行的代码块就三个```补充说明,可根据自己编写代码块的语言,设定对应的标签(比如Java-java, ...

  9. 新浪博客中插入高亮代码

    在ie浏览器里可以用,但是不知道mac有没有这个插件 原文地址:新浪博客中插入高亮代码作者:木子超-同学 一.              Sublime text 3是一个强大的代码编辑软件,强烈推荐 ...

  10. 用Java向SQL Server数据库中插入float数据报错An error occurred while converting the Float value to JDBC data type

    作者:翁松秀 用Java向SQL Server数据库中插入float数据报错 用Java向SQL Server数据库中插入float数据报错 报错信息: 报错原因: 解决方案: 报错信息: An er ...

最新文章

  1. 算力“竞速”,企业AI落地的当务之急
  2. WSRP调用中的一些问题
  3. 梯度下降法求多元线性回归及Java实现
  4. 读《c#与算法--快速排序》随笔
  5. PowerShell变量——PowerShell三分钟(七)
  6. java7 文件_Java SE 7新特性之文件操作(9) - 遍历目录树
  7. 排序算法 -- 待增加
  8. easy-ui实现左右滚动条
  9. 数据库事务的一致性和原子性浅析
  10. 东莞潇洒培训学校分享知识点:UG编程加工参数设置,新手看过来
  11. E1630加工散热孔:中兴路由器wifi6千兆E1630电信商企版Wi-Fi6路由器3000M全千兆
  12. hard link soft link
  13. ceph pg peering和恢复 (1)
  14. C++银行账户管理程序2
  15. StatsD,collected,fluentd和其他守护程序
  16. 短信发送显示服务器失败,手机短信发不出去怎么办 手机故障解决方法【方法步骤】...
  17. 高端知识星球正式开放了
  18. 【转】羽毛球教学 专家把脉 01
  19. 如何选择第三方鉴定机构?
  20. 50岁程序员还奋战在一线,软件测试能干到多少岁?有年龄限制吗?

热门文章

  1. 《Java游戏编程原理与实践教程》读书笔记(第4章——Java游戏程序的基本框架)
  2. MapGuide Maestro 3.0发布
  3. win7 64位系统epson LQ630k 不打印的问题解决方法
  4. Windows 使用技巧之WinZIP密码破解
  5. 利用QT写的局域网聊天工具(客户端)
  6. Python -- 扫描局域网活跃IP
  7. Android 配置 junit 单元测试
  8. Effective minidump
  9. EnableQ在企业员工满意度调查上的贡献
  10. Aladdin HASP加密狗破解脱壳笔记