8.1 JSP概述

8.1.1 什么是JSP

JSP是由SUN公司提供的一门<mark>动态Web资源开发技术</mark>
JSP看起来像一个HTML,但和html不同的是,JSP中可以书写Java代码,可以通过Java代码获取动态的数据。

所以JSP可以开发***页。

<mark>JSP其实本质上就是一个Servlet程序!</mark>

  • 静态 Web 资源:在不同的条件下(或者不同的人) 取访问,看到的效果都是相同的,这就是静态Web资源
    <mark>静态开发技术:html / css / js</mark>
    (==不是指这个网页是不能动的!==能动的网页,很多也是静态的Web资源)
  • 动态 Web 资源:在不同的条件下(或者不同的人)去访问,可以看到不同的效果。
    (如,购物车页面,每个人访问,购物车内容不一样)
    <mark>动态开发技术:Servlet / jsp / PHP / .NET</mark>(读:“Duang~” NET)

思考1:为什么要学习JSP?

  • Servlet本质上是一段Java程序,擅长处理业务逻辑,但是不适合向外输出一个网页。
  • HTML可以用于开发网页,但仅限于开发静态网页,无法显示动态数据,
  • JSP中可以书写Java代码,可以开发一个动态的网页。

<mark>JSP的出现既解决了Servlet不适合输出网页的问题,同时也解决html无法显示动态数据的问题!</mark>

思考2:为什么说JSP本质是一个Servlet?

JSP在第一次被访问时,会翻译成一个Servlet程序。

在访问JSP后看到的网页,其实就是翻译后的Servlet程序输出的网页!

  • 在哪找?
    {Web程序发布路径下 - 主机名}\work\Catalina\localhost\day10\org\apache\jsp


    比如我的:D:\tools\apache-tomcat-8.5.49\webapps\Catalina\localhost\day10\org\apache\jsp

8.2 JSP执行过程

访问JSP的过程为

  • 访问index.jsp
  • <mark>–翻译-></mark> index_jsp.java(Servlet)
  • <mark>–编译-></mark> index_jsp.class(运行)
  • <mark>–结果-></mark> 输出一个(html)网页到浏览器

如果是访问一个HTML
+访问index.html

  • —> 服务器根据访问的路径去寻找index.html文件
  • —> 如果能找到就直接将index.html文件的内容响应给浏览器,让浏览器解析。
  • —> 如果找不到就响应一个404页面。

localhost/day11/index.html

总结:

  • 访问JSP需要在服务器端翻译、编译、运行,最终响应给浏览器一个html网页,
  • 访问html会直接将html发送给浏览器解析,因此html运行效率比jsp高!

8.3 修改JSP模版 - 【感觉没必要】

修改JSP模版步骤: 点击菜单栏中的 window --> Preferences,出现如下窗口:

点击edit编辑JSP模版,修改为如下:

<%@ pageEncoding="${encoding}"%><!-- 设置编码 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="${encoding}"/>
<title></title>
</head>
<body>
<!-- 开始光标位置 -->
${cursor}
</body>
</html>

这里最好编码改成utf-8

8.4 JSP语法

8.4.1 模版元素

除了JSP特有内容以外的其他内容都属于模板元素
例如:
下图中除了红色框中的内容,其他的都是模板元素。
模板元素在翻译后的servlet中,是直接被out.write()原样发送给浏览器,由浏览器负责解析并显示。

8.4.2 JSP表达式

格式: <%= 常量/变量/表达式 %>

<%=123+100 %>
<%= new Date() %>
<%="Hello JSP" %>
Hello JSP

<% String str = "韩少云"; %>
<%=str %>

作用:

  • 在翻译后的Servlet中,计算表达式的值,将计算的结果输出到浏览器,由浏览器负责解析并显示!

在JSP中:

<!-- 循环输出5"hello jsp..." -->
<% 
	for(int i=0;i<5;i++){
		out.write("hello jsp...<br/>");
	}
%>

在翻译后的Servlet中:

out.write("\t<!-- 循环输出5行\"hello jsp...\" -->\r\n");
out.write("\t");

for(int i=0;i<5;i++){
	out.write("hello jsp...<br/>");
}

其他形式,在JSP中:

<% for(int i=0;i<5;i++){ %>
	hello jsp~~~<br/>
<% } %>

在翻译后的Servlet中:

for(int i=0;i<5;i++){ 
  out.write("\r\n");
  out.write("\t\thello jsp~~~<br/>\r\n");
  out.write("\t");
}

写在某一个脚本片段中的Java代码可以是不完整的,但是最终的所有脚本片段中的内容加在一起,必须是完整符合Java语法的!

8.4.4 JSP注释

格式: <%-- 注释内容 --%>
作用:

  • 为代码添加解释说明
  • 将一些暂时不需要执行的代码注释掉。

