Jsp介绍
含义
Jsp:Java Server Page(Java服务器页面),是一个动态的网页技术标准。它和其他的 Web 服务器页面技术:php/asp/ruby/python没有什么不同,对于它,可以简单的理解为 Jsp就是 HTML+Java 代码。在本节课程中,需要了解Jsp的用途、Jsp的执行原理、Jsp的语法等知识点
为什么要使用Jsp:
虽然我们可以使用Servlet输出动态的网页,但是Servlet本身也有着它的局限性,比如某些复杂的网页开发维护不方便,动态页面和Java代码混合到一起难以维护,Servlet利用out.println()语句输出,开发效率低下,eclipse 难调试等问题。这些问题深深的困扰着我们,于是我们决定放弃使用Servlet对于复杂网页内容的输出,将眼光投向另一门技术Jsp。
Jsp特点:
- Jsp是j2ee的功能模块,由web服务器执行
- Jsp作用就是降低动态网页开发难度
- Jsp使用简单,有着HTML和Java基础就可以短时间上手
- Jsp将HTML和Java代码分离,降低开发难度
-
Jsp的运行要求:
可正常运行的Tomcat
- 所有Jsp的页面扩展名必须是.jsp
- Jsp页面应放在web应用程序目录下
第一个Jsp页面
在Jsp页面中,Java代码需要使用<% %>包裹<%@ 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>工资年限计算表</title></head><body><table><tr><th>year</th><th>salary</th></tr><%for(int i = 0; i <= 50; i++) {out.println("<tr>");//Jsp中的打印输出语句,同servlet中代码out.println("<td>"+ i +"</td>");int salary = 0;if(i <= 5) {salary = salary + i * 150;//五年内,每年涨薪10%} else if(i > 5 && i <= 10) {salary = salary + 5 * 150 + 300 * (i - 5);//五年后,每年涨薪20%} else if(i > 10) {salary = salary + 5 * 150 + 300 * 5 + 375 * (i - 10);//十年后,每年涨薪25%}out.print("<td>"+ salary +"</td>");out.println("</tr>");}%></table></body></html>
Jsp的执行过程

关于Jsp是Servlet的直接证明我们可以在Tomcat的work文件夹中找到。
所有我们在Jsp中所写的代码,无论是HTML还是Java都会被转译为Servlet代码。
Jsp基本语法-Scriptlet
Jsp的基本语法其实非常简单,可以分为以下四种:
- Jsp代码块
- Jsp声明构造块
- Jsp输出指令
- Jsp处理指令
Jsp代码块
用于在JSP中嵌入Java代码,语法:<% java代码 %>
Jsp声明构造块
Jsp声明构造块用于声明变量、方法、类,语法:<%! 声明语句 %>
现在已经不推荐使用了!
Jsp输出指令
用于在Jsp页面中显示java代码执行结果,语法:<%= Java代码 %>
Jsp处理指令
用于提供Jsp执行过程中的辅助信息,语法:<%@Jsp指令 %>
常用处理指令:
- <%@ page %>定义当前Jsp页面全局设置
- <%@ include %>将其他Jsp页面与当前Jsp页面合并
- <%@ taglib %>引入Jsp标签库
Jsp注释

注意:
HTML注释和Jsp注释不同,Jsp注释不会做任何处理;
而Jsp中的HTML注释仍然会被执行,但之后不会被浏览器解释;
Jsp综合训练
案例:质数算法
要求:列出1000以内的质数(除1以外,只能被1和自身整除的自然数)
任务:
- 使用List保存所有的有效的质数
将结果打印到页面,格式为
X是质数
<%@page import="java.util.ArrayList"%> <%@page import="java.util.List"%> <!-- 当前标签指示当前页面语言使用的是Java语言,contenType指明当前页面内容为text/html格式,并且字符集为UTF-8字符集 --> <%@ 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>1000以内质数表</title> </head> <body> <h1>1000以内质数表</h1> <%-- 定义一个方法判断是否是质数 --%> <%! //该方法作用域在当前页面中,本页面任何位置都可以调用该方法,这也是jsp方法定义的局限性 boolean isPrime(int num) { boolean flag = true; for(int j = 2; j < num; j++) { if(num % j == 0) { flag = false; break; } } return flag; } %> <% List<Integer> list = new ArrayList<Integer>(); for(int i = 2; i <= 1000; i++) { /*boolean flag = true; for(int j = 2; j < i; j++) { if(i % j == 0) { flag = false; break; } } */ boolean flag = isPrime(i); if(flag == true) { /* out.println("<h2>"+ i +"</h2>"); */ list.add(i); } } %> <% for(int p : list) { //out.println("<h2>"+ p +"是质数</h2>"); %> <h2 style="color:red;"><%=p %>是质数</h2> <% } %> </body> </html>
Jsp页面重用
对于页面来说,可能在整个项目中,每个页面都有着相同的头部和相同的尾部内容的。是否需要每个页面都写一遍这些内容呢?比如我们可以打开腾讯的门户首页,我们发现有些页面只有主体内容跟换,头尾并没有什么改变。
include指令可以复用页面
**
静态包含 include
include 是包含页面的指令,属于静态页面引入。
页面引入的好处在于:可以把多个页面共同的部分抽象出来定义。
<%@include file="head.jsp" %>
<h1>content</h1>
<%@include file="foot.jsp" %>
动态包含
<%
String str = "HELLO";
%>
<jsp:include page="head.jsp"></jsp:include>
<h1><%=str %>,CONTENT</h1>
<jsp:include page="foot.jsp"></jsp:include>
静态引入和动态引入的区别
在静态引入中,子页面是原封不动的把页面的信息放到了父页面中,父页面把所有页面的页面信息都收集完成后,统一的进行解析,完成页面的输出。这样,如果在不同的页面中定义了相同名称的变量,那么就会产生冲突。
但是在动态引入中,由于每一个页面都是单独的进行解析的。再交给父页面合成生成一个 HTML 页面,每个子页面和父页面中定义的 Scriptlet 是不会产生冲突的。
在实际的开发中,我们一般都是用动态的引入。
