JSP学习

JSP

全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它[1]  是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。

原理:

  jsp实质上是servlet,jsp访问时,会生成一个.java和.class文件来处理数据。通过out.write()进行输出(默认),其中的java类继承自httpServlet就是一个证据。

当然也可以用response.getWrite().write进行输出文字。

重定向和转发

重定向-----修改用户请求

转发------转发用户请求。

 四大域对象:

java与jsp间常常通过域对象进行数据传递

pageContext:整个页面共享

request:转发的页面共享

session:整个会话过程共享

application:整个工程共享

九大内置对象:

request:请求对象,获取请求信息

pageContext:当前页面上下文对象

session:会话对象。可以获取会话信息。

application:ServletContext对象实例,可以获取整个工程的一些信息。

exception:异常对象只有在jsp页面的page 指令中设置 isErrorPage="true" 的时候才会存在

config:ServletConfig对象实例,可以获取Servlet的配置信息

out:输出流

page:表示当前Servlet对象实例(无用,用它不如使用this对象)

response:响应对象。可以设置响应信息

九大内置对象,都是我们可以在【代码脚本】中或【表达式脚本】中直接使用的对象。

jsp中的三种脚本介绍

1)第一种,声明脚本:

声明脚本格式如下:

<%!   

java 代码

%>

在声明脚本块中,我们可以干4件事情

1.我们可以定义全局变量。

2.定义static静态代码块

3.定义方法

4.定义内部类

几乎可以写在类的内部写的代码,都可以通过声明脚本来实现

2)第二种,表达式脚本(***重点,使用很多):

表达式脚本格式如下:

<%=表达式  %> 

表达式脚本 用于向页面输出内容。

表达式脚本 翻译到Servlet程序的service方法中 以 out.print() 打印输出

out 是jsp的一个内置对象,用于生成html的源代码

注意:表达式不要以分号结尾,否则会报错

表达式脚本可以输出任意类型。

比如:

1.输出整型

2.输出浮点型

3.输出字符串

4.输出对象

    <%-- 测试当前页面作用域 --%>
    <%=pageContext.getAttribute("key") %><br/>
    <%=request.getAttribute("key") %><br/>
    <%=session.getAttribute("key") %><br/>
    <%=application.getAttribute("key") %><br/>

表达式脚本 用于向页面输出内容。

3)第三种,代码脚本(*****重点,使用最多):

代码脚本如下:

<%  java代码  %>

代码脚本里可以书写任意的java语句。

代码脚本的内容都会被翻译到service方法中。

所以service方法中可以写的java代码,都可以书写到代码脚本中

<%
        // out输出
        out.write("这是out的第一次输出<br/>");
        // out flush之后。会把输出的内容写入writer的缓冲区中
        out.flush();
        // 最后一次的输出,由于没有手动flush,会在整个页面输出到客户端的时候,自动写入到writer缓冲区
        out.write("这是out的第二次输出<br/>");
        // writer的输出
        response.getWriter().write("这是writer的第一次输出<br/>");
        response.getWriter().write("这是writer的第二次输出<br/>");
    %>

代码脚本执行代码逻辑

在jsp中使用纯java代码或java表达式会使jsp页面太笨重,所以引进EL表达式和JSTL

E L的全称:Expression Language,就是表达式语言。可以输出表达式的值。跟jsp的表达式脚本一样。计算表达式的值后输出。 

EL表达式出现的目的是为了使JSP写起来更加简单,让jsp的代码更佳简化。
EL表达式的最主要功能就是从域对象中获取数据,并且输出

EL表达式,获取域对象数据(*****重点)

使用EL表达式获取数据的语法: “${标识符}”

第一点:当EL表达式输出的key不存在的时候,输出的是空串””

第二点:EL表达式在域对象中搜索属性的顺序是pageContext,request,session。Application

EL表达式可以从域对象中获取数据

1、EL表达式获取域数据的顺序

EL 表达式语句在执行时,会用标识符为关键字分别从page、request、session、application四个域中查找对应key的对象。

找到则返回相应数据。找不到则返回空串。(注意,不是null,而是空字符串)

1.2、EL表达式,获取域对象数据(*****重点)

使用EL表达式获取数据的语法: “${标识符}”

第一点:当EL表达式输出的key不存在的时候,输出的是空串””

第二点:EL表达式在域对象中搜索属性的顺序是pageContext,request,session。Application

EL表达式可以从域对象中获取数据

1、EL表达式获取域数据的顺序

EL 表达式语句在执行时,会用标识符为关键字分别从page、request、session、application四个域中查找对应key的对象。

找到则返回相应数据。找不到则返回空串。(注意,不是null,而是空字符串)

2、获取javaBean普通属性、数组属性、List集合属性,以map属性中的数据。

例如:

${  user.username  }    // 获取user对象中。username属性值

${  list[0]  }                     // 访问有序集合(或数组)中给定索引的元素

