Java进阶-11.JSP、EL、JSTL

半城伤御伤魂 提交于 2020-01-11 06:32:22

一、JPS

1.java 服务器页面

jsp全称java server pages(java服务器页面),本质是一个servlet。它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。将内容的生成和显示进行分离,用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面,并使用JSP标识或者小脚本来生成页面上的动态内容。

2.jsp脚本

<%....%>   java代码片段

<%=..%>  输出表达式,相当于out.print()

<%!...%>  声明成员变量

3.jsp指令

格式:<%@ 指令名称 属性="值" 属性="值"%>,用于指示JSP执行某些步骤,用于指示JSP表现特定行为。

例如:<%@page language="java" import="java.util.*" pageEncoding="utf-8"%>

jsp指令的分类:page-声明jsp页面的一些属性、include-静态包含、taglib-导入标签库。

注意:一个页面中可以出现多个指令,指令可以放在任意位置,一般都放在jsp页面最上面。

1)page指令

重要属性:

contentType:设置响应流的编码,及通知浏览器用什么编码打开。设置文件的mimetype。

pageEncoding:设置页面的编码

import:导入所需要的包

pageEncoding与contentType都是page指令的属性,它们都是用来设置编码,有如下联系:

如果这两个属性只提供了其中一个,那么没有提供的那个属性的编码值就是提供的这个属性的编码值,例如:在jsp页面中设置了contentType=”text/html;charset=utf-8”,那么没有设置的pageEncoding的值就为utf-8,反之亦然;如果两个属性都没有提供,那么两者的默认编码就是ISO-8859-1。

根据对这两个属性的讲解,它们有如下区别:

pageEncoding是设置当前页面的编码,该编码是给服务器看的,可以让服务器正确的将jsp文件翻译成Java文件;

contentType有两个作用:一是设置响应字符流的编码,二是设置Content-Type响应头,即通知浏览器使用什么编码方式解码响应信息。

了解属性:

language:当前jsp页面里面可以嵌套的语言

buffer:设置jsp页面的流的缓冲区的大小

autoFlush:是否自动刷新

extends:声明当前jsp的页面继承于哪个类,必须继承的是httpservlet 及其子类

session:设置jsp页面是否可以使用session内置对象

isELIgnored:是否忽略el表达式,可取值为true/false。如果值为true,那么页面上的el表达式就不会被解析。

errorPage:当前jsp页面出现异常的时候要跳转到的jsp页面

isErrorPage:当前jsp页面是否是一个错误页面,若值为true,可以使用jsp页面的一个内置对象exception,调用相关的函数

2)include指令

include指令的作用是在JSP页面中静态包含一个文件,同时由JSP解析包含的文件内容,生成一个java文件。包含的是目标文件的源码;包含过来,一起翻译。

格式:<%@include file="相对路径或者是内部路径" %>

例子:

main.jsp中的代码

<%

         String s = “abc”;

%>

<%include file=“part.jsp” %>

part.jsp中的代码

<%=s %> 没有定义变量s

尽管part.jsp本身会有错误但是运行main.jsp就可以正确引入part.jsp

3)taglib指令

用于导入标签库。

格式:<%@taglib prefix="前缀名" uri="名称空间" %>

uri  标签文件的URI地址

prefix  标签组的命名空间前缀

若taglib指令导入之后

    <前缀名:标签 .. >

例如:<c:if test="boolean表达式">输出内容</c:if >      

4.jsp对象

1)9大内置对象

在jsp页面上可以直接使用的对象

    内置对象            类型
    out             JspWriter
    request         HttpServletRequest
    response        HttpServletResponse
    session         HttpSession
    exception       Throwable
    page            Servlet(this)
    config          ServletConfig
    application     ServletContext
    pageContext     PageContext

2)JSP域对象

application整个项目、session一次会话、request一次请求、pageContext一个页面。

pagecontext:

可以通过pageContext对象获取jsp中其他的内置对象。 PageContext类中定义了如下八个方法:getPage()、getRequest()、getResponse()、getServletConfig()、getServletContext()、getException()、getSession()等方法,其中getOut()放是在其父类中定义的,有了这些方法,pageContext对象自然能够获取其他八个内置对象了。

pageContext也是一个域对象,所以他有以下方法:

void setAttribute(String name,Object value)

Object getAttribute(String name);

Void removeAttribute(String name);

我们还可以利用以下方法操作其他域中的对象:

Object getAttribute(String name, int scope):

该方法的第一个参数是域属性的名称,第二个参数指定是从那个域中取出域属性;

在PageContext中已经定义了如下几个静态常量作为scope的可选值:

  • int APPLICATION_SCOPE:表示从application域中获取数据;
  • int PAGE_SCOPE:表示从pageContext域中获取数据;
  • int REQUEST_SCOPE:表示从request域中获取数据;
  • int SESSION_SCOPE:表示从session域中获取数据。

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

该方法的第一个参数指的是域属性的名称,第二参数指的是域属性的值,第三个参数指定域属性保存的域,scope的取值同上;

void removeAttribute(String name,int scope):

该方法的第一个参数指的是域属性的名称,第二个参数指的是将指定域属性从哪个域中移出,scope的取值同上;

PageContext类的父类中定义了如下方法:

Object findAttribute(String name):该方法是从jsp的四个域pageContext、request、session、application依次查找指定名称的域属性,如果找到就停止,这说明如果这四个域中存在同名的属性,那么返回的数据是从page范围中获取的。即表示谁的域范围越小,谁的优先级越高。

5.jsp的动作标签

<jsp:forward>:请求转发  相当于java中request.getRequestDispatcher(..).forward(..);

