首页 > 代码库 > 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回顾