java第二阶段之web服务器(二)JSP&EL表达式

一、JSP简介

        JSP(全称Java Server Pages)java服务器页面。 是一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。

        JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求,是简化版的Servlet。

        执行的过程为  xxx.jsp---->xxx.java---->xxx.class

二、使用策略

        1.纯碎的HTML使用

        语法和使用HTML的用法完全一样,可以包含css,javaScript,Jquery等

        2.纯粹的Servlet使用

        以<% java代码片段 %>写法显示在jsp页面,相当于Servlet中 的service方法 如果是Java代码写成什么样显示什么样

        3.HTML + Servlet使用

        如果写的html代码 相当于 out.write("<a></a>")

        但是我们需要注意:

                jsp 只用来显示数据  不处理业务

                Servlet 只处理业务

三、JSP核心

        Jsp的内容包含除了以上的html,css,js,jquery,java代码外,还可以包含JSP相关指令,主要作用用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。

(一)三大指令

        1、page指令

        <%@page 属性名="值" 属性名="值" %> 控制整个jsp页面的配置信息

        常用的属性:

                language="java"         支持的语言

                contentType="text/html; charset=UTF-8"         内容类型

                pageEncoding="UTF-8"         页面的编码格式

                import="java.util.List,java.util.ArrayList"         导入jar

                autoFlush="true"         自动刷新

                errorPage="03-error.jsp"         如果当前页面抛异常 跳转指定页面

                session="true"         当前页面中可以直接使用该对象

                isELIgnored="false"         是否忽略EL表达式

        2、include指令

        页面包含说的是一个页面可以包含另一个页面的内容,并且能正常加载。

        语法:<%@include file=”被包含的页面名称” %>

        include指令的主要作用:可以将页面公共的部分提取出来,让每个页面包含这个公共的页面,一是为了减少代码量,二是易于手续的维护。

        3、taglib指令

        后面使用JSTL标准标签库时使用。语法:<%@taglib prefix="前缀" uri="引入外部标签库的路径" %>

(二)六大动作

        1、作用:

        JSP动作标签利用XML语法格式的标记来控制Servlet引擎的行为。利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。

        2、演示

        ①<jsp:forward ></jsp:forward> 完全转发

          <jsp:forward page="01-login.jsp"></jsp:forward>

        ② <jsp:include ></jsp:include> 部分转发 也成为动态包含

          <jsp:include page="01-login.jsp"></jsp:include>

        ③ <jsp:useBean></jsp:useBean>

        <%-- 3. 创建实体类对象 --%>

            <jsp:useBean id="users01"class="com.ujiuye.bean.Users"></jsp:useBean>

        ④ <jsp:setProperty />

          <%-- 实体类对象中赋值 --%>

          <jsp:setProperty property="username"name="users01" value="王二小"/>

        ⑤ <jsp:getProperty />

          <%-- 获取对象中的属性值 --%>

          <jsp:getProperty property="username"name="users01"/>

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

        ①写法不同:

                静态包含是指令包含<%@include file=”***”%>

                动态包含是JSP动作标签包含<jsp:include page="***"></jsp:include>

        ②编译方式不同:

                静态包含:编译过程中将被包含的页面先整合到包含页面再编译。所以只有一个文件

                动态包含:编译过程中包含的页面与被包含的页面都编译,运行后内容再通过servlet整合

        ③参数传递:

                静态包含不能向被包含页面传递参数

                动态包含可以使用jsp:param标签向被包含页面传递参数

        ④运行效率:

                静态包含快,当成了一个页面;

                动态包含是多个页面,运行慢。

