JSP常用标签

一、标签技术

1.作用: 移除jsp页面的java代码

在jsp页面写一些标签,jsp引擎会根据标签去调用一个java类的成员方法

2.移除java代码的标签有一下几种:

1)jsp内置了一些标签,我们称作jsp标签或jsp动作元素

2)自定义标签: 自己写一个类,在标签描述文件中描述类和标签的关系

3)jstl标签 : 调用方法

4)el 表达式 : 用于在jsp页面取值

5)el函数: 针对字符串的常用操作

l   

<jsp:include>标签

l  <jsp:include>标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入。

l  语法:

       <jsp:include page="relativeURL | <%=expression%>" flush="true|false" />

ü  page属性用于指定被引入资源的相对路径,它也可以通过执行一个表达式来获得。

ü  flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。 

ü  <jsp:include>与include指令的比较

ü  <jsp:include>标签是动态引入, <jsp:include>标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。

ü  而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。

ü  不管是<jsp:include>标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。

ü  <jsp:forward>标签

<jsp:forward>标签用于把请求转发给另外一个资源。

语法:

       <jsp:forward page="relativeURL | <%=expression%>" />

ü  page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。

ü  <jsp:param>标签

当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给其它资源时,可以使用<jsp:param>标签向这个资源传递参数。

语法1

       <jsp:include page="relativeURL | <%=expression%>">

              <jsp:param name="parameterName" value="parameterValue|<%= expression %>" />

       </jsp:include>

语法2

       <jsp:forward page="relativeURL | <%=expression%>">

              <jsp:param name="parameterName" value="parameterValue|<%= expression %>" />

       </jsp:include>

<jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值。在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。

在JSP中使用JavaBean

l  JSP技术提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为:

l  <jsp:useBean>标签:用于在JSP页面中查找或实例化一个JavaBean组件。

l  <jsp:setProperty>标签:用于在JSP页面中设置一个JavaBean组件的属性。

l  <jsp:getProperty>标签:用于在JSP页面中获取一个JavaBean组件的属性。

<jsp:useBean>标签

l  <jsp:useBean>标签用于在指定的域范围内查找指定名称的JavaBean对象

  • 如果存在则直接返回该JavaBean对象的引用。
  • 如果不存在则实例化一个新的JavaBean对象并将它以指定的名称存储到指定的域范围中。

方法中的代码除了遇到return否则必定执行

导包 以及pageencoding 指令 可以冲突

url编码 :%ff 两个16进制数

jap:param 标签会对参数进行url编码

tomcat默认使用iso-8859-1进行url解码

l  常用语法:

              <jsp:useBean id="beanName" class="package.class"

                            scope="page|request|session|application"/>

  • id属性用于指定JavaBean实例对象的引用名称和其存储在域范围中的名称。
  • class属性用于指定JavaBean的完整类名(即必须带有包名)。
  • scope属性用于指定JavaBean实例对象所存储的域范围,其取值只能是page、request、session和application等四个值中的一个,其默认值是page。

l  标签体只在对象被创建时才执行

<jsp:setProperty>标签

l  <jsp:setProperty>标签用于设置JavaBean对象的属性

l  语法格式:

<jsp:setProperty name="beanName"

{

       property="propertyName" value="string " |

       property="propertyName" [ param="parameterName" ] |

       property= "*"

}/>

name属性用于指定JavaBean对象的名称。

property属性用于指定JavaBean实例对象的属性名。

value属性用于指定JavaBean对象的某个属性的值,value的值可以是字符串,也可以是表达式。为字符串时,该值会自动转化为JavaBean属性相应的类型,如果value的值是一个表达式,那么该表达式的计算结果必须与所要设置的JavaBean属性的类型一致。 

param属性用于将JavaBean实例对象的某个属性值设置为一个请求参数值,该属性值同样会自动转换成要设置的JavaBean属性的类型。

<jsp:getProperty>标签

l  <jsp:getProperty>标签用于读取JavaBean对象的属性,也就是调用JavaBean对象的getter方法,然后将读取的属性值转换成字符串后插入进输出的响应正文中。

l  语法:

       <jsp:getProperty name="beanInstanceName" property="PropertyName" />

name属性用于指定JavaBean实例对象的名称,其值应与<jsp:useBean>标签的id属性值相同。

property属性用于指定JavaBean实例对象的属性名。

l  如果一个JavaBean实例对象的某个属性的值为null,那么,使用<jsp:getProperty>标签输出该属性的结果将是一个内容为“null”的字符串。

l   EL表达式和JSTL标签快速入门

l  EL表达式用于获取数据,在JSP页面中可使用${标识符}的形式,通知JSP引擎调用pageContext.findAttribute()方法,分别从page、request、session、application四个域中查找相应的对象找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)

l  结合JSTL标签,EL表达式也可轻松获取各种集合中的元素。

l  EL表达式也可使用例如${1==1}的形式进行简单的逻辑判断。

l  EL表达式支持二元表达式非常好用

语法: ${user!=null?user.name : “”}

l  JSTL标签库 (要想迭代就用jstl标签)

  • JSTL是sun公司开发的一套标签库,使用JSTL可以在页面中实现一些简单的逻辑,从而替换页面中的脚本代码(java代码)
  • 在页面中使用JSTL标签需完成以下2个步骤:

1、导入jstl.jar和standerd.jar这两个JSTL的jar文件。

2、在JSP页面中使用<%@ taglib url=“”  prifix=“” %>元素导入标签库。

  • JSTL标签库中常用标签:

<c:foreach var=“” items=“”> 增强for循环

<c:if test=“”> 条件判断

二、 jsp标签

1. include标签

