导学

Jsp:Java Server Page(Java服务器页面),是一个动态的网页技术标准。它和其他的 Web 服务器页面技术:php/asp/ruby/python没有什么不同,对于它,可以简单的理解为 Jsp就是 HTML+Java 代码。在本节课程中,需要了解Jsp的用途、Jsp的执行原理、Jsp的语法等知识点

Jsp

为什么要使用Jsp:
image.png
虽然我们可以使用Servlet输出动态的网页,但是Servlet本身也有着它的局限性,比如某些复杂的网页开发维护不方便,动态页面和Java代码混合到一起难以维护,Servlet利用out.println()语句输出,开发效率低下,eclipse 难调试等问题。这些问题深深的困扰着我们,于是我们决定放弃使用Servlet对于复杂网页内容的输出,将眼光投向另一门技术Jsp。

Jsp介绍

Jsp特点:
Jsp:Java Server Page(Java服务器页面),是一个动态的网页技术标准

  1. Jsp是j2ee的功能模块,由web服务器执行
  2. Jsp作用就是降低动态网页开发难度
  3. Jsp使用简单,有着HTML和Java基础就可以短时间上手
  4. Jsp将HTML和Java代码分离,降低开发难度
  5. Jsp的本质就是Servlet

Jsp的运行要求:

  1. 可正常运行的Tomcat
  2. 所有Jsp的页面扩展名必须是.jsp
  3. Jsp页面应放在web应用程序目录下

    第一个Jsp页面

    在Jsp页面中,Java代码需要使用<% %>包裹

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>工资年限计算表</title>
    8. </head>
    9. <body>
    10. <table>
    11. <tr>
    12. <th>year</th>
    13. <th>salary</th>
    14. </tr>
    15. <%
    16. for(int i = 0; i <= 50; i++) {
    17. out.println("<tr>");//Jsp中的打印输出语句,同servlet中代码
    18. out.println("<td>"+ i +"</td>");
    19. int salary = 0;
    20. if(i <= 5) {
    21. salary = salary + i * 150;//五年内,每年涨薪10%
    22. } else if(i > 5 && i <= 10) {
    23. salary = salary + 5 * 150 + 300 * (i - 5);//五年后,每年涨薪20%
    24. } else if(i > 10) {
    25. salary = salary + 5 * 150 + 300 * 5 + 375 * (i - 10);//十年后,每年涨薪25%
    26. }
    27. out.print("<td>"+ salary +"</td>");
    28. out.println("</tr>");
    29. }
    30. %>
    31. </table>
    32. </body>
    33. </html>

    Jsp的执行过程

    3.Jsp入门 - 图2
    关于Jsp是Servlet的直接证明我们可以在Tomcat的work文件夹中找到。
    3.Jsp入门 - 图3
    所有我们在Jsp中所写的代码,无论是HTML还是Java都会被转译为Servlet代码。

    Jsp基本语法-Scriptlet

    Jsp的基本语法其实非常简单,可以分为以下四种:

  4. Jsp代码块

  5. Jsp声明构造块
  6. Jsp输出指令
  7. Jsp处理指令

Jsp代码块

  1. 用于在JSP中嵌入Java代码,语法:<% java代码 %>

Jsp声明构造块

  1. Jsp声明构造块用于声明变量、方法、类,语法:<%! 声明语句 %>

现在已经不推荐使用了!
Jsp输出指令

  1. 用于在Jsp页面中显示java代码执行结果,语法:<%= Java代码 %>

Jsp处理指令

  1. 用于提供Jsp执行过程中的辅助信息,语法:<%@Jsp指令 %>

常用处理指令:

  1. <%@ page %>定义当前Jsp页面全局设置
  2. <%@ include %>将其他Jsp页面与当前Jsp页面合并
  3. <%@ taglib %>引入Jsp标签库

Jsp注释
3.Jsp入门 - 图4
注意:HTML注释和Jsp注释不同,Jsp注释不会做任何处理;
而Jsp中的HTML注释仍然会被执行,但之后不会被浏览器解释;

Jsp综合训练

案例:质数算法
要求:列出1000以内的质数(除1以外,只能被1和自身整除的自然数)
任务:

  1. 使用List保存所有的有效的质数
  2. 将结果打印到页面,格式为<h2>X是质数</h2>

    1. <%@page import="java.util.ArrayList"%>
    2. <%@page import="java.util.List"%>
    3. <!-- 当前标签指示当前页面语言使用的是Java语言,contenType指明当前页面内容为text/html格式,并且字符集为UTF-8字符集 -->
    4. <%@ page language="java" contentType="text/html; charset=UTF-8"
    5. pageEncoding="UTF-8"%>
    6. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    7. <html>
    8. <head>
    9. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    10. <title>1000以内质数表</title>
    11. </head>
    12. <body>
    13. <h1>1000以内质数表</h1>
    14. <%-- 定义一个方法判断是否是质数 --%>
    15. <%!
    16. //该方法作用域在当前页面中,本页面任何位置都可以调用该方法,这也是jsp方法定义的局限性
    17. boolean isPrime(int num) {
    18. boolean flag = true;
    19. for(int j = 2; j < num; j++) {
    20. if(num % j == 0) {
    21. flag = false;
    22. break;
    23. }
    24. }
    25. return flag;
    26. }
    27. %>
    28. <%
    29. List<Integer> list = new ArrayList<Integer>();
    30. for(int i = 2; i <= 1000; i++) {
    31. /*boolean flag = true;
    32. for(int j = 2; j < i; j++) {
    33. if(i % j == 0) {
    34. flag = false;
    35. break;
    36. }
    37. } */
    38. boolean flag = isPrime(i);
    39. if(flag == true) {
    40. /* out.println("<h2>"+ i +"</h2>"); */
    41. list.add(i);
    42. }
    43. }
    44. %>
    45. <%
    46. for(int p : list) {
    47. //out.println("<h2>"+ p +"是质数</h2>");
    48. %>
    49. <h2 style="color:red;"><%=p %>是质数</h2>
    50. <%
    51. }
    52. %>
    53. </body>
    54. </html>

    Jsp页面重用

    image.png
    对于页面来说,可能在整个项目中,每个页面都有着相同的头部和相同的尾部内容的。是否需要每个页面都写一遍这些内容呢?比如我们可以打开腾讯的门户首页,我们发现有些页面只有主体内容跟换,头尾并没有什么改变。

    include指令可以复用页面

静态包含 include

include 是包含页面的指令,属于静态页面引入。
页面引入的好处在于:可以把多个页面共同的部分抽象出来定义。

  1. <%@include file="head.jsp" %>
  2. <h1>content</h1>
  3. <%@include file="foot.jsp" %>

动态包含

  1. <%
  2. String str = "HELLO";
  3. %>
  4. <jsp:include page="head.jsp"></jsp:include>
  5. <h1><%=str %>,CONTENT</h1>
  6. <jsp:include page="foot.jsp"></jsp:include>

静态引入和动态引入的区别

在静态引入中,子页面是原封不动的把页面的信息放到了父页面中,父页面把所有页面的页面信息都收集完成后,统一的进行解析,完成页面的输出。这样,如果在不同的页面中定义了相同名称的变量,那么就会产生冲突。
但是在动态引入中,由于每一个页面都是单独的进行解析的。再交给父页面合成生成一个 HTML 页面,每个子页面和父页面中定义的 Scriptlet 是不会产生冲突的。

在实际的开发中,我们一般都是用动态的引入。