(三)九大内置对象

        1、对象介绍

        内置对象:也称隐式对象,在jsp中,已经初始化好并且给我们封装好了,不需要程序员创建,可以直接使用的对象就是内置对象。

        对象名                   功能                                    类型

        Out                  页面输出对象                         JspWriter

        Exception         异常处理对象                      Throwable

        Page                 描述页面的对象                      Object

        PageContext    页面的全局对象【作用域】  PageContext

        Request          请求对象【作用域】        HttpServletRequest  

        Response         响应对象                       HttpServletResponse

        Session         会话对象【作用域】           HttpSession

        Config                 配置                           ServletConfig

        Application     服务器对象【作用域】      ServletContext

        这些内置对象在Jsp页面都是存在的,我们可以直接使用;

        这里默认能显示的内置对象共8个,还有一个特殊的对象

        Exception关于异常的,只有在page指令中设置isErrorPage="true"时才会显示。

        可以通过以下方式获取:

        pageContext.getException() //获取异常对象

        2、对象详解

        ①application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。该对象的类型是SevletContext类型,它的生命周期在tomcat服务器启动时创建,关闭时销毁。其作用范围为整个Web应用。

        ②request 对象是 javax.servlet.HttpServletRequest类型的对象。该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。request对象的作用域为一次请求。

        ③response 对象是 javax.servlet.HttpServletRsponse类型的对象。该对象代表客户端的响应信息,主要是将JSP容器处理过的对象信息返回到客户端。

        ④config 对象的主要作用是取得服务器的配置信息。通过pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。

        ⑤page:当前jsp页面的实例,相当于this关键字。

        ⑥session:会话对象。session 对象是由服务器自动创建与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。其作用范围为一次会话。

        ⑦exception对象的作用是显示异常信息,只有在包含isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的exception 对象。

        ⑧out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。JSP中的out对象是JspWriter类型。

        ⑨pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,可以获取项目的根目录,还可通过getXXX()获取其他内置对象

        3、四大作用域

        ①application 作用域

         如果把变量放到application里,就说明它的作用域是application,它的有效范围是整个应用。 整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。 application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。

        ②session作用域

           session作用域比较容易理解,同一浏览器对服务器进行多次访问,在这多次访问之间传递信息,就是session作用域的体现。如果把变量放到session里,就说明它的作用域是session,它的有效范围是当前会话。所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。也就是说,只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量,就可以在当前会话的所有请求里使用。

        ③request作用域

         一个HTTP请求的处理可能需要多个Servlet合作,而这几个Servlet之间可以通过某种方式传递信息,但这个信息在请求结束后就无效了。request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了。如果把变量放到request里,就说明它的作用域是request,它的有效范围是当前请求周期。 所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。在这个过程中可能使用forward的方式跳转了多个jsp页面,在这些页面里你都可以使用这个变量。

        ④.pageContext作用域

        page对象的作用范围仅限于用户请求的当前页面,对于page对象的引用将在响应返回给客户端之后被释放,或者在请求被转发到其他地方后被释放。page里的变量只要页面跳转了,它们就不见了。如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。从把变量放到pageContext开始,到jsp页面结束,你都可以使用这个变量。

(四)EL表达式

        1、简介

        EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。

        2、作用

        是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)通过以下方式:

        在JSP页面的任何静态部分均可通过:${expression}来获取到指定表达式的值

        包含以下几种方式:

                ${绑定名} 获取javaBean对象或者其他类型数据

                ${绑定名.属性名} 获取javaBean中对应的属性名

                ${绑定名[索引值]} 获取集合或者数组中对应的值

                ${绑定名["key"]} 通过key的值获取在Map中对应的value值

        同样也可以在el表达式内部做一些简单的运算

        3、原理

        依次从四大作用域对象检索对应的绑定名,如果在某一个对象中获取到了,则不再去其他对象检索,否则继续检索,如果都没有查找到则返回的是一个空字符串,而不是null

        如果如下操作时:以表达式${user.name}为例

        EL表达式会根据name去User类里寻找这个name的get方法,此时会自动把name首字母大写并加上get前缀,一旦找到与之匹配的方法,El表达式就会认为这就是要访问的属性,并返回属性的值。所以,想要通过EL表达式获取对象属性的值,那么这个属性就必须有与之对应的get方法。

        可以通过指定检索四大作用域对象来提升检索速度,如下:

        application-->applicationScope

        session-->sessionScope

        request-->requestScope

        pageContext-->pageScope

        比如:

        ${requestScope.user} 表示直接去request对象中获取user绑定名对应的值

(五)JSTL标签库

        1、简介

        JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库。它主要提供给JavaWeb开发人员一个标准通用的标签,开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。

        需要注意的是:jstl中需要获取值的地方一般都要配合EL表达式去使用

        2、使用

        ①导入

        jstl.jar standard.jar 两个包

        ②引入

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

        ③常用标签

                1).<%--声明变量标签--%>

                        <c:set var="name" value="柳岩"></c:set>

                        var:声明的变量名

                        value:变量的值

                2).<%--输出标签--%>

                        <c:out value="${name}" ></c:out>

                        value:要输出的变量的值,需要通过el表达式获取

                3).<%--删除声明变量--%>

                        <c:remove var="name"></c:remove>

                        var:删除要删除的变量的名字

                4).<%--if单分支标签--%>

                        <c:if test="${empty name}">测试if分支标签1</c:if>

                        test:当值为true的时候显示标签内部的值,否则不显示

                5).<%--choose多分支标签--%>

                        <c:choose>

                        <c:when test="${1>2}">第一个条件的标签内容</c:when>

                        <c:when test="${3>2}">第二个条件的标签内容</c:when>

                        <c:otherwise>以上条件都不满足的标签内容</c:otherwise>

                        </c:choose>

                当when标签的test的值为true的时候,显示标签内容,否则不显示,当多个when标签都为true的时候,值显示第一个为true的when标签内容,如果以上when标签都为false则显示otherwise的标签内容

                注意:

                        when标签出现至少一个

                        otherwise标签最多出现一个

                6).<%--集合或者数组的遍历标签--%>

                        <c:forEach items="" var="" ></c:forEach>

                        items:要遍历的集合或者数组对象,需要通过el表达式获取

                        var:循环变量,可以理解为集合或者数组中的每一个值或者对象,名称自定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皇正经

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值