JSP常见标签
JSP指令
指令格式
使用<%@ %>标记
常见指令
page指令用来定义JSP页面的相关属性。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" extends="entendServletClassName" import="importList" session="true|false" autoFlush="true|false" isThreadSafe="true|false" errorPage="errorURI" isErrorPage="true|false" isELIgnored="true|false" trimDirectiveWhitespaces="true" %>
- language:当前页面使用的脚本语言
- import:导入包,可以导入多个包,包之间使用逗号分隔,最后一个包不要使用分号结束,尽量不要导入一个包下的所有类
- session:当前页面是否支持回话,默认为true
- autoFlush:是否自动刷新缓存
- isThreadSafe:是否线程安全
- erroePage:设置错误页面
- isErrorPage:当前的页面是否可以作为错误页面
- isELIgnore:当前页面是否忽略EL表达式
- trimDirectiveWhitespaces:是否去除指令两端的空白格
include指令用于在JSP中静态包含一个文件(包含的内容和JSP页面翻译成一个Java文件)
<%@ include file="includeURL" %>
taglib指令在JSP页面中使用标签时使用
<%@ taglib prefix="prefix_name" uri="tag_uri" tagdir="tag_dir" %>
示例
注释示例(index.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
import="java.util.Date" %>
<%--导入标签库,需要先下载两个JAR包 --%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!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=UTF-8">
<title>JSP简介</title>
</head>
<body>
<!-- HTML注释 -->
<%--JSP注释 --%>
<%
int age=8;
%>
年龄:<%=age%><br/>
<%--EL表达式输出,既可以使用单引号也可以使用双引号 --%>
${"Hello EL"}<br/>
<%--页面包含,既可以是HTML也可以是JSP页面--%>
<jsp:include page="include.jsp"></jsp:include>
<!-- 也可以先导入java.util.*包 ,从而直接使用Date类-->
<f:formatDate value="<%=new java.util.Date() %>" pattern="yyyy-MM-dd HH:mm:ss" /><br/>
<!-- 包含指令 -->
<%@ include file="include.jsp" %>
</body>
</html>
被包含的文件(include.jsp)
<%@ 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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<strong>这是一个被包含的页面</strong><br/>
</body>
</html>
出错时出现的页面(error.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
isErrorPage="true"
trimDirectiveWhitespaces="true"%>
<!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=UTF-8">
<title>错误页面</title>
</head>
<body>
<h3>这是一个 错误页面,仅当出现错误时出现</h3>
</body>
</html>
出错测试(errorPageTest.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import="java.util.Date, java.util.ArrayList, java.util.List"
errorPage="error.jsp"
trimDirectiveWhitespaces="true"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=new Date() %>
<%
String line=null;
%>
<br/>
<!-- 空指针异常错误 -->
<%=line.toString() %>
</body>
</html>
JSP脚本
脚本(Scripting ELements)
声明(类似在Java类中定义字段,可以定义方法)(注意感叹号和分号)
<%!int age=22;%>
小脚本(可以定义变量,但是不能定义方法)
<%for (int i=0; i<age; i++)%> <li><%=i+1%></li> <%}%>
表达式
<%=age%>
代码示例
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
int count=5;
int add(int a, int b){
return a+b;
}
%>
<!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=UTF-8">
<title>JSP脚本</title>
</head>
<body>
<%
int result=add(2, 8);
%>
count: <%=count%>
<br/>
result: <%=result %>
循环:
<%for (int i=0; i<count; i++){%>
<br/>i: <%=i%>
<%}%>
</body>
</html>
JSP隐式对象
隐式对象
在JSP翻译成Servlet时,在_JSPServlet方法中有几个对象即为隐式对象。
隐式对象不能在声明中使用。
名称 | 类型 |
---|---|
out | javax.servlet.jsp.JspWriter |
config | javax.servlet.ServletConfig |
exception | java.lang.Throwable |
response | javax.servlet.http.HttpServletResponse |
page | java.lang.Object |
pageContext | javax.servlet.jsp.PageContext |
request | javax.servlet.http.HttpServletRequest |
session | javax.servlet.http.session |
application | javax.servlet.ServletContext |
隐式对象的说明
out
- 继承至 java.io.Writer,可以通过page指令制定其缓冲区的大小
- 方法:clear, clearBuffer, close, flush, getBufferSize, getRemaining, isAutoFlush
config
- 获取JSP初始化数据(在web.xml使用Serlvet标签对JSP页面进行配置)
exception
- 对JSP页面产生的异常进行处理(只有在错误页面中才能使用——isErrorPage=”true”)
response(和Servlet中使用方法一样)
page
- 当前JSP运行后的实例,很少直接使用
隐式对象的说明(作用域对象)
pageContext
- 提供获取其他隐式对象的方法(getRequest,getOut等)
- 作用域设置为page时,数据保存在pageContext中(SetAttribute),此时设置的数据只能在本页面获取,也也随着本页面而生,随着本页面而逝
request
- 使用同Servlet
- 作用域设为request时,数据保存在request中
session
- 使用同Servlet
- 作用域设为session时,数据保存在session中
application(本质就是ServletContext)
- 作用域设为application时,数据保存在application中(整个运用共享)
示例
配置文件(web.xml)
<servlet>
<servlet-name>ImplicitObjects</servlet-name>
<jsp-file>/ImplicitTest/implicitObjects.jsp</jsp-file>
<init-param>
<param-name>test</param-name>
<param-value>JSP Config</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ImplicitObjects</servlet-name>
<url-pattern>/implicitObjects</url-pattern>
</servlet-mapping>
设置数据(implicitObjects.jsp)
<title>JSP隐式对象</title>
</head>
<body>
<!-- 获取web.xml配置的初始化的值 -->
web.xml配置数据:<%= config.getInitParameter("test")%>
<%
String cfg=config.getInitParameter("test");
pageContext.setAttribute("test", cfg);
application.setAttribute("test", cfg);
%>
</body>
获取数据(getInfo.jsp)
<title>获取在前一个文件夹下的配置数据</title>
</head>
<body>
<!-- pageContext获取值为null -->
pageContext: <%=pageContext.getAttribute("test") %>
<br/>
application: <%=application.getAttribute("test") %>
</body>
</html>
JSP动作
格式:
<jsp:action_name [attr="value"]>...</jsp:action_name>
JSP常用动作
include
- 格式
<jsp:include page="urlSpec" flush="true|false"> [<jsp:param name="param_name" value="param_value"/>]* </jsp:include>
- include指令与动作比较
语法 相对路径 发生时间 <%@ include file="url"%>
当前文件 翻译(转换) <jsp:include page="url">
当前页面 请求处理 实际上,使用包含指令,就相当于把两个文件合成一个文件,只会生成一个java源文件,并且在包含源文件声明的变量,在被包含文件中也可以访问,而指令动作则不能。
forward
- 格式
<jsp:forward page="urlSpec" flush="true|false"> [<jsp:param name="param_name" value="param_value"/>]* </jsp:forward>
include是将包含的页面包含到当前页面里来,是由当前包含的页面进行相应的;而forward则是由forward指定的页面进行相应的。例如,在forward之后写的代码并不会响应到页面上。
param
- 格式
<jsp:param name="name" value="value" />
useBean动作
javaBean
- 是一个public的Java类
- 必须包含一个默认无参的构造方法
- 属性名称第二个字母不能大写(要有getter方法、setter方法)
useBean
创建一个由id代表的class指定的类的示例并保存至scope指定的作用域(page, request, response, application)
<jsp:useBean class="com.li.bean.User" id="user" scope="page" />
- setProperty
配合useBean使用request对象获取的用户数据为属性赋值(name为useBean的id,设置已经实例化的Bean对象的属性)
<jsp:setProperty name="user" property="*" /> <jsp:setProperty name="user" param="name" property="pname" />
param 是可选的。它指定用哪个请求参数(例如表单的元素)作为Bean属性的值。如果当前请求没有参数,则什么事情也不做,系统不会把null传递给Bean属性的set方法。因此,你可以让Bean自己提供默认属性值,只有当请求参数明确指定了新值时才修改默认属性值。当然,如果表单的元素的名称(这里通过param来指定)和Bean的属性名称是一样的,将会直接填充,星号就是这个意思。
- getProperty
jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出。语法格式如下:
<jsp:getProperty name="user" property="pname" />
JavaBean使用示例
一个简单的JavaBean(User.java)
package com.li.entity;
public class User {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
一个用户用户登录的表单(login.jsp)
<%@ 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=UTF-8">
<title>用户登录</title>
</head>
<body>
<form action="doLogin.jsp" method="post">
<fieldset>
<legend>用户登录</legend>
<p>用户名:<input name="name" /></p>
<p>密 码:<input type="password" name="pwd" /></p>
<p>
<input type="submit" value="登录">
<input type="reset" value="重置">
</p>
</fieldset>
</form>
</body>
</html>
一个用于获取表单元素并封装成JavaBean的JSP页面(doLogin.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import="com.li.entity.User"%>
<%--主要用来获取表单信息,并封装成一个java示例,不需要HTML页面框架 --%>
<%--使用一般的方式 --%>
<%
/*
request.setCharacterEncoding("UTF-8");
String name=request.getParameter("name");
String password=request.getParameter("pwd");
User user=new User();
user.setName(name);
user.setPassword(password);
request.setAttribute("user", user);
*/
%>
<%-- 使用userBean,并指定作用域范围为requset,以便通过request来获取 --%>
<jsp:useBean id="user" class="com.li.entity.User" scope="request">
<jsp:setProperty name="user" property="*" />
<jsp:setProperty name="user" param="pwd" property="password" />
</jsp:useBean>
<%--由welcome.jsp页面来响应 --%>
<jsp:forward page="welcome.jsp"></jsp:forward>
显示页面(welcome.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import="com.li.entity.User"
%>
<%
//需要进行强制转换
User user=(User)request.getAttribute("user");
%>
<!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=UTF-8">
<title>欢迎<%=user.getName() %></title>
</head>
<body>
<strong>欢迎<%=user.getName() %></strong>
</body>
</html>