JSP基础
-
1.jsp和servlet的分工
- jsp
- 作为请求发起页面,例如显示表单、超链接
- 作为请求结束页面,例如显示数据
- servlet
- 作为请求中处理数据的环节
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j8vhBBAn-1594728087223)(en-resource://database/3015:1)]
- 作为请求中处理数据的环节
- jsp
-
2.jsp的组成
- jsp = html + java脚本 + jsp标签(指令
- jsp中无需创健即可使用的对象一共有9个,被称之为9大内部对象
- request:客户端的请求信息
- response:封装了jsp产生的响应,然后被发送到客户端以响应客户的请求
- session:用来保存每个用户的信息,以便跟踪每个用户的操作状态
- application:应用程序对象(ServletContext)
- out:向客户端输出数据
- pageContext:
- 为JSP页面包装页面的上下文。
- 管理对属于JSP中特殊可见部分中己经命名对象的该问
- config:表示Servlet的配置,当一个Servlet初始化时,容器把某些信息通过此对象传递给这个Servlet
- page:Jsp实现类的实例,它是jsp本身,通过这个可以对它进行访问
- exception:反映运行的异常
- 四大域对象
- page域: 只能在当前jsp页面使用 (当前页面)
- request域: 只能在同一个请求中使用 (转发)
- session域: 只能在同一个会话(session对象)中使用 (私有的)
- context域: 只能在同一个web应用中使用 (全局的)
-
3.中java脚本
-
<%…%>:java代码片段(常用),用于定义0~N条Java语句,方法内写什么,就能写什么
-
<%=…%>:java表达式,用于输出(常用),用于输出一条表达式(或变量)的结果。
print(…),…写什么就能写什么 -
<%!..%>:声明:用来创健类的成员变量和成员方法(基本不用
Class sd {…},…些什么就写什么 -
<%-- … --%>:注释,不会被编译到java
-
-
4.jsp原理
- 是一种特殊的Servlet
- 当jsp页面第一次被访问时,服务器会把jsp编译成java文件(这个java其实是一个servlet类)
- 然后再把java编译成.class
- 然后创健该对象
- 最后调用它的service()方法
- 第二次请求同一个jsp时,直接调用service()方法
- 在tomcat的work目录下可以找到jsp对应的.java源码
- 查看jsp对应的java文件
- java脚本
- html
- 是一种特殊的Servlet
JSP高级
JSP九大内置对象
- out(JspWriter):等同于reponse.getWriter(),用来向客户端发送文本数据
- config(ServletConfig)
- page(当前JSP的真身类型):当前JSP页面的this,即当前对象
- pageContext(PageContext):页面上下文对象
- exception(Throwable):只有在错误页面中可以使用这个对象
- request(HttpServletRequest)
- response(HttpServletRespone)
- application(ServletContext)
- session(HttpSession)
config、page、exception基本不会使用
exception、session不是每个jsp页面都可以使用
- pageContext
- Servlet中有三大域,而JSP中有四大域,pageContex就是最有一个域对象
- ServletContext:整个应用程序
- HttpSession:整个会话
- request:一个请求链
- pageContext:一个jsp页面
- 这个域是当前jsp页面和当前jsp页面中使用的标签之间共享数据
- 代理其他域!
- getAttribute和setAttribut中
- 最有一个参数可以设置PageContext.SESSION_SCOPE其他域
- getAttribute和setAttribut中
- 全域查找:pageContext.findAttribute()
- 从小域到大域查找
- 获取其他8个内置对象
- Servlet中有三大域,而JSP中有四大域,pageContex就是最有一个域对象
JSP三大指令
- page–>最复杂
- include–>静态包含
- taglib—>导入标签库
page指令
- 格式:
<%@ page language="java" info="xxx" ...%>
- 特性:一个页面可以放N个Page指令,位置随意,没有必须属性,都是可选
- 属性:
- pageEncoding和contentType
- pageEncoding:指定当前jsp页面的编码,tomcat将.jsp编译成.java时需要
- contentType:表示添加一个响应头Content-Type等同于 repsonse.setContentType(“text/html; charset=utf-8”);
- 如果两个属性只提供一个,那么另一个的默认值为设置的哪一个
- 如果两个属性都没有设置,那么默认为iso
- import:导包,可以出现多次,或者多个包用逗号隔开
- errorPage和isErrorPage
- errorPage:当前页面如果抛出异常,那么转发到哪一个页面,由errorPage指定
- isErrorPage:指定当前页面是否为处理错误的页面(true或false),HTTP状态码会设置为500,只有True才可以使用9大内置对象的Exception
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zw4U8x4G-1594728087225)(en-resource://database/3033:1)]
- autoFlush和buffer
- autoFlush:指定jsp的输出流缓冲区满时是否自动刷新,默认为true,如果为false,那么缓冲区满时抛出异常
- buffer:指定缓冲区大小,默认为8kb,通常不需要球盖
- isElIgnored:是否忽略EL表达式,默认值为false,不忽略,即支持EL表达式
- 不常用属性
- language:指定当前jsp编译后的语言类型,默认值为java
- info:说明性信息
- isThreadSafe:当前jsp是否支持并发访问,默认为false,为true时,jsp生成的Servlet会去实现一个过时的标记接口,SingleThreadModel,这时jsp只能处理单线程的访问
- session:当前页面是否支持session,如果为false,那么当前页面就没有session这个内置对象
- extends:让jsp生成的servlet去继承该属性指定的类
- pageEncoding和contentType
include指令:静态包含
- 与RequestDispatcher的include()方法功能相似
<%@ include%>
是在jsp编译成java文件时完成,他们共同生成一个java(就是一个servlet)文件,然后再生成一个class- RequestDispatcher的include()是一个方法,包含和被包含的是两个servlet,即两个.class!他们只是把响应的内容在运行时合并
- 感觉类似于C++的#include
- 作用:把页面分解了,使用包含的方式组合在一起,这样一个页面不变的部分,就是一个独立的JSP,而我们只需要处理需要变化的JSP
- 属性:
- file:包含的另一个jsp
taglib:导入标签库
- 属性:
- prefix:指定标签库在本页面中的前缀!由我们自己定义
- uri:指定标签库的位置
- <%taglib prefix=“pre” uri="/struts-tags" %>
- 使用标签pre:text
- 前缀名是处理冲突的
JSP动作标签
- 动作标签是由tomcat服务器来解释执行!它与java代码一样,都是在服务端执行的
- html由浏览器执行
- jsp:forward:转发,与RequestDispatcher的forward方法一样
- jsp:include:包含,与RequestDispatcher的include方法一样
- 属性:
- 都是page
- jasp:param:用来作为forwar和include的子标签!用来转发或办函的页面传递参数
<jsp:forward page="b.jsp">
<jsp:param value=""zhangsan" name="name"/>
</jsp:forward>
- tomcat的web.xml中
- 自动重新加载,只适合在开发中使用
JSP中JavaBean标签
- jsp:userBean 创健或查找bean
- jsp:setProperty 设置属性
- jsp:getProperty 获取属性
<jsp:userBean id="user" class="cn.xxx.xxx.User" scope="session"/>
<jsp:setProperty name="user" property="username" value="admin"/>
<jsp:getProperty name="user" property="username" />
EL表达式
-
EL表达式是jsp的内置语言
- jsp2.0开始,不让再使用java脚本,而是使用el表达式和动态标签
- EL替代的是<%=…%>
-
全域查找取值
${request_XXX}
- 如果域中不存在值,则输出空字符串
- 从小域到大域取值
-
指定域查找
- ${pageScope.xxx}
- ${requestScope.xxx}
- ${sessionScope.xxx}
- ${aplicationScope.xxx}
-
JavaBean导航
Emp emp;
request.setAttribute(“emp”, emp);- ${requestScope.emp.address.street}
-
EL内置对象11个
- 域查找的四个
- 请求参数相关
- param:Map<String,String>类型,param对象可以用来获取参数与request.getParameter()方法相同,Key是参数名,value是属性值
- $<param.username>
- paramValue: Map<String, String[]>类型,当一个参数名,对应多个参数值时可以使用它
- $<[paramValues.hobby[0]>
- header:对应请求头,Map,key头名称,value单值
- ${header[‘User-Agent’]}
- headerValues:对应请求头,Map,key头名称,value多个值
- initParam:获取内的参数
- ${initpAram.xxx}
- param:Map<String,String>类型,param对象可以用来获取参数与request.getParameter()方法相同,Key是参数名,value是属性值
- cookie:Map<String, Cookie>类型
- ${cookie.username.value}}
- pageContext:PageContext类型
- ${pageContext.request.scheme}
- ${pageContext.request.contextPath}项目名称
-
EL函数库
- 1.导入标签库<%@ taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions” %>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3DpdlOet-1594728087227)(en-resource://database/3039:1)] - 自定义函数库
- 写一个java类,类中可以定义0~N个方法,必须静态必须,必须有返回值
- 在WEB-INF目录下创健一个tld文件
- 在jsp页面中导入标签库uri="/WEB-INF/xxx/xxx.tld"
- 1.导入标签库<%@ taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions” %>
JSTL标签库
- apache提供的,依赖EL
- 四大标签库
- core:核心标签库
- fmt:格式化标签库
- sql:数据库标签库,过时Model1年代
- xml:xml标签库,过时Model1年代
core
- 导包<%@taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%>
- out和set
- <c:out>输出
- value:可以是字符串常量,也可是以EL表达式
- default:当要输出的内容为null时,会输出default指定的值
- excapeXml:默认值为true,表示转义
- <c:set>创健域的属性,默认域是pageContext
- var:变量名
- value:变量值,可以是EL表达式
- scope:指定域(page,request,session,application)
- <c:out>输出
- remove 删除域中的变量
- var:变量名
- scope:如果不指定scope,表示删除所有域中该名称的变量
- url
- value:指定一个路径,他会在路径前面自动添加项目名!
- <c:url value="/index.jsp" /> 它会输出/项目名/index.jsp
- 子标签:<c:param>,用来给url后面添加参数,可以对参数进行url编码
<c:url value=“index.jsp”>
<c:param name=“username” value=“张三”>
</c:url> - var:指定变量名,一旦添加了这个属性,那么url标签就不会输出到页面,而是把生成的url保存到域中
- scope:它与var一起使用,用来指定变量添加到哪个域
- value:指定一个路径,他会在路径前面自动添加项目名!
- if
- <c:if test=“布尔类型值或表达式 栗子:${not empty a}”>…</c:if> 当test为真时,执行标签体内容
- choose 相当于ifelse,当test中为真时输出
<c:choose>
<c:when test=“布尔类型值或表达式”>…</c:when>
<c:otherwise>…</c:otherwise>
</c:choose> - forEach用来循环遍历数组、集合,可以用计数方式循环
<c:forEach var="i" begin="1" end="10">
${i}
</c:forEach>
- var 循环变量
- begin:循环遍历从几开始
- end:循环遍历到几技术
- step:步长,默认为1
<c:forEach items="${strs}" var="str">
${str}
</c:forEach>
-
items:指定要循环谁,它可以是一个数组或集合,items中不能有空格
-
var:把数组或集合中的每个元素赋值给var指定的变量
-
forEach循环状态变量
<c:forEach items="${strs}" var="str" varStatus="vs">
${vs.count}
</c:forEach>
- count:int类型,当前遍历元素的个数
- index:index类型,当前元素的下标
- first:boolean类型,是否为第一个元素
- last:boolean类型,是否为最后一个元素
- cuurent:Object类型,表示当前项目
fmt
<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt”%>
<fmt:formatDate value="${d}" patten=“yyyy-MM-dd HH:mm:ss”>
- value:指定一个Date类型的变量
- pattern:用来指定输出的模板!
<fmt:formaNumber value="${d}" patten=“0.00”>
- 表示小数点后几位,四舍五入
- #.##不补位
- 0.00补位