一、jsp概述

    JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。

    JSP实际上就是Servlet。

    JSP这门技术的最大的特点在于:写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

    jsp = html + java

    html:静态内容。

    servlet:服务器端的小应用程序。适合编写java逻辑代码,如果编写网页内容-->太苦逼。

    jsp:适合编写输出动态内容,但不适合编写java逻辑。

    Servlet负责那些事情?

      1. 获取表单数据

      2. 处理业务逻辑

      3. 分发转向

    提问:为什么JSP技术也是一种动态web资源的开发技术?

      答:因为JSP技术允许在页面中嵌套java代码,以产生动态数据,并且web服务器在执行jsp时,web服务器会传递web开发相关的对象给jsp,

       jsp通过这些对象,可以与浏览器进行交互,所以jsp当然也是一种动态web资源开发技术。

    强调一个概念:

      对现在的用户而言,认为通过浏览器看到的东西都是网页。

      但我们程序员心里要清楚,开一个浏览器访问网页,这些网页有可能是一个html页面(即静态web资源),也有可能是一个动态web资源(即用servlet或jsp程序输出的)。

二、jsp的原理

    1. IE浏览器在访问JSP页面时,Web服务器是如何调用并执行一个jsp页面的?(Servlet)

      答:第一次:转译(翻译) --> 编译 --> 执行

          第二次:执行

    2. Web服务器在执行jsp页面时,是如何把Jsp页面中的html排版标签发送到客户端的?

      答:out.print("<......>"); 或者 out.write("<......>");

    3. Jsp页面中的java代码服务器是如何执行的?

      答:服务器 --> .java文件 --> .class文件 --> 结果out回客户端

    4. Web服务器在调用jsp时,会给jsp提供一些什么java对象(内置对象)?

      答:HttpSession、ServletConfig、ServletContent、request、response、out等等。

        
        
 
        

三、jsp的最佳实践

    Servlet:控制器。重点编写java代码逻辑。(获取表单数据、处理业务逻辑、分发转向)

    JSP:代码显示模板。重点在于显示数据。(为什么显示数据不直接用.html文件呢?因为.jsp文件中可以插入java代码显示回显消息,简言之,jsp功能更强大)

    示例:

      lojin.jsp

      doLogin.jsp(该jsp文件,先转译成java文件,注意:该jsp文件说白了其实就是纯的java代码,那么就最好不使用jsp文件了。)

      success.jsp

    但是用户关心的是只有显示给他们的页面,你怎么实现的,跟我(用户)没有关系。所以doLogin.jsp的代码可以放到src中。

四、jsp的基本语法

    1、JSP的模版元素:简言之就是网页的静态内容

    例如:html标签和普通文本。

    2、JSP的脚本

    2.1、小脚本

      <% java代码 %>

    2.1、表达式

      <%= 2 + 3 %> 等价于out.print(2 + 3);

          
 
          

    2.3、声明

      <%! %> 表示在类中定义全局成员和静态块。

    3、JSP注释

    JSP注释:<%-- 被注释的内容 --%> 特点:安全,省流量

    网页注释:<!-- 网页注释 -->     特点:不安全,费流量

          

    4、JSP的3个指令

    5、JSP的6个动作

    6、JSP的9个内置对象

