JSP是由SUN公司提供的一门动态Web资源开发技术
JSP看起来像一个HTML,但和html不同的是,JSP中可以书写Java代码,可以通过Java代码获取动态的数据。
所以JSP可以开发动态网页。
JSP其实本质上就是一个Servlet
程序!
- 静态 Web 资源:在不同的条件下(或者不同的人) 取访问,看到的效果都是相同的,这就是静态Web资源
静态开发技术:html / css / js
(==不是指这个网页是不能动的!==能动的网页,很多也是静态的Web资源)- 动态 Web 资源:在不同的条件下(或者不同的人)去访问,可以看到不同的效果。
(如,购物车页面,每个人访问,购物车内容不一样)
动态开发技术:Servlet / jsp / PHP / .NET(读:“Duang~” NET)
JSP的出现既解决了Servlet不适合输出网页的问题,同时也解决html无法显示动态数据的问题!
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
访问JSP的过程为:
.java
(Servlet).class
(运行)html
)网页到浏览器如果是访问一个HTML:
+访问index.html
localhost/day11/index.html
总结:
修改JSP模版步骤: 点击菜单栏中的 window --> Preferences,出现如下窗口:
点击edit编辑JSP模版,修改为如下:
<%@ pageEncoding="${encoding}"%>
<html>
<head>
<meta charset="${encoding}"/>
<title>title>
head>
<body>
${cursor}
body>
html>
除了JSP特有内容以外的其他内容都属于模板元素
例如:
下图中除了红色框中的内容,其他的都是模板元素。
模板元素在翻译后的servlet中,是直接被out.write()原样发送给浏览器,由浏览器负责解析并显示。
格式: <%= 常量/变量/表达式 %>
<%=123+100 %>
<%= new Date() %>
<%="Hello JSP" %>
Hello JSP
<% String str = "韩少云"; %>
<%=str %>
作用:
在JSP中:
<!-- 循环输出5行"hello jsp..." -->
<%
for(int i=0;i<5;i++){
out.write("hello jsp...
");
}
%>
在翻译后的Servlet中:
out.write("\t\r\n");
out.write("\t");
for(int i=0;i<5;i++){
out.write("hello jsp...
");
}
其他形式,在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~~~
\r\n");
out.write("\t");
}
写在某一个脚本片段中的Java代码可以是不完整的,但是最终的所有脚本片段中的内容加在一起,必须是完整符合Java语法的!
格式: <%-- 注释内容 --%>
作用:
关于JSP注释,在翻译时,直接将JSP注释丢弃,不参与翻译过程。
在JSP中可以书写JSP注释、java注释、html注释:
<%--
<% out.write("aaa
"); %>
--%>
上面的JSP注释包括其中的注释内容,在翻译时直接被抛弃,不参与翻译。
所以其中的aaa不会发送给浏览器,也不会显示在页面上。
<% //out.write("bbb
"); %>
上面的java注释内容放在脚本片段中,会参与翻译,但是由于被java注释注释了,所以也不会执行,bbb也不会发送给浏览器,不会显示在页面上。
<!--
<% out.write("ccc
"); %>
-->
上面的html注释会被当做模板元素被out.write发送到浏览器, 其中包裹的脚本片段中的内容也会执行。ccc也会发送到浏览器。但由于前后被html注释包裹了。浏览器不会解析html注释中的内容,因此也不会显示。
指令的格式: <%@ 指令名称 若干属性声明... %>
指令的作用: 用于指挥JSP解析引擎如何将一个JSP翻译成一个Servlet程序。
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;
下面这个指令( 重 要 \color{#f01}{重要} 重要)
<%@ page pageEncoding="UTF-8"%>
pageEncoding属性是用于指定JSP使用的编码。
只要保证 pageEncoding 属性指定的编码和 JSP 文件另存时的编码一致。
JSP中就不会有乱码问题。
(在JSP中获取请求参数乱码另说)
可以将上面的属性都声明在一个 page
指令上。
<%@ page language="java" pageEncoding="UTF-8" import="java.util.Date"%>
taglib指令是用于引入JSTL标签库或者其他标签库时用的
后面在讲解JSTL标签库时,会讲解其用法。
在JSP页面中写入大量的 java 代码会导致JSP页面中html代码和java代码混杂在一起,
会造成页面非常的混乱,(11年左右)
难于维护。
于是在JSP的2.0版本中,sun提出了JSP标签技术,
推荐使用标签来代替JSP页面中java代码,并且推荐,
JSP2.0以后不要在JSP页面中出现任何一行java代码。
格式: ${ 常量、表达式、变量 }
注意:放在EL中的变量必须得先存入域才可以获取到。
作用:
<hr>
如果EL中存放的是常量或表达式,结果是直接将常量的值或者表达式的计算结果输出到当前位置<br>
如果EL中存放的是变量,底层会根据变量的名字作为key到四大作用域中寻找指定的value,寻找时是按照四大作用于的大小来寻找,寻找顺序是从小到大<br>
如果找到就返回value值,如果找不到也不会返回null,二十什么都不输出!<br>
----- 如下 ---<br>
<%
String name = "张飞";
request.setAttribute("name1", name);
%>
${name1}
${ ns[0] } <br/>
${ ns[1] } <br/>
${ ns[2] } <br/>
${ ns[3] } <br/>
${ map1.name } <br/>
${ map1.age } <br/>
${ map1.nickname } <br/>
${ user.getUsername() } <br/>
${ user.getPassword() } <br/>
${ user.getAddr() } <br/>
<hr/>
${ user.username } <br/><!-- 底层还是调用getUsername方法 -->
${ user.password } <br/><!-- 底层还是调用getPassword方法 -->
${ user.addr } <br/><!-- 底层还是调用getAddr方法 -->
JSTL标签库是为JavaWeb开发人员提供的一套标准通用的标签库;
JSTL标签库和EL配合使用可以取代JSP中大部分的Java代码;
在使用JSTL标签库之前需要完成:
(1)导入JSTL的开发包
(2)在使用JSTL标签库的JSP中引入JSTL