关于JSP注释,在翻译时,直接将JSP注释丢弃,<mark>不参与翻译过程</mark>。
在JSP中可以书写JSP注释、java注释、html注释:

<%-- 
<% out.write("aaa<br/>"); %>
 --%>

上面的JSP注释包括其中的注释内容,在翻译时直接被抛弃,<mark>不参与翻译</mark>。
所以其中的aaa<mark>不会发送给浏览器</mark>,也不会显示在页面上。

<% //out.write("bbb<br/>"); %>

上面的java注释内容放在脚本片段中,<mark>会参与翻译</mark>,但是由于被java注释注释了,所以也不会执行,bbb也<mark>不会发送给浏览器</mark>,不会显示在页面上。

<!-- 
<% out.write("ccc<br/>"); %>
 -->

上面的html注释会被当做模板元素被out.write发送到浏览器, 其中包裹的脚本片段中的内容也<mark>会执行</mark>。ccc也<mark>会发送到浏览器</mark>。但由于前后被html注释包裹了。<mark>浏览器不会解析html注释中的内容,因此也不会显示</mark>。

8.4.5 JSP指令

指令的格式: <%@ 指令名称 若干属性声明... %>
指令的作用: 用于指挥JSP解析引擎如何将一个JSP翻译成一个Servlet程序。

1、page指令

page指令的作用是,用于声明JSP文件的基本属性信息
(比如,jsp使用的开发语言,jsp使用的编码,jsp中需要引入哪些包等.)

<%@ page language="java" %>

– language属性用于指定jsp使用的开发语言, 指定为java。默认也是java.

<%@ page import="java.util.Date"%>

import是用于导入包用的, 类似于java程序中的import关键字

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

下面这个指令( <mstyle mathcolor="&#35;f01"> </mstyle> \color{#f01}{重要}

<%@ page pageEncoding="UTF-8"%>

pageEncoding属性是用于指定JSP使用的编码。
只要保证 pageEncoding 属性指定的编码和 JSP 文件另存时的编码一致。
<mark>JSP中就不会有乱码问题</mark>。
(在JSP中获取请求参数乱码另说)

可以将上面的属性都声明在一个 page 指令上。

<%@ page language="java" pageEncoding="UTF-8" import="java.util.Date"%>

2、taglib指令

taglib指令是用于引入JSTL标签库或者其他标签库时用的
后面在讲解JSTL标签库时,会讲解其用法。

8.5 JSP标签技术

<mark>在JSP页面中写入大量的 java 代码</mark>会导致JSP页面中html代码和java代码混杂在一起,
会造成页面非常的混乱,(11年左右)
<mark>难于维护</mark>。

于是在JSP的2.0版本中,sun提出了JSP标签技术,
<mark>推荐使用标签来代替JSP页面中java代码</mark>,并且推荐,
JSP2.0以后不要在JSP页面中出现任何一行java代码。

8.5.1 EL表达式

格式: ${ 常量、表达式、变量 }
注意:放在EL中的变量必须得先存入域才可以获取到。
作用:

  • 计算表达式的值,将计算的结果输出
  • <mark>主要作用是用于从 四大作用域 中获取数据</mark>。

1、获取常量、表达式、变量的值(变量得先存入域中)

<hr>
	如果EL中存放的是常量或表达式,结果是直接将常量的值或者表达式的计算结果输出到当前位置<br>
	如果EL中存放的是变量,底层会根据变量的名字作为key到四大作用域中寻找指定的value,寻找时是按照四大作用于的大小来寻找,寻找顺序是从小到大<br>
	如果找到就返回value值,如果找不到也不会返回null,二十什么都不输出!<br>
	----- 如下 ---<br>
	
	<%
		String name = "张飞";
		request.setAttribute("name1", name);
	%>
	${name1}

2、获取作用域中数组或集合中的元素

${ ns[0] } <br/>
${ ns[1] } <br/>
${ ns[2] } <br/>
${ ns[3] } <br/>

3、获取作用域中map集合中的元素

${ map1.name } <br/>
${ map1.age } <br/>
${ map1.nickname } <br/>

4、获取作用域中JavaBean对象的属性值

${ user.getUsername() } <br/>
${ user.getPassword() } <br/>
${ user.getAddr() } <br/>
<hr/>
${ user.username } <br/><!-- 底层还是调用getUsername方法 -->
${ user.password } <br/><!-- 底层还是调用getPassword方法 -->
${ user.addr } <br/><!-- 底层还是调用getAddr方法 -->

8.5.2JSTL标签库

JSTL标签库是为JavaWeb开发人员提供的一套标准通用的标签库;
JSTL标签库和EL配合使用可以取代JSP中大部分的Java代码;
在使用JSTL标签库之前需要完成:

(1)导入JSTL的开发包
(2)在使用JSTL标签库的JSP中引入JSTL