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 库安装
向项目的lib目录下导入jar包:
standard.jar
、jstl.jar
;在要使用标签的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(“a−b−c”,”−“),”,”)length:
{fn:length(“123456”) }
replace:
fn:replace(“abc−efg−hij”,”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:true
containsIgnoreCase:true
endsWith:false
indexOf:1
join:a,b,c
length:6
replace:abc-aaa-hij
startsWith:true
substring:bc
substringAfter:efg
substringBefore:ab
toLowerCase:abc
toUpperCase:ABCDEFG
trim:abc