Jsp(是一个简化的servlet设计)
servlet技术:在java代码中嵌套html.擅长java代码编写
Jsp技术: html输出时比较便捷,在html中嵌套java代码.擅长页面显
Jsp的传统标签:脚本、指令、标签
脚本:是jsp中嵌入的java代码
指令作用就是申明页面的属性
标签分为jsp子代内置标签和通过taglib指令来使用jsp标签库,或自定义标签
jsp脚本和注释
1.jsp脚本:
1)<%java代码%> ---内部的java代码翻译到service方法的内部
2)<%=java变量或表达式> ---会翻译成service方法内部out.print()
3)<%!java代码,方法,属性%> ----会被翻译成service的成员内容,声明方法和属性(全局变量)
jsp注释:(不同的注释可见范围不同)
1) Html注释:<!--注释内容-->
可见范围jsp源码、翻译后的servlet、页面显示html源码
2) java注释://单行注释 /*多行注释*/
可见范围jsp源码、翻译后的servlet
3 ) jsp注释<%--注释内容--%>
可见范围jsp源码
2.jsp运行原理----jsp本质就是servlet
jsp在第一次被访问时会被Web容器翻译成servlet,再执行
过程:
第一次访问--->helloServlet.jsp---->helloServlet_jsp.java---->编译运行
Tomcat获得jsp文件后,先将jsp转为servlet,变成xxx.java(servlet源码),再将java文件编译成.class文件。被翻译后的servlet在Tomcat的work目录中可以找到
1.> jsp就是特殊的servlet,编写在jsp中的html静态内容最终都是以输出对象一句句输出出去,这是jsp技术自动生成并完成响应的,程序员不需要关注这些,我们只要明白它的执行原理.
2.> jsp在运行时会生成对应的servlet源码并编译,在客户端第一次请求时编译jsp为class文件,之后的请求不再重新编译。
3.> jsp内容修改之后会重新编译
3.jsp指令(3个)
jsp的指令是指导jsp翻译和运行的命令.jsp包括三大指令:
1)page指令(属性最多,实际开发中page指令默认)设置页面 属性最多的一个指令,根据不同的属性,指导整个页面特性
格式:<%@ page属性名="属性值" 属性名2="属性值2"...%>
<%@page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%>
language:java唯一值,表示脚本中使用的编程语言。jsp脚本中可以嵌入的语言种类
contentType:设置了内容的类型和静态页面的编码 (告诉浏览器以什么编码显示)
pageEncoding:页面本身的编码格式 (写页面时用的编码格式)
import导包:<%@page import="java.util.Date"%> //具体的包和类
session:是否jsp在翻译时自动创建session
errorPage:
isErrorPage:Jsp页面中出现异常的处理方式,代表当前页面是一个处理错误的页面
对于有可能出现异常的页面:
<%@page errorPage="error.jsp"%> //异常时会跳转到处理异常的页面;这页面自己写
对于处理异常的页面(error.jsp)里:
<%@page isErrorPage="true"%>,其中使用<%=exception.getMessage() %>把异常信息打印出来
2)include指令(包含页面)
页面包含(静态包含)指令,可以讲一个jsp页面包含到另一个jsp页面中
格式: <%@ include file="被包含的文件地址" %>
3)taglib指令(引入标签库)
在jsp页面中引入标签库(jstl标签库,struts2标签库)
格式:<%@ taglib uri="标签库地址" prefix="前缀"%>
4. jsp标签(动作)
4.1.<jsp:forward>动作
形式:<jsp:forward page="要转发的资源"/>
等价于 Servlet中通过RequestDispatcher.forward();
可以传参数
<jsp:forward page="要转发的资源">
<jsp:param name="name" value="angle"/>
<jsp:param name="age" value="18" />
</jsp:forward>
4. 2.<jsp:Include>动作(动作包含)
形式:<jsp:include page="被包含的页面"/>
等价于 Servlet中通过RequestDispatcher.include();
Include动作也可以传参数
<jsp:include page="被包含的页面" flush="true">
<jsp:param name="name" value="angle"/>
</jsp:include>
flush 指示在读入包含内容之前是否清空任何现有的缓冲区。
静态包含<%@ include file=””%>先将内容合在一起,在运行。只有一个class文件
动态包含<jsp:include page=””>先运行,需要时合并,有两个class文件,运行时把页面插进去
4.3 <jsp:param>动作
当使用 <jsp:include> 动作标记引入的是一个能动态执行的程序时,如 Servlet 或 JSP 页面,可以通过使用 <jsp:param> 动作标记向这个程序传递参数信息
以下4个JSP动作与JavaBean有关
<jsp:plugin>动作
<jsp:useBean>动作
<jsp:setProperty>动作
<jsp:getProperty>动作
5. jsp内置/隐式对象(9个)
jsp被翻译成servlet之后,service方法中有9个对象定义并初始化完毕,我们在jsp脚本中 可以直接使用这9个对象
page pageContext Out exception config request response application session(饿汉式创建)
1. Page:page对象代表当前jsp页面,是当前jsp编译后的servlet类对象.相当于this。
2. pageContext:表示jsp页面上下文(jsp管理者) pageContext
3. Out:输出体响应 JspWriter
4. Exception:异常对象
5. Config:标识Servlet配置, 类型ServletConfig
6. Request:请求对象 HttpServletRequest
7. Response:响应对象HttpServletResponse
8. Application:标识web应用上下文 ServletContext
9. Session:一次会话
注意:在page指令中,一个isErrorPage属性,默认false,被关闭了,所以无法再jsp转换后的servlet文件中看到exception对象。
1.out对象
out的类型:jspWriter
out作用就是想客户端输出内容----out.write()
out缓冲区默认8kb,可以设置成0(buffer=0),代表关闭out缓冲区,内容直接写到 response 缓冲区
Tomcat引擎会从response缓冲区获得内容,再等out缓冲区内容刷到response缓冲区时,输出相应out缓冲区的内容.所以先显示response写出的内容,在按上下文顺序显示其它写出的内容
2.pageContext对象(作用域为当前页面)
jsp页面的上下文对象,作用如下:
1)pageContext是一个域对象
setAttribute(name,obj);
getAttribute(name);
removeAttribute(name,int scope);
pageContext可以向指定的其他域中存取数据
提供作用域常量
PageContext.PAGE_SCOPE PageContext.REQUEST_SCOPE PageContext.SESSION_SCOPE...
findAttribute(String name) 一次性获得指定名称的内容,依次从pageContext域、request域、session域、application域中获取属性,在某个域中获取后将不在向后寻找
2)可以获得其他8大隐式对象
eg:
pageContext.getRequest();
pageContext.getSession();
PageContext.getOut();
pageContext.getResponse();
pageContext.getServletContext();
pageContext.getServletConfig();
pageContext.getPage();
pageContext.getException();
jsp的四大作用域总结的作用范围:
page域:当前jsp页面范围
request域:一次请求
session:一次会话
application域:整个web应用
EL
1.EL表达式概述(表达式言)
EL(Expression Language) 表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要代替jsp页面脚本的编写。
在JSP页面中,使用EL可以简化对变量和对象的访问。
在page属性中 isELIgnored=”false” 默认就是false,不忽略
2.EL从域中取出数据(EL最重要的作用)
jsp脚本:<%=request.getAttribute(name)%>
EL表达式:${requestScope.name}
EL最重要的作用是获得四大域中的数据,格式${EL表达式}
EL获得pageContext域中的值:${pageScope.key};
EL获得request域中的值:${requestScope.key};
${sessionScope.key};
${applicationScope.key};
EL从四个域中获得某个值${key} 同样是依次从pageContext域,request域,session域,application域中获取属性,在某个域中获取后将不在向后寻找
3.EL的内置对象11个
隐含对象 | 类型 | 说明 |
PageContext | javax.servlet.ServletContext | 表示此jsp的PageContext |
PageScope | java.util.Map | 取得Page范围的属性名称所对应的值 |
RequestScope | java.util.Map | 取得request范围的属性名称所对应的值 |
sessionScope | java.util.Map | 取得Sessiont范围的属性名称所对应的值 |
applicationScope | java.util.Map | 取得Applicationt范围的属性名称所对应的值 |
param | java.util.Map | 如同ServletRequest.getParameter(String name)。回传String类型的值 |
paramValues | java.util.Map | 如同ServletRequest.getParameterValues(String name)。回传String[]类型的值 |
header | java.util.Map | 如同ServletRequest.getHeader(String name)。回传String类型的值 |
headerValues | java.util.Map | 如同ServletRequest.getHeaders(String name)。回传String[]类型的值 |
cookie | java.util.Map | 如同HttpServletRequest.getCookies() |
initParam | java.util.Map | 如同ServletContext.getInitParameter(String name)。回传String类型的值 |
pageScope,requestScope,sessionScope,applicationScope 获取jsp中域的数据 $(param/paramValues.接收参数)
相当于request.getParameter() request.getParameterValues()
$(header/headerValues.)获取请求头信息 相当于request.getHeader(name)
initParam 获取全局初始化参数 相当于this.getServletContext().getInitParameter(name)
cookie 相当于request.getCookies()--cookie.getName()---cookie.getValue()
pageContext ---web开发中的pageContext(pageContext获得其它八大对象)
${pageContext.request.contextPath}---获得在web项目中的路径
4.EL执行表达式
${1+1} 进行运算
${empty user} 判断对象是否为null,是null对象返回true,
${user==null?true:false}三目运算
.与[]运算符
- .与[]可以混合使用
${sessionScope.user.sex}等于${sessionScope.user[“sex”]}
${sessionScope.shoppingCart[0].price}回传结果为shoppingCart中第一项物品价格
以下情况会有差异
2. 当要存取的属性名称中包含一些特殊字符,如.或- 等非字母或数字的符号,就一定使用[]
${user[“my-name”]}
JSTL
jsp标准标签库(JSTL)是一个jsp标签集合,它封装了jsp应用的通用核心功能。jstl是apache提供的,使用时需要导两个jar包.[jstl.jar standard.jar]
使用jsp的taglib指令导入核心标签库< %@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
核心标签 core
jstl 函数 fn
格式化标签 fmt
sql标签 sql
xml标签 xml
- 核心标签 jstl常用标签,包括判断,循环等流程语句
<标签名称:功能>
第一类:表达式控制标签
<c:out value=””> 用于在jsp中输出数据,就像<%=...>
<c:set var=”” value=”” scope=””> 保存数据,可以指定保存的范围(域)
<c:remove var=”” value=”” scope=””> 删除数据
<c:catch> 用来处理产生错误的异常状况,并且将错误信息储存起来.
第二类:流程控制标签
<c:if> 与我们在一般程序中用的if一样
如:
<c:if test="${p.emp_property_issuedby=='1'}">通过</c:if>
判断字符串相等 <c:if test="${a == b}">
多个条件判断 ,用and或者&& <c:if test="${a!=b and a >1 }">
<c:choose> 本身只当做<c:when>和<c:otherwise>的父标签
choose相当于if{}else if{}else{} when可以出现1次或多次,当test属性为true时,会执行该分支。Otherwise可以出现0次或1次,表示例外。
<c:choose>
<c:when test=”${user.sex==’m’}”>男</c:when>
<c:when test=”${user.sex==’f’}”>女</c:when>
<c:otherwise>保密</c:otherwise>
</c:choose>
<c:when> <c:choose>的子标签,用来判断条件是否成立
第三类:循环标签
<c:forEach > 迭代标签,接受多种集合类型
<c:param> 用来给包含或重定向的页面传递参数 获取的话:从请求中获取req.getParameter("")
<c:redirect> 重定向至一个新的url
标签详解:
1. <c:if test="">标签test是返回boolean的条件
2. <c:forEach var=”” items=”” varStatus=”” >标签
var:迭代参数的名称
Items:要进行迭代的集合
varStatus =”num”:迭代变量的名称,可以通过num.index获得相应的下标(从0开始)
begin:如果指定了items,迭代就从items[begin]开始进行迭代。
end: items从index[end]结束, 没有指定items从end结束
step:迭代的步长,类型为整型
使用方式有两种组合形式:
1<c: forEach begin="0" end="5" var="i">
${i}<br/>
</c:forEach> ==for(int i=0;i<=5;i++){syso(i)}
2.String[] ss=new String["a","b","c"];
<c: forEach items="${ss}" var="str">
${str}
</c:forEach> for(String str:ss){syso(str)}
Fmt:
<fmt:formatDate value=”${}” pattern=”yyyy-mm-dd HH:mm:ss”/>格式化时间
<fmt:formaNum value=”” pattern=”#.00”/>格式化数字,#.00指定保留的小数位
字符串取子串:
${fn:substring(a, 0, 2)}
以上就是关于jsp相关的介绍,如有不足,欢迎留言指正。望不吝赐教。。。
来源:CSDN
作者:曰业而安
链接:https://blog.csdn.net/duan196_118/article/details/104617097