JSP是在HTML文档中嵌入java代码的技术,本质上是一个servlet类,因为在服务器端会被编译为一个servlet类来执行,相关HTML语句被编译为字符串形式执行,JSP出现的原因也就是在servlet中书写字符串类型的HTML语句繁琐且容易出错,而在jsp页面中HTML语句则可按照原来的规范书写,转换工作交由服务器端完成即可
jsp注释
<%-- --%>:jsp标准注释,不会被编译,不能通过查看源代码查看到
<!-- --!>:HTML注释,会被编译
<% %>:jsp代码
<%= %>:jsp输出
<%! %>:声明变量或方法,多个变量使用,分隔
<%/* */%>、<%// %>:多行注释、单行注释
编译指令
(包含在<%@ %>之间的部分)
page指令:用来定义JSP文件中的全局属性
Include指令:用来将指定位置上的资源包含在当前JSP文件中
taglib指令:当JSP页面中引用了用户自定义标签时,用来声明这些用户自定义标签的,用法:<%@taglib=”taglibURL”(唯一确定标签库的位置) prefix=”tagPerfix”(定义标签中的前缀字符串)%>
动作指令
<jsp:include>:用于在客户端请求时间内把静态或者动态的资源包含在JSP页面,包含的资源在page属性中用URL形式指定
用法:<jsp:include page=”fileName” flush=”true”>
<jsp:forward>:将请求转发到其他JSP页面、HTML页面或者servlet类
用法:<jsp:forward page=”url”/>
<jsp:param>:用于传递参数,为其他动作指令提供附加信息,和<jsp:include>、<jsp:forward>等指令一起使用
用法:<jsp:param name=”paraName(参数名)” value=”paramValue(传递的参数值)”>
JSP内置对象
①request:用来接收客户端提交的各种信息
常用方法:getParameter(String name)获取客户端传递给服务器的各种参数,name指定表单中参数的名字;getParameterNames()获取客户端传递给服务器的所有参数的名字,返回一个枚举类型
Request对象的getAttribute(String name)、setAttribute(String name,Java.long.Object.objt)方法可以用来保存和读取数据
②response: response对象是服务端向客户端返回的数据,使用sendRedirect(String location)方法可以实现页面的转向(与<jsp: forward>的区别是response的参数可以是相对路径也可以是一个合法的URL,并且是一种完全跳转)
③out:动态的向JSP页面输出字符流,进而把动态的内容转化为HTML形式展示
④session:用来保存每个用户的信息,常用方法:getAttribute(String name)获取名字为name的属性、getAttributeNames()返回存储在session对象中的的所有属性的名字,结果为一个枚举类型、setAttribute(String name,Java.lang.Object value)设置一个名字为name的属性,其值为value
⑤application:保存着整个web应用运行期间的全局数据和信息,常用方法:getAttribute(String name)返回application对象中名字为name的属性的值、setAttribute(String name,Object object)在application对象中设置一个名字为name的属性,其值为object
⑥pageContext(JSP作用域通信对象):提供访问其他内置对象的统一方法,方法:getRequest()、getResponse()、getServletConfig()、getServletContext()、getSession()、setAttribute()、removeAttribute()
⑦config:代表当前jsp页面的配置信息(在Servlet中用处较大)
⑧exception:用来封装运行时出现的异常信息
⑨page:指向当前jsp页面本身(类似于this指针),表示当前jsp页面转换后的servlet类的实例
JavaBean
JavaBean是符合一定规范的java类,其封装了一系列的私有属性并提供get和set方法
JavaBean与jsp页面的交互:<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>
JavaBean
public class Userbean {
private String username;
private String pwd;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
jsp_form:
<form action="./AcceptForm.jsp" method="POST">
用户名:<input type="text" name="username"/>
密码:<input type="password" name="pwd">
<input type="submit" value="提交"/>
</form>
jsp_accept_form:
<%
request.setCharacterEncoding("utf-8");
%>
<jsp:useBean id="user1" class="com.test.javabean.Userbean"></jsp:useBean>
<jsp:setProperty property="username" name="user1"/>
<jsp:setProperty property="pwd" name="user1"/>
<%--获取JavaBean对象中的值的两种方法 --%>
<%= user1.getUsername()+':'+user1.getPwd()%>
<jsp:getProperty property="username" name="user1"/>
<jsp:getProperty property="pwd" name="user1"/>
</body>
JSP自定义标签
不带属性的自定义标签:
jsp
<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib prefix="mytag" uri="/mytag" %>
<html>
<head>
<title>简单标签实例</title>
</head>
<body>
<h3>调用mytag标签库中的print标签</h3>
调用print标签的结果:<mytag:print/>
</body>
</html>
标签解析类
public class MytagPrint extends TagSupport{
@Override
public int doStartTag() throws JspException {
try {
pageContext.getOut().print("Hello Tag!");
} catch (IOException e) {
throw new JspTagException("SimpleTag:"+e.getMessage());
}
return SKIP_BODY;
}
@Override
public int doEndTag() throws JspException {
// TODO Auto-generated method stub
return EVAL_PAGE;
}
}
带属性值的自定义标签
jsp
<%@ page contentType="text/html;charset=utf-8"%>
<%--prefix为自定义标签的前缀,uri为tld文件地址--%>
<%@ taglib prefix="mytag" uri="/mytag" %>
<html>
<head>
<title>带属性标签实例</title>
</head>
<body>
<h3>调用mytag标签库中的printa标签</h3>
打印后不换行:<mytag:printa value="Hello Tag" type="0" />
打印后换行: <mytag:printa value="Hello Tag" type="1" />
打印后不换行:<mytag:printa value="Hello Tag" type="0" />
</body>
</html>
标签解析类
public class MytagPrinta extends TagSupport{
protected String value=null;
protected String type="0";
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public int doStartTag() throws JspException {
try {
if(type.equals("0"))
pageContext.getOut().print("Hello Tag!"+value);
else
pageContext.getOut().print("Hello Tag!"+value+"<br/>");
} catch (Exception e) {
throw new JspTagException("attrTag:"+e.getMessage());
}
//忽略标签体
return SKIP_BODY;
}
@Override
public int doEndTag() {
//继续执行剩下页面的代码
return EVAL_PAGE;
}
}
mytag.tld文件
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0">
<display-name>mytag标签库</display-name>
<tlib-version>2.0</tlib-version>
<short-name>mytag</short-name>
<uri>/mytag</uri>
<tag>
<name>print</name>
<tag-class>tags.MytagPrint</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<description>带有type和value属性的printa标签</description>
<name>printa</name>
<tag-class>tags.MytagPrinta</tag-class>
<body-content>empty</body-content>
<attribute>
<name>type</name>
<required>false</required>
</attribute>
<attribute>
<name>value</name>
<required>true</required>
</attribute>
</tag>
</taglib>
JSTL
JSTL是JSP标准标签库,是一个开源的不断完善的标签库
可分为Core tags(核心标签)、Formatting tags(格式化标签)、SQL tags(SQL标签)、XML tags(XML标签)、JSTL function(JSTL函数)5种
核心标签库
<%@ taglib prefix=”c” yri=”http://java.sun.com/jsp/jstl/core”%>
表达式控制标签(out、set、remove、catch)
<c:out value=”object”(要显示的数据内容)[escapeXml=”true|false”](是否转换为特殊字符,如<p></p>等字符是否要显示,默认为true)>
</c:out>
<c:out value="${3+7}"/> <br>
<c:out value="<p>有特殊字符</p>" /><br>
<c:out value="<p>有特殊字符</p>" escapeXml="false" />
<c:set var="num1" scope="request" value="${3+5}"/>
<c:remove var=”var” [scope=…..]/>
<c:catch [var=”var”]>
欲捕获的异常部分
</c:catch>
value(Object):需设定的范围变量或对象的属性值
var(String):要设定的范围变量名
scope(String):var指定变量的范围,默认值为page
target(Object):需设定属性的对象
property(String):需设定值的target对象的属性名称
流程控制标签(if、choose、when、otherwise)
<c:set var="num" scope="page" value="admin"/>
<c:if test="${num=='admin' }" var="condition" scope="page">
你好,admin!
</c:if>
<c:out value="这是判断结果:${condition}"/>
<c:set var="num" value="admin" scope="page"/>
<c:choose>
<c:when test="${num=='guest'}">
<c:out value="guest"/>
</c:when>
<c:when test="${num=='admin'}">
<c:out value="admin"/>
</c:when>
<c:otherwise>
<c:out value="other"/>
</c:otherwise>
</c:choose>
循环标签(forEach、forTokens)
<%
String items[]=new String[5];
items[0]="核心标签库"; items[1]="国际化标签库";
items[2]="SQL标签库"; items[3]="XML标签库";
items[4]="函数标签库";
request.setAttribute("items", items);
%>
<b><c:out value="不指定begin和end的迭代:"/></b>
<c:forEach var="item" items="${items }">
<c:out value="${item }"/><br>
</c:forEach>
<b><c:out value="指定begin和end的迭代:"/></b>
<c:forEach var="item" items="${items }" begin="1" end="3" step="1">
<c:out value="${item }"/><br>
</c:forEach>
<b><c:out value="输出整个迭代的信息:"/></b>
<c:forEach var="item" items="${items }" begin="3" end="4" step="1"
varStatus="s">
<c:out value="${item }"/>的四种属性:<br>
所在位置,即索引:<c:out value="${s.index }"/><br>
总共已迭代次数:<c:out value="${s.count }"/><br>
是否为第一个位置:<c:out value="${s.first }"/><br>
是否为最后一个位置:<c:out value="${s.last }"/><br>
</c:forEach>
var(String):表示当前处理对象的变量,可以用来遍历输出
items(支持多种类型,如Array、Collection、Iterator(迭代器)等):表示循环的项目
varStatus(String):记录循环状态的变量
begin(int):循环的起始点
end(int):循环的结束位置,不能小于begin
step(int):循环步长
<c:forTokens>:另一个迭代循环标签,用来对一个字符串进行迭代循环,这些字符串使用符号分开的
<c:forTokens var="token" items="red,blue,yellow/red,blue/yellow,green" delims="/">
<c:out value="${token}"/>
</c:forTokens>
<h4>
使用‘|’和‘,’一起作分隔符
</h4>
<c:forTokens var="token" items="red,blue,yellow/red,blue/yellow,green" delims="/,">
<c:out value="${token}"/>
</c:forTokens>
items(String):要处理的一系列以特定符号隔开的字符串
delims(String):分隔字符集合
var(String):输出时可用
URL标签(import、url、redirect)
<c:import>:引入某个URL指定的网页内容到当前jsp
<c:rediect>和<c:param>:用来进行参数值的传递
<c:redirect url="c_redirect2.jsp">
<c:param name="username" value="admin" />
</c:redirect>
格式化标签库
<%@ taglib prefix=”fmt” yri=”http://java.sun.com/jsp/jstl/fmt”%>
不同地区对数字、货币等的表示不同,通过该标签库来根据不同的语言请求做出不同的响应
<fmt:setLocale>:设定用户的语言地区代码
<fmt:setLocale value=”value”(语言环境的字符串http://www.w3.org查询) [variant=””(指定web浏览器或供应商代号) [scope=....]>en表示英文、en_US表示英文(美国)、zh_CN表示中文(中国)
<fmt:message>:根据本地化环境从资源包检索文本信息,从而实现文本的本地化
<fmt:bundle>:用来根据本地环境来选择所需的资源包
<fmt:setbundle>:为本地化环境设置一个默认的资源包
<fmt:param>:指定文本消息参数值,动态的设置参数
<fmt:timeZone>:设置时区
<fmt:formatDate>:设定日期和时间的格式并按照设置的格式给予输出
<fmt:parseDate>:解析日期和时间值
<fmt:formatNumber>:格式化数值,即设定特定语言环境下的数值的输出方式
<fmt:parseNumber>:解析数值字符串
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>数字格式化标签实例</title>
</head>
<body>
<font size=4>
<fmt:setLocale value="en_US"/>
美国:<br>
数字格式:<fmt:formatNumber value="123456789"/><br>
百分数格式:<fmt:formatNumber type="percent">123456789</fmt:formatNumber><br>
货币格式:<fmt:formatNumber value="12345.67" type="currency"/><br>
<c:set var="date" value="<%=new java.util.Date() %>"/>
<fmt:formatDate value="${date }"
pattern="yyyy年MM月dd日" type="date" dateStyle="full"/><br>
<fmt:formatDate value="${date }"
pattern="HH:mm:ss" type="time" timeStyle="full"/><br>
<fmt:formatDate value="${date }"
pattern="yyyy年MM月dd日HH:mm:ss"
type="both" dateStyle="full" timeStyle="full"/><br>
<fmt:formatDate value="${date }" type="both"
timeStyle="full" var="formatted"/>
<fmt:parseDate value="${formatted }" type="both"
timeStyle="full" timeZone="GMT" var="parsed"/>
<c:out value="${parsed }"/><br>
</font>
</body>
</html>
SQL标签
<%taglib prefix=”sql” uri=”http://java.xun.com/jsp/jstl/sql”%>
使用JDBC方式连接数据库:
<sql:setDateSource
driver=””(数据库驱动程序字符串) url=””(数据库连接字符串) [user=””(数据库登录用户名)] [password=””] [var=””] [scope=””]/>
XML标签
<%@ taglib prefix=”x” yri=”http://java.sun.com/jsp/jstl/xml”%>
<x:parse>解析一个XML文档
<c:import var="doc" url="Students.xml" charEncoding="gb2312"/>
<x:parse var="studentDoc" doc="${doc }"/>
<c:out value="学生姓名:"/>
<x:out select="$studentDoc/students/student/name"/><br>
<c:out value="学生年龄:"/>
<x:out select="$studentDoc/students/student/age"/><br>
<c:out value="学生性别:"/>
<x:out select="$studentDoc/students/student/sex"/><br>
JSTL函数标签
<%taglib prefix=”fn”uri=”http://java.xun.com/jsp/jstl/functions”%>
fn:contains(string,substring):如果参数string包含参数substring,返回true
fn:containsIgnoreCase(string,substring):……(忽略大小写)
fn:endsWith(string,suffix):字符串string以suffix结尾,返回true
fn:join(array,separator):将一个给定的数组array用给定的间隔符separator串在一起
fn:replace(string,before,after):返回一个string对象,用参数after替换参数string中所有出现参数before字符串的地方
<c:set var="s1" value="I love java web!"/>
<%
String[] customers={"Lester","Johnson","Jake"};
session.setAttribute("customers", customers);
%>
<table cellpadding="5" border="1">
<tr>
<th align="Left">Input String</th><th>Result</th>
</tr>
<tr>
<td>${s1}</td><td>${fn:length(s1)}</td>
</tr>
<tr>
<td>${customers}</td><td>${fn:length(customers)}</td>
</tr>
<tr>
<td>null</td><td>${fn:length(undefined)}</td>
</tr>
<tr>
<td>empty string</td><td>${fn:length("")}</td>
</tr>
</table>
EL表达式
实现对session对象、request对象等存储对象的简化访问
语法:${表达式}
设置EL支持
设置单个JSP页面是否支持EL(默认为支持,值为false):
<%@ page isELIgnored=”true|false”%>
对于整个JSP应用,修改web.xml配置文件来支持EL,格式为(false为支持)
<jsp-property-group>
<el-ignored>false|true</el-ignored>
</jsp-property-group>
EL应用
①运算符求值(+、-、*、/、gt(大于)、lt(小于)、le(小于等于)、ge(大于等于)、ne(不等于)、and、or等等)
②访问作用域对象,格式为${attrname(作用域变量名)}
③EL内置对象