1. 什么是JSP

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

JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和 容易。

*.html 静态页面(包含固定的页面内容)

*.jsp 动态页面(页面数据可以动态更新,支持嵌套java代码和html代码)

2. JSP为什么会出现

1.servlet展示信息的不方便,引入了JSP。

2.JSP本质上也是一个servlet!!!!!!

3.JSP就是在HTML页面中嵌入了java代码。

3.JSP中如何嵌套java代码

答案:小脚本(<% java代码%>)

语法

声明标签 <%!变量或者方法声明%>
表达式标签 <%= 表达式%> 在页面上显示的效果
程序代码标签 <%java代码%> 页面上动态展示内容

page指令:

<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*"%>
//定义变量和方法
<body>
<%! int i=10;%><!--成员变量-->
<%! public void show(){}%> <!--成员方法-->
i的值是:<%=i%> <!--输出变量值-->
</body>

如何把一个数据存在request域中

取值操作如下:

jsp中的注释

<!-- html注释内容,查看源码时能看到-->

<%-- jsp注释,查看页面源码时看不到 --%>

4. JSP的原理

当浏览器访问http://localhost:8080/day9_1/index.jsp。服务器发现后缀为.jsp,它会根据路径找到index.jsp文 件,会将index.jsp翻译成index_jsp.java文件,对这个java文件进行编译,产生一个index_jsp.class文件,将class 文件加载运行。

将JSP翻译成java文件,它是将JSP中的所有的HTML代码通过流进行输出,也就是说最终翻译成 class,被虚拟机加载,它本质是servlet,它就会往回响应,响应回去就是把JSP中的HTML代码以流的方式写回浏览器。所以在JSP中展示出了HTML代码

5. JSP的内置对象

JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、

pagecontext、config、page、exception

https://www.cnblogs.com/liuyangv/p/8059848.html

1、request对象

request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于

接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的

作用域为一次请求。

方法名

说明

getAttribute

获取指定属性的值,如该属性值不存在返回Null

getAttributeNames

获取所有属性名的集合

getCookies

获取所有Cookie对象

getCharacterEncoding

获取请求的字符编码方式

getInputStream

返回请求输入流,获取请求中的数据

getParameter

获取指定名字参数值

getParameterValues

获取指定名字参数的所有值

getRemoteAddr

获取客户端的IP地址

getSession

获取和请求相关的会话

getServerPath

获取客户端请求文件的路径

removeAttribute

删除请求中的一个属性

setAttribute

设置指定名字参数值

... 

2、response对象

response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作

用域,它只在JSP页面内有效。所属类型:HttpServletResponse

方法名

说明

addCookie

添加一个Cookie对象

addHeader

添加Http文件指定名字头信息

sendError

向客户端发送错误信息

sendRedirect

把响应发送到另一个位置进行处理(重定向)

getOutputStream

返回到客户端的输出流对象

... 

3、session对象

session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为“Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。HttpSession

方法名

说明

getAttribute

获取指定名字的属性

getAttributeNames

获取session中全部属性名字,一个枚举

getCreationTime

返回session的创建时间

getId

获取会话标识符

getMaxInactiveInterval

返回session对象的生存时间单位千分之一秒

isNew

每个请求是否会产生新的session对象

removeAttribute

删除指定名字的属性

setAttribute

设定指定名字的属性值

... 

4、application对象

application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用

中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量” ServletContext

可以使用application对象来实现页面访问次数记录的功能:

<%
    Object obj=application.getAttribute("counter");
    if (obj==null){
        application.setAttribute("counter",new Integer(1));
        out.println("该页面被访问了1次<br/>");
    }else {
        int countValue=new Integer(obj.toString());
        countValue++;
        out.println("该页面被访问了"+countValue+"次<br/>");
        application.setAttribute("counter",countValue);//java会自动装箱

    }
%>

区别:

request:单次请求

session:浏览器访问期间(会话期间)

application:服务器启动期间,所存的数据可以跨浏览器

<%
   request.setAttribute("req","request的值");
   session.setAttribute("sessionkey","session的值");
   application.setAttribute("app","application的值");
