JSP
一、jsp的概念
- jsp(Java Server Pages)是一种动态网页开发技术
- jsp本质上是java的servlet,所以运行需要servlet容器
二、jsp的运行(以tomcat为例)
1、jsp怎么产生的?
在tomcat中lib目录下的jasper.jar负责解释jsp文件->.java文件->.class文件(继承了HttpJspBase(HttpServlet的子类))
2、编译后的文件放在哪
解释和编译好的文件(java和class)会放在tomcat的work\Catalina\localhost\项目名\org\apache\jsp目录下
三、jsp的生命周期
- 编译阶段:解释和编译jsp文件(所以第一次访问jsp文件会慢一点)
- 初始化阶段:调用编译后类的jspInit()方法
- 执行阶段:调用_jspService(request,response)方法
- 销毁阶段:调用destroy()方法
四、Jsp代码的格式
原本的HTML/CSS/JS代码的格式不变,引入了一些java脚本代码
1、jsp脚本元素
<%=%>
jsp表达式:里面可以写java代码,会被解释为out.print(jsp表达式的内容)<%%>
jsp脚本:里面写任何java代码,只要jasper能够认识,(tomcat8.5不能识别lambda表达式),会被解释在类的_jspService方法内<%!%>
jsp声明:里面写java中的声明,比如定义成员变量和方法,会被解释在类中
在jsp脚本中可以嵌入任何java代码,只要jasper能够认识,(tomcat8.5不能识别lambda表达式)
2、jsp指令<%@指令名字 属性="值" .. %>
-
page指令:
- language属性,目前只能是java
- import属性,引入相关的包
- pageEncoding属性,设置页面编码
- contentType属性,设置页面传输过程的编码方式
- session属性,是否支持session对象的使用,默认是支持的
- isThreadSafe属性,设置jsp页面是否是线程安全的
- errorPage属性,设置页面生错误时跳转的页面
- isErrorPage属性,设置这个jsp是一个显示错误信息的页面,只要这个属性被设置为true,就可以使用jsp的隐藏内置对象exception
-
include指令:
-
<%@include file="" %>
:静态包含另一个页面静态包含:把被包含的页面中的内容原封不动的拿到页面中
-
-
taglib指令
- 在当前jsp页面中引入一些特殊的标签库.比如jstl标签库、struts2标签库、spring标签库等等.
3、jsp动作
-
<jsp:useBean>
获取一个javaBean对象<jsp:useBean id="s" class="com.koutain.bean.Student" scope="page"></jsp:useBean>
相当于
<% Student s = null; s = (Student)pageContext.getAttribute("s"); if(s==null){ s = new Student(); pageContext.setAttribute("s",s); } %>
-
<jsp:setProperty>
为javaBean对象中的属性赋值<jsp:setProperty property="name" value="tom" name="s"/>
相当于
<% Student s = (Student)pageContext.getAttribute("s"); s.setName("tom"); %>
-
<jsp:getProperty>
获取JavaBean对象中的属性值<jsp:getProperty property="name" name="s"/>
相当于
<% Student s = (Student)pageContext.getAttribute("s"); out.write(s.getName()); %>
-
<jsp:forward>
jsp页面跳转//跳转的同时还可以传参数 <jsp:forward page="target.jsp?name=tom"></jsp:forward> 或者 <jsp:forward page="target.jsp"> //这个动作元素专门是传参数使用的 <jsp:param value="tom" name="name"/> </jsp:forward>
-
<jsp:include
动态包含<jsp:include page="foot.jsp"> <jsp:param value="lisi" name="name"/> </jsp:include>
- 动态包含和静态包含的区别?
- 动态包含是将要包含的页面翻译为一个方法的调用,访问这个页面的时候才会调用;静态包含是一开始就将目标页面翻译在同一类中
- 动态包含可以给目标页面传参数;静态包含不可以
- 动态包含和静态包含的区别?
-
<jsp:element>
向浏览器输出一个标签<jsp:element name="font"> <jsp:attribute name="color">blue</jsp:attribute> <jsp:body>hello world</jsp:body> </jsp:element>
相当于
<font color="blue">hello world</font>
五、jsp中的注释
1、//或/**/
注释
- 因为jsp中可以嵌入jsp脚本所以在jsp脚本中可以使用java的注释
2、<!---->
- 因为jsp页面最终是要输出文HTML代码,所以在非jsp脚本中可以使用HTML的注释
3、<%----%>
- 在jsp页面中还可以使用一种jsp独有的注释,使用位置和HTML注释一样
4、<!---->
和<%----%>
的区别
<!---->
会在最终输出的HTML源代码中显示,<%----%>
不会,<%----%>
只会在jsp页面的源码中显示
六、jsp中的九大内置对象
<%=%>
jsp表达式
<%!%>
jsp声明 在声明中无法使用jsp的9种内置对象
EL表达式
一、el表达式的使用
1、格式
${}
2、相关规则
- {}中可以是任意数据类型,会自动调用toString方法
- {}中还可以是算术表达式
- 判断是否为空
${empty "tom"}
- 使用三目运算符
${empty stu.age?"stu.age":"null"}
3、一些使用的情况
注意:当el表达式获取不到值时,什么都不做
二、el表达式"."后面跟的不是是attribute而是property
- attribute是javabeen的属性
- property是指JavaBean的Get方法
三、取值的优先级
<%
//pageContext.setAttribute("age", 10,PageContext.PAGE_SCOPE);
pageContext.setAttribute("age", 20,PageContext.REQUEST_SCOPE);
pageContext.setAttribute("age", 30,PageContext.SESSION_SCOPE);
pageContext.setAttribute("age", 40,PageContext.APPLICATION_SCOPE);
%>
${age }
属性名相同,在多个域对象中,取值的顺序是:page->request->session->appliction
四、el表达式中"."和[]的区别
在属性名或参数中有特殊符号时(例如"."),可以使用"[]"
JSTL标签库
使用jstl要额外引入jstl标签库的jar包(jstl.jar和standard.jar)
一、JSTL的使用
在jsp页面使用tablib指令添加:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
其中prefix后面跟的是使用jstl标签的前缀;uri后面是要引用的jstl标签库
二、JSTL标签库的常用标签
1、<c:forEach>
标签:遍历数组和集合
<%
List<Student> list = new ArrayList<Student>();
list.add(new Student("001", "zs1", 13));
list.add(new Student("002", "zs2", 14));
list.add(new Student("003", "zs3", 18));
list.add(new Student("004", "zs4", 11));
session.setAttribute("list", list);
HashMap<Long,Student> map = new HashMap<Long,Student>();
map.put(20L, new Student("002", "zs2", 14) );
map.put(30L, new Student("003", "zs3", 18) );
%>
<c:forEach items="${list }" var="stu" begin="0" end="3" step="1" varStatus="status">
${status.index }-${stu.id}-${stu.name }-${stu.age}<br>
</c:forEach>
<c:forEach items="${map }" var="entry">
${entry.key }-${entry.value.id }-${entry.value.name }-${entry.value.age }<br>
</c:forEach>
2<c:out>
标签:输出(相当于<%=%>
)
<c:out value="hello"></c:out>
<c:out value="${score}"></c:out>
3、<c:if>
标签:判断
<%-- 判断(eq判断字符串是否相等)--%>
<c:if test="${name eq 'tom'}">
tom is exist
</c:if>
4、<c:choose>
标签:相当于if/else if
<c:choose>
<c:when test="${score >=90 }">优</c:when>
<c:when test="${score >=80 }">良</c:when>
<c:when test="${score >=70 }">中</c:when>
<c:when test="${score >=60 }">及格</c:when>
<c:otherwise>差</c:otherwise>
</c:choose>
5、<c:set>和<c:remove>
标签:添加和删除元素
<%-- 添加元素 --%>
<c:set var="name" value="tom" scope="request"></c:set>
<c:out value="${name}"></c:out>
<%-- 删除元素 --%>
<c:remove var="name" scope="request"/>
<c:out value="${name}"></c:out>
6、<c:catch>
标签:在jsp页面处理产生错误的异常状况,并且将错误信息储存起来。
<c:catch var ="catchException">
<% int x = 1/0;%>
</c:catch>
<c:if test = "${catchException != null}">
<p>异常为 : ${catchException} <br />
发生了异常: ${catchException.message}</p>
</c:if>
7、<c:import>
标签:相当于jsp动作的动态包含
<c:import url=""></c:import>
8、<c:redirect>
标签: 重定向到某个页面
<c:redirect url=""></c:redirect>
三、自定义标签
1、先导
-
jsp2.0之前,自定义标签需要实现Tag接口,具体实现起来比较复杂
-
jsp2.0之后,要简单的定义一个自己的标签,可以继承SimpleTagSupport类
2、具体步骤
-
编写一个类继承SimpleTagSupport类,重写doTag()方法
public class HelloTag extends SimpleTagSupport { //添加的属性 private int count; public int getCount() { return count; } public void setCount(int count) { this.count = count; } @Override public void doTag() throws JspException, IOException { StringWriter sw = new StringWriter(); super.getJspBody().invoke(sw); String tagBody = sw.toString(); //按照count属性遍历 for (int i = 0; i < count; i++) { // 输出添加的标签体 super.getJspContext().getOut().print("hello:" + tagBody+"<br>"); } } }
-
创建.tld文件
在WEB-INF下创建一个后缀为.tld的文件(文件名随意),里面的内容可以参照tomcat安装目录下webapps/examples\WEB-INF\jsp\example-taglib.tld
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>simple</short-name> <uri>koutian-hello</uri> <tag> <name>hello</name> <tag-class>com.koutian.jstl.HelloTag</tag-class> <body-content>scriptless</body-content> <attribute> <!-- 属性名 --> <name>count</name> <!-- 属性是否必须 --> <required>true</required> <!-- 属性值是否可以使用el表达式 --> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
-
在jsp页面测试
<%@ page pageEncoding="UTF-8"%> <%@ taglib prefix="m" uri="koutian-hello" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>test myTag</title> </head> <body> <% request.setAttribute("name", "tom"); request.setAttribute("count", "10"); %> <m:hello count="${count }">${name }</m:hello> </body> </html>