Jsp相关

来源:互联网 发布:c语言中char是什么意思 编辑:程序博客网 时间:2024/05/19 16:06

一 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              HttpServletRequestresponse             HttpServletResponseconfig               ServletConfigapplication          ServletContextsession              HttpSessionexception            Throwablepage                 Object(this)out                  JspWriterpageContext          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();    }}
原创粉丝点击