您的位置:首页 > Web前端 > JavaScript

web开发学习笔记四:jsp

2017-01-09 00:11 316 查看
jsp:用java语言(+html语言)开发动态资源的技术
jsp页面可以写java代码,也可以写html代码
jsp也是servlet,
servlet的技术可以用在jsp程序中
jsp的技术并不是全部适用于servlet程序

一.jsp的生命周期
jsp也是servlet,所有jsp的生命周期与servlet差别不大,

jsp的生命周期:
1.翻译:jsp->java文件
2.编译:java文件->class文件
3.构造方法(第一次访问)
4.init方法(第一次访问):_jspInit();
5.service方法:_jspService();
6.destroy方法:_jspDestroy();

二.jsp语法
jsp脚  本:<% 在这中写java代码 %>
jsp表达式: <%= 向浏览器输出变量或表达式计算的结果  %>
jsp声  明:<%! 声明jsp的成员变量或成员方法 %>
jsp注  释: <%--  这是注释 --%>

三.jsp的三大指令:

include指令:在当前页面用于包含其他页面,包含的页面会在最顶部
<%@include file="要包含的资源路径" %>

page指令:告诉tomcat服务器如何翻译jsp文件
各个参数含义如下:
language:翻译的动态语言,java
import:  导入包,多个包之间使用,相隔

编码相关参数:
pageEncoding:告诉tomcat服务器使用什么编码翻译jsp文件(jsp->java文件)
contentType:  服务器发送浏览器的数据类型和内容编码,一般不需要设置

错误相关参数:
errorPage:指定当前jsp页面的错误处理页面
isErorrPage:指定当前页面是否为错误处理页面。
false,不是错误处理页面,则不能使用exception内置对象
true,是错误处理页面,可以使用exception内置对象
其它参数:
session:是否开启session功能
false,不能用session内置对象
true,可以使用sessio置对象
buffer: jsp页面缓存大小
isELIgnore:是否忽略EL表达式

taglib指令:导入标签库(tld文件)
<%@taglib uri=" 所要导入的tld文件的uri " prefix=" 简写名 " %>

四.jsp的内置对象
Sun公司设计Jsp时,在jsp页面加载完毕之后就会自动帮开发者创建好一些常用对象,
这些创建好的对象就叫内置对象。

jsp的9大内置对象
对象名 对象类型
request
HttpServletRequest
response
HttpServletResponse
config
ServletConfig
application
ServletContext
session
HttpSession
exception
Throwable
page Object(this)
out jspWriter
pageContext
PageContext

out对象:相当于带缓存的PrintWriter
PrintWriter:
write("内容"),直接向浏览器写出

JspWriter:
write("内容"),向jsp缓冲区写出内容

当满足以下条件之一,缓冲区内容写出:
1.缓冲区满了
2.刷新缓存区
3.关闭缓存区
4.执行完毕jsp页面

pageContext对象: jsp的上下文对象
可以获得其它8个内置对象,如: pageContext.getOut(),;pageContext.getSession();

也是四个域对象之一:pageContext
域对象保存获取数据的方法都是: get/set Attribut();

pageContext作为域对象,可以往不同域对象中存取数据
pageContext.setAttribute("key","value",PageContext.REQUEST_SCOPE);

加上域范围常量,pageContext便可以把数据存到相应的域对象中。

域范围常量:
PageContext.PAGE_SCOPE //pageContext默认
PageContext.REQUEST_SCOPE
PageContext..SESSION_SCOPE
PageContext.APPLICATION_SCOPE

既然pagetContext可以把数据存在不同的域对象中,自然也可以在不同的域对象中取
pageContext.getAttribute("key",PageContext.REQUEST_SCOPE);
与存一致,只需要加上域范围常量便可。

自动在4个域对象中搜索数据
pageContext.findAttribut("key");

搜索的顺序为:pageContext域 --> request域 --> session域 -->  ServletContext域

域对象作用范围:
pageContext域:
在当前jsp页面中使用(当前页面)
HttpServletRequest域:
在同一个请求中使用(转发)
HttpSession域:
在同一个会话(session对象)中使用(私有的)
ServletContext域:
在同一个web应用中使用(全局的)

五.EL表达式:向浏览器输出域对象中的变量值或表达式计算的结果
jsp表达式<%= %> 和 jsp脚本<% %> 在这语法中书写java代码会导致代码混乱不易维护,
所以在开发中应尽量书写java代码,使用el表达式来替换掉jsp表达式<%= %>

el表达式语法:${变量或者表达式}

输出基本类型和变量

${key} 表示从四个域中搜索名为key的数据 = pageContext.findAttribut("key")

