JSP
HeChuangJun约 1720 字大约 6 分钟
jsp/el/jstl
- 建立在Servlet规范上的动态网页开发技术本质是servlet(Html + Java)
- 特点:跨平台、业务代码相分离、JavaBean组件重用、预编译(一个用户只编译一次)
- 产生原因:html页面输出太麻烦
- 本质就是servlet,第一次被访问的时候被web容器翻译成servlet再执行
- helloServlet.jsp→helloServlet_jsp.java源文件→helloServlet_jsp.class字节码文件
- 被翻译后的servlet在Tomcat的work目录中可以找到
- F:\Tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\WEB17\org\apache\jsp
- jsp继承了HttpjspBase,HttpjspBase类又继承了HttpServlet,故jsp就是servlet
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
脚本分类 | 说明 |
---|
<%(变量/方法/语句等)%> | jspScriptlets:被翻译到Servlet中的service方法的局部变量。调用完则释放内存空间,常用于输出 |
<%=(变量/表达式)%> | jsp表达式:被翻译成servlet中service方法内部out.print()输出,变量或者表达式后面不能有分号 |
<%!java代码%> | jsp声明语句:被翻译成servlet类的成员方法/变量/代码块,静态方法/变量/代码块,对整个jsp页面有效 |
注释分类 | 说明 | 可见范围 |
---|
Html注释 | <!--注释内容--> | jsp源码、java源码、html源码 |
java注释 | //单行注释/多行注释/ | java源码、jsp源码 |
jsp注释 | <%--注释内容--%> | jsp源码 |
指令(指导jsp翻译和运行的命令)分类 | 属性 |
---|
<%@page 属性名1="属性值1"%> | language:jsp脚本中可以嵌入的语言种类java |
属性名称区分大小写 | pageEncoding:读取jsp文件内容采用的编码一定要和保存文件的编码一致--内部可以包含contentType |
| contentType:有效文档类型text/html; |
| session:是否jsp在翻译时自动创建true/false |
| import:导入java的包 可多次,其他只能一次java.util.* |
| errorPage:当当前页面出错后跳转到哪个页面 |
| isErrorPage:当前页面是一个处理错误的页面true/false |
| buffer:8kb,jsp缓存大小,也是out的缓冲区大小 |
| autoFlush:自动刷新,true/false |
<%@taglib 属性名1="属性值1" > | uri:要引入的(jstl、struts2)标签库地址, prefix:前缀 使用xxx:前缀 |
<%@include 属性名1="属性值1"%> | file:被包含的相对于webcontent文件地址(静态包含) |
jsp被翻译成servlet后,service方法中有9个对象定义并初始化完毕,jsp脚本可直接使用
所有对象都可以存取数据request.setAttribute("age", 30);
9大内置对象名称 | 类型 | 说明 |
---|
request | HttpServletRequest | 得到用户请求信息 |
response | HttpServletResponse | 服务器向客户端回应信息 |
config | ServletConfig | 服务器配置,可以取得初始化参数 |
session | HttpSession | 保存用户信息 |
application | ServletContext | 所有用户的共享信息 |
page | Object | 指当前页面转换后的Servlet类的实例 |
exception | Throwable | 表示jsp页面所发生的异常,在错误页面中才起作用 |
pageContext | PageContext | jsp的页面容器,jsp页面的上下文对象 |
| | ①获得其他8个内置对象:pageContext.getRequest() |
| | ②域对象:setAttribute(String name,Object obj[,int scope]) |
| | getAttribute(String name[,int scope]) |
| | removeAttrbute(String name[,int scope]) |
| | pageContext.(PAGE/REQUEST/SESSION/APPLICATION)_SCOPE |
| | ③findAttribute(String name)依次从page,request,session,application域中获取属性 |
out | jspWriter | 用于页面输出 |
| | response.getWriter().write("a"),先输出,out.write后输出 |
| | out.write()先放到jspWriter缓冲区中(默认8kb) |
| | 若page属性buffer=“0kb” 关闭out缓冲区,则按顺序输出 |
jsp标签/动作 | 说明 |
---|
<jsp:include /> | page:被包含的页面的地址 flush:包含页面flush是否将输出内容立即刷新到客户端,默认false, |
| false;等全部加载完了再刷新 |
<jsp:forward /> | page="要转发请求的资源相对于webcontent地址" |
include指令(静态包含) | include标签(动态包含) |
---|
引入的资源必须是jsp格式的文件 | 引入的资源必须能被web容器独立运行 |
引入的资源是编译前包含的 | 引入的资源是编译后包含的 |
不限制改变状态码和设置响应头 | 不能改变状态码和设置响应头 |
简单的数据访问语言,使jsp的代码更加简化
分类 | 内置对象名称 | 说明 |
---|
作用域 | pageScope | page作用域 |
| requestScope | request作用域 |
| sessionScope | session作用域 |
| applicationScope | application作用域 |
请求参数 | param | 获得一个参数 |
| paramValues | 获得一组参数 |
请求头 | header | 获得一个请求头 |
| headerValues | 获得一组请求头 |
jsp上下文对象 | pageContext | |
全局初始化参数 | initParam | |
cookie | cookie | |
内置对象使用 | 说明 |
---|
${内置对象} | 获得内置对象 |
${内置对象.key} | 获得内置对象数据 |
${内置对象.[key-xxx]} | 获得内置对象有-或者空格的数据 |
${内置对象.key[index]} | 获得内置对象数据为数组,list,map,对象集合的数据 |
${key} | 底层使用findAttribute("name"),依次从page、request、session、application获得数据 |
${pageContext.request} | pageContext获得其他八大对象 |
$(pageContext.request.contextPath)/XXX | 相当于<%=pageContext.getRequest().getContextPath%>获得WEB应用的名称 |
${表达式} | el表达式运算 |
- jsp标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能。
- jstl出现的目的同el一样也是要提到jsp页面中的脚本代码
jstl使用 | 说明 |
---|
导入jstl.jar | 包含JSTL规范中定义的接口和相关类 |
导入standard.jar | 包含用于实现JSTL的.class文件以及JSTL中5个标签库描述符文件(TLD) |
引入标签库 | <%@taglib uri="http://java.sun.com/jsp/jstl/coreopen in new window" prefix="c"%> |
遍历对象 | <c:forEach begin="0"end="5"var="i" step=“2”>${i}</c:forEach> |
| <c:forEach items="将要迭代的对象" var="每一个对象的值" [varStatus=""]> |
获得普通list的值 | <c:forEach items="{str }</c:forEach> |
获得list对象的值 | <c:forEach items="{user.nameopen in new window }${user.age}</c:forEach> |
获得普通map的值 | <c:forEach items="{entry.key }==${entry.value }</c:forEach> |
获得map对象的值 | <c:forEach items="{entry.value.nameopen in new window }--${entry.value.password }</c:forEach> |
判断条件 | <c:if test="" var="" scope="page"></c:if> |
输出 | <c:out value="hello,world"> |