Java后台之路(14)-JSP

来源:互联网 发布:hadoop执行过程源码 编辑:程序博客网 时间:2024/06/01 08:49

EL表达式

EL表达式是JSP中获取数据的一种规范,语法格式:${},我们依旧举例说明:

取值

// 我们在Session存入了数据namesession.setAttribute("name", "戚继光");// 两种方式取出数据session.getAttribute("name");${name}//获取Person类的age属性值Person person;person.getAge();${person.age}

简单运算

// 非空判断${empty object}// 三目运算符${empty object ? "true" : "false"}

EL隐式对象

  • pageContext,对应于JSP页面中的pageContext对象;
  • pageScope,代表page域中用于保存属性的Map对象;
  • requestScope,代表request域中用于保存属性的Map对象;
  • sessionScope,代表session域中用于保存属性的Map对象;
  • applicationScope,代表application域中用于保存属性的Map对象;
  • param,表示一个保存所有请求参数的Map对象;
  • paramValues,表示一个保存了所有请求参数的Map对象,它对于某个请求参数返回一个string类型数组;
  • header ,表示一个保存了所有http请求头字段的Map对象;
  • headerValues,表示一个保存了所有http请求头字段的Map对象,返回string类型数组;
  • cookie,表示一个保存了所有cookie的Map对象;
  • initParam,表示一个保存了所有web应用初始化参数的map对象。

JSTL简介

从JSP 1.1规范开始JSP就支持使用自定义标签,使用自定义标签极大地降低了JSP页面的复杂度,同时增强了代码的重用性,所以自定义标签在WEB应用中被广泛使用。故,许多WEB应用厂商都开发出了自己的一套标签库,这导致出现了许多功能相同的标签,令开发人员手忙脚乱,无所适从。为了解决该问题,Apache开发了一套用于解决这些常用问题的自定义标签库,这套标签库被SUN公司定义为标准标签库(The JavaServer Pages Standard Tag Library),简称JSTL。在开发中可使用JSTL实现JSP页面中逻辑处理,如判断、循环等等操作。

JSTL库包含5个类别。

如何集成

1.官网jar包,jstl.jar和standard.jar放入到\WebRoot\WEB-INF\lib下。

2.根据不同的JSTL库类别,在jsp中添加相应的依赖。


JSTL类别

1. 核心标签

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

2. 格式化标签

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

3. SQL标签

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

4. XML标签

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

5. JSTL函数

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

常用的标签库参照这里。


JSP连接数据库

1. jsp引入MySQL

这里下载mysql驱动jar包,将其放入到Tomcat的lib目录下;

2. sql的简介

/** * 连接数据库 * var,连接的别名 */ <sql:setDataSource     var="myDB" driver="com.mysql.jdbc.Driver"    user="root" password="root"    url="jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&useSSL=true&characterEncoding=utf-8" />/** * 查询语句 * var,查询结果存放变量 * dataSource,依赖的数据别名 */<sql:query var="queryRes" dataSource="${myDB }" >    select * from person;</sql:query>/** * 数据插入、更新、删除 */<sql:update var="updateRes" dataSource="${myDB }">    INSERT INTO person(pname, page, pcity) VALUES("郑成功", 60, "台湾");</sql:update>

来个例子吧:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8" %><%@ page import="java.io.*,java.util.*,java.sql.*" %><%@ page import="javax.servlet.http.*,javax.servlet.*" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%><html><head>    <title>sql.jsp</title></head><body>    <sql:setDataSource var="myDB" driver="com.mysql.jdbc.Driver"        url="jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&useSSL=true&characterEncoding=utf-8"        user="root" password="root"/>    <sql:update var="updateRes" dataSource="${myDB }">        INSERT INTO person(pname, page, pcity) VALUES("郑成功", 60, "台湾");    </sql:update>    <sql:query var="queryRes" dataSource="${myDB }" >        select * from person;    </sql:query>    <table border="1" width="50%">        <tr>            <th>id</th>            <th>name</th>            <th>age</th>            <th>city</th>        </tr>        <c:forEach var="row" items="${queryRes.rows }">            <tr>                <th><c:out value="${row.pid}"/></th>                <th><c:out value="${row.pname}"/></th>                <th><c:out value="${row.page}"/></th>                <th><c:out value="${row.pcity}"/></th>            </tr>        </c:forEach>    </table></body></html>