${requestScope .key} 表示从request域中搜索名为key的数据 
等同于 pageContext.getAttribute("name",PageContext.PAGE_SCOPE)

输出对象的属性值
如下数据:
Student student = new Student("eric",20);
pageContext.setAttribute("student",student);

${student.name}表达式中的.就相当于调用该对象的getxx方法,${student.name} = student.getName();
${student.age } 等同于该代码 (Student)pageContext.findAttribute("student")).getAge();

如果域对象存的是List类型呢
pageContext.setAttribute("list",list);

${list[0]}取出list数组下标为0的数据, [0]中括号相对于调用get(参数)方法 list.get(0)
等同于(List)pageContext.findAttribute("list")).get(0)

如果数据为对象,想取出对象属性值得话
${list[0].name} 与上相似

如果域对象存的是Map类型呢 Map(key,value)
pageContext.setAttribute("map",map);

${map['key']} 与list类似,不同的是list中 [0] 填写的是下标,map中填写的是[key]值

如果数据为对象,想取出对象属性值得话
${map['key'].name} 如上原理:.代表getxxx方法,map['key']得到对象,.调用方法得到属性

普通的表达式计算如:

${10+5} 算数表达
${10>5} 比较运算
${true || false} 逻辑运算

name = "";
${name==null || name==""} 判空

六.jsp标签
标签分类:
1.内置标签(动作标签): 不需要在jsp页面导入标签
2.jstl标签: 需要在jsp页面中导入标签
3.自定义标签 : 开发者自行定义,需要在jsp页面导入标签

1.内置标签
<jsp:forward> 转发标签,
<jsp:forward page="转发资源路径"> </jsp:forward>

<jsp:param> 参数标签
转发中可以带参数转发
<jsp:forward page="转发资源路径"> 
<jsp:param value="tom" name="cat"/>
</jsp:forward>

转发的页面可以接受参数
<%= request.getParameter("cat") %> 得到的值为 "tom"

转发标签等同于
request.getRequestDispatcher("/资源路径").forward(request,response);
如果带参数的话便是
request.getRequestDispatcher("/资源路径?cat=tom").forward(request,response);

<jsp:include> 包含标签
<jsp:include page="包含的页面资源路径"> </jsp:include>,也可以带参数

与include指令的区别
include指令: <%@inclue file="被包含的页面"%> 静态包含
<jsp:include>标签: <jsp:include page="被包含的页面"> 动态包含

静态包含不能像被包含的页面传递参数
动态包含可以像被包含的页面传递参数

静态包含: 先合并再翻译
动态包含: 先翻译再合并

2.jstl标签:java standard tag libarary  java标准标签库
使用jstl标签需要导入标签,使用taglib指令导入标签
<%@taglib uri=" 所要导入的tld文件的uri " prefix=" 简写名 " %>

掌握核心标签库 (c标签库)
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

核心标签库的标签:

set标签,保存数据(保存到域中),默认pageContext域
<c:ser var="key" value="值" scope="指定保存的域,request"></c:set>

out标签,获取数据(从域中),
<c:out value="${key}"
default="<h3>标题3</h3>": 当value值为null时,使用默认值
escapeXml: 是否对value值进行转义,false,不转义,true,转义(默认)
></c:out>

if标签,单条件判断
<c:if test="true"> 条件成立 </c:if>

choose标签+when标签+otherwirse标签: 多条件判断
<c:choose></c:choose> ==  switch 语句
<c:when test=""></c:when> == case 语句 test里放表达式判断
<c:otherwise></c:otherwise> == default :以上没有符合的变执行;

forEach标签:循环
<c:forEach>有如下参数:
items="":  需要遍历的数据(集合)
var="":    每个元素的名称
begin="" :  从哪个元素开始遍历,从0开始.默认从0开始
end="":     到哪个元素结束,默认到最后一个元素
step="" :  步长 (每次加几),默认1
varStatus="":当前正在遍历元素的状态对象。(count属性:当前位置,从1开始)    
如:
<c:forEach items="${list}" var="student" varStatus="varSta">
序号:${varSta.count} - 姓名:${student.name } - 年龄:${student.age}<br/>
   </c:forEach>

forToken标签: 循环特殊字符串

数据:String str = "java-php-net-平面";
pageContext.setAttribute("str",str);

items = 需要切割的内容  delims = 切割点 var = 切割后字符串的名字

<c:forTokens items="${str}" delims="-" var="s">
${s }
</c:forTokens>

redrict:重定向标签
<c:redirect url="路径资源"></c:redirect>

该文章内容只是本人作为初学者的学习笔记总结,若想深入了解详情请自行查阅相关资料
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: