javaWeb实战教程6-jsp和jstl

来源:互联网 发布:保留小数位数的函数sql 编辑:程序博客网 时间:2024/06/16 11:07

javaWeb实战教程


2.9 jsp

JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头,以%>结束。

JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

与纯 Servlets相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。

jsp继承于servlet,包含servlet的所有方法,我们可以像操作servlet一样操作jsp。

在网站根目录下新建一个jsp文件:Lesson9Jsp.jsp,在body中写入hello world:

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html>    <head>    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">    <title>Insert title here</title>    </head>    <body>         hello world    </body></html>

在浏览器中访问http://localhost/javaWeb/Lesson9Jsp.jsp。

我们虽然可以在jsp中处理表单、执行业务逻辑,但通常情况下我们只使用jsp做为html页面展示数据,也就是mvc框架中的view的作用,实际的业务逻辑还是在servlet中执行。

在cn.funsoftware.Lesson.servlet里新建一个servlet:Lesson9Servlet2Jsp.java:

@WebServlet("/Lesson9Servlet2Jsp")public class Lesson9Servlet2Jsp extends HttpServlet{    @Override    protected void doGet(HttpServletRequest req,     HttpServletResponse resp) throws ServletException, IOException {        req.setAttribute("username", "xiaoming");        Type type=new TypeDao2().getById(1);        req.setAttribute("type", type);        List<Type> types=new TypeDao2().getList();        req.setAttribute("types", types);        req.getRequestDispatcher("/Lesson9Jsp.jsp").forward(req, resp);    }}

在Lesson9Jsp.jsp里写入

<%=request.getAttribute("username") %><br><%=((Type)request.getAttribute("type")).getName() %><br><%    List<Type> types=(List<Type>)request.getAttribute("types");    for(Type type:types){%>    <%=type.getName() %><%  }%>

在浏览器里运行http://localhost/javaWeb/Lesson9Servlet2Jsp,原本存在servlet的request中的值展示在了jsp页面里。


2.10 JSTL标准标签库

刚刚所写的Lesson9Jsp.jsp虽然实现了数据展示,但满眼的<%%>java代码,使得HTML和java混杂到一起。实际开发时,通常编写java代码和编写前台html页面的程序员是不同职责的两批人,负责前台编写的程序员可能只会HTML,或者负责前台编写的程序员没有参与过后台java的编写,不了解项目的各个类,这时候我们需要一个更简单、与java代码分离的方法来更优雅的展示数据。

Lesson9Jsp.jsp如果使用jstl标签来写,应该是这样的:

${username }<br>${type.name}<br><c:forEach items="${types}" var="t">${t.name}</c:forEach>

2.10.1 JSTL 库安装

  1. 向项目的lib目录下导入jar包:standard.jarjstl.jar

  2. 在要使用标签的jsp页面上引入要使用的标签,如:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


2.10.2 核心标签core

核心标签是最常用的JSTL标签。引用核心标签库的语法如下:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

核心标签常用功能:

标签 描述 用于在JSP中显示数据,就像<%= … > 用于保存数据 用于删除数据 与我们在一般程序中用的if一样 本身只当做和的父标签 的子标签,用来判断条件是否成立 的子标签,接在标签后,当标签判断为false时被执行 基础迭代标签,接受多种集合类型 根据指定的分隔符来分隔内容并迭代输出

运行下面的代码来实践各个标签的作用:

<c:out value="${username}"></c:out><hr><c:set var="result" value="${2000*2}"/><c:out value="${result}"/><hr><c:remove var="result"/><c:out value="${result}"/><hr><c:if test="${username=='xiaohua'}">是小花!</c:if><c:if test="${username!='xiaohua'}">不是小花!</c:if><hr><c:choose>    <c:when test="${username=='小花' }">是小花</c:when>    <c:otherwise>不是小花</c:otherwise></c:choose><hr><c:forEach items="${types}" var="t" varStatus="s">${s.index }:${t.name }<br></c:forEach><hr><c:forTokens items="小明,小红,小花" delims="," var="name">${name}</c:forTokens>

2.10.3 格式化标签fmt

JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:

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

格式化标签常用的标签是:

标签 描述 使用指定的格式或精度格式化数字 使用指定的风格或模式格式化日期和时间

其中formatNumber可以格式化数字:

maxIntegerDigits:<fmt:formatNumber value="123.34" maxIntegerDigits="2"/><br>minIntegerDigits:<fmt:formatNumber value="1.1" minIntegerDigits="3"/><br>maxFractionDigits:<fmt:formatNumber value="1.123456" maxFractionDigits="2" ></fmt:formatNumber><br>minFractionDigits:<fmt:formatNumber value="1.1" minFractionDigits="3"></fmt:formatNumber><br>pattern:<fmt:formatNumber value="234.5678" pattern="####.00"></fmt:formatNumber><br>
  • maxIntegerDigits:整型数最大的位数;
  • minIntegerDigits:整型数最小的位数 ;
  • maxFractionDigits:小数点后最大的位数;
  • minFractionDigits:小数点后最小的位数;
  • pattern:指定一个自定义的格式化模式用与输出,0和#代表一位数字,若没有则显示 0,其中#的前导 0 和追尾 0 不显示;

formatDate可以格式化时间:

<fmt:formatDate value="<%=new Date() %>" pattern="yyyy-MM-dd HH:mm:ss"/>

pattern可以自定义格式模式。

2.10.4 函数标签fn

JSTL包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下:

<%@ taglib prefix="fn"        uri="http://java.sun.com/jsp/jstl/functions" %>
标签 描述 fn:contains() 测试输入的字符串是否包含指定的子串 fn:containsIgnoreCase() 测试输入的字符串是否包含指定的子串,大小写不敏感 fn:endsWith() 测试输入的字符串是否以指定的后缀结尾 fn:indexOf() 返回指定字符串在输入字符串中出现的位置 fn:join() 将数组中的元素合成一个字符串然后输出 fn:length() 返回字符串长度 fn:replace() 将输入字符串中指定的位置替换为指定的字符串然后返回 fn:split() 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回 fn:startsWith() 测试输入字符串是否以指定的前缀开始 fn:substring() 返回字符串的子集 fn:substringAfter() 返回字符串在指定子串之后的子集 fn:substringBefore() 返回字符串在指定子串之前的子集 fn:toLowerCase() 将字符串中的字符转为小写 fn:toUpperCase() 将字符串中的字符转为大写 fn:trim() 移除首位的空白符

contains:fn:contains(,)containsIgnoreCase:{fn:containsIgnoreCase(“abcDefg”,’cd’) }
endsWith:fn:endsWith(abcDefg,ef)indexOf:{fn:indexOf(‘abcdefg’,’b’) }
join:fn:join(fn:split(abc,),,)length:{fn:length(“123456”) }
replace:fn:replace(abcefghij,efg,aaa)startsWith:{fn:startsWith(“aaabbbccc”,”aaa”) }
substring:fn:substring(abcd,1,3)substringAfter:{fn:substringAfter(‘abcdefg’,’cd’) }
substringBefore:fn:substringBefore(abcde,cd)toLowerCase:{fn:toLowerCase(‘AbC’) }
toUpperCase:fn:toUpperCase(AbcdEfg)trim:{fn:trim(’ abc’) }

输出结果:

contains:truecontainsIgnoreCase:trueendsWith:falseindexOf:1join:a,b,clength:6replace:abc-aaa-hijstartsWith:truesubstring:bcsubstringAfter:efgsubstringBefore:abtoLowerCase:abctoUpperCase:ABCDEFGtrim:abc