动态页面技术JSP&EL&JSTL

  • Post author:
  • Post category:其他




JSP技术



概念

Java Server Pages:java 服务器端页面

  • 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
  • 用于简化书写

    原理:JSP本质上就是一个Servlet
  • JSP在第一次被访问时会被web容器翻译成Servlet,再执行。

    过程:第一次访问→helloServlet.jsp→helloServlet_jsp.java→编译运行

被翻译后的Servlet在Tomcat的work目录可以找到



JSP脚本和注释

  1. <%代码%>:内部的java代码翻译后,在Service方法中。Service方法中可以定义什么,该脚本中就可以定义什么。
  2. <%!代码%>:内部的java代码翻译后,在jsp转换后的java类的成员位置。
  3. <%=代码%>:内部的java代码翻译后,会输出到页面上[out.print()]。输出语句中可以定义什么,该脚本就可以定义什么。

JSP注释:不同的注释可见范围不同

  1. html注释:<!–注释内容 –>:可见范围JSP源码、翻译后的Servlet、页面显示html源码
  2. java注释://单行注释/*多行注释*/:可见范围JSP源码、翻译后的Servlet
  3. JSP注释:<%–注释内容–%>:可见范围JSP源码



JSP指令

JSP的指令是指导JSP翻译和运行的命令,用于配置JSP页面,导入资源文件

格式:<%@ 指令名称 属性名1=属性值1 属性名2=属性值2…%>

分类:



page:配置JSP页面,根据不同的属性,指导整个页面特性。

  • contentType:等同于response、setContentType()

    1. 设置响应体的MIME类型以及字符集
    2. 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要pageEncoding属性设置当前页面的字符集)
  • pageEncoding:当前JSP文件的本身编码,内部可以包含contenType
  • import:导入java的包
  • session:是否JSP在翻译时自动创建session
  • errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
  • isErrorPage:标识当前页面是否为错误页面

    true:是,可以使用内置对象exception

    false:否,默认值,不可以使用内置对象exception



include:页面包含的,导入页面的资源文件

页面包含(静态包含)指令,可以将一个JSP页面包含到另一个JSP页面中

格式:<%@include file=“被包含的文件地址”%>



taglib:导入资源

在JSP页面中引入标签库[JSTL标签库、struts2标签库]

格式:<%@taglib uri = “标签库地址” prefix=“前缀”%>



JSP的内置对象

在jsp页面中不需要获取和创建,可以直接使用的对象

JSP一共有9个内置对象:

名称 类型 描述
out javax.servlet.JspWriter 用于页面输出
request javax.servlet.http.HttpServletRequest 得到用户请求信息
response javax.servlet.http.HttpServletResponse 服务器向客户端的回应信息
config javax.servlet.ServletConfig 服务器配置,可以取得初始化参数
session javax.servlet.http.HttpSession 用来保存用户的信息
application javax.servlet.ServletContext 所有用户的共享信息
page java.lang.Object 指当前页面转换后的Servlet类的实例
pageContext javax.servlet.jsp.PageContext JSP的页面容器
exception java.lang.Throwable 表示JSP页面所发生的异常,在错误页才起作用
  1. out对象

    out的类型:JSPWriter

    out的作用就是向客户端输出内容,方法:out.write()

    out缓冲区默认8kb[buffer=“8kb”],可以设置成none,代表关闭out缓冲区,内容将直接写到response缓冲区
  2. pageContext对象

    JSP页面的上下文对象,作用如下:

    1. pageContext是一个域对象,范围:当前页面
    2. pageContext可以向指定的其他域中存取数据

      setAttribute(String name,Object obj,int scope)

      getAttribute(String name,int scope)

      removeAttribute(String name,int scope)

      findAttribute(String name)

      依次从pageContext域,request域,session域,application域中获取属性,某个域中获取后将不再向后寻找

四大作用域总结:

  • page域:当前JSP页面范围
  • request域:一次请求
  • session域:一次会话
  • application域:整个web应用
  1. 可以获得其他8大隐式对象

    例如:pageContext.getRequest(),pageContext.getSession()等。



JSP标签(动作)

  1. 页面包含(动态包含):<jsp:include page=“被包含的页面”/>
  2. 请求转发:<jsp:forward page=“要转发的资源”/>

思考:静态包含与动态包含的区别?

静态包含生成一个文件

动态包含生成两个文件



EL技术



EL表达式概述

概念:Expression Language 表达式语言,表达式可以嵌入在jsp页面内部

作用:要替代和简化jsp页面中脚本的编写

语法:${表达式}

