JSP
JSP全名为Java Server Pages,中文名叫java服务器页面...其根本是一个简化的Servlet设计,是一种动态网页技术标准。JSP技术它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段和JSP标记从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
Java Servlet是JSP的技术基础,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。
jsp原理详解
JSP -- 翻译Servlet文件 -- 编译.class文件 -- 执行
在tomcat/work/翻译Servlet的文件
脚本元素
<%! %> 成员方法、成员变量
<%= %> 输出内容
<% %> 局部变量,语句
JSP页面的注释
* HTML的注释 <!-- --> JSP文件的阶段存在,在翻译成java文件也存在, 在页面存在
* JAVA的注释 JSP文件的阶段存在,在翻译成java文件也存在, 在页面不存在
<% /**/多行 /** *文档 */ %>
* JSP的注释 <%-- JSP的注释 --%> 之后存在JSP文件的阶段
配置全局的错误页面
* 在web.xml中进行配置。
<error-page> <error-code>404</error-code> <location>/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/500.jsp</location> </error-page>
page指令及其常用属性
<%@ page %>指令作用于整个JSP页面,同样包括静态的包含文件。但是<% @ page %>指令不能作用于动态的包含文件,比如 <jsp:include>
你可以在一个页面中用上多个<% @ page %>指令,但是其中的属性只能用一次,不过也有个例外,那就是import属性。因为import属性和Java中的import语句差不多(参照Java Language),所以你就能多用此属性几次了.
无论你把<% @ page %>指令放在JSP的文件的哪个地方,它的作用范围都是整个JSP页面。不过,为了JSP程序的可读性,以及好的编程习惯,最好还是把它放在JSP文件的顶部.
属性
* language :JSP文件允许嵌入的语言。只支持一种JAVA语言。(不需要改变) * extends :JSP翻译翻译Servlet文件,servlet继承的类。(不需要改变) * session :默认值是true,可以直接使用session。设置false,不能直接使用。 * import :引入java的jar包(使用多次) * buffer :设置缓冲区的大小 默认8kb * aotoFlush :设置默认刷新缓冲区(不要修改) * errorPage :指定错误页面 * isErrorPage :设置值,可以是exception对象,设置true,使用exception,设置不能使用exception对象 * contentType :服务器端输出所有内容采用编码。 * pageEncoding :JSP翻译成Servlet文件时采用的编码。 * isELIgnored :是否忽略EL表达式(false,不忽略,true,忽略)
* 重点:
session
import
contentType
pageEncoding
isELIgnored
taglib指令及其常用属性
<% @ taglib %>指令声明此JSP文件使用了自定义的标签,同时引用标签库,也指定了他们的标签的前缀。
你必须在使用自定义标签之前使用<% @ taglib %>指令,而且你可以在一个页面中多次使用,但是前缀只能使用一次
语法
* taglib :引入标签库文件
* 语法:<%taglib %>
属性
* uri:引入标签库文件的名称
* prefix :标签库的别名
include指令及其属性的介绍
<jsp:include>元素允许你包含动态文件和静态,这两种包含文件的结果是不同的。如果文件仅是静态文件,那么这种包含仅仅是把包含文件的内容加到jsp文件中去,而如果这个文件动态的,那么这个被包含文件也会被Jsp编译器执行。
* include:包含页面(页面布局)
* 语法:<%@ include file="要包含文件的地址(静态包含)" %>
* <%@ include file="/include/head.jsp" %>
隐式对象
jsp内置对象,是指可以不加声明和创建就可以在JSP页面脚本(Java程序片和Java表达式)中使用的成员变量。
(1)out 对象
用于向页面中【客户端】输出信息
示例:out.println("信息");
Request和response简介
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象
request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了
(2)request 请求对象
get请求
(1)new String(变量名.getBytes("ISO-8859-1"),"UTF-8");
对中文需要逐一的处理
(2)修改tomcat:conf->server.xml-> <Connector URIEncoding="UTF-8" />
post请求
request.setCharacterEncoding("UTF-8");
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。 客户端的请求信息被封装在request对象中 request对象具有请求域,即完成客户端的请求之前,该对象一直有效。 序号 方 法 说 明 1 object getAttribute(String name) 返回指定属性的属性值 2 Enumeration getAttributeNames() 返回所有可用属性名的枚举 3 String getCharacterEncoding() 返回字符编码方式 4 int getContentLength() 返回请求体的长度(以字节数) 5 String getContentType() 得到请求体的MIME类型 6 ServletInputStream getInputStream() 得到请求体中一行的二进制流 7 String getParameter(String name) 返回name指定参数的参数值 8 Enumeration getParameterNames() 返回可用参数名的枚举 9 String[] getParameterValues(String name) 返回包含参数name的所有值的数组 10 String getProtocol() 返回请求用的协议类型及版本号 11 String getScheme() 返回请求用的计划名,如:http.https及ftp等 12 String getServerName() 返回接受请求的服务器主机名 13 int getServerPort() 返回服务器接受此请求所用的端口号 14 BufferedReader getReader() 返回解码过了的请求体 15 String getRemoteAddr() 返回发送此请求的客户端IP地址 16 String getRemoteHost() 返回发送此请求的客户端主机名 17 void setAttribute(String key,Object obj) 设置属性的属性值 18 StringgetRealPath(String path) 返回一虚拟路径的真实路径 19 String request.getContextPath() 返回上下文路径 response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
(3)response --响应对象
用于响应客户端请求并向客户端输出信息
常用方法
sendRedirect("跳转的页面");
response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其它页面的response对象对当前页面无效。 序号 方 法 说 明 1 String getCharacterEncoding() 返回响应用的是何种字符编码 2 ServletOutputStream getOutputStream() 返回响应的一个二进制输出流 3 PrintWriter getWriter() 返回可以向客户端输出字符的一个对象 4 void setContentLength(int len) 设置响应头长度 5 void setContentType(String type) 设置响应的MIME类型 6 sendRedirect(java.lang.String location) 重新定向客户端的请求
重定向和转发的对比:(常考)
(1)实现方式不同
转发:request.getRequestDispatch("").forward(request,response);
重定向:response.sendRedirect("");
(2)地址栏效果不同
转发时地址栏不变
重定向时地址栏改变
(3)数据问题
转发时,request中存的数据不丢失
request.setAttribute()存的值只保留在单次请求中
重定向时会丢失数据
那我们是用什么来存值呢?需要使用session 会话
out对象
out对象是JspWriter类的实例,是向客户端输出内容常用的对象 序号 方 法 说 明 1 void clear() 清除缓冲区的内容 2 void clearBuffer() 清除缓冲区的当前内容 3 void flush() 清空流 4 int getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0 5 int getRemaining() 返回缓冲区还剩余多少可用 6 boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常 7 void close() 关闭输出流
page对象
page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例 序号 方 法 说 明 1 class getClass 返回此Object的类 2 int hashCode() 返回此Object的hash码 3 boolean equals(Object obj) 判断此Object是否与指定的Object对象相等 4 void copy(Object obj) 把此Object拷贝到指定的Object对象中 5 Object clone() 克隆此Object对象 6 String toString() 把此Object对象转换成String类的对象 7 void notify() 唤醒一个等待的线程 8 void notifyAll() 唤醒所有等待的线程 9 void wait(int timeout) 使一个线程处于等待直到timeout结束或被唤醒 10 void wait() 使一个线程处于等待直到被唤醒 11 void enterMonitor() 对Object加锁 12 void exitMonitor() 对Object开锁
application对象
application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。 序号 方 法 说 明 1 Object getAttribute(String name) 返回给定名的属性值 2 Enumeration getAttributeNames() 返回所有可用属性名的枚举 3 void setAttribute(String name,Object obj) 设定属性的属性值 4 void removeAttribute(String name) 删除一属性及其属性值 5 String getServerInfo() 返回JSP(SERVLET)引擎名及版本号 6 String getRealPath(String path) 返回一虚拟路径的真实路径 7 ServletContext getContext(String uripath) 返回指定WebApplication的application对象 8 int getMajorVersion() 返回服务器支持的Servlet API的最大版本号 9 int getMinorVersion() 返回服务器支持的Servlet API的最小版本号 10 String getMimeType(String file) 返回指定文件的MIME类型 11 URL getResource(String path) 返回指定资源(文件及目录)的URL路径 12 InputStream getResourceAsStream(String path) 返回指定资源的输入流 13 RequestDispatcher getRequestDispatcher(String uripath) 返回指定资源的RequestDispatcher对象 14 Servlet getServlet(String name) 返回指定名的Servlet 15 Enumeration getServlets() 返回所有Servlet的枚举 16 Enumeration getServletNames() 返回所有Servlet名的枚举 17 void log(String msg) 把指定消息写入Servlet的日志文件 18 void log(Exception exception,String msg) 把指定异常的栈轨迹及错误消息写入Servlet的日志文件 19 void log(String msg,Throwable throwable) 把栈轨迹及给出的Throwable异常的说明信息 写入Servlet的日志文件
exception对象
exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象 序号 方 法 说 明 1 String getMessage() 返回描述异常的消息 2 String toString() 返回关于异常的简短描述消息 3 void printStackTrace() 显示异常及其栈轨迹 4 Throwable FillInStackTrace() 重写异常的执行栈轨迹
pageContext对象
pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本类名也叫pageContext。 序号 方 法 说 明 1 JspWriter getOut() 返回当前客户端响应被使用的JspWriter流(out) 2 HttpSession getSession() 返回当前页中的HttpSession对象(session) 3 Object getPage() 返回当前页的Object对象(page) 4 ServletRequest getRequest() 返回当前页的ServletRequest对象(request) 5 ServletResponse getResponse() 返回当前页的ServletResponse对象(response) 6 Exception getException() 返回当前页的Exception对象(exception) 7 ServletConfig getServletConfig() 返回当前页的ServletConfig对象(config) 8 ServletContext getServletContext() 返回当前页的ServletContext对象(application) 9 void setAttribute(String name,Object attribute) 设置属性及属性值 10 void setAttribute(String name,Object obj,int scope) 在指定范围内设置属性及属性值 11 public Object getAttribute(String name) 取属性的值 12 Object getAttribute(String name,int scope) 在指定范围内取属性的值 13 public Object findAttribute(String name) 寻找一属性,返回起属性值或NULL 14 void removeAttribute(String name) 删除某属性 15 void removeAttribute(String name,int scope) 在指定范围删除某属性 16 int getAttributeScope(String name) 返回某属性的作用范围 17 Enumeration getAttributeNamesInScope(int scope) 返回指定范围内可用的属性名枚举 18 void release() 释放pageContext所占用的资源 19 void forward(String relativeUrlPath) 使当前页面重导到另一页面 20 void include(String relativeUrlPath) 在当前位置包含另一文件
config对象
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象) 序号 方 法 说 明 1 ServletContext getServletContext() 返回含有服务器相关信息的ServletContext对象 2 String getInitParameter(String name) 返回初始化参数的值 3 Enumeration getInitParameterNames() 返回Servlet初始化所需所有参数的枚举
JSP内置对象
使用的几率是极小的
exception
exception.getMessage();//需要标记当前页面是错误页面才可以 见上<%@ page language="java" isErrorPage="true" import="java.util.*" pageEncoding="UTF-8"%>
获取异常的提示信息
exception.getMessage();
config
config.getServletContent().getRealPath("/file");
完整文件的路径F:\apache-tomcat-7.0.73\webapps\Day18\file
JSP中的四大域
就是存值的地方
请求域
request HttpServletRequest setAttribute() getAttribute()
会话域
session HttpSession setAttribute() getAttribute()
全局域
application ServletContext setAttribute() getAttribute()
当前页面域
pageContext PageContext setAttribute() getAttribute()
JavaBean
就是一个java的实体类
* 定义 * 必须有一个无参的构造方法 * 属性私有化 * 私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。 public class User{ private String username; private String password; public void setUsername(){ } public void getUsername(){ } public void getPassword(){ } public void getInfo(){ } }
* 作用:封装数据。
JSP 标签
1. 页面引入 jsp:include 将其他文件的内容引入到本页面 动态导入 <jsp:include> :页面的包含(动态包含) 属性:page 要包含的页面 <%@ include file="jsp文件"%> 静态导入 两种的区别: 动态导入:当前页面和关联页面分开转换和编译,当当访问当前页面时,才将编译后的关联页面 的内容加入到当前页面中 静态导入:将关联页面中的全部内容,加入到当前页面,然后进行统一转换和编译 2.跳转页面: <jsp:forward page="目标页面地址"/> <jsp:forward> :转发 属性:page 要转发的页面 3.创建对象: <jsp:useBean id="对象名" class="类的完整路径"/> 4.设置属性: <jsp:setProperty name="对象名" property="属性名" value="值"/> 5.获取属性: <jsp:getProperty name="对象名" property="属性名"/>
EL表达式
作用:将jsp页面中的小脚本彻底替换
特点: 写法简单,数据类型可以自动转换
1.使用变量名获取值
语法:${key值}
pageContext.setAttribute();//在当前页面中保存数据
pageContext是EL隐式对象中的jsp隐式对象
pageContext.getRequest()
返回的类型是ServletRequest
pageContext.getResponse()
返回的类型是ServletResponse
存值: 取值:{作用域 . key} pageContext.setAttribute() ${pageScope.key} request.setAttribute(); ${requestScope.key} session.setAttribute(); ${sessionScope.key} application.setAttribute(); ${applicationScope.key}
注意:
当指定了作用域时,el只会在该作用域中查找数据,
如果不指定作用域,则el会按照page->request->session->application的作用域顺序逐个查找数据
key是相同的情况下
2.eL访问对象
el访问对象(点符号前写的key值指的是作用域中setAttribute()方法中的key值) ${requestScope[作用域].u[KEY值].name[对象的属性] } ${key.对象的属性名} 不写作用域 ${key["属性名"]} 不写点 注意:el表达式是通过属性的get方法进行属性数据的访问
3.eL访问list集合
${key值[下标]}
4.eL访问map集合
${key值.map中的key值}
${key值.map中的key值.属性值}
5.支持条件的判断
<h1>el表达式中写关系运行符:${3<pageTotal?1:2}</h1> //三目运算 <h1>el表达式中写逻辑运行符:${3>5||4<7}</h1> <h1>el表达式中写逻辑运行符:${!(3>5)}</h1> <h1>empty:${not empty abc}----${empty abc}</h1>//判断abc【变量】是否存在 存在返回false 不存在返回true
JSTL标签:(c标签库)
对于页面中的小脚本我们使用了EL表达式进行了一个简化。但是存在有些逻辑判断语句和循环语句我们是不能够使用EL比到时来完成的。赋值也是不能够实用EL表达式完成的
JSP标准标签库
JavaServerPages Standard Tag Library
优点
1.提供一组标准标签
2.可用于编写各种动态的jsp页面
使用JSTL标签之前先在页面中引入标签的支持:
uri是固定不变的,后面的prefix是去一个别名的意思【自定义、】但是一般都叫c
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
通用标签
(1)存值:
(1)存值: <c:set var="变量名" value="内容" scope="page|request|session|application"/> 等价于 request.setAttribute("str" , "字符串") 存对象的属性值: <c:set target="要存值的对象" value="属性值" property="属性名"/> 示例: <% Users users=new Users(); users.setName("abc"); request.setAttribute("user",users); %> user的原值:${user.name}<br> <c:set target="${user}" value="value新值" property="name"/> user的新值:${user.name}<br>
(2)输出标签:
<c:out value="要输出的值"/> 示例: <c:out value="值"/> <c:out value="${key}"/>
c:out处理标签 和 EL表达式的区别: ${"<a href='#'>百度</a>"} 展示在页面中的是 一个带有功能的百度字样 <c:out value="<a href='#'>百度</a>"></c:out> 展示在页面中的是 一个纯文本信息没有任何功能 在加上一个属性escapeXml="Y" 就和EL表达式一样了显示一个带有功能的文本信息 <c:out escapeXml="Y" value="<a href='#'>百度</a>"></c:out> 这个属性和值的意思是边坡是支持或者编辑信息中的html标签
(3)删除变量:
<c:remove var="变量名"/> 示例: <c:set var="name" value="张三"/> ${name}<br> <c:remove var="name"/>
条件标签【判断】
条件判断:c:if
java----if(条件){} jstl----<c:if test="条件"></c:if> <c:if text="条件判断的表达式" var= “ 设定一个变量用于保存结果” scope = “ 作用域”
条件判断2:c:choose
格式 <c:choose> <c:when test=""></c:when> 满足一定条件就会被执行 <c:otherwise></c:otherwise> 当上述条件都不满足时执行 </c:choose> 示例: <c:set var="title" value="董事长23"/> <c:choose> <c:when test="${title=='总经理'}"> 总经理界面 </c:when> <c:when test="${title=='董事长'}"> 董事长界面 </c:when> <c:when test="${title=='CEO'}"> CEO界面 </c:when> <c:otherwise> 我也不知道你是谁 </c:otherwise>
迭代标签【循环】
语法: <c:forEach items="要遍历的集合" var="集合中每一个元素都会赋给这个变量" varStatus="记录数"> ${s}---${记录数.index}//记录的下标 ---${sta.count}//记录的行数 <br> </c:forEach> 示例: <c:forEach items="${mylist}" var="s" varStatus="sta"> ${s}---${sta.index}---${sta.count}<br> </c:forEach> 使用sta.index来完成隔行换色 <c:forEach items="${list}" var="good" varStatus="sta"> <!-- 隔行变色 --> <c:if test="${sta.index%2 == 0 }"> <tr style="background-color: yellow"> </c:if> <c:if test="${sta.index%2 != 0 }"> <tr> </c:if>
补充:可以使用begin,end属性实现数值循环 <c:forEach var="i" begin="1" end="5"> for(int i=1;i<=5;i++){syso(i);} ${i} </c:forEach> 效果:1 2 3 4 5
如果你需要添加一个jar包
/项目名/WebRoot/WEB-INF/lib/jstl.jar
/项目名/WebRoot/WEB-INF/lib/standard.jar
获取WEB开发中的对象
request中
param 获取请求的参数 getParameter() <h4>EL的WEB对象</h4> ${ param.username }
paramValues 获取请求的参数 getParameterValues() header 获取请求头的信息 <h4>获取请求头</h4> ${ header.referer }
headerValues 获取请求头的信息
initParam 获取全局的初始化参数 <h4>获取全局初始化参数</h4> ${ initParam.username }
cookie 获取cookie
pageContext <h4>pageContext对象</h4> ${ pageContext.request.contextPath }
path和basepath
path = /C1709A_20171205_Day15_MVSC basePath = http://localhost:8080/C1709A_20171205_Day15_MVSC/ 直接使用<%= path%>就可以