JSP技术
JSP:Java Server Page
在html中嵌入代码
JSP可以接收请求、返回响应,本质就是Servlet
JSP运行原理 --本质 - Servlet
JSP在第一次被访问时会被Web容器翻译成servlet,在执行过程
被翻译后的servlet在Tomcat的work目录中可以找到
XXX.jsp---->XXX_jsp.java:间接继承HttpServlet
JSP脚本和注释
JSP脚本
<%java代码%> -----内部的java代码翻译到service方法的内部
<%=Java变量或表达>-----表达式需要有结果,结果会直接显示在页面上,会被翻译成service方法内部 out.print()
<%!java代码%>-----会被翻译成servlet的成员的内容,成员变量/方法
JSP注释
注释的可见范围:jsp代码、翻译后的Java代码、html页面源码
< !–html注释-- >:jsp代码、翻译后的Java代码、html页面源码
//Java注释:jsp代码、翻译后的Java代码
<%–jsp注释%>:jsp代码
JSP 指令----<%@ %>
page指令 —属性最多的指令(一般指令默认)
<%@ page 属性1="…" 属性2="…" …%>
常用属性:
language:JSP脚本中可以嵌入的语言种类,默认且只能写java
pageEncoding:当前JSP文件本身的编码,内部可以包含conType
contentType:response.setContentType(text/html;charset=UTF-8)
session:是否JSP在翻译时自动创建session
import:导入java包
errorPage:当 当前页面出错后跳转到哪个页面
isErrorPage:当前页面是一个处理错误的页面
buffer=“0kb”: 缓冲区大小
include指令
页面包含指令:包含子页面 - 静态包含
<%@include file=“被包含的文件地址”%>
A1.jsp:
B1.jsp
taglib指令
在JSP页面中引入标签库(jstl标签库、struts2标签库)
格式:< %@taglib uri=“标签库地址” prefix=“前缀”%>
JSP内置对象
在JSP脚本中可以直接使用的对象 --------------9个
request
<%
request.setAttribute("name", "wangwu");
%>
response
<%
response.setAttribute("name", "lisi");
%>
application
<%
application.setAttribute("name", "zhangsan");
%>
session
<%
session.setAttribute("name", "lisi");
%>
pageContext
<%
pageContext.setAttribute("name", "zhaoliu");
%>
config
out:输出流,有自己的缓冲区,和response缓冲区不一样,可以通过设置buffer="0kb"来关闭
page - this servlet
exception ->抓取到的异常 isErrorPage="true"时存在
pageContext:域对象 - 当前页面
pageContext可以操作其他的三个域
可以向指定的其他域中存取数据
setAttribute(String name,Object obj,int scope)
getAttribute(String name,int scope)
removeAttrbute(String name,int scope)
pageContext.setAttribute("","",PageContext.APPLICATION_SCOPE);
findAttribute(name)
--------------------------依次从四个域中,寻找name对应的值,直到找到为止,四个都没有返回null
--------------------------寻找次序从范围从小到大
pageContext域,request域,session域,application域
通过pageContext可以获得其他8个内置对象
pageContext.getRequest()
pageContext.getSession()
JSP动态标签:
动态包含:
<jsp:include page =""></jsp:include>
转发:
<jsp:forwad page=""></jsp:forwad>
静态包含和动态包含的区别:
静态包含:<%@ include file=""%>
----------------两个jsp在同一个java文件中被翻译
动态包含:<jsp:include page =""></jsp:include>
----------------两个jsp各自编译各自运行
EL技术
EL(Express Language)表达式可以嵌入在JSP页面内部,减少JSP脚本的编写,EL出现的目的是要替代JSP页面中脚本的编写。
EL表达式从域中取出数据
JSP脚本:<%=request.getAttribute(name)%>
EL表达式替代上面的脚本:${requestScope.name}//取代get方法
EL最主要的作用是获得四大域中的数据,格式${EL表达式}
EL获得pageContext域中的值:$(pageScope.key);
EL获得request域中的值:$(requestScope.key);
EL获得session域中的值:$(sessionScope.key);
EL获得application域中的值:$(applicationScope.key);
//EL获得Map<String,User>的值
<%
Map<String,User> map = new HashMap<String,User>();
map.put("user1", new User("lily",19));
map.put("user2", new User("lucy",20));
map.put("user3", new User("tom",21));
map.put("user4", new User("jhon",22));
session.setAttribute("userMap", map);
%>
${userMap.user2.age }<br>
//EL获得Map<String, List<User>>的值
<%
Map<String,List<User>> map2 = new HashMap<String,List<User>>();
List<User> list1 = new ArrayList<User>();
list1.add(new User("lily",19));
list1.add(new User("lucy",20));
List<User> list2 = new ArrayList<User>();
list2.add(new User("tom",21));
list2.add(new User("jhon",22));
map2.put("java",list1);
map2.put("c", list2);
session.setAttribute("classMap", map2);
%>
${classMap.c[1].name }
EL的内置对象 11个–了解
域:applicationScope/sessionScope/requestScope/pageScope
applicationScope .name ----- 取代了四个域中的getAttribute方法
${name}–取代了pageContext.findAttribute() --name是键值,与变量名无关
${实体类.属性名} -- 取代get方法,实体类的属性必须有get/set方法
${集合[index]}
${map.key}
${1+1}---2
<!--empty 判断依据,值是不是有效值,内容是否为空-->
<!--为空 = true 不为空 = false
null一定是空 ""/空集合 -> true-->
${empty ""}
内置对象:
*${header.user-agent}->"-"非法字符 可以用 ${header['User-Agent']}代替,所有.可以用中括号代替
<!--cookie 相当于Map<name,Cookie>-->
pageContext:
${pageContext.request.contextPath}获得应用名
JSTL
jstl必须要导库:
导包:
JSTL核心库的常用标签
<c:if test=" ">标签
test=判断条件 -只能true或者false
<c:if test="${empty user}"></c:if>
<c:forEach>标签
var = "i" ->等同于在当前页面定义了一个变量i,并且存入page域中
<c:foreach begin="0" end="9" step="1" var="i">${i }</c:foreach>
// for(String str : list){} --集合需要先存到list中
<c:foreach items="${list }" var="str">${str }</c:foreach>
map迭代:
entrySet entry:键值对集合
<c:foreach var="entry" items="${map}">
${entry.key} ----${entry.value}------key和value存在同一个entry集合中
</c:foreach>
四大作用域的总结:
page域:当前JSP页面范围
request域:一次请求
session域:一次会话
application域:整个web应用