%>
小脚本方式获取:<br>
request=  <%=request.getAttribute("req") %><br>
session=  <%=session.getAttribute("sessionkey") %><br>
application=<%=application.getAttribute("app")%><br>

方法名

说明

getAttribute

获取应用对象中指定名字的属性值

getAttributeNames

获取应用对象中所有属性的名字,一个枚举

getInitParameter

返回应用对象中指定名字的初始参数值

getServletInfo

返回Servlet编译器中当前版本信息

setAttribute

设置应用对象中指定名字的属性值

5、out 对象

out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

示例:

out.print("<script type='text/javascript'>alert('用户名不存
在');location.href='index.jsp'</script>");

方法名

说明

print或println

输出数据

newLine

输出换行字符

flush

输出缓冲区数据

close

关闭输出流

clear

清除缓冲区中数据,但不输出到客户端

clearBuffer

清除缓冲区中数据,输出到客户端

getBufferSize

获得缓冲区大小

getRemaining

获得缓冲区中没有被占用的空间

isAutoFlush

是否为自动输出

6、pageContext 对象

pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用pageContext对象。

 <% pageContext.setAttribute("pa","pageContext的值");%>
pageContext=<%=pageContext.getAttribute("pa")%>

方法名

说明

forward

重定向到另一页面或Servlet组件

getAttribute

获取某范围中指定名字的属性值

findAttribute

按范围搜索指定名字的属性

removeAttribute

删除某范围中指定名字的属性

setAttribute

设定某范围中指定名字的属性值

getException

返回当前异常对象

getRequest

返回当前请求对象

getResponse

返回当前响应对象

getServletConfig

返回当前页面的ServletConfig对象

getServletContext

返回所有页面共享的ServletContext对象

getSession

返回当前页面的会话对象

... 

7、config 对象

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

//将image路径转换成服务器端的路径
String url= config.getServletContext().getRealPath("/image");
<h1>url=<%=url %></h1>

方法名

说明

getServletContext

返回所执行的Servlet的环境对象

getServletName

返回所执行的Servlet的名字

getInitParameter

返回指定名字的初始参数值

getInitParameterNames

返回该JSP中所有的初始参数名,一个枚举

 

 

8、page 对象

page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。

方法名

说明

toString

将当前项目的信息打印出来

getClass

返回当前的object类

hashCode

返回page对象的hashCode值

equals

用于比较对象是否与当前对象相同

9、exception 对象

exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。

exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况;

如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

(1)先在可能发生错误的页面中添加errorPage属性,使其跳到自定义的错误提示页面error.jsp:

<%@ page pageEncoding="utf-8"
errorPage="error.jsp"
contentType="text/html;charset=UTF-8" language="java" %>

(2) 在error.jsp页面中设置isErrorPage="true" 的属性

(使用exception对象之前,需要先将当前页面设置成错误页面)

<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>

jsp的作用域:

pageContext -> request -> session -> application

当前页面 单次请求有效 当前会话期间 服务器运行期间有效

 

6. JSP的指令

JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。

语法格式如下:

<%@ directive attribute="value" %>
directive:指令名称 attribute 属性名 value:属性值

(1)Page指令

Page指令为容器提供当前页面的使用说明一个JSP页面可以包含多个page指令

Page指令的语法格式:

<%@ page attribute="value" %>

(2) Include指令

JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好

像是该JSP文件的一部分,会被同时编译执行。

Include指令的语法格式如下:

<%@ include file="文件相对 url 地址" %>

include 指令中的文件名实际上是一个相对的 URL 地址。

<%@ include file="bottom.jsp"%>

如果您没有给文件关联一个路径,JSP编译器默认在当前路径下寻找。 

(3)Taglib指令

JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。

Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。

<%@ taglib uri="uri" prefix="" %>

uri属性确定标签库的位置,prefix属性指定标签库的前缀(可自定义)。

7. JSP出现的状态码

8. EL表达式

(1)什么Expression Language 表达式语言

最初定义于JSTL1.0部分

在JSP2.0中,EL从JSTL中剥离出来,放置在JSP规范中,称为JSP2.0规范的一部分

在JSP中使用EL表达式,可以简化对象和变量的访问是EL表达式

(2)EL表达式语法

语法格式:${需要展示信息的名字}

注意:

当表达式没有指定变量或者对象的范围时,

那么容器会依次从pageContext—>request—>session—>application中查找该变量或对象,我们可以通过隐含

对象获得指定作用域的值:

pageScope对象,用于获取当前页面的属性值

requestScope对象,用于获取请求范围的属性值

sessionScope对象,用于获取会话范围的属性值

applicationScope对象,用于获取程序范围的属性值

语法:

${requestScope.key}
<%
   request.setAttribute("req","request的值");
   session.setAttribute("sessionkey","session的值");
   application.setAttribute("app","application的值");
   pageContext.setAttribute("pa","pageContext的值");


    //   pageContext.setAttribute("k1","pageContext的值-k1");
       application.setAttribute("k1","application的值-k1");
       request.setAttribute("k1","request的值-k1");
       session.setAttribute("k1","session的值-k1");


   %>
<hr>
     小脚本方式获取:<br>
   request=  <%=request.getAttribute("req") %><br>
     session=  <%=session.getAttribute("sessionkey") %><br>
  application=<%=application.getAttribute("app")%><br>
     pageContext=<%=pageContext.getAttribute("pa")%>
  <%  out.print("<script>alert('aaaa');</script>"); %>
 url= <%=config.getServletContext().getRealPath("/image")  %>
<hr>
     <h1>el表达式获取的</h1>
     request= ${req}<br>
     session=${sessionkey}<br>
     application=${app}<br>
     pageContext=${pa}
    k1=${sessionScope.k1}
  <% /*System.out.println(7/0);*/%>
  <%@ include file="bottom.jsp"%>

 

(3)EL中基础操作符

 示例:

<body>
<%  int k=20;
request.setAttribute("k1",k);
    Users users = new Users();
    users.setUserId(101);
    users.setUserName("里能");
    request.setAttribute("u1",users);
%>
   单个表量:${k1+20>100?111:222}<br>
   uid=${u1.userId}<br>
   uname=${u1.userName}<br>
  ${10+20<50 and 200<100}
<br>
</body>
单个变量:${a+10}<br>
单个变量:${s}<br>
单个对象:${key.属性名}

//对象类型
Users u=new Users();
u.setName("王老五");
u.setPass("abc");
pageContext.setAttribute("u1",u);
user.name=${u1.name}
user.pass=${u1.pass}

// list集合对象:
List list=new ArrayList();
list.add("刘能");
list.add(30);
list.add(u);
pageContext.setAttribute("list2",list);
list1=${list2[0]}<br/>
list2=${list2[1]}<br/>
list3=${list2[2].pass}<br/>

// map集合:
k1=${map1.k1}<br>
k2=${map1.k2.username}--- ${map1.k2.password}

判断变量是否有值或是否存在:${empty key值}
List list2=new ArrayList();
list2.add("aa");
request.setAttribute("list222",list2);

判断list中是否有数据:${empty list222}

(4)<%@ page isELIgnored="false"%>的作用

JSP 2.0的一个主要特点是它支持表达语言(expression language)。JSTL表达式语言可以使用标记格式方便地访问JSP的隐含对象和JavaBeans组件,JSTL的核心标记提供了流程和循环控制功能。自制标记也有自定义函数的功能,因此基本上所有seriptlet能实现的功能都可以由JSP替代。在JSP 2.0中,建议尽量使用EL而使JSP的格式更一致。

在web.xml的<jsp-property-group>中可以控制一组JSP是否使用EL,在每个JSP中也可以指定是否该JSP使用EL。在page directive中的isELIgnored属性用来指定是否忽略。格式为:

<%@ page isELIgnored="true|false"%>

如果设定为真,那么JSP中的表达式被当成字符串处理。比如下面这个表达式<p>${2000 % 20}</p>在isELIgnored="true"时输出为${2000 % 20},而isELIgnored="false"时输出为0。Web容器默认isELIgnored="false"。

 

9. JSTL

(1) 什么是JSTL

JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。

JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还

提供了一个框架来使用集成JSTL的自定义标签。

根据JSTL标签所提供的功能,可以将其分为5个类别。核心标签 格式化标签 sql标签 xml标签 jstl函数(后面详细

解释)

(2) JSTL的作用和语法格式

作用:简化jsp页面编写代码

语法格式:

1. 下载 jakarta-taglibs-standard-1.1.2.zip 包并解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文

件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下。

2. 在JSP页面中引入<%@ taglib prefix=”页面使用的名称” uri=”功能范围的路径”%>

(3) 核心标签

①核心标签是最常用的 JSTL标签。引用核心标签库的语法如下:

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

② 核心标签的分类

表达式操作 out、set、remove、catch

流程控制 if、choose、when、otherwise

迭代操作 forEach、forTokens

URL操作 import、param、url、redirect

Set标签

<c:set>

主要用来将变量存储至JSP范围中 或是JavaBean的属性或Map对象中

 <c:out>

主要用来显示数据的内容

 <c:remove>

主要负责移除变量

<h1>删除前</h1>
  <c:set value="c-set的值" var="str" scope="request"></c:set>
  str=${str}<br>
  str=<c:out value="${str}"></c:out>
 <c:remove var="str" scope="request"></c:remove>
  <h1>删除后</h1>
  str=${str}<br>
  str=<c:out value="${str}"></c:out>
<h1>if</h1>
  <c:set var="age" value="23" scope="request"></c:set>

 <c:if>

主要用于进行if判断,如果为true,则输出标签体中的内容

<c:if test="${age>18 and age<30}">
        青年
    </c:if>

 

 <c:choose>,<c:when>,<c:otherwise>

作用相当于if-else

<c:choose>
        <c:when test="${age<18}">
            未成年
        </c:when>
        <c:when test="${age<30}">
            青年人
        </c:when>
        <c:otherwise>其他人</c:otherwise>
    </c:choose>

 

 <c:forEach>

循环控制,它可以将数组,集合(Collection)中的成员循序浏览一遍。

 其中varStatus有两个属性count、index,可以用来计数,count从1开始,index从0开始

 <%
       List list=new ArrayList();
       list.add("list内容");
       list.add(100);
       list.add(new Users());
       request.setAttribute("alist",list);
    %>
<h1>list</h1>
    <c:forEach items="${alist}" var="va" varStatus="sta">
       ${sta.count}---${sta.index}----》 ${va}<br>
    </c:forEach>

(4)格式化标签 

<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
      request.setAttribute("day",new Date());
      request.setAttribute("mydate","2000-1-1");
      request.setAttribute("num",123.4567);
     %>

1、fmt:formatDate

作用:将日期类型格式化为指定模式的字符串

属性

value:将要被格式化的数据

pattern:格式化的模式,与SimpleDateFormat的参数设置一样

var:格式化后的字符串所要存放的变量,若不指定var,则会将格式化的结果直接显示在页面

scope:变量存放的域属性空间,默认page

type:其取值为date、time、both,表示给出的value是日期、时间、还是两者都包含,默认是date

<h1>日期:<fmt:formatDate value="${day}" pattern="yyyy-MM-dd"></fmt:formatDate></h1>

2、fmt:parseDate

作用:用于将指定字符串转化为日期类型

Value服务器获取的时间

Pattern:转换的格式

Var:页面显示的变量

<h1>日期2:<fmt:parseDate value="${mydate}" pattern="yyyy-MM-dd"></fmt:parseDate></h1>

3、fmt:formatNumber

按照指定格式对数字进行格式化

属性

maxIntegerDigits:整数部分最多的位数

minIntegerDigits:整数部分最少的位数

maxFrctionDigits:小数部分最多的位数

minFrctionDigits:小数部分最少的位数

var:存储格式化结果的变量

scope:var属性的作用域

integerOnly:是否只解析整型数true或者浮点数false

<h1>num=<fmt:formatNumber value="${num}" maxFractionDigits="1"></fmt:formatNumber> </h1>

示例:前台日期格式转换

1.jsp引入JSTL的fmt标签

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

2.使用:

<td><fmt:formatDate value="${bill.billtime}" pattern="yyyy-MM-dd"></fmt:formatDate> </td>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