1. 运行jsp首先需要搭建环境
jsp是在服务器运行的,因此需要一个web容器作为服务器作为运行环境,推荐使用tomcat。
特点:
- 在html中写java代码开发动态资源
- 放在服务器中运行,tomcat中的work目录用于存放jsp临时文件
2.jsp执行过程
问题:为什么通过http://localhost:8080/test.jsp就可以显示效果?
- 首先,访问到test.jsp文件。服务器(jspparse)解析jsp,在tomcat/work目录下翻译成test.java文件 --翻译过程
- 然后将test.java编译成test.class文件 --编译过程
- 构造test.class实例
- 执行test.class中的方法
注意:
- 第一次访问test.jsp,走1,2,3,4;第二访问走4
- 都是在tomcat服务器中执行的
- jsp 文件修改了或临时文件删除了,都会重新走翻译和编译的过程
3.生命周期
对比servlet生命周期:
执行:
1. 构造方法(第一次访问)
2. init方法(第一次访问)
3. service方法
4. destroy方法
jsp生命周期:
执行:
1. 翻译
2. 编译
3. 构造方法
4. init方法
5. service方法
6. destroy方法
4. jsp语法
- jsp模板
就是jsp中html代码的部分 - jsp表达式
语法:<%=表达式 %>
作用就是向流浪器输出变量的值 - jsp脚本
语法: <%java代码 %>
作用:执行java代码
原理:把Java代码拷贝到service方法中执行 - jsp声明
语法:<%! 变量 %> - jsp注释
语法:<%!-- 注释 --%>
注意:jsp注释不会被翻译和执行,html注释会翻译和执行
5.jsp三大指令
5.1 including指令
语法:<%@including file=“common/test.jsp” %>
作用:在当前页面包含其他页面,例如每一个网站下面都有版权相关信息,如果没次都写的话,非常麻烦,而且维护起来也相当不方便,工作量非常大,这时候就可以使用包含指令。
1,准备footer.jsp
2,静态包含
<%@include file="footer.jsp" %>
注意:
- 原理就是将两个jsp文件翻译成一个java源文件,再编译执行。叫做静态包含
- 被包含的页面可以不出现全局html标签了,因为会翻译到一个原文件中去,所以千万不要定义重复变量!!!
5.2 page指令
作用:告诉tomcat服务器如何翻译jsp文件
语法: <%@page
language =“java” – 翻译成的语言
import =“java.util.*” --java代码需要用到的包
pageEncoding =“utf-8” --服务器翻译jsp使用的编码
contentType =“text/html,charset=utf-8” --服务器输出到浏览器的内容与编码
isErrorPage=“false” --当前页面是否为错误处理页面
errorPage =“error.jsp” --指定错误处理页面
isELIgnored=“false” --是否支持EL表达式
seesion=“true” %>
6.九大内置对象
jsp内置了九大内置对象,在jsp加载完成是就会创建
名称 对应类型
request HttpServletRequest
response HttpservletResponse
session HttpSession
page Object(this)
config ServletConfig
application ServletContext
exception Throwable
out JspWriter
pageContextt PageContext
6.1 out对象与printlnWriter对象
PrintlnWriter:直接向流浪器输出内容
out对象 :向jsp缓存写数据,相当于带缓存的printWriter
注意:以下才会刷新缓存:
- 手动刷新
- 缓存区满了
- 改jsp或者执行完jsp
6.2 pageContext对象
类型为PageContext,封装了其他对象,可用来获取其他对象,在自定义标签时常用
注意:pageContext也是域对象
jsp中有四大域对象,分别是:
request:只能在同一请求中使用
session : 只能在用一会话中使用
pageContext :只能在当前jsp使用
application : 在当前应用中使用
7. EL表达式
EL表达式非常好用,它的作用就是替代jsp表达式,可以输出变量,获取Javabean对象的属性,从域对象中取出数据
注意四个域对象的优先级
pageContext>request>session>application;
如果四个域对象都有同一个属性,则会按照优先级找;当然也可以到指定域对象中查找
//1.从域对象中获取数据
<%request.setAttribute("name","张三"); %>
${name }<!--默认从pageContext域中取数据-->
<%request.setAttribute("name","request");
pageContext.setAttribute("name", "pageContext");
session.setAttribute("name", "session");
application.setAttribute("name", "application"); %>
${name }<!--访问jsp输出pageContext-->
<!--指定域范围查找-->
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
//获取javabean的属性
${bean.name}//实际上bean.getName(
8. jsp标签
jsp标签用于替换掉jsp脚本,jsp中就可以不用出现大量的java代码了!!分为:
- 内置标签(动作标签):不需要导入
- jstl标签库:需要导入标签
- 自定义标签:需要导入
8.1 动作标签
<!--forward转发标签配合param参数标签使用-->
<jsp:forward page="/FooterJsp.jsp">
<jsp:param value="zhangsan" name="name" />
</jsp:forward>
8.2 jstl ——jsp standard tag library
开发中主要使用到核心标签库core和国际化标签fmt
8.2.1 core标签
set标签
out标签
remove标签
<!--使用taglib指令,uri代表tld文件中的URI,prefix表示简写-->
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!--相当于request.setAttribute("name","xiao")-->
<c:set var="name" value="${ 'xiao'}" scope="request"></c:set>
<!--相当于request.getAttribute("name")-->
<c:out value="${ name}"></c:out>
<!--相当于request.remove("name")-->
<c:remove var="name" scope="request"/>
if 单条件选择标签,没有else标签,可以使用empty判断对象是否为空,字符串长度是否为0,集合长度是否为0
<c:set var="hp" value="${88 }" scope="request"></c:set>
<c:if test="${hp<5 }"><p>这个英雄快死了</p></c:if>
<c:if test="${!(hp<5) }"><p>这个英雄还可以抢救</p></c:if>
<%
pageContext.setAttribute("weapon", null);
pageContext.setAttribute("lastwords", "");
pageContext.setAttribute("item",new ArrayList());
%>
<c:if test="${empty weapon }"><p>武器栏为空</p></c:if>
<c:if test="${empty lastwords }"><p>特种兵没有遗言</p></c:if>
<c:if test="${empty item }"> <p>穷鬼英雄,物品栏为空</p></c:if>
choose标签 多选择标签
<c:set var="ph" value="${80 }"></c:set>
<c:choose>
<c:when test="${ph<60 }"><p>盖伦快撑不住了</p></c:when>
<c:otherwise><p>盖伦:我觉得我还可以再抢救!!!</p></c:otherwise>
</c:choose>
foreach 循环标签
<%
ArrayList<String> heros=new ArrayList<String>() ;
heros.add("神枪手");
heros.add("剑魂");
heros.add("鬼泣");
%>
<table width="200px" align="center" border="1" cellspacing="0">
<tr>
<td>编号</td>
<td>英雄</td>
</tr>
<c:forEach items="${heros}" var="hero" varStatus="st" >
<tr>
<td><c:out value="${st.count}" /></td>
<td><c:out value="${hero}" /></td>
</tr>
</c:forEach>
</table>
direct 重定向标签
<c:redirect url="FooterJsp.jsp"></c:redirect>
forTokens标签,用于拆分字符串,可使用多个分隔符
<c:forTokens items="google,baidui,taobao" delims="," var="hero">
<c:out value="${hero }"></c:out>
</c:forTokens>