1.JSP java server pages.代替servlet程序 回传 html页面的数据给客户端进行显示。
创建:new java enterprise,在web下new jsp
访问:第一次访问jsp页面时,tomcat服务器会将jsp页面翻译成java源文件,并对其编译形成.class字节码文件。
翻译出来的文件位置:C:\Users\VICTORIA\.IntelliJIdea2019.3\system\tomcat\Tomcat_8_5_54_tomcat8\work\Catalina\localhost\tomcat8_war_exploded\org\apache\jsp
本质:jsp程序通过继承HttpJspBase类间接继承HttpServlet类,实质就是将jsp程序翻译成servlet程序后,在servlet程序中,通过输出流将html数据回传至客户端
语法:
jsp头部page指令:修改jsp页面的属性和行为 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
属性含义:
language Jsp文件经翻译后形成什么语言的文件,暂时只支持java
contentType jsp返回的数据类型,即源码中response.setContentType()的值
pageEncoding 当前jsp文件本身使用的字符集
import 与java源文件一样,用于导包导类
对于out输出流: autoFlush设置out输出流缓冲区,满后是否自动刷新,默认值ture buffer设置out输出流缓冲区大小,默认值8kb
errorPage jsp页面出错后,跳转的页面位置
isErrorPage 设置当前页面是否为jsp出错页面,默认值false;当设置为ture时可以对其进行异常错误信息的获取
session 设置当前jsp页面是否会创建HttpSession对象,默认为ture
extends 设置由jsp文件翻译出来的java类默认继承谁
2.错误类型
JSP Buffer overflow:JSP缓冲区满了之后不能自动刷新。
3.jsp常用脚本:声明脚本、表达式脚本、代码脚本
声明脚本(不常使用嘞)
表达式脚本:在jsp页面上输出数据 <%= %>,可输出整型、浮点型、字符串和对象。
表达式脚本都会被翻译到相应java文件的_jspService()方法中,并可以使用该方法中定义的对象。使用out.print()将内容输出到页面上。结尾不加;
在浏览器中输出。
代码脚本:在其中编译我们需要的功能。<% %>
代码脚本都会被翻译到相应java文件的_jspService()方法中,并可以使用该方法中方法。
可由多个代码脚本组合完成一个功能,且可与表达式脚本组合使用
在控制台输出。例如if,for,重写_jspService中的方法
4.jsp三种注释:html注释、java注释、jsp注释
html注释:<!-- -->翻译到java文件中的_jspService()中,以out.writer()输出到客户端
java注释:// /**/ 在声明脚本和代码脚本中使用
jsp注释:<%-- --%>可注释掉jsp文件中的代码
5.jsp九大内置对象:
response响应对象,
request请求对象,
pageContext: jsp上下文对象,
session会话对象,
application:ServletContext对象,
config:ServletConfig对象,
out: jsp输出对象,
page:指向当前jsp页面的对象,
exception:在jsp声明中添加isErrorPage='true'后得到的异常对象。
6.jsp四大域对象:像map一样存取数据,但各自对数据的存取范围不同。
PageContextImpl类pageContext:当前jsp页面范围内有效。使用request.getRequestDispatcher("/scope2.jsp").forward(request,response)验证
HttpServletRequest类request:一次请求内有效
HttpSession类session:一个会话范围内有效(打开浏览器访问服务器,会话开始;直到关闭浏览器,会话结束)
ServletContext类application:整个web工程范围内。只要web工程不停止,该对象的数据一直存在
7.jsp中的out.write(" "),response.getWriter().write(" "):表示响应,用于给客户端回传内容的。
区别:由于jsp页面在执行完全部代码后,调用out.flush()将out缓冲区中的数据追加到response缓冲区末尾;最后response缓冲区刷新将全部数据写回到客户端。
因jsp翻译成java底层使用out输出,故使用out输出,避免打乱
out.write()和out.print()区别
out.write()输出字符串没有问题(输出其他整型等有问题的原因,底层将整型先转换成ASCIII码后输出)
out.print()输出任何类型都没有问题(原因,底层将数据转换成字符串后使用out.write()输出)
jsp页面使用out.print()进行输出
8.jsp标签:
静态包含:<%@ include file="包含文件路径" %> 可用在对网站页面中重复引用的模块 进行维护
不翻译被包含的jsp页面,仅将被包含的代码拷贝到包含的位置,进行输出。
动态包含:<jsp:include page="包含文件路径"><jsp:param name="guo" value="tong"></jsp:include>
翻译被包含的jsp页面为 java文件,
底层执行 org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/index.jsp", out, false); 调用被包含的页面进行输出
中间定义的参数可在 被包含的文件中获取requesr.getparameter("name");
请求转发:<jsp:forward page="/"></jsp:forward>
9.javaweb三大组件:Servlet程序,Filter过滤器,Listener监听器
Listener监听器:JavaEE规范,一种接口,监听事物变化,通过回调函数反馈给程序做相应处理。
10.ServletContextListener监听器(最常使用):监听ServletContext对象的创建和销毁。
监听到创建和销毁后,分别调用contextInitialized()和contextDestoryed(),在ServletContext对象创建后马上调用做初始化,在ServletContext对象销毁后调用。
使用过程:编写一个类去实现ServletContextListener监听器 监听 ServletContext对象
实现两个回调方法
在web.xml中配置监听器
11.EL表达式${键值}:expression language 代替jsp页面的 表达式脚本<%= %>在jsp页面进行域对象 数据的输出。编码更加简洁
当值为null时,输出空串。
四个域中都具有键值 符合要求的话,按pageContext,request,session,application顺序输出
可输出一个类的普通属性、数组属性( ${p.persons}输出数组地址;${p.persons[]}输出数组中指定位置的值 )。list集合属性${p.persons[]}和map集合属性${p.persons.key1}。
12.EL表达式运算:
逻辑(== != > < >= <=),
关系(&& || !),
数值(+ - * / %),
empty运算(判断一个数据是否为空,值为null 空串 Object数组长度为0 list元素个数为0 map元素个数为0 情况下输出true)(${empty key值}),
三元运算,
.运算(可输出bean对象中属性的值),
[]运算(可输出有序集合中元素的值 同时 可输出map集合中key中含特殊字符key的值${map['a.a.a']} ${map["b+b+b"]})
13.EL中11个隐含对象(EL自身定义,可随意使用):scope表示范围
变量 | 类型 | 作用 |
pageContext | PageContextImp类 | 获取jsp九大内置对象;用于输出协议,服务器IP,服务器端口,当前工程路径contextPath,请求方法method,客户端IP remoteHost,会话ID ${pageContext.Session.ID} |
pageScope | Map(String,Object) | 获取pageContext域中的 对象 |
requestScope | Map(String,Object) | 获取Request域中的 对象 |
sessionScope | Map(String,Object) | 获取Session域中的 对象 |
applicationscope | Map(String,Object) | 获取ServletContent域中的 对象 |
param | Map(String,String) | 获取请求参数的值 ${param.key值} |
paramValues | Map(String,String[]) | 获取多个请求参数的值 |
header | Map(String,String) | 获取请求头的值 ${header['user-Agent']} ${header.user-Agent} |
headerValues | Map(String,String[]) | 获取多个请求头的值 ${headerValues.['user-Agent'][0]} ${headerValues.['user-Agent']}得到数组对象 |
cookie | Map(String,Cookie) | 获取当前请求的cookie信息 ${cookie.JSESSIONID}输出cookie对象 ${cookie.JSESSIONID.name}cookie对象也是 键-值对的组合 |
initParam | Map(String,String) | 获取web.xml中配置的<context.param>即上下文参数 |
对于pageContext对象的使用:EL表达式 . 表示寻找相应的get()
输出使用协议:<%=request.getScheme()%> ${pageContext.request.scheme}
输出服务器IP:<%=request.getServerName()%> ${pageContext.request.servlername}
输出服务器端口:<%=request.getServerPort()%> ${pageContext.request.servlerport}
企业中:
<% pageContext.setAttribute("req",request)%> 先封装再使用
<%=req.getServerPort()%> ${req.servlerport}
14.JSTL标签库 JSP Standard Tag Library 代替JSP代码脚本
JSTL五类标签库:
核心标签库:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> taglib表示标签库
格式化:
函数
数据库:现使用dao层实现与数据库的交互
xml:早期客户端与数据库之间交互,现使用JSON
使用步骤:
导入jstl标签库的jar包(taglibs-standard-impl-1.2.1.jar和taglibs-standard-spec-1.2.1.jar)
使用taglib指令引入标签库
15.标签
保存数据:<c:set scope="" var="" value="" /> (scope属性设置保存到哪儿个域,page表示PageContext域(默认),request表示Request域,session表示Session域,application表示ServletContext域)(var设置键值)(value设置值)
if判断:<c:if test="" var="" scpoe=""/>(test条件表达式,使用EL,${12=12})
switch选择:<c:choose><c:when><c:otherwise> 分别表示父标签,test条件为真时执行,test条件为假时执行,
遍历整型,对象数组,map对象,list对象:
<c:forEach var="i" begin="1" end="5" step="" /> var表示当前循环对象 varStatus当前变量的状态 items表示遍历的集合
16.varStatus当前变量的状态 <c:varStatus="status" /> ${status.current}
public status implement interface LoopTagStatus{
public Object getCurrent();//当前遍历的数据
public int getIndex();//当前遍历的索引
public int getCount();//当前遍历的个数
public boolean isFirst();//当前遍历是否为开头或结尾
public boolean isLast();
public Integer getBegin();//获取begin end step的属性值
public Integer getEnd();
public Integer getStep();
}