JSP

JSP概述

由sun公司提供的动态web资源的开发技术。本质上是一个servlet.

[toc]

1.JSP由来

JSP的出现是为了解决Servlet在响应时不适合向外输出页面的问题.

  • Servlet本质上是一段java代码,非常适合处理逻辑,但是处理的结果不太适合由Servlet向外输出(不适合输出完整的html页面)。
  • HTML是用于开发网页的一门技术,可以用来展示数据。但是HTML开发出来的页面本质上就是一个文档(静态资源),无法展示动态的数据
  • JSP非常适合编写HTML代码,适合作为响应页面向外输出,同时JSP里可以写java代码,也可以展示动态的数据
  • 所以JSP的出现既可以解决Servlet不适合向外响应一个完整的页面又可以解决html无法展示动态数据的问题
  • JSP在第一次访问时,会被翻译成一个Servlet,对JSP访问后看到的页面 其实就是翻译后的Servlet在向外输出

2.JSP执行过程


3.JSP语法

模板元素

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

模板元素在翻译后的Servlet中,直接被out.write原样输出到浏览器。

JSP表达式

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


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

<%= "Hello JSP" %>
<%= 153+231 %>

JSP脚本片段

格式:==<% java语句 %>==

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

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

JSP注释

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

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

JSP指令

用于指挥JSP解析引擎如何来翻译当前JSP页面中其它部分的内容

(1)page指令

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

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

(1)<%@ page language="java" %> -- 指定当前JSP使用的语言是java.(了解即可)

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

(3)<%@ page session="true"%> -- 用来指定当前页面是否使用session,如果设置为true,则翻译过来的servlet中将会有对session对象的引用,于是可以直接在JSP中使用session隐式对象。但
是这将导致一旦访问JSP就会调用request.getSession()方法,可能导致不必要的空间浪费。如果确定JSP中不需要session可以设为false.

(4)<%@ page errorPage="filepath"%> -- 为当前JSP页面指定友好错误提示页面,即当前JSP如果抛出了异常,将会跳转到errorPage属性指定的页面。

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

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

可以实现页面包含的效果

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

(3)taglib指令

引入JSTL标签库

4.JSP的九大隐式对象

JSP翻译引擎在将JSP翻译成servlet的过程中,在servlet里预先定义了九个对象,因此我们可以在JSP页面中直接使用这九个对象

隐式对象 info
page this
request ServletRequest
response ServletResponse
application ServletContext
config ServletConfig
session HttpSession
exception
out 等价于response.getWriter()
pageContext

pageContext

代表当前JSP页面的运行环境的对象,通过该对象可以访问页面中的共享数据

(1).pageContext对象可以获取其他八大隐式对象
(2).pageContext是一个域对象
方法 相关描述
setAttribute(String name,Object value) 添加一个域属性
getAttribute(String name) 根据指定的属性名获取属性值.
removeAttribute(String name) 根据指定的属性名删除一个属性.

生命周期:当访问JSP开始时创建pageConext对象,当访问JSP结束时销毁pageContext对象.

作用范围: 整个JSP页面

主要功能: 在整个JSP页面中实现数据的共享

四大作用域范围: ServletContext > Session > Request > pageContext

5.JSP标签技术

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

EL表达式

EL表达式在JSP中可以非常方便的获取数据,可以代替JSP页面中的JSP表达式(<%= %>)

基本结构: ${ 表达式 }

EL只能获取不能设置!!!


EL只能获取不能遍历!!!

(1) 获取常量/变量(必须存入域中)/表达式的值
    ${ "Hello EL" }
    ${ 123+456 }
    
    <br/>
    <%= "Hello EL" %>
    <%= 123+456 %>
    
    <hr/>
    <% String name = "赵云"; %>
    
    <%= name %>
    <%-- 上面通过JSP表达式获取name, 是在当前JSP运行环境
        中获取名称为name的变量的值 --%>
    
    <%
        request.setAttribute("name", "request张飞");
        session.setAttribute("name", "session张飞");
    %>
    ${ name }
    <%-- 通过EL获取name, 是在四大域中寻找名称为name的属性
        值, 如果找到就返回name属性的值, 如果找不到就什么
        也不输出!!
        在寻找时, 是按照从小到大的顺序到四大域中寻找指定
        名称的属性值!!
     --%>
