博客目录
1、什么是JSP
2、JSP与Servlet的关系
3、JSP规范
4、JSP注释、代码块、声明语句块、表达式块
5、JSP基础总结
一、什么是JSP
- JSP全称:Java Server Pages
- JSP是在传统静态网页HTML中插入Java代码片段和JSP标签的一直文件,后缀为.jsp
- 因为Java是跨平台的,所以JSP也是跨平台
二、JSP与Servlet的关系
JSP文件的本质是Servlet,只不过JSP与Servlet不同的是,JSP是专门用于进行数据展示的Servlet,其有特殊的写法。而普通的Servlet是用于完成业务逻辑处理的。由于Servlet是运行在单例多线程环境下的,所以JSP同样也是运行在单例多线程环境下
三、JSP规范
将JSP页面翻译为Servlet的过程,是由Tomcat完成的。在Tomcat内置了一个JSP翻译引擎,当第一次访问该JSP页面时,翻译引擎会将JSP页面翻译为Servlet,例如JSP页面中的HTML,CSS,JavaScript,及普通文本均被翻译到out.write中(例如下图就是JSP编译后的Servlet),Tomcat中的JSP翻译引擎,就遵循了这个JSP规范
如何找到JSP编译成Java后的文件
在Tomcat目录下
work>Catalina>localhost>项目名称>org>apache>jsp>.java文件
四、JSP注释、代码块、声明语句块、表达式块
1、JSP注释<%– –%>
- 翻译引擎会将HTML注释翻译到Service方法中的out.write()中,而JSP注释会被忽略成一个\t
- 在客户浏览器查看源码时,HTML注释是可以查看到的,但JSP注释是无法查看的,所以如果是很重要的注释可以写成JSP注释
图1是JSP注释和HTML注释的区别
图2是HTML注释被翻译到了Service方法中,而JSP注释被忽略成一个\t
图1
图2
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>Insert title here</title>
</head>
<body>
<!-- JSP代码块 -->
<%
String name="linjie";
%>
<%
System.out.println(name);
System.out.println("这是Java代码块");
%>
</body>
</html>
- 可以写在任意位置
- 每个<% %>都是联系的,因为都翻译到一个Service中
- <% %>中声明变量不能加权限访问控制符,因为<% %>会被翻译到Service方法中,而方法中的变量不能用权限访问控制符
- <% %>中不能定义方法,因为被翻译到Service方法中又有方法,在Java中不允许方法的嵌套
- <% %>中不能定义静态语句块:static{},方法中不能有静态代码块,静态代码块应该在类中
3、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>
<!--JSP声明语句块 -->
<%!
public void show()
{
System.out.println("Java声明语句块");
}
%>
<%
show();
%>
</body>
</html>
- JSP声明语句块被翻译的位置改变了:翻译到了类中,成为了成员变量、成员方法,可以修改(但会造成线程安全问题,因为Servlet是单例多线程的,如果有可修改的成员变量,则会引起线程安全问题,所以一般Servlet不加成员变量)
4、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>
<%
String name="linjie";
%>
<!-- JSP表达式块 -->
<%=name %>
</body>
</html>
- 会在浏览器显示name的值
- 被翻译到Service中out.print(name);
五、总结
1、JSP代码块
- <% %>
- 不能写方法、访问控制符、静态语句块
- 翻译到Service方法中
2、JSP声明语句块
- <%! %>
- 能写方法、访问控制符、静态语句块
- 翻译到类中
- 但由于Servlet是单例多线程,其中如果加了可修改成员变量会引起线程安全问题
3、JSP表达式块
- <%= %>
- 没有分号
- <%=name %>:即在浏览器中显示name的值
- 被翻译到Service方法中:out.print(name);