五、jsp的3个指令

  JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分

  在JSP 2.0规范中共定义了三个指令:

    page指令(页面级别)

    include指令(导入其它页面的信息)

    taglib指令(标签指令)

  例如:

      

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; UTF-8"%>

  语法:

      <%@ 指令名称 属性1="属性值1" 属性2="属性值2 ...... %>

    或者:

      <%@ 指令名称 属性1=" %>

      <%@ 指令名称 属性2="属性值2" %>
 

  示例:

      <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
    或者:
      <%@ page language="java" %>
      <%@ page import="java.util.*" %>

   1、page

    作用:page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面。

    为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。

    属性:

      1.1、import和java代码中的import是一样的。

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

      或者:

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

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

      JSP会自动导入(默认导入)以下的包:

        import java.lang.*;

        import javax.servlet.*;

        import javax.servlet.http.*;

        import javax.servlet.jsp.*;

      1.2、session: 表示是否会自动创建session对象。其默认值是true。

      1.3、buffer: JSP中有javax.servlet.jsp.JspWriter输出字符流。设置输出数据的缓存大小,默认大小是8kb。建议最好不要改大小。

      1.4、errorPage: 如果页面中有错误,则跳转到指定的资源。(即不让页面弹出404/500等错误)

        errorPage="/uri"

        如果写"/"则代表当前应用的目录下,绝对路径。

        如果不写"/"则代表相对路径。

      1.5、isErrorPage: 表示是否创建throwable对象。其默认值是false。作用:输出页面错误信息:by zero

      1.6、contextType: contentType="text/html; charset=UTF-8" 告诉浏览器使用什么编码来解析文本。等同于 response.setContextType("text/html; charset=utf-8"); 

      1.7、pageEncoding: 告诉JSP引擎(服务器)要转译(翻译)的文件使用的编码。

        例如:<%@ page  pageEncoding="gbk" %>

      1.8、isELIgnored: 是否支持EL表达式。 默认是false,表示支持EL表达式。

        例如:${1+1}  等价于out.print(1+1);

      pageEncoding说明图:

        

   2、include

      include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。

      静态包含:把其它资源包含到当前页面中。

        <%@ include file="/include/header.jsp" %>

      动态包含:

        <jsp:include page="/include/header.jsp"></jsp:include>

      两者的区别:转译(翻译)的时间段不同

        前者:在翻译时就把两个文件合并

        后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。

      使用原则:能用静的就不用动的。原因之一是:可以省略一些代码的书写。

  3、taglib

      作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。

        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    prefix:前缀(相当于重新给uri起个名字)

      示例:

        <% 

          if (5 > 3) { 

          out.print(5); 

          } 

        %> 

        <%-- 上下二种方式是等价的 --%>

        <c:if test="${5>3}"> 

          aaa 

        </c:if>

        下面的这种方式很好用!后面慢慢体会。

六、jsp的6个动作

  使用标签的形式来表示一段java代码。

    如:

      <jsp:include page="2.jsp"></jsp:include>

      <jsp:include > 动态包含

      <jsp:forward> 请求转发

      <jsp:param> 设置请求转发的参数

      <jsp:useBean> 创建一个对象

      <jsp:setProperty> 给指定的对象属性赋值

      <jsp:getProperty> 取出指定对象的属性值

    示例:

      

七、jsp的9个内置对象

      指在JSP的<%=%> 和<% %>中可以直接使用的对象,服务器给我们创建好的对象,直接拿过来用就行了。

    例如:

      <%=request.getParameter("name") %>

      <%

         Student stu = new Student();

        stu.setName("tom");

         out.print(stu.getName());

        // request.getRequestDispatcher("/7.jsp").forward(request, response);

      %>

对象名

类型

说明

request

javax.servlet.http.HttpServletRequest

response

javax.servlet.http.HttpServletResponse

session

javax.servlet.http.HttpSession

由session="true"控制开关

application

javax.servlet.ServletContext

exception

java.lang.Throwable

由isErrorPage="false"控制开关

page

java.lang.Object 当前对象this

当前servlet实例

config

javax.servlet.ServletConfig

out

javax.servlet.jsp.JspWriter

字符输出流,相当于printWriter对象

pageContext

javax.servlet.jsp.PageContext

当前页面的上下文

      pageContext(重要):做自定义标签的时候会用到它,该域对象用的比较少,因为该域对象只在当前页面有效。

    1、本身也是一个域对象:它可以操作其它三个域对象(request、session、application)的数据

      void setAttribute(String name, Object value);

      Object getAttribute(String name);

      void removeAttribute(String name);

    操作其它域对象的方法

      void setAttribute(String name, Object value, int scope);

      Object getAttribute(String name, int scope);

      void removeAttribute(String name, int scope);

      scpoe(域)的值:

        PageContext.PAGE_SCOPE

        PageContext.REQUEST_SCOPE

        PageContext.SESSION_SCOPE

        PageContext.APPLICATION_SCOPE

      findAttribute(String name); // 自动从page、request、session、application依次查找,找到了就取值,然后结束查找。(很牛的方法,要记住)

    2、它可以创建其它的8个隐式对象

      在普通类中可以通过PageContext获取其他JSP隐式对象。自定义标签时使用。

    3、提供了转发和包含的简易方法

      pageContext.forward("2.jsp"); // 请求转发

      pageContext.include("2.jsp"); // 包含