注意:jsp默认支持el表达式的。如果要忽略el表达式

  1. 设置jsp中page指令中:isELIgnored=”true“忽略当前jsp页面中所有的el表达式
  2. ${表达式}:忽略当前的这个el表达式



EL表达式的使用



运算

运算符

  1. 算数运算符:+、-、*、/(div)、%(mod)
  2. 比较运算符:>、<、>=、<=、==、!=
  3. 逻辑运算符:&&(and)、||(or)、!(not)
  4. 空运算符:empty

    功能:用于判断字符串、集合、数组对象是否为null或者长度为0

    ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0

    ${not empty str}:判断字符串、集合、数组对象是否不为null并且者长度>0



获取值

el表达式只能从域对象中获得值

语法:

1. ${域名称.键名}:从指定域中获取指定键的值

域名称:

pageScope -> pageContext

requestScope -> request

sessionScope -> session

applicationScope -> application(ServletContext)

举例:在request域中存储了name = 张三

获取:${requestScope.name}

2.${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止 等同于findAttribute(String name)

3. 获取对象、List集合、Map集合的值

i 对象:${域名称.键名.属性名}

本质上会去调用对象的getter方法

ii List集合:${域名称.键名[索引]}

iii Map集合:

${域名称.键名.key名称}

${域名称.键名[“key名称”]}

举例:

  • EL获得普通字符串
  • EL获得User对象的值
  • EL获得List<String>的值
  • EL获得List<User>的值
  • EL获得Map<String,String>的值
  • EL获得Map<String,User>的值
  • EL获得Map<String,List<User>>的值
<%--EL最常用的功能:从域对象中获取数据--%>
    <%
        String name = "张三";
        request.setAttribute("name",name);
        String[] arr = new String[]{"苹果","香蕉","柿子","李子","栗子","梨"};
        request.setAttribute("strArr",arr);
        User user = new User("2","mike","12345");
        request.setAttribute("user",user);
        Car car = new Car("劳斯莱斯","黑色");
        User user1 = new User("15","jackson","12345",car);
        request.setAttribute("user1",user1);
        List<String> list = new ArrayList<>();
        list.add("面");
        list.add("饭");
        list.add("馒头");
        request.setAttribute("strList",list);
        ArrayList<User> users = new ArrayList<>();
        users.add(new User("1","lucy","111"));
        users.add(new User("2","john","222"));
        users.add(new User("3","nancy","333"));
        users.add(new User("4","rose","444"));
        request.setAttribute("userList",users);
        HashMap<String, String> strMap = new HashMap<>();
        strMap.put("yellow","黄色");
        strMap.put("red","红色");
        strMap.put("blue","蓝色");
        strMap.put("green","绿色");
        request.setAttribute("strMap",strMap);
        HashMap<String, User> userMap = new HashMap<>();
        userMap.put("Q",new User("1","q","111"));
        userMap.put("W",new User("2","w","112"));
        userMap.put("E",new User("3","e","113"));
        userMap.put("R",new User("4","r","114"));
        request.setAttribute("userMap",userMap);
        HashMap<String, List<User>> listMap = new HashMap<>();
        listMap.put("Q",users);
        listMap.put("W",users);
        listMap.put("E",users);
        listMap.put("R",users);
        listMap.put("T",users);
        request.setAttribute("listMap",listMap);
    %>
    <%--pageContext.findAttribute("name")--%>
    普通字符串类型:${name} <br>
    字符串数组类型:${strArr[2]} <br>
    User对象类型:${user.username} ${user1.car.name} <br>
    String类型的集合:${strList[1]} <br>
    User集合类型:${userList[2].username} <br>
    String Map类型:${strMap.red} <br>
    User Map类型:${userMap.E.username} <br>
    List Map类型:${listMap.W[1].username} <br>



隐式对象

el表达式中有11个隐式对象

  • pageScope、requestScope、sessionScope、applicationScope 获取jsp中域中的数据
  • param、paramValues 接收参数 等同于:request.getParameter()、request.getParameterValues()
  • header、headerValues 获取请求头信息 等同于:request.getHeader(name)
  • initParam 获取全局初始化参数 等同于:this.getServletContext().getInitParameter(name)
  • cookie WEB开发中cookie 等同于:request.getCookies()、cookie.getName()、cookie.getValue()
  • pageContext 可以获得其他八大对象

    重点:${pageContext.request.contextPath}:动态获取虚拟目录



JSTL技术



JSTL概述

JavaServer Pages Tag Library,JSP标准标签库,可以嵌入在JSP页面中使用标签的形式完成业务逻辑等功能。是由Apache组织提供的开源的免费的jsp标签。

JSTL出现的目的同EL一样也是要替换和简化JSP页面中的脚本代码

标签库 标签库的URI 前缀
Core http://java.sun.com/jsp/jstl/core c
I18N http://java.sun.com/jsp/jstl/fmt fmt
SQL http://java.sun.com/jsp/jstl/sql sql
XML http://java.sun.com/jsp/jstl/xml x
Functions http://java.sun.com/jsp/jstl/functions fn



使用步骤

  1. 导入jstl相关jar包
  2. 引入标签库:taglib指令 <%@ tablib %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • 使用标签



常用的JSTL标签



<c:if test=””>

if:相当于java代码的if语句

属性:

  • test 必须属性,接受boolean表达式

    如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容

    一般情况下,test属性值会结合el表达式一起使用

注意:c:if标签没有else情况,想要else情况,则可以再定义一个c:if标签



<c:forEach>

foreach:相当于java代码的for语句

使用方法有两种组合形式:

<%-- 1. 模拟:for (int i = 0; i <= 5; i++) { sout(i) } --%>
<%-- begin: 从⼏开始
end: 到⼏结束(包含)
var: 临时变量, 将现在循环的值 i 存⼊到了page域中
--%>
<c:forEach begin="0" end="9" step="1" var="i">
        ${i}
</c:forEach>
    <%-- 2. 模拟:String[] strList = {"lucy", "tom", "jack"};
for(String str : strList) { sout(str) }
--%>
<%-- items: 要遍历的集合或者数组
var: 遍历出来的每⼀个元素, 将这个元素存⼊到了page域中 起名为xx
varStatus: 记录当前遍历状态的对象, index-下标 count-序号
--%>
<c:forEach items="${strList}" var="str" varStatus="s">
 ${s.count} -- ${str} <br>
</c:forEach>

举例:

  • 遍历List的值
  • 遍历List的值
  • 遍历Map<String, String>的值
  • 遍历Map<String, User>的值
  • 遍历Map<User, Map<String, User>>的值
 <%
        List<String> list = new ArrayList<>();
        list.add("面");
        list.add("饭");
        list.add("馒头");
        request.setAttribute("strList",list);
        ArrayList<User> users = new ArrayList<>();
        users.add(new User("1","lucy","111"));
        users.add(new User("2","john","222"));
        users.add(new User("3","nancy","333"));
        users.add(new User("4","rose","444"));
        request.setAttribute("userList",users);
        HashMap<String, String> strMap = new HashMap<>();
        strMap.put("yellow","黄色");
        strMap.put("red","红色");
        strMap.put("blue","蓝色");
        strMap.put("green","绿色");
        request.setAttribute("strMap",strMap);
        HashMap<String, User> userMap = new HashMap<>();
        userMap.put("Q",new User("1","q","111"));
        userMap.put("W",new User("2","w","112"));
        userMap.put("E",new User("3","e","113"));
        userMap.put("R",new User("4","r","114"));
        request.setAttribute("userMap",userMap);
        HashMap<User, Map<String, User>> userMapHashMap = new HashMap<>();
        userMapHashMap.put(new User("1","q","111"),userMap);
        userMapHashMap.put(new User("2","w","112"),userMap);
        userMapHashMap.put(new User("3","e","113"),userMap);
        userMapHashMap.put(new User("4","r","114"),userMap);
        request.setAttribute("userMapHashMap",userMapHashMap);
    %>
    <%--循环List类型--%>
    <c:forEach items="${strList}" var="str">
        ${str} <br>
    </c:forEach>
    <%--循环user类型的集合--%>
    <c:forEach items="${userList}" var="user">
        ${user.id} -- ${user.username} -- ${user.password} <br>
    </c:forEach>
    <%--循环map--%>
    <c:forEach items="${strMap}" var="entry">
        ${entry.key} -- ${entry.value} <br>
    </c:forEach>
    <%--循环map<String,User>--%>
    <c:forEach items="${userMap}" var="entry">
        ${entry.key} -- ${entry.value.id} -- ${entry.value.username} -- ${entry.value.password} <br>
    </c:forEach>
    <%--循环Map<User, Map<String, User>>--%>
    <c:forEach items="${userMapHashMap}" var="entry">
        ${entry.key.id} -- ${entry.key.username} -- ${entry.key.password} --
        <c:forEach items="${entry.value}" var="entry1">
            ${entry1.key} -- ${entry1.value.id} -- ${entry1.value.username} -- ${entry1.value.password}
        </c:forEach> <br>
    </c:forEach>



版权声明:本文为weixin_51973131原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。