首页 > 代码库 > JSP回顾
JSP回顾
-
JSP指令
- page指令
- include指令
- JSP声明
- java程序片段
- java表达式
- 隐含对象
- JSP的请求转发
-
包含
- 静态包含
- 动态包含
- PageContext抽象类
-
JSP访问javabean
- javabean
- 基本语法
-
EL表达式
- 基本语法
- 隐含对象
- 命名变量
- 定义和使用EL函数
- 自定义JSP标签
- JspTag接口
- JSP CORE库(JSTL)
-
一般用途的标签
-
<c:out>
标签 -
<c:set>
标签
-
-
条件标签
<c:if|choose|when|otherwise>
-
<c:if>
- choose when otherwise标签
-
-
迭代标签
-
<c:forEach>
标签 -
<c:forTokens>
标签
-
- form表单的格式
?
servlet源文件就是 .java
jsp文件可以包含:
* html
* JSP指令
* JSP声明
* java程序片段
* java表达式
* JSP隐含对象
JSP指令
<%@ 指令名 属性=”值“ %>
常见三个指令 page include taglib(比较多,后面写)
page指令
?
?
include指令
<%@ include file = "url" %>
JSP声明
<%! %>
用于声明与JSP对应的servlet的变量和方法
<%! int v =0 %>
<%!
public String method(int i)
{
}
%>
java程序片段
<% %>
嵌入任何有效的java代码,成为Scriptlet.如果在page指令中没有声明方法,那默认这段为JSP对应的servlet的service()中的代码块。
java表达式
<%= %>
将表达式的值输出到网页。int或者float会转换成字符串在输出
<html>
<head><title>hitCounter</title></head>
<body>
<H1>
You hit the page:
<%! int hitcount=1;%>
<%
int count=0;
hitcount=count++;
%>
<%=hitcount++ %>
times
</H1>
</body></html>
上述输出始终为 0 times
在<%! %> JSP声明中定义的变量为实例变量,程序片段<%%>中定义则为局部变量。
隐含对象
servletcontext servletrequest servletresponse等对象,在JSP中称为隐含对象,每个对象都被固定的引用变量引用。JSP不需要声明,可以直接使用。
?
<%String username = request.getParameter("username")%>
获取请求参数
<%= username %>
打印参数值
JSP的请求转发
<jsp:forward page="target.jsp">
<jsp:param name="username" value="http://www.mamicode.com/TOm">
</jsp:forward>
在taget.jsp中可以使用request.getParameter("username")获得参数值。
包含
上面写过包含指令:<%@ include file="URL">
包含标签:<jsp:include page="URL">
指令用于静态包含,标签用于动态包含。源组件和目标组件都共享请求范围内的共享数据。
静态包含
遇到<%@ include file="URL">
时,把代码融合到源组件中,然后翻译成servlet,在编译执行。两个对应同一个servlet 就可以共享局部变量数据。
所以静态包含目标组件只能是HTML和JSP,不能是servlet。
动态包含
两个对应不同的servlet 不能共享局部变量,但是请求范围的数据是可以共享的。
目标组件可以是HTML,JSP,servlet
还有一个flush属性,如果为true意味着在包含目标组件前就会把响应结果先发给客户。
PageContext抽象类
主要应用场合:
*JSP文件中的java程序片段
*JSP文件中自定义标签的处理类
PageContext类中的方法:
*用于向各种范围内存取属性
*用于获得由容器提供的其他对象的引用的方法
*用于请求转发和包含的方法
JSP访问javabean
javabean
表示业务数据,粗暴就是实体类。
是一个public的类
有一个不带参数的构造方法
get获取属性,set设置属性
基本语法
导入bean类 <%@ page import="mypack.CounterBean" %>
声明对象 <jsp:useBean id="mybean" class="mypack.CounterBean" scope="session"/>
与下面的java片段是等价的:
mypack.CounterBean myBean = null;
myBean = (mypack.CounterBean)session.getAttribute("myBean")
if(myBean == null){
myBean = new mypack.CounterBean();
session.setAttribute("myBean",myBean);
}
访问javabean属性
<jsp:getProperty name="myBean" property="count"/>
等价于
<%=myBean.getCount() %>
在一定的范围内(声明时候,scope指定),处于同一个会话中的web组件共享这个会话范围内的javaBean对象。
EL表达式
JSP2.0提出,用于替代传统的<%= %>的表达式,以及部分<%%>程序片段。
还可以作为JSP标签的属性的值。
<jsp:useBean id="myPageBean" scope="page" class="mypack.CounterBean">
<jsp:setProperty name="mypageBean" property="count" value="http://www.mamicode.com/${myPageBean.count+1}">
基本语法
\({var}
访问对象的属性:`\){customer.name}等价于
\({customer["name"]}`
访问数组:`\){customer[0]}`
隐含对象
?
上述11个隐含对象可以分为4种类型:
* http请求中的特定数据
${header["user-agent"]}
不能用. 因为有-特殊字符
${header.host}
${cookie.username.value}
调用名为"username"的cookie对象的getValue方法
* 表示特定范围
${sessionScope.cart.total}
调用会话范围内对象名为cart的getTotal方法
* 表示PageContext对象
${pageContext.servletContext.servletInfo}
application.getServerInfo()
${pageContext.request.requestURL}
request.getRequestURL()
*表示web应用的初始化参数集合
${initParam.driver}
application.getInitParameter("driver")
不能直接访问JSP的隐含对象
命名变量
EL表达式中的变量称为命名变量,它不是JSP文件中的局部变量或实例变量。
定义和使用EL函数
定义函数(就是java类),
jsp中声明<%@ taglid prefix="mm" uri="/mytaglib" %>
使用${mm.add(param.x,param.y)}来调用函数
在WEB-INF中创建mytaglib.tld 配置映射关系
在web.xml 配置
自定义JSP标签
(1)创建自定义标签的处理类
(2)创建TLD标签的描述文件
如何使用:
(1)把标签的处理类放到WEB-INF\classes
(2)将描述文件放在WEB-INF目录或者其子目录下
(3)在web.xml中声明
(4)在JSP中使用
JspTag接口
所有的标签处理类都要实现JspTag接口。
JSP CORE库(JSTL)
?
使用方式:
将standard.jar导入到WEB-INF/lib下,在JSP中通过taglib指令声明。
一般用途的标签
<c:out>
把一个表达式的结果打印到网页
<c:set>
设定明明变量的值
<c:remove>
删除一个命名变量
<c:catch>
用于捕获异常
<c:out>
标签
<c:out value="http://www.mamicode.com/表达式"/>
<c:out value="http://www.mamicode.com/${param.username}"/>
<c:out value="http://www.mamicode.com/"/>
以上代码与单纯的EL表达式${param.username}等价
设置默认值<c:out value="http://www.mamicode.com/表达式" default="默认值"/>
<c:set>
标签
*为String类型的命名变量设置值
*如果命名变量为javabean,就为这个对象的特定属性设置值
*如果命名变量为map类型,就为这个对象特定的key设定值。
1 <c:set var="命名变量的名字" value=http://www.mamicode.com/“表达式” scope=“page|request|session|application”/>
2 <c:set target="javabean的命名变量" property="javbean属性名" value="http://www.mamicode.com/表达式"/>
?
3.与2一致
条件标签<c:if|choose|when|otherwise>
<c:if>
<c:id test="逻辑表达式" var="代表逻辑表达式值的命名变量的名字" scope=""/>
该标签会把逻辑表达式的值存放在var属性指定的命名变量,scope默认是page
<c:if test="${param.username==‘Tom‘}" var="result" scpe="request"/>
等价于
<%String username=request.getParameter("username");
if(username!=null&&username.equals("Tom"))
request.setAttribute("result",true);
else
reques.setAttribute("result",false);%>
<c:if>
标签还可包含标签主体,当逻辑表达式为true时才会执行主体。
<c:if test="${param.save==`user`}">
Saving user
<c:set var="user" value="http://www.mamicode.com/Tom">
等价于
<%
String save=request.getParameter("save");
if(save!=null && save.equals("user")){
out.print("saving user")
pageContext.setAttribute("user","Tom");
}
%>
choose when otherwise标签
<c:choose>
<c:when test="${empty param.username}">
Nuknown user
</c:when>
<c:when test="${param.username==‘tom‘}">
${param.username} is manager
</c:when>
<c:otherwise>
${param.username} is employee
</c:otherwise>
</c:choose>
等价于
<%
String username=request.getParameter("username");
id(username==null){
out.print("Nuknown user")
}else if(username.equals("Tom")){
out.print(username+"is manager")
}else{
out.print(username+"is memployee")
}
%>
一些相关语法规则:
?
<c:otherwise>
必须位于<c:when>
标签之后
迭代标签
*<c:forEach>
:用于遍历集合中的对象,并且能重复执行标签主体
*<c:forTokens>
:用于遍历字符串中用特定分隔的字符串,并且重复执行标签主体
<c:forEach>
标签
<c:forEach var="代表集合中的一个元素的命名变量的名字" items="集合">
标签主体
</c:forEach>
例子:
<%@ page import="java.util.HashSet" %>
<%
HashSet names= new HashSet();
names.add("tom")
names.add("mike")
names.add("linda")
%>
<c:forEach var="name" items="<%=names %>" >
${name}
</c:forEach>
标签每次从集合中取出一个元素,并且把它放在NESTED范围的命名变量中,在标签主体中可以访问这个命名变量。
等价于
<%@ page import="java.util.HashSet" %>
<%
Iterator it=name.iterator();
while(it.hasNext()){
String name=(String)it.next();
pageContext.setAttribute("name",name);
}
name=(String)pageContext.getAttribute("name");
out.print(name+"")
pageContext.removeAttribute("name");
%>
<c:forEach>
标签的varStatus属性
varStatus属性用于设定一个javax.servlet.jsp.jstl.core的LOopTagStaus类型的命名变量,这个命名变量包含了从集合中取出的当前元素的状态信息。
*count 元素在集合中的序号 从1开始计数
*index 元素在集合中的索引,从0开始计数
*first 元素是否为集合的第一个元素
* last 元素是否时集合中的最后一个元素
<%@ page contentType="text/html; charset=GB2312" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.HashSet" %>
<%
HashSet names=new HashSet();
names.add("Tom");
names.add("Mike");
names.add("Linda");
%>
<table border="1">
<tr>
<td>序号</td>
<td>索引</td>
<td>是否为第一个元素</td>
<td>是否为最后一个元素</td>
<td>元素的值</td>
</tr>
<c:forEach var="name" items="<%=names %>" varStatus="status">
<tr>
<td>${status.count} </td>
<td>${status.index} </td>
<td>${status.first} </td>
<td>${status.last} </td>
<td>
<c:choose>
<c:when test="${status.last}">
<font color="red">${name} </font>
</c:when>
<c:otherwise>
<font color="green">${name} </font>
</c:otherwise>
</c:choose>
</td>
</tr>
</c:forEach>
</table>
<c:forTokens>
标签
用于便利字符串中用特定分隔符分隔的子字符串,并且能重复执行标签主体
<c:forEach var="代表字符串命名变量的名字" items="被分隔的字符串" delims="分隔符">
标签主体
</c:forEach>
<c:forTokens var="name" items="Tom:MIke:Linda" delims=":">
${name}
</c:forTokens>
form表单的格式
表单提交格式与浏览器有关
JSP回顾