JSP动态网页

本文深入讲解JSP技术,包括其背景、执行流程、语法、标签技术及与EL、JSTL的配合使用,旨在帮助开发者掌握JSP动态网页开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

JSP概述

JSP 介绍

JSP 执行过程

JSP语法

模版元素

JSP 脚本片段

JSP 注释

JSP指令

JSP 标签技术

EL表达式

JSTL标签库


JSP概述

JSP 介绍

由SUN公司提供的动态web资源的开发技术,看起来非常像html,但是可以在JSP页面中写java代码。

所以JSP是一种动态web资源开发技术。

JSP本质上就是一个Servlet。

思考:JSP技术产生的原因?(了解)

JSP的出现是为了解决Servlet在响应时不适合向外输出完整页面、以及解决html无法展示动态数据的问题

(1)Servlet本质上是一段java代码,非常适合处理逻辑,但是处理的结果不太适合由Servlet向外输出(不适合输出完整的html页面)。

(2)HTML是用于开发网页的一门技术,可以用来展示数据。但是HTML开发出来的页面本质上就是一个文档(静态资源),无法展示动态的数据。

(3)JSP非常适合编写HTML代码,适合作为响应页面向外输出,同时JSP里可以写java代码,也可以展示动态的数据。所以JSP的出现既可以解决Servlet不适合向外响应一个完整的页面又可以解决html无法展示动态数据的问题。

JSP 执行过程

通过浏览器访问一个JSP文件,很多人会误以为,服务器是直接将JSP文件响应给浏览器,浏览器直接解析JSP从而显示网页内容。

这个理解的错误的! 因为JSP中包含JSP特有的元素,并且其中可能会包含Java代码,这些内容浏览器是无法解析的。

JSP的执行过程图解:JSP在第一次访问时,会被翻译成一个Servlet,对JSP访问后看到的网页内容,其实就是翻译后的Servlet在向外输出!

JSP语法

模版元素

直接写在jsp页面中的html内容称之为jsp页面中的模版元素

除了JSP特有的内容之外的其他内容都是模板元素

模版元素在翻译过来的Servlet中被out.write()原样输出到浏览器中

模版元素在JSP翻译后的Servlet中直接被out.write原样输出. 如下:

JSP 表达式

格式: <%= 表达式 %>       其中可以书写常量、变量、表达式。

作用: 执行表达式, 将结果再原样发送给浏览器

JSP表达式在翻译后的Servlet中是执行表达式的值再原样输出到浏览器,例如

(1)在JSP页面编写内容如下:

<%= request.getContextPath() %> <br/>
<%= "Hello...JSP..." %> <br/>

(2)在翻译后的Servlet中翻译如下:

JSP 脚本片段

格式:<% 若干java语句 %>

在翻译过来的servlet中,脚本片段中的Java代码被复制粘贴到对应的位置执行

翻译前:

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

翻译后:

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

需要注意的是: 在某一个脚本片段中的java代码可以是不完整的,但是要求在翻译过来的servlet中整体的代码必须是完整符合java语法的.

<%  //可以书写若干条Java语句
	for(int i=0;i<5;i++){
		out.write("Hello JSP<br/>");
	}
	//out相当于response.getWriter()
%>

<%-- 之所以可以按照下面的方式书写, 是因为在JSP翻译
后的Servlet中, 就没有脚本片段的区分了, 所以在JSP中
多个脚本片段之间的内容可以互相访问 --%>
<% for(int i=0;i<5;i++){ %>
	Hello JSP<br/>
<% } %>

JSP 注释

格式: <%-- JSP注释 --%>

例如:<%-- out.write("aaa"); --%> 被JSP注释注释的内容,在翻译的过程中被抛弃,不会被翻译。

注意: 注释不能交叉嵌套!!

<% String name = "刘德华"; %>
<%= name %>                 ---> 输出刘德华
<%--
<% name = "马德华"; %>
 --%>
<%= name %>                 ---> 输出刘德华

提示: 在JSP中最好还是使用JSP注释, 使用html注释可能会出现注释不了的情况:

<% String name1 = "刘德华"; %>
<%= name1 %>             ---> 输出刘德华
<!-- 
<% name1 = "马德华"; %>
 -->
<%= name1 %>             ---> 输出马德华

JSP指令

JSP指令格式:<%@ 指令名称 若干属性声明... %>

JSP指令的作用:不会直接产生输出,JSP指令是用来指挥JSP解析引擎如何来翻译当前JSP页面中其他部分的内容(除指令意外的其他内容,例如模版元素、jsp表达式等)

  • page指令

-- 用来声明当前JSP页面的基本属性的,page指令可以写在JSP页面的任意位置,但是为了可读性考虑,一般情况下最好放在JSP页面的最前面

格式: <%@ page ... %>

(1) <%@ page pageEncoding="UTF-8"%> -- 用来通知JSP解析引擎使用指定的编码来翻译JSP。如果想防止JSP乱码,应该要保证JSP文件保存时的编码和pageEncoding指定的编码保持一致。

(2) <%@ page import="..."%> -- 为JSP翻译后的Servlet指定所依赖的jar包.例如:

<%@page import="java.util.Date"%>
<%@page import="java.io.File" %>
<%@page import="java.sql.DriverManager"%>
  • include指令

-- 可以实现页面包含的效果,即页面的合并效果

格式:<%@ include file="" %>

  • taglib指令

在使用JSTL标签库中的标签时, 在当前JSP中要引入JSTL标签库:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