八、四大域对象:实际开发如何用?

    PageContext:pageConext      存放的数据仅在当前页面有效。开发时使用较少。当前页面存放数据用表单标签中的 <input type="hidden" />,且该存值方式用户看不到。

    ServletRequest: request      存放的数据在一次请求(转发:可以传数据)内有效。使用非常多。

    HttpSession: session         存放的数据在一次会话(多次请求)中有效。使用的比较多。例如:存放用户的登录信息、购物车功能。

    ServletContext: application  存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用。用于统计在线人数。

九、EL表达式

  1、EL的概述和基本语法 

      EL表达式:expression language 表达式语言

      作用:要简化jsp中java代码开发。

        特点:具有很强的容错机制。

      它不是一种开发语言,而是jsp中获取数据的一种规范。或者说,它把java底层代码进行了封装。

      

  2、EL的具体功能 

    a、获取数据

个作用域中的数据。

      ${ s } 原理: ${ s } 等价于 pageContext.findAttribute("s");

          注意1:${ s }取不到表单数据,若想取到表单数据,需要 ${ param.s } 这样才可以取到。

          注意2:url?name=tom&pwd=123  这种方式就是get提交的表单方式,所以需要 ${ param.name } 才能取到值。

    EL获取对于null这样的数据,在页面中表现为空字符串(""),不会报错,说明EL具有很强的容错机制。

      ${ s.name } 等价于 s.getName()方法

    点(.) 运算符相当于调用了getter方法,点后页面跟的是属性名。
      
    属性导航:非常好用。以后学习框架Hibernate的时候,一个对象中包含其它对象。
      
    []运算符:点能做的,它也能做; 它能做的,点不一定能做。
    ${ s.name } == ${ s['name'] } == ${ s["name"] }
      

  b、运算

    empty 

      判断null空字符串没有元素的集合(即使集合对象本身不为null)都返回true。

      

    三元运算符 

      

  c、隐式对象:11个

EL隐式对象引用名称

类型

JSP内置对象名称

说明

pageContext

javax.servlet.jsp.PageContext

pageContext

一样的

pageScope

java.util.Map<String, Object>

没有对应的

pageContext范围中存放的数据,页面范围

requestScope

java.util.Map<String, Object>

没有对应的

请求范围数据

sessionScope

java.util.Map<String, Object>

没有对应的

会话范围数据

applicationScope

java.util.Map<String, Object>

没有对应的

应用范围数据

param

java.util.Map<String, String>

没有对应的

一个请求参数

paramValues

java.util.Map<String, String[]>

没有对应的

重名请求参数

header

java.util.Map<String, String>

没有对应的

一个请求消息头

headerValues

java.util.Map<String, String[]>

没有对应的

重名请求消息头

initParam

java.util.Map<String, String>

没有对应的

web.xml中全局参数

cookie

java.util.Map<String, Cookie>

没有对应的

key:cookie对象的name值

 
      
 
      

十、JSTL

  1、什么是JSTL

  JSTL(JavaServerPages Standard Tag Library)JSP标准标签库。

  作用是:简化java代码。

  EL表达式${...} 只能处理简单java代码,复杂的逻辑java代码就不行了!此时就用JSTL。

  2、JSTL的作用

使用JSTL实现JSP页面中逻辑处理。如判断、循环等。

注意:在JSTL中想取值,必须加${值}。

  3、使用JSTL

    1)在JSP页面中添加taglib指令(prefix:前缀(相当于重新给uri起个名字))

      

    2)使用JSTL标签

      

  4、常用标签介绍

  核心标签库:

  > 通用标签:set、 out、 remove(了解就行,开发时根本不用个!)

        
        
 

  > 条件标签:if  choose

        
 

  > 迭带标签:foreach

  普通for循环

  

迭带器

        
    注意:
      <tr></tr> 代表行
      <td></td> 代表单元格
      <th></th> 相当于<td>,只是内置样式加粗居中
        
        
      或者使用css选择器中的类选择器的方式改变样式,如下:
        
        
      c:forEach中的varStatus属性。
        该属性指向一个字符串,该字符串引用一个对象。map.put("vs", 一个对象); 
          这个对象记录着当前遍历的元素的一些信息:
          getIndex() 返回索引,从0开始。
          getCount() 返回计数,从1开始。
          isFirst() 是否是第一个元素。
          isLast() 是否是最后一个元素。

