Jsp相关

本文介绍了JSP的基本概念和技术特点,包括JSP的生命周期、语法元素如表达式、脚本和声明等,并详细讲解了EL表达式的使用方法及如何通过JSTL标签进行页面操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 Jsp基础

Jsp的作用:用html语言中混合java语言开发动态资源的技术。

Jsp的特点:jsp页面既可以写html代码,也可以写java代码。jsp就是servlet。

jsp的生命周期:

  1. 翻译:jsp->java文件
  2. 编译:java文件->class文件(servlet)
  3. 走servlet的生命周期方法
1.1 jsp的语法:

1.jsp表达式

//语法:<%=变量或表达式%>
//作用:向浏览器输出变量的值或表达式计算的结果。
//示例
<%      
  String name = "eric";//变量
  int a = 10;
  int b =20;
%>
<%=name%>
<%=(a+b)%>

2.jsp脚本

//语法:<% java代码 %>
//作用:执行java代码
//示例
<%
  //生成随机数
  Random ran = new Random();
  float num = ran.nextFloat();
 %>

3.jsp声明

//语法:<%!变量或方法%>
//作用:声明jsp的变量或方法
//示例
<%!
  //变量
  String name = "lucy";
  //方法
  public String getName()
  {
   return name;
  }
%>

4 jsp的注释

//语法
<%----------%>
1.2 jsp指令

1 include 指令

//作用:在当前jsp页面包含其他页面
//语法:<%@include file="文件路径"%>
//示例
<%@include file="common/header.jsp"%>
//注意:被包含的页面(header.jsp)中不要出现全局的html标签(只需要<body>标签里面的内容其他与html相关的都删掉)

2 page指令

//作用:告诉tomcat以什么样的方式翻译jsp
<%@ page language = "java" ---告诉服务器用什么语言翻译jsp
          import ="java.util.*" ----导java包多个包之间用逗号分隔
          pageEncoding="utf-8" ----告诉服务器用什么编码翻译jsp文件
          contentType = "text/html;charset=utf-8"---服务器发送给浏览器的数据格式和内容编码
          errorPage = "error.jsp"---指定出错时显示的界面
          isErrorPage = "false"----是否是出错界面
          isELIgnored="false"---jsp页面支持EL,不写默认不支持EL
%>
1.3内置对象

jsp页面加载完成之后就创建好的对象,就叫内置对象。

9大内置对象

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

pageContext内置对象:

作用:可以通过pageContext获取其他八大内置对象。

pageContext也是一个域对象—-作用范围在同一个jsp页面内

二 EL

2.1 EL表达式

作用:向浏览器输出在域对象中的变量值或表达式计算的结果,替换掉jsp表达式。

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

输出对象

<%
Student stu = new Student("jack",20);
pageContext.setAttribute("student",stu);
%>
//输出
${student.name}

输出集合对象

<%
 ArrayList list = new ArrayList();
 Student stu1 = new Student("jack",22);
 list.add(stu1);
 Student stu2 = new Student("eric",24);
 list.add(stu2);
 Student stu3 = new Student("andy",25);
 list.add(stu3); 
 pageContext.setAttribute("studentlist",list);
%>

//取出
${studentlist[0].name}

三 jsp标签

作用:替换jsp脚本

3.1 内置标签:不需要再jsp页面导入标签

<jsp:forward page="/action.jsp"> 
     <jsp:param value="jack" name="name"/>//参数标签
</jsp:forward>//转发标签

<jsp:include page="/header.jsp"><jsp:include>//包含

3.2 jstl标签:需要在jsp页面中导入标签

使用步骤:

  1. 导入标签库(使用javaee5.0以上的项目自动导入了jstl支持jar包,不需要手动导入)
  2. 使用taglib指令导入标签库(<%@taglib uri=”tld文件的uri名称” prefix=”简写” %>)
  3. 在jsp中使用标签

核心标签库的taglib指令

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

常用标签:

//保存数据
<c:set></c:set>
//获取数据
<c:out value=""></c:out>
//单条件判断
<c:if test=""></c:if>
//多条件判断
<c:choose ></c:choose>
<c:when test=""></c:when>
<c:otherwise ></c:otherwise>
//循环数据
<c:forEach></c:forEach>
<c:forTokens items="" delims=""></c:forTokens>
//重定向
<c:redirect></c:redirect>

使用示例:

//数据默认保存在page域中
<c:set var = "count" value = "10"></c:set>
//从域中获取数据 当value=null时使用默认值
<c:out value="${name}" default="默认值"></c:out>
//单条件判断
<c:if test="${10>5}">
    条件成立
</c:if>

//choose标签+when标签+otherwirse标签一起使用
<c:choose >
   <c:when test="${count>5&&count<10}">---相当于if else
      条件成立
   </c:when>
   <c:otherwise > ----相当于else
     条件成立
  </c:otherwise>