prefix值可以为任意,但使用JSTL标签库时要用该值作为标签名

需要注意: 在引入之前还需要导入JSTL相关的jar包

JSP 标签技术

在JSP页面中写入大量的java代码会导致JSP页面中html代码和java代码混杂在一起,会造成页面非常的混乱,难于维护。

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

EL表达式

格式: ${ 常量、表达式、变量 } 变量必须得事先存入域中

作用:主要作用是从域中获取数据,并输出

(1)获取常量、表达式或变量的值(变量必须的现存入域中)

${ "Hello EL" }   Hello EL   <hr/>
${ 100+123 }  ${ (23*54) > 1250 ? 23*54 : 1250  } <hr/> 
<%
    //声明一个变量name, 并将变量存入域中
    String name = "张三";
    request.setAttribute("name1", name);
%>
${ name1 } 
在EL中书写变量, 会通过变量名(name1)到四个域中去
寻找指定名称(name1)属性值, 如果找到就返回属性值,
如果找不到, 就什么也不输出。
 
寻找时按照域的范围大小, 按照从小到大的顺序去寻找,
找到就输出,找不到就接着往后查找,最终还找不到,就
什么也不输出!
pageContext<request<session<application

(2)获取域中的数组或集合中的数据

<%
    //声明一个数组,并将数组存入到域中
    String[] names = {"刘德华","郭富城","张学友","黎明"};
    request.setAttribute( "ns", names );
    //下面通过EL获取域中数组中的元素
%>
${ ns[0] } <br/>
${ ns[1] } <br/>
${ ns[2] } <br/>
${ ns[3] } <br/>

(3)获取域中的map集合中的数据

<%
    //声明一个Map集合,并将map集合存入到域中
    Map map = new HashMap();
    map.put("name", "阿凡达");
    map.put("age", 20);
    map.put("addr", "北京");
    request.setAttribute( "map1", map );
%>
${ map1.name } <br/>
${ map1.age } <br/>
${ map1.addr } <br/>

(4)获取域中的JavaBean/POJO中的数据

<%
    //创建一个Account对象, 并存入域中
    Account acc = new Account(1, "john", 3000);
    request.setAttribute("account",  acc );
%>
${ account.getId() }
${ account.getName() }
${ account.getMoney() }     <hr/>
<%--  在EL中 对象.getXxx() 可以简化为 对象.xxx --%>
${ account.id }
${ account.name }
${ account.money }              <hr/>

在EL中通过对象.xxx,例如:

${ account.id }底层代码其实调用的是 account.getId()方法

${ account.name }底层代码其实调用的是 account.getName()方法

JSTL标签库

STL标签库是为JavaWeb开发人员提供的一套标准通用的标签库;

JSTL标签库和EL配合使用取代JSP中大部分的Java代码;

在使用JSTL标签库之前, 需要进行以下操作:

(1)需要在项目中导入JSTL的jar包

(2)需要在使用JSTL标签库的jsp中通过taglib指令引入JSTL标签库

其中常用的标签如下:

1、<c:set></c:set> -- 往四大作用域中添加域属性,或者修改四大作用域中已有的属性

(1) 往四大作用域中添加一个域属性

<%--  request.setAttribute("name", "张三"); --%>
<c:set var="name"  value="张三"  scope="request"/>
${ name }

(2) 修改四大作用域中已有的属性

如果重复添加相同的属性,值会发生覆盖,相当于修改.

<c:set var="name"  value="张三丰"  scope="request"/>
${ name }

(3) 修改作用域中Map集合中的属性(了解)

c_set标签属性总结:

(1)var -- 指定存入作用域中的属性名称

(2)value -- 指定存入作用域中属性的值

(3)scope -- 指定将属性存入哪一个作用域中

   可取值: a)page表示pageContext域     b)request表示request域 

                c)session表示session域      d)application表示ServletContext

2、<c:if></c:if> -- 构造if…else…语句

<c:if test="${3>5}">yes</c:if>
<c:if test="${!(3>5)}">no</c:if>

test属性用于指定判断的条件,注意:JSTL中没有提供else对应的标签

3、<c:forEach></c:forEach> -- 对集合或数组等中元素进行循环遍历或者是执行指定次数的循环.

(1) 遍历域中数组或集合中的元素

<%
    //声明一个数组, 并将数组存入域中
    String[] names = {"王海涛","齐雷","陈子枢"};
    request.setAttribute("names", names);
%>
<c:forEach items="${names}" var="name">
    ${ name }
</c:forEach>

(2) 遍历域中map集合中的元素

<%
	//声明一个Map, 并将Map存入域中
	Map map = new HashMap();
	map.put("name", "关羽");
	map.put("age", "38");
	map.put("addr", "中鼎大厦B座");
	request.setAttribute("map", map);
%>
<c:forEach items="${ map }" var="entry">
	${ entry.key } : ${ entry.value } <br/>
</c:forEach> 

(3) 遍历0~100之间的整数,将是3的倍数的数值输出到浏览器中

<c:forEach begin="0" end="100" var="i" >  
		${ i%3==0? i : "" }
</c:forEach> 

c_forEach标签属性总结:

(1)items: 指定需要遍历的集合或数组

(2)var: 指定用于接收遍历过程中的元素

(3)begin: 指定循环从哪儿开始

(4)end: 指定循环到哪儿结束

(5)step: 指定循环时的步长, 默认值是1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值