JavaBean

一个最简单的用法:

<jsp:useBean id="date" class="java.util.date"><p>日期为:<%=date %></p>

在jsp中生成一个Java类对象,我们看一个Person这个类;

Person.class

public class Person {    private int pid;    private String pname;    private int page;    private String pcity;    //setter、getter省略}

javabean.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8" %><%@ page import="java.io.*,java.util.*,java.sql.*" %><%@ page import="javax.servlet.http.*,javax.servlet.*" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%><html><head>    <title>javabean.jsp</title></head><body>    <jsp:useBean id="person" class="model.Person" >        <jsp:setProperty name="person" property="pid" value="1"/>        <jsp:setProperty name="person" property="pname" value="戚继光"/>        <jsp:setProperty name="person" property="page" value="24"/>        <jsp:setProperty name="person" property="pcity" value="蓟州"/>    </jsp:useBean>    <p><c:out  value="${person.pid }" /> </p>    <p><c:out  value="${person.pname }" /> </p>    <p><c:out  value="${person.page }" /> </p>    <p><c:out  value="${person.pcity }" /> </p></body></html>

JSP自定义标签

我们通过例子来理解它的用法和作用:

一个简单的显示例子,定义一个打印”hello world”的例子,分以下三步:

  • 创建继承SimpleTagSupport的HelloTag类,实现其doTag()方法;
  • 在/webRoot/WEB-INF/custom.tld中声明tag;
  • 在jsp中调用。

ShowTag.class

public class ShowTag extends SimpleTagSupport{    @Override    public void doTag() throws JspException, IOException {        JspWriter out = getJspContext().getOut();    }}

custom.tld

<taglib>  <tlib-version>1.0</tlib-version>  <jsp-version>2.0</jsp-version>  <short-name>Example TLD</short-name>  <tag>    <name>Show</name>    <tag-class>tag.ShowTag</tag-class>    <body-content>empty</body-content>  </tag></taglib>

test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8" %><%@ page import="java.io.*,java.util.*,java.sql.*" %><%@ page import="javax.servlet.http.*,javax.servlet.*" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%><%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html><head>    <title>test.jsp</title></head><body>    <ex:Show /></body></html>

1. 带内容的自定义标签

ShowTag.class

StringWriter sw = new StringWriter();@Overridepublic void doTag() throws JspException, IOException {    getJspBody().invoke(sw);    getJspContext().getOut().println(sw.toString());}

custom.ltd

<tag>  <name>Show</name>  <tag-class>tag.ShowTag</tag-class>  <body-content>scriptless</body-content></tag>

test.jsp

<ex:Show >    戚继光是民族英雄</ex:Show>

2. 自定义属性的标签

ShowTag.class

public class ShowTag extends SimpleTagSupport{    private String message;    @Override    public void doTag() throws JspException, IOException {        if( message!=null ){            // 从属性中获取信息            JspWriter out = getJspContext().getOut();            out.println(message);        }else {            // 从内容体中获取信息            StringWriter sw = new StringWriter();            getJspBody().invoke(sw);            getJspContext().getOut().println(sw.toString());        }    }    public void setMessage(String message) {        this.message = message;    }}

custom.ltd

<tag>    <name>Show</name>    <tag-class>tag.ShowTag</tag-class>    <body-content>scriptless</body-content>    <attribute>        <name>message</name>    </attribute></tag>

test.jsp

<ex:Show message="戚继光是民族英雄" />