JAVAEE我爱编程

JAVAEE——动态页面技术JSP EL JSTL

2018-03-29  本文已影响117人  So_ProbuING

JSP技术

jsp脚本和注释

jsp脚本:

<%=hello jsp%>
在翻译后java文件后,形成的翻译代码为:
out.write("hello jsp");

jsp注释: 不同的注释可见范围是不同

jsp运行原理-----jsp本质就是servlet

jsp在第一次被访问时会被Web容器翻译成servlet
在执行过程:

第一次访问---->helloServlet.jsp---->helloServlet_jsp.java---->编译运行
PS:被翻译后的servlet在Tomcat的work目录中可以找到

jsp指令(3个)

jsp的指令是指导jsp翻译和运行的命令,jsp包括三大指令:

page指令

属性最多的指令(实际开发中page指令默认)
属性最多的一个指令,根据不同的属性,指导整个页面特性
格式:<%@ page 属性名1= "属性值1" 属性名2= "属性值2" ...%>
常用属性如下:

include指令

页面包含(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中
格式:

<%@ include file="被包含的文件地址"%>

taglib指令

在jsp页面中引入标签库(jstl标签库、struts2标签库)
格式:

<%@ taglib uri="标签库地址" prefix="前缀"%>

jsp内置/隐式对象(9个)

jsp被翻译成servlet之后,service方法中有9个对象定义并初始化完毕,我们在jsp 脚本中可以直接使用这9个对象

名称 类型 描述
out javax.servlet.jsp.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页面所发生的异常,在错误页中才起作用

out对象

out的类型:JspWriter
out作用就是想客户端输出内容----out.write()
out有自己的缓冲区,缓冲区默认8kb 可以设置成0 代表关闭out缓冲区 内容直接写到respons缓冲器

看一个案例

<html>
<head>
    <title>$Title$</title>
</head>
<body>
<%
    out.write("bbbbbbbbbb");
    response.getWriter().write("cccccccccccc");
%>
<%="dddddddddddddd"%>
aaaaaaaaaaaa
</body>
</html>

输出 cccccccccccc aaaaaaaaaaaa bbbbbbbbbb dddddddddddddd
分析


out缓冲区.png

由于out缓冲区最后要输出到response缓冲区来进行响应显示,所以会出现输出顺序的问题

pageContext对象

jsp页面的上下文对象,作用如下:
page对象与pageContext对象不是一回事

setAttribute(String name,Object obj)
getAttribute(String name)
removeAttrbute(String name)
setAttribute(String name,Object obj,int scope) 指定作用范围
getAttribute(String name,int scope)
removeAttrbute(String name,int scope)
findAttribute(String name) 会从域的范围从小到大搜索范围中的name
依次从pageContext域 request域 session域 application域

四大作用域的总结:
page域:当前jsp页面范围
request域:一次请求
session域:一次会话
application域:整个web应用

通过PageContext获得其他8大对象

  //获取request对象
    pageContext.getRequest();
    //获取out对象
    pageContext.getOut();
    //获取response对象
    pageContext.getResponse();
    //获取session对象
    pageContext.getSession();
    //获取exception对象
    pageContext.getException();
    //获取config对象
    pageContext.getServletConfig();
    //获取ServketContext
    pageContext.getServletContext();
    //获取page对象
    pageContext.getPage();

jsp标签(动作)

静态包含和动态包含的区别

静态与动态包含区别.png

EL技术

EL 表达式概述

EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写。

EL从域中取出数据

---同样是依次从pageContext域,request域,session域,application域中 获取属性,在某个域中获取后将不在向后寻找

示例代码

 <%
        //request中存放数据
        request.setAttribute("name", "张三");
        //pageContext域中取出数据
        pageContext.setAttribute("namepage", "pageContext");
        //session域中存储对象
        User user = new User();
        user.setAge(22);
        user.setName("user");
        user.setEmail("xxx@xxx");
        session.setAttribute("user", user);
        //application域中存储一个集合
        ArrayList<User> users = new ArrayList<User>();
        User user1 = new User();
        user1.setAge(23);
        user1.setName("user1");
        user1.setEmail("user1@xxx.com");

        User user2 = new User();
        user2.setName("user2");
        user2.setAge(23);
        user2.setEmail("user2@xxx.com");
        User user3 = new User();
        user3.setAge(24);
        user3.setName("USER3");
        user3.setEmail("user3@xxx.com");
        users.add(user1);
        users.add(user2);
        users.add(user3);
        application.setAttribute("users", users);
    %>

    <%--jsp脚本方式取出数据--%>
    <%=request.getAttribute("name")%>
    <%=pageContext.getAttribute("namepage")%>
    <%=((User) session.getAttribute("user")).toString()%>
    <%=((User) ((ArrayList) application.getAttribute("users")).get(2)).getName()%>
    <%--el表达式取出数据--%>
    ${requestScope.name}
    ${pageContext.getAttribute("name")}
    ${sessionScope.user}
    ${applicationScope.users[2].name}
    <%--el表达式全局搜索--%>
    ${name}
    ${namepage}
    ${users[1]}
    ${user.name}

EL内置对象 11个对象

相当于
request.getParameter() request.getParameterValues()
相当于
request.getHeader(name)
request.getHeaders()
相当于
this.getServletContext().getInitParameter()
request.getCookies()----cookie.getName()----cookie.getValue()
pageContext作为jsp页面的上下文对象,可以获取其他的8大对象

示例代码

$(pageContext.request.contextPath)
相当于
<%=pageContext.getRequest().getContextPath%>
这行代码不能实现原因:获得的Request 不是HttpRequest
获得WEB应用的名称

EL执行表达式运算

<%--el执行表达式--%>
${1+1}
${1==1?"yes":"no"}
<%--判断对象是否为空  先在域中取出对象 再判断是否为空--%>
${empty ""}

JSTL技术

标签库 标签库的UR 前缀
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

JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能。jstl出现的目的同el一样也是要提到jsp页面中的脚本代码。JSTL标准标准标签库有5个子库,但随着发展,目前常使用的是他的核心库

标签库 标签库的UR 前缀
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

JSTL下载与导入

JSTL下载:
从Apache的网站下载JSTL的JAR包。进入 “http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/”网址下载 JSTL的安装包。jakarta-taglibs-standard-1.1.2.zip,然后将下载好的JSTL安装包 进行解压,此时,在lib目录下可以看到两个JAR文件,分别为jstl.jar和standard.jar。 其中,jstl.jar文件包含JSTL规范中定义的接口和相关类,standard.jar文件包含用于 实现JSTL的.class文件以及JSTL中5个标签库描述符文件(TLD)

需要导入的包
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

JSTL核心库的常用标签

 <%--test代表的返回boolean的表达式条件--%>
    <%--if块--%>
    <c:if test="${1==1}">
        xxx
    </c:if>
    <%--else块--%>
    <c:if test="${1!=1}">
        yyy
    </c:if>
 <%
        request.setAttribute("count",9);
    %>
    <c:if test="${count==9}">
        xxxdddd
    </c:if>
  从0开始从5结束 将结果赋值给i
    <c:forEach begin="0" end="5" var="i">
        ${i}<br>
    </c:forEach>
<%
    ArrayList<String> strings = new ArrayList<String>();
    strings.add("aaa");
    strings.add("bbb");
    strings.add("ccc");
    strings.add("ddd");
    application.setAttribute("strings", strings);
%>
<c:forEach items="${strings}" var="str">
    ${str}<br/>
</c:forEach>
  Map<String, Integer> maps = new HashMap<String, Integer>();
    maps.put("aaa", 111);
    maps.put("bbb", 222);
    maps.put("ccc", 333);
    maps.put("ddd", 444);
    request.setAttribute("maps", maps);
<%--从map中取出数据--%>
<c:forEach items="${maps}" var="entry">
    ${entry.key}:${entry.value}
</c:forEach>

javaEE的三层架构

javaEE三层架构.png
上一篇 下一篇

猜你喜欢

热点阅读