<jsp:include page="/jsptag/2.jsp" />

动态引入,首先将两个jsp分别翻译成两个Servlet,编译,两个Servlet对象之间实现包含

<%@ include file="/jsptag/2.jsp" %>

静态引入,将两个jsp翻译成一个Servlet

jsp页面包含时需要注意:

1)含的jsp页面不用写jsp模板元素

2)两个jsp页面的指令不能有冲突

       有两个指令除外, import 可以冲突,因为有可能导入不同的包

       pageEncoding可以冲突,因为两个jsp文件有可能编码格式不一样

用在哪?

比如说页面的头需要一个统一的格式,就可以写一个jsp,让每个页面都来包含

2. forward 标签

实现请求转发

传参用 param 标签

<jsp:forward page="/jsptag/5.jsp">

           <jsp:param name="name" value="老张"/>

    </jsp:forward>

param标签会对参数进行url编码 采用的编码是 request.getCharacterEncoding();

3. jsp标签访问bean

<%-- 访问User对象, 设置属性  访问属性

             userBean 实例化一个javabean对象,存入指定的域 默认存在page域

             标签体只在创建对象的时候才执行,如果域中已经存在对象了,此时不创建,标签体不执行

      --%>

     

      <jsp:useBean id="bean" class="cn.itcast.domain.User" />

     

      <jsp:setProperty name="bean" property="username" value="zhangsan" />

     

      <jsp:setProperty name="bean" property="username" param="name" />

     

      <jsp:setProperty name="bean" property="*" />

<%--

       String username = ((User)pageContext.getAttribute("bean")).getUsername();

       String password = ((User)pageContext.getAttribute("bean")).getPassword();

       System.out.println("username = " + username);

       System.out.println("password = " + password);

 --%>

username : <jsp:getProperty name="bean" property="username"/>   

password : <jsp:getProperty name="bean" property="password"/>

三、web开发的模式

sun公司针对web开发提供了两种开发模式

model1: jsp+javabean   只适合开发小型的应用

IE

form.jsp

handle.jsp

获得请求参数封装到bean

进行运算

显示结果

javabean

封装数据

实体

model2: servlet+jsp+javabean (mvc)

问题:

getParameter(key)、getAttribute(key)/setAttribute()有什么区别什么时候用

class Request {

    Map attributes = new HashMap(); // 作为域对象

    Map parameters = new HashMap(); // 封装请求参数

    Map headers = new HashMap();

    getAttribute(key) {

    return attributes.get(key);

}

getParameter(key) {

    return parameters.get(key);

}

getHeader(name) {

   

}

}

四、 简单标签

1. 写一个类实现 SimpleTag接口, 这个类就是一个简单标签类

实现一个标签,步骤:

1) 写一个java类,实现SimpleTag接口

doTag     

jsp引擎在执行标签时会自动调用该方法

setJspContext

jsp引擎在调用doTag之前会将pageContext对象作为JspContext传递给该方法

setJspBody(JspFragment fragment)

jsp引擎在调用doTag之前会将标签体作为JspFragment对象传递给该方法

JspFragment对象有个invoke方法决定将标签体输出到哪去,

如果传入参数是null,将标签体输出到 JspWriter ,这相当于让标签体执行

setParent

getParent

一般来讲,我们可以通过继承 SimpleTagSupport 类来实现SimpleTag接口

实现SimpleTagSupport类的好处

可以直接通过调用 getJspContext() 方法获得jsp的 PageContext对象

可以直接通过调用 getJspBody() 方法获得jsp的JspFragment对象

2) 在 WEB-INF目录下 建一个tld文件

       对标签进行描述

       <tag>

        对标签的文字性描述

        <description>hello world</description>

        标签名,就是在jsp页面如何取引用该标签

        <name>first</name>

        标签类,需要写完整类名

        <tag-class>cn.itcast.mytag.FirstTag</tag-class>

        标签体的类型,常用: empty(空标签) scriptless(不允许写jsp脚本)

        <body-content>empty</body-content>

    </tag>

3) 在jsp页面使用taglib指令引入一个标签库

       uri属性指定标签库对应的名称空间uri

       prefix 指定在jsp页面使用别名

%--

                 el表达式替换的java代码

                 Object value = pageContext.findAttribute("name");

                 if(value==null)

                        out.print("");

                 else

                        out.print(value);

             --%>

Username: ${user.username }<br>       <%--pageContext.findAttribute("user").getUsername() --%> 后面的注释是翻译的内容

<%-- 迭代标签 相当于增强for循环 --%>

<%-- 迭代arr集合,然后将元素存入page域,var指定的变量作为key

                  迭代多少次 标签体就执行多少次

           --%>

public void doTag() throws JspException, IOException {

              // 执行到标签时调用此方法

              // 获得request对象

              HttpServletRequest request = (HttpServletRequest) this.context.getRequest();

              // 获得 对方ip

              String ip = request.getRemoteAddr();

              // 输出

              this.context.getOut().print("您的ip是: " + ip);

       }

       public JspTag getParent() {

              // 获得当前标签的父级标签

              return null;

       }

       // 3

       public void setJspBody(JspFragment fragment) {

              // jsp引擎会将标签体的内容封装到 fragment 对象传入, 调用此方法

       }

      

       // 2

       public void setJspContext(JspContext context) {

              // jsp引擎会将代表jsp页面的pageContext对象 作为 JspContext类型传进来

              this.context = (PageContext) context;

       }

       // 1

       public void setParent(JspTag arg0) {

              // 设置父标签对象

       }

posted on 2011-05-04 23:24  情定诺坎普  阅读(1711)  评论(0编辑  收藏  举报