导学
Jsp:Java Server Page(Java服务器页面),是一个动态的网页技术标准。它和其他的 Web 服务器页面技术:php/asp/ruby/python没有什么不同,对于它,可以简单的理解为 Jsp就是 HTML+Java 代码。在本节课程中,需要了解Jsp的用途、Jsp的执行原理、Jsp的语法等知识点
Jsp
为什么要使用Jsp:
虽然我们可以使用Servlet输出动态的网页,但是Servlet本身也有着它的局限性,比如某些复杂的网页开发维护不方便,动态页面和Java代码混合到一起难以维护,Servlet利用out.println()语句输出,开发效率低下,eclipse 难调试等问题。这些问题深深的困扰着我们,于是我们决定放弃使用Servlet对于复杂网页内容的输出,将眼光投向另一门技术Jsp。
Jsp介绍
Jsp特点:
Jsp:Java Server Page(Java服务器页面),是一个动态的网页技术标准
- Jsp是j2ee的功能模块,由web服务器执行
- Jsp作用就是降低动态网页开发难度
- Jsp使用简单,有着HTML和Java基础就可以短时间上手
- Jsp将HTML和Java代码分离,降低开发难度
- Jsp的本质就是Servlet
Jsp的运行要求:
- 可正常运行的Tomcat
- 所有Jsp的页面扩展名必须是.jsp
-
第一个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保存所有的有效的质数
将结果打印到页面,格式为
<h2>X是质数</h2><%@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 是不会产生冲突的。
在实际的开发中,我们一般都是用动态的引入。