(2)获取域中数组或集合中的数据
   <%
        String[] names = 
            { "王海涛", "齐雷", "陈子枢", "刘沛霞" };
        request.setAttribute("names", names);
    %>
    ${ names[0] }
    ${ names[1] }
    ${ names[2] }
    ${ names[3] } 
(3)获取域中map集合中的数据
    <%
        Map map = new HashMap();
        map.put("name", "刘德华");
        map.put("age", 18);
        map.put("nickname", "Andy");
        
        request.setAttribute("map", map);
    %>
    ${ map.name }
    ${ map.age }
    ${ map.nickname }

JSTL标签库

(1)c:set标签
  • 往域中添加一个域属性
<c:set var="name" value="张三丰" scope="request"/>
    ${ name }
  • 修改域中已有的域属性
<c:set var="name" value="张无忌" scope="request"/>
    ${ name }
  • 修改域中map集合中的元素
    <%
        Map map = new HashMap();
        map.put("name", "刘德华");
        map.put("age", 18);
        map.put("nickname", "Andy");
        
        request.setAttribute("map", map);
    %>
    修改前: 
    ${ map.name }
    ${ map.age }
    ${ map.nickname } 
    <hr/>
    <c:set target="${map}" property="name" value="阿凡达"/>
    <c:set target="${map}" property="nickname" value="小达达"/>
    修改后:
    ${ map.name }
    ${ map.age }
    ${ map.nickname }
(2)c:if标签
    <c:if test="${ 3>5 }">yes</c:if>
    <c:if test="${ !(3>5) }">no</c:if>
    
    <!-- 模拟判断用户是否登录 -->
    <%
        session.setAttribute("user", "张三");
        session.removeAttribute("user");
    %>
    <c:if test="${ user == null }">
        <a href="#">您好, 请登录...</a>
    </c:if>
    <c:if test="${ user != null }">
        欢迎, ${ user } 回来...
    </c:if>
(3)c:forEach标签
  • 遍历域中的数组或集合中的元素
    <%
        List list = new ArrayList();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("刘能");
        request.setAttribute("list", list);
        
        for(Object o : list){
            System.out.println(o);
        }
    %>
    <c:forEach items="${list}" var="o">
        ${ o }<br/>
    </c:forEach>
  • 遍历域中的map集合中的元素
    <%
        Map<Object, Object> map = new HashMap();
        map.put("name", "刘德华");
        map.put("age", 18);
        map.put("nickname", "Andy");
        request.setAttribute("map", map);
        
        for(Map.Entry<Object,Object> e : map.entrySet()){
            System.out.print(e.getKey() + " : ");
            System.out.println(e.getValue());
        }
    %>
    <c:forEach items="${map}" var="entry">
        <%-- ${ entry.getKey() } : ${ entry.getValue() } <br/> --%>
        ${ entry.key } : ${ entry.value } <br/>
    </c:forEach>
  • varStatus 用于指定表示循环状态信息的对象
参数 相关描述
first Boolean,当前被遍历元素是否是第一个
last Boolean,当前被遍历的元素是否是最后一个
count 数值,当前被遍历元素是第几个
index 索引,当前被遍历元素的索引值()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容

  • 1.学习内容 JSP技术入门和常用指令 JSP的内置对象&标签介绍 EL表达式&EL的内置对象 2.JSP技术入门...
    WendyVIV阅读 2,136评论 1 18
  • JSP总结(经典) day1 JSP 定义: 1)Java Server Page, Java EE 组件,本...
    java日记阅读 3,449评论 0 13
  • Jsp技术总结 1. 什么是JSP JSP即Java Server Pages,它和servlet技术一样...
    java日记阅读 1,656评论 0 18
  • 1.什么是JSP (1)jsp全称是Java Server Pages,它和Servlet技术一样都是sun公司定...
    yjaal阅读 3,655评论 5 99
  • 可乐开了/文 那些记忆历久弥新! 那是辆生了锈的二八车,黑色,外观没有特别之处,不过脚蹬因为时间久了常常整个掉下来...
    z锦w瑟y阅读 452评论 0 2