${  map.key  }                        // 访问map集合中指定key的属性值

${      map[“key”]       }                 // 访问特殊字符串的key的属性值

注意:[] 中括号除了可以访问带有顺序的集合和数组的元素之外。

还可以访问特殊的key

1.3、EL 表达式--运算。

1)关系运算

2)逻辑运算

3)算数运算

4)empty运算符(***常用)

empty运算是判断一个对象或者集合是否为空。返回boolean值。

 

对象为null时,返回true

如果是空的字符串,返回true

如果是空的Object数组(Object数组.length == 0),返回true

空的集合,返回true

空的map,返回true

empty运算测试代码:

<h1>EL empty 运算</h1>
对象为null,empty为真 ---->>>>${ empty nullObject }<br/>
空的字符串,empty为真------>>>>${ empty emptyStr }<br/>
空的数组,empty为真------>>>>${ empty emptyArr }<br/>
空的list集合,empty为真---->>>>${ empty emptyList }<br/>
空的map集合,empty为真----->>>>${ empty emptyMap }<br/>

1.4、EL表达式中11个隐含对象。

EL表达式 中隐含11个对象,这11个对象我们都可以直接使用!!!

1.5、EL表达式获取域对象中的数据(****重点)

pageScope                       <=== 对应 ===>              pageContext        域中的属性

requestScope                  <=== 对应 ===>              request                域中的属性

sessionScope                   <=== 对应 ===>              session                 域中的属性

applicationScope               <=== 对应 ===>              ServletContext    域中的属性

<%     
    // 在四个域中存放数据,进行获取
    pageContext.setAttribute("key", "pageContext-value");
    request.setAttribute("key", "request-Value");
    session.setAttribute("key", "session-value");
    application.setAttribute("key", "application-value");
%>
<%-- 从不同的域中获取数据 --%>
page域中key的值:${ pageScope.key }<br/>
request域中key的值:${ requestScope.key }<br/>
session域中key的值:${ sessionScope.key }<br/>
application域中key的值:${ applicationScope.key }<br/>

1.6、pageContext访问Jsp中内置对象(用的不多)。

通过pageContext对象。我们可以直接获取jsp中的一些内置对象,

比如:

request对象,

session对象,

Servletconfig对象,

ServletContext对象,

然后获取一些我们需要的信息。

常用的功能获取

协议:

服务器ip:

服务器端口:

获取工程路径:

获取请求方法:

获取客户端ip地址:

获取会话的id编号:

pageContext使用示例代码

<body>
协议:${ pageContext.request.scheme }<br/>
服务器ip:${ pageContext.request.serverName }<br/>
服务器端口:${ pageContext.request.serverPort }<br/>
获取工程路径:${ pageContext.request.contextPath }<br/>
获取请求方法:${ pageContext.request.method }<br/>
获取客户端ip地址:${ pageContext.request.remoteHost }<br/>
获取会话的id编号:${ pageContext.session.id }<br/>
</body>

pageContext对象最常用的功能就是获取上下文路径(也就是工程路径名)

 

工程名(上下文路径):${ pageContext.request.contextPath }

但是在实际项目中。为了缩短代码量,会把request对象放在pageContext域对象中。然后再使用,比如说

<%

// 先把request对象放到pageContext域对象中

pageContext.setAttribute(“req”,request);

%>

然后EL表达式代码改为

工程名(上下文路径):${ req.contextPath }

1.7、EL表达式其他隐含对象的使用。

jsp的常用标签(重点****)

<%--  静态包含 --%>

<%--  动态包含 --%>

<%--  转发 --%>

2、JSTL标签库(次重点****)

JSTL标签库 全称是指 JSP Standard Tag Library  JSP标准标签库。是一个不断完善的开放源代码的JSP标签库。

EL表达式主要是为了替换jsp中的表达式脚本,而标签库则是为了替换代码脚本。这样使得整个jsp页面变得更佳简洁。

JSTL由五个不同功能的标签库组成。

在jsp标签库中使用taglib指令引入标签库
  CORE 标签库

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

  XML 标签库

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

  FMT 标签库 

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

  SQL 标签库

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

  FUNCTIONS 标签库

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

 此处省略...................................

jsp的常用标签(重点****)

1)静态包含--很常用

<%@ include file="" %>

静态包含是把包含的页面内容原封装不动的输出到包含的位置。

2)动态包含--少用

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

动态包含会把包含的jsp页面单独翻译成servlet文件,然后在执行到时候再调用翻译的servlet程序。并把计算的结果返回。

动态包含是在执行的时候,才会加载。所以叫动态包含。

3)页面转发--常用

    <jsp:forward page=""></jsp:forward> 

<jsp:forward 转发功能相当于

request.getRequestDispatcher("/xxxx.jsp").forward(request, response); 的功能。

原文地址:https://www.cnblogs.com/limingxian537423/p/7056911.html