<jsp:forward page="内部路径"></jsp:forward>

<jsp:include>:动态包含,就是将被包含页面或者servlet的运行结果包含到当前页面中。

二、el

EL是Expression Language的缩写,它是jsp内置的表达式语言,从jsp2.0开始,就不让再使用java脚本,而是使用el表达式或动态标签来代替java脚本。EL表达式的格式如下:${表达式}。EL表达式代替的是java脚本中的<%= …%>,也就是说EL表达式也是向浏览器端输出数据。例如${1+2}会向浏览器端输出3。

1.EL作用

获取数据:EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)

执行运算:利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}

获取web开发常用对象:EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。

调用Java方法:EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。

获取域中数据:${pageScope|requestScope|sessionScope|applicationScope.属性名}

注意:若属性名中出现了"."|"+"|"-"等特殊符号,需要使用[]获取,例如:${requestScope["arr.age"] }

${属性名}:依次从pageContext,request,session,application查找指定属性,若查找到返回值,结束该次查找;若查找不到,返回""。

获取复杂数据

获取数组中的数据:${域中的名称[index]}

获取list中的数据:${域中的名称[index]}

获取map中的数据:${域中的名称.键名}

2.javabean导航

java语言编写的一个可重用的组件,狭义上来说就是我们编写的一个普通的java类 例如:User Person

javabean规范:

1.必须是一个公共的具体的类  public class

2.提供私有的字段  private String id;//id称之为字段

3.提供公共访问字段的方法 get|set|is方法:public String getId(){..},一旦有公共的方法之后,get|set|is之后的内容,将首字母小写,将这个东西称之为bean属性,id就是一个bean属性。

4.提供一个无参的构造器

5.一般实现序列化接口  serializable

${域中javabean名称.bean属性}

3.执行运算

四则运算、关系(>..)、逻辑(&& ||)

+:只能进行加法运算,字符串形式数字可以进行加法运算.

empty:判断一个容器的长度是否为0(array set list map),还可以判断一个对象是否为空,${empty 域中的对象名称}

三元运算符:  ${ 3>4?"yes":"no" }

4.el的内置对象(了解)

11个

pageScope、requestScope、sessionScope、applicationScope

param、paramValues

header、haederValues

initParam

cookie★

pageContext★

注意:除了pagecontext其余对象获取的全是map集合。

了解:和参数相关的el内置对象

    param、paramValues

例如:访问栏http://localhost/day?username=tom,则${param.username }结果为tom

了解:和请求头相关的el内置对象

    header、haederValues

例如:${headerValues["user-agent"][0] }

了解:和全局初始化参数相关的el内置对象

    initParam

参数具体在web.xml中。

pageContext:获取不是map集合,相当于jsp的pageContext内置对象

在jsp页面中获取项目名:${pageContext.request.contextPath}

5.cookie内置对象

${cookie}获取map{key=Cookie},key是cookie的名称,value是cookie本身。

例如:创建cookie: Cookie c=new Cookie("username","tom");

通过${cookie}获取相当于:{username=new Cookie("username","tom")}

若要获取名称username的cookie的value值(获取tom):${cookie.username.value}--javabean导航

获取jsession的值:${cookie.JSESSIONID.value}

6.jsp注释

html注释 <!--  -->,注释的内容只在页面上看不到  java代码和html源代码都有

java注释,只在java代码中存在

jsp注释 <%--  --%>,只在jsp页面中存在,翻译成java文件之后就没有了

三、jstl

JSTL(JSP Standard Tag Library,jsp标准标签库)是Apache对EL表达式的扩展,也就是说JSTL依赖EL表达式。JSTL是标签语言,使用起来非常方便。但是它不是jsp内置的标签,所以用的时候需要我们自己导包,以及指定标签库。

使用步骤:

    1.导入jar包 (jstl.jar和standard.jar)

    2.在页面上导入标签库:<%@taglib prefix="" uri=""%>

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

jstl的分类:core:核心类库 ★、fmt:格式化|国际化、xml:过时了、sql:过时了、函数库:很少使用

1.core

★c:if

★c:forEach

c:set 往域中设置值、c:choose 相当于switch..case

c:when

c:otherwise 分支

★c:if 判断

    <c:if test="${el表达式}">满足的时候输出的内容</c:if>

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

       3大于4

</c:if>

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

            3不大于4

</c:if>

★c:forEach 循环

格式1:

<c:forEach begin="从那里开始" end="到那里结束" step="步长" var="给变量起个名字" varStatus="循环状态变量">

            ${i }--${vs.count }--${vs.current }<br>

</c:forEach>

varStatus:用来记录循环的状态,常用的属性:count:记录次数、current:当前遍历的内容。

例如:

<c:forEach begin="1" end="20" step="2" var="i" varStatus="vs">

            ${i }--${vs.count }--${vs.current }<br>

</c:forEach>

格式2:

<c:forEach items="${el获取域中的容器}" var="n">

            ${n }

</c:forEach>

例如:

//遍历list

<c:forEach items="${list }" var="n">

                ${n }

</c:forEach>

//遍历map

<c:forEach items="${map }" var="en">

                ${en.key }-- ${en.value }<br/>

</c:forEach>

扩展:

c:set 、c:choose、c:when

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

    <c:set var="day" value="4"/><!-- 相当于 pageContext.setAttribute("day",3)  -->

    <c:choose>

        <c:when test="${day==1 }">

            周1

        </c:when>

        <c:when test="${day==2}">

            周2

        </c:when>

        <c:when test="${day==3 }">

            周3

        </c:when>

        <c:otherwise>

            其他

        </c:otherwise>

    </c:choose>

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!