和 tomcat 密切耦合的 JSP 代码示例

按:仅有实验用途,且限定使用 tomcat 作为容器,如果用别的容器,import 路径显然不对。

JSP 最终会被 Java Web 容器编译成 java 源文件(servlet 源文件),然后编译成 class 文件,最终运行在 JVM 上。既然 JSP 会转化成 java,那么这些 java 文件也就可以产生依赖关系了。理论上是这样,但在具体的生产实践中,似乎没有应用过这一理论。

Tomcat 通过 JSP 文件生成 java 文件举例如下:

JSP 文件:

{tomcat home}/webapps/hellohello/
│  2.jsp
│  index.jsp
├─hello
│      3.jsp

java 文件:

{tomcat home}/work/Catalina/localhost/hellohello/org/apache/jsp/
│  index_jsp.java
│  _2_jsp.java
└─hello
        _3_jsp.java

通过以上两个目录的内容,可以看出几点:

  • java 文件的代码目录是 {tomcat home}/work/Catalina/localhost/{app name},最顶的包即:org.apache.jsp
  • JSP 和 java 文件,名称对应规则为:abc.jsp 对应 abc_jsp.java。如果 JSP 文件以数字命名,则生成的 java 文件在名前加下划线,如 2.jsp 对应 _2_jsp.java, 如果 JSP 在某文件夹下,则 java 文件也增加对应的包。看来在 tomcat 这种服务级别的应用中,不像普通的应用开发那样遵照匈牙利驼峰命名规则了。

本实验的目的是借助 tomcat 的转化功能,通过 JSP 来编写 java 程序,有(很)趣(囧)吧;)

index.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>index</title>
</head>
<body>
hello, there! <br/>
<%!
// 定义几个变量
int aInt = 123;
String b = "bbbb";
public static String hello = "hello"; //这个是 static 的
//定义一个方法
public String hello(String name) {
    return "Hello, " + name;
}
%>
</body>
</html>

2.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>2</title>
</head>
<body>
<%
out.print(index_jsp.hello + "<br/>");
index_jsp indexJsp = new index_jsp();
out.print(indexJsp.aInt + "<br/>");
out.print(indexJsp.b + "<br/>");
out.print(indexJsp.hello("world!"));
%>
</body>
</html>

hello/3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="org.apache.jsp.index_jsp"%>
<!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>3</title>
</head>
<body>
<%
out.print(index_jsp.hello + "<br/>");
index_jsp indexJsp = new index_jsp();
// 因 index 中定义的可见性原因,注释掉这两行
//out.print(indexJsp.aInt + "<br/>");
//out.print(indexJsp.b + "<br/>");
out.print(indexJsp.hello("world!"));
%>
</body>
</html>

以上很明显,在 index.jsp 中定义了变量和函数,在 2.jsp, hello/3.jsp 中有使用到。因为定义的可见性关系,在 hello/3.jsp 只能使用那几个 public 的变量和函数。在调试时,需要先访问 index.jsp,让 tomcat 先生成 index_jsp.java, 以便 _2_jsp.java 和 hello/_3_jsp.java 用到,和普通的 Java 开发不一样,当先访问 2.jsp 时,tomcat 不会主动去生成 index_jsp.java,而是直接报错。

真变(好)态(爽)!这个东西绝对不会在生产中使用到,但是对了解容器的原理有一定帮助。容器生成的几个 java 文件,内容太杂,在本页的附件中。