day11_jsp/EL/JSTL学习笔记的更多相关文章

  1. JavaWeb 后端 <六> 之 EL & JSTL 学习笔记

    一.EL表达式(特别重要)

  2. JavaEE EL & JSTL 学习笔记

    1. EL表达式(特别重要)

  3. JSTL学习笔记(核心标签)

    一.JSTL标签分类: 核心标签 格式化标签 SQL标签 XML标签 JSTL函数 二.核心标签       引用方式:<%@ taglib prefix="c" uri=& ...

  4. JSTL学习笔记

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6684442.html  一:JSTL用途 JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用 ...

  5. EL表达式学习笔记

     转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6684424.html  一:EL表达式的用途 1.获取数据:(某个web域 中的对象,访问javabean的 ...

  6. Java Web学习笔记之---EL和JSTL

    Java Web学习笔记之---EL和JSTL (一)EL (1)EL作用 Expression  Language(表达式语言),目的是代替JSP页面中复杂的代码 (2)EL表达式 ${变量名} ( ...

  7. [原创]java WEB学习笔记43:jstl 介绍,core库详解:表达式操作,流程控制,迭代操作,url操作

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. [原创]java WEB学习笔记38:EL 中的 11个 隐含对象 详解

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. [原创]java WEB学习笔记42:带标签体的自定义标签,带父标签的自定义标签,el中自定义函数,自定义标签的小结

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

随机推荐

  1. linux下使用异步通知

    阻塞式I/O是一直等待直到设备可以访问,非阻塞式I/O是定期轮询设备是否可以访问. 异步通知则是当设备可以访问时才主动通知应用程序,有点像设备的硬中断. 并不是所有的设备都支持异步通知,应用程序通常假 ...

  2. GIT版本控制 — GIT与SVN的相互转换 (三)

    git-svn git-svn用于Git和SVN的转换,可以把Git仓库迁移成SVN仓库,反之亦可. 详细介绍可见[1],或者命令行输入git-svn. Bidirectional operation ...

  3. 09_Android中ContentProvider和Sqllite混合操作,一个项目调用另外一个项目的ContentProvider

    1.  编写ContentPrivider提供者的Android应用 清单文件 <?xml version="1.0" encoding="utf-8"? ...

  4. 【算法导论】图的深度优先搜索遍历(DFS)

    关于图的存储在上一篇文章中已经讲述,在这里不在赘述.下面我们介绍图的深度优先搜索遍历(DFS). 深度优先搜索遍历实在访问了顶点vi后,访问vi的一个邻接点vj:访问vj之后,又访问vj的一个邻接点, ...

  5. 《java入门第一季》之类小案例(模拟用户登录)

    首先是做一个用户登录的小案例.在此基础上加入其它逻辑. import java.util.Scanner; /* * 模拟登录,给三次机会,并提示还有几次.如果登录成功,就可以玩猜数字小游戏了. * ...

  6. Cocos2D v2.0至v3.x简洁转换指南(四)

    实现通用的update方法 在Cocos2d 2.x你需要2个步骤去实现在每帧调用update方法: // 1) schedule update [self scheduleUpdate]; ... ...

  7. 说说nio----1

    既然说到了nio,就得谈以下几个问题 为什么会出现新io,"旧io"有什么问题吗? ok,一步一步来,先给大家看几个例子: 1单线程的服务器程序 import java.net.* ...

  8. DBUtils学习总结

    这几天闲着无聊,就看了一下DBUtils这个数据库组件.中间有了一些想法,现在记录下来. 文章主要分几部分 1 最简单同时也是最经常使用的一些范例 2 学习源码前的一些知识储备 3 我自己写的mydb ...

  9. OM模块功能&API详解

    (一)销售订单概述 1.1   与车间模块关系 当使用ATO类型订单时,订单管理模块会直接在车间模块中产生任务 1.2   与库存模块关系 在销售订单中使用的物料,单位等信息均来自库存模块,在订单执行 ...

  10. 使用JCrop进行图片裁剪,裁剪js说明,裁剪预览,裁剪上传,裁剪设计的图片处理的工具类和代码

     1.要想制作图片裁剪功能,可以使用网上的裁剪工具JCrop,网址是:https://github.com/tapmodo/Jcrop/ 案例效果如下: 2.引入JCrop的js代码,具体要引入那 ...