</c:choose>

//循环数据 begin:从哪个元素开始   end:到哪个元素结束  step:步长  items:需要遍历的数据 var:每个元素的名称
<c:forEach begin="0" end="2" step="1" items="${list}" var="stu" varStatus="varSta" >
序号:${varSta.count} 获取对象的属性值:${stu.name}
</c:forEach>

//循环特殊字符串<% pageContext.setAttribute("str","java-php-net")%>  
<c:forTokens items="${str}" delims="-" var="s">
  ${s}
</c:forTokens>

//重定向
<c:redirect url="http://www.baidu.com"></c:redirect>

3.3 自定义标签:开发者自行定义,需要在jsp页面导入标签

自定义标签开发步骤:

1编写一个普通的java类(ShowIpTag),继承于SimpleTagSupport类。

public class ShowIpTag extends SimpleTagSupport{

    /**
     * 2)覆盖doTag方法
     */
    @Override
    public void doTag() throws JspException, IOException {
        //this.getPageContext获取到pageContext对象
        HttpServletRequest request = (HttpServletRequest)this.getPageContext.getRequest();

        String ip = request.getRemoteHost();

        JspWriter out = pageContext.getOut();

        out.write("使用自定义标签输出客户的IP地址:"+ip);

    }
}

2 在web项目的WEB-INF目录下建立itcast.tld文件,这个tld叫标签库的声明文件。并且在tld文件中添加如下内容(参考核心标签库的tld文件)

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">
  <!-- 标签库的版本 -->
  <tlib-version>1.1</tlib-version>
  <!-- 标签库前缀 -->
  <short-name>itcast</short-name>
  <!-- tld文件的唯一标记 -->
  <uri>http://itcast.cn</uri>

  <!-- 一个标签的声明 -->
  <tag>
    <!-- 标签名称 -->
    <name>showIp</name>
    <!-- 标签处理器类的全名 -->
    <tag-class>itcast.a_tag.ShowIpTag</tag-class>
    <!-- 输出标签体内容格式 -->
    <body-content>scriptless</body-content>
    <!-- 属性声明 -->
    <attribute>
        <!-- 属性名称 -->
        <name>num</name>
        <!-- 是否必填 -->
        <required>true</required>
        <!-- 是否支持EL表达式 -->
        <rtexprvalue>false</rtexprvalue>
    </attribute>
  </tag>

</taglib>

3 在jsp页面的头部导入自定义标签库

<itcast:showIp></itcast:showIp>

自定义标签的作用:<itcast:showIp>标签体内容</itcast:showIp>标签余下内容
1)控制标签体内容是否输出
2)控制标签余下内容是否输出
3)控制重复输出标签体内容
4)改变标签体内容
5)带属性的标签

/**
 * 标签处理器类
 * @author APPle
 *
 */
public class DemoTag extends SimpleTagSupport{
    //1.声明属性的成员变量
    private Integer num;

    //2.关键点: 必须提供公开的setter方法,用于给属性赋值
    public void setNum(Integer num) {
        this.num = num;
    }


    @Override
    public void doTag() throws JspException, IOException {
        System.out.println("执行了标签");

        /**
         * 1)控制标签内容是否输出
         *    输出: 调用jspFrament.invoke();
         *    不输出: 不调用jspFrament.invoke();
         */
        //1.1 得到标签体内容
        JspFragment jspBody = this.getJspBody();

        /**
         * 执行invoke方法: 把标签体内容输出到指定的Writer对象中
         */
        //1.2 往浏览器输出内容,writer为null就是默认往浏览器输出
        //JspWriter out = this.getJspContext().getOut();
        //jspBody.invoke(out);
        jspBody.invoke(null);//等价于上面的代码

        /**
         * 3)控制重复输出标签体内容
         *     方法: 执行多次jspBody.invoke()方法
         */
        /*for(int i=1;i<=num;i++){
            jspBody.invoke(null);
        }*/

        /**
         * 4)改变标签体内容
         */
        //4.1 创建StringWriter临时容器
        /*StringWriter sw = new StringWriter();
        //4.2 把标签体拷贝到临时容器
        jspBody.invoke(sw);
        //4.3 从临时容器中得到标签体内容
        String content = sw.toString();
        //4.4 改变内容
        content = content.toLowerCase();
        //System.out.println(content);
        //4.5 把改变的内容输出到浏览器
        //jspBody.invoke(null); 不能使用此方式输出,因为jsbBody没有改变过
        this.getJspContext().getOut().write(content);*/


        /**
         * 2)控制标签余下内容是否输出
         *   输出: 什么都不干!
         *   不输出: 抛出SkipPageException异常
         */
        throw new SkipPageException();

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值