jsp中的指令分为两大类,编译指令和动作指令。
编制指令 | <%@ inlcude file=” “%>和 <%@ page 属性1 属性2 %> 和<%@ taglib (uri="tagLibraryURI" | tagdir="tagDir") prefix="tagPrefix" %> |
动作指令 | <jsp:include ><jsp:forward><jsp:useBean> |
一、JSP编译指令
(1)page
是针对当前页面的指令
pag指令常用属性
属性 | 定义 |
---|---|
language =“语言” | 主要指定JSP 容器 要用什么语言来编译JSP页。JSP 1.2 规范中指出,目前只可以使用Java 语言,不过未来不排除增加其他语言,如C、C++、Perl 等等。默认值为Java语言 |
extends = “基类名” | 主要定义此JSP 网页产生的Servlet 是继承哪个父类 |
import= “包名” | 定义此JSP 网页可以使用哪些Java类库 |
session=”true或false” | 决定此JSP 网页是否可以使用session 对象。默认值为true |
buffer=”none或size in kb” | 决定输出流(output stream) 是否有缓冲区。默认值为8KB 的缓冲区 |
autoFlush=”true 或false” | 决定输出流的缓冲区是否要自动清除,缓冲区满了会产生异常(Exception)。默认值为true |
isThreadSafe=”true 或 false” | 告诉JSP 容器,此JSP 网页是否能同时处理多个请求。默认值为true,如果此值设为false, 转义生成的Servlet会实现SingleThreadModel接口。 |
info =”text” | 表示此JSP 网页的相关信息 |
errorPage=”error_url” | 表示如果发生异常错误时,网页会被重新指向指定的URL |
isErrorPage=”true或false” | 表示此JSP Page 是否为专门处理错误和异常的网页 |
contentType = “ctinfo” | 表示MIME 类型和JSP 网页的编码方式,其作用相当于HttpServletResponse接口的setContentType()方法 |
(2)include
include指令可以将一个外部文件嵌入到当前jsp文件中,同时解析这个页面中的jsp语句。include命令既可以包含jsp页面也可以包含静态文本。编译指令语法如下:
<%@ include file="要导入的jsp页面或文本文件" %>
使用include指令注意事项:
(1)file名不能为依变量,下面的例子是错误的:
<%! String url="header.jsp" %>
<%@ include="<%=url %>"
(2)file名后面不能传入参数,下面的例子是错误的:
<%@ include file="header.jsp?username=abc" %>
(3)file的路径是相对于此jsp的路径。
(3)taglib指令
taglib指令允许页面使用用户定制的标签。
taglib指令的语法如下:
<%@ taglib (uri="tagLibraryURI" | tagdir="tagDir") prefix="tagPrefix" %>
taglib指令有三个属性:
-
uri
:该属性唯一地标识和前缀(prefix)相关的标签库描述符,可以是绝对或者相对的URI。这个URI被用于定位标签库描述符的位置。
-
tagdir
:该属性指示前缀(prefix)将被用于标识安装在/WEB-INF/tags/目录或其子目录下的标签文件,一个隐含的标签库描述符被使用。
下面三种情况将发生转换(translation)错误:
属性的值不是以/WEB-INF/tags/开始。
属性的值没有指向一个已经存在的目录。
该属性与uri属性一起使用。 -
prefix
:定义一个prefix:tagname形式的字符串前缀,用于区分多个自定义标签。以jsp:,jspx:,java:,javax:,servlet:,sun:和sunw:开始的前缀被保留。前缀的命名必须遵循XML名称空间的命名约定。在JSP 2.0规范中,空前缀是非法的
编译指令的语法格式如下:
<%@ 编译指令名 属性名1="属性值" 属性名2="属性值" ... %>
eg: taglib指令用于引入一些特定的标签库,语法格式:
<%@ taglib prefix="tagPrefix" uri="tagLibraryURI" %>
eg:使用struts标签库
<%@ taglib prefix="s" taglib="/struts-tags" %>
JSP动作指令
1、forward
使用<jsp:forward>
的格式为 <jsp:forward page="filename">
举个例子:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="UTF-8"%>
<jsp:forward page = "login.jsp">
<jsp:param value = "zoeng" name = "userName"/>
<jsp:param value = "jikexueyuan" name = "password"/>
</jsp:forward>
login.jsp的源码如下所示:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<%
String userName = request.getParameter("userName");
String password = request.getParameter("password");
out.print(userName);
out.print("<br/>");
out.print(password);
%>
</body>
</html>
有几点需要说明一下,
<jsp:forward>
动作指令之后的代码是不会执行的(可以试一下)。- 使用动作指令跳转的页面,浏览器的地址还是跳转之前的页面地址
2、include
<jsp:include> :动态包含
举个例子:
index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<jsp:include page = "header.html"></jsp:include>
<jsp:include page = "body.jsp">
<jsp:param value = "red" name = "bgcolor" />
</jsp:include>
</html>
header.html:
<head>
<meta charset="UTF-8">
<title>include</title>
</head>
body.jsp:
<body bgcolor = "<%= request.getParameter("bgcolor") %>">
</body>
<%@include%>:静态包含
静态和动态include详细解释:https://blog.csdn.net/zfl589778/article/details/56494523
由上可以总结出:
对于静态包含,<%@include%>,中包含的文件,只是简单的嵌入到主文件中,就是在jsp页面转化成Servlet时才嵌入到主文件中,因为运行的结果是只生成了一个Servlet。
而对于动态包含<jsp:incude>,如果被包含文件是动态的,那么就会生成两个Servlet,也就是被包含文件也要经过jsp引擎编译执行生成一个Servlet,两个Servlet通过request和reponse进行通信。如果被包含的文件是静态的,那么这种情况和<%@include>就很相似,只生成了一个Servlet,但是他们之间没有进行简单的嵌入,而依然是通过request和reponse进行的通信。
3、useBean
参考博客:https://blog.csdn.net/qq_26525215/article/details/52072428
JavaBean其实就是一个遵循特定写法的java类,但是必须具有如下特点:
1.这个java类必须具有一个公开的无参构造函数
2.属性必须私有化,类必须公开
3.私有化的属性必须通过public类型的方法暴露给其他程序,并且方法的命名也必须遵守一定的命名规范---getXxx和setXxx方法。
把一个拥有对属性进行set和get方法的类,我们就可以称之为JavaBean。实际上JavaBean就是一个java类,在这个java类中就默认形成了一种规则——对属性进行设置和获得。而反之将说ava类就是一个JavaBean,这种说法是错误的,因为一个java类中不一定有对属性的设置和获得的方法(也就是不一定有set和get方法)。
在JSP中访问JavaBean的语法:
1、声明JavaBean对像-必须使用完整类名:
<jsp:useBean id=“someBean” class=“package.SomeBean” scope=“page”/>
以上声明相当于: SomeBean someBean = new SomeBean(); pageContext.setAttribute(“someBean”,someBean);
scope的可选值为:page|request|session|application
需要说明的是:一般情况下,我们保留<jsp:useBean/>的body部分为空,如果不为空,则只有初始化此Bean时执行,如: <jsp:useBean id=“person” class=“cn.Person”> 这是body部分,只会在初始化时执行一次 </jsp:userBean>
<jsp:useBean>
标记:
<jsp:useBean id="name" class="classname" scope="page|request|session|application"/>
id:代表jsp页面中的实例对象 通过这个对象引用类中的成员,如,id="wq", wq.成员();
class: 代表JavaBean类,如: class="com.Test",引用com包中的Test类
scope:指明了javabean的生存时间。默认为page范围。 当声明了一个Bean并将它放到某个范畴之后,在同一个范围内再次使用<jsp:useBean../>
将不再创建。而是直接给你返回已经创建过的Bean的实例。此过程可以通过查看容器翻译的源代码得知。
2、访问JavaBean的属性:
<jsp:setProperty name=“someBean” property=“name” value=“Tom”/>
<jsp:getProperty name=“someBean” property=“name”/>
也可以在页面上使用Java代码直接访问它的属性和其他方法。
举个例子:
register.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>录入注册信息</title>
</head>
<body>
<form action = "do_register.jsp" method = "post">
用户名:<input type = "text" name = "userName" />
password:<input type = "text" name = "password" />
<input type = "submit" value = "submit" />
</form>
</body>
</html>
do_register.jsp:
<html>
<head>
<meta charset="UTF-8">
<title>处理提交的内容</title>
</head>
<body>
<jsp:useBean id = "user" class = "com.jikexue.jsp.UserEntity" ></jsp:useBean>
<jsp:setProperty property = "userName" name = "user" />
<jsp:setProperty property = "password" name = "user" />
<%
String userName = request.getParameter("userName");
String password = request.getParameter("password");
out.print(userName);
out.print("<br/>");
out.print(password);
%>
<br/>
<jsp:getProperty property="userName" name = "user" />
<jsp:getProperty property="password" name = "user" />
</body>
</html>
<jsp:setproperty>详解
转载自:https://blog.csdn.net/IT_COOKIE_SAM/article/details/55518753?locationNum=6&fps=1
jsp:setProperty动作有下面四个属性,如下表:
属性 | 描述 |
---|---|
name | name属性是必需的。它表示要设置属性的是哪个Bean。 |
property | property属性是必需的。它表示要设置哪个属性。有一个特殊用法:如果property的值是"*",表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set方法。 |
value | value 属性是可选的。该属性用来指定Bean属性的值。字符串数据会在目标类中通过标准的valueOf方法自动转换成数字、boolean、Boolean、 byte、Byte、char、Character。例如,boolean和Boolean类型的属性值(比如"true")通过 Boolean.valueOf转换,int和Integer类型的属性值(比如"42")通过Integer.valueOf转换。 value和param不能同时使用,但可以使用其中任意一个。 |
param | param 是可选的。它指定用哪个请求参数作为Bean属性的值。如果当前请求没有参数,则什么事情也不做,系统不会把null传递给Bean属性的set方法。因此,你可以让Bean自己提供默认属性值,只有当请求参数明确指定了新值时才修改默认属性值。 |
getProperty:获取Bean的属性的值并将之转化为一个字符串,将其插入到页面中。
Jsp:getproperty有两个必须属性:
Name:表示Bean的名字
Property:表示提取哪一个属性的值。
在sun的JSP参考中提到,如果你使用<jsp:getProperty>来检索的值是空值,那么NullPointerException将会出现,同时如果使用程序段或表达式来检索其值,那么在浏览器上出现的是null(空).