JSP的九大内置对象、指令和动作标签
JSP的九大内置对象
1、request—>(HttpServletRequest)
-
request对象是javax.servlet.http.HttpServletRequest 类的实例。HttpServletRequest是ServletRequest接口的子接口。
-
request内置对象是使用最多的一个对象,每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。
-
主要作用是接收客户端发送而来的请求信息,如请求的参数、发送的头信息等都属于客户端发来的信息。
-
request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。
-
客户端的请求信息被封装在request对象中,通过他才能了解到客户端需求,然后做出响应。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。
-
当服务器端想得到客户端信息时就会使用request对象来完成。
-
常用场景介绍:
- 1、乱码解决(setCharacterEncoding)
- 2、接收请求参数(getParameter() 或者一组 getParameterValues())
- 3、显示全部的头信息(getHeader()或者getHeaderNames() )
- 4、角色验证(isUserInRole()返回一个Boolean)
2、response—>(HttpServletResponse)
- response对象属于javax.servlet.http.HttpServletResponse接口的实例。
- 当服务器创建request对象时会同时创建用于响应这个客户端的response对象。
- response对象的主要作用是对客户端的请求进行回应,将Web服务器处理后的结果发回给客户端。
- 通过这个对象,开发者们可以添加新的cookies,时间戳,HTTP状态码等等。
- 常用场景介绍:
- 1、设置响应头信息(setHeader页面的定时跳转)
- 2、设置将发送到客户端的响应的内容类型:(setContentType)
- 3、设置页面跳转(sendRedirect()重定向)
- 4、添加Cookie(addCookie)
3、session—>(HttpSession)
-
首先介绍什么是会话:从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个浏览器结束,称此为一个会话。
-
session表示客户端与服务器的一次会话,也就是用户浏览这个网站所花费的时间。
-
服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。
-
session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。
-
当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象。
-
实际上在开发中session对象最主要的用处就是完成用户的登录(login)、注销(logout)等常见功能,每一个session对象都表示不同的访问用户。
-
常见的应用场景
- 1、登录及注销(设置一个session范围的属性,然后在其他需要验证的界面中判断是否存在此session范围的属性)
- 2、判断新用户(inNew())
- 3、取得用户的操作时间(getCreationTimesession的创建时间或者getLastAccessedTimesession的最后一次操作时间。)
4、application—>(ServletContext)
- 这个对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,随着jspDestroy()方法的调用而被移除。
- 通过向application中添加属性,则所有组成您web应用的JSP文件都能访问到这些属性。
- 在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作。在任何地方对application对象属性的操作,都将影响到其他用户对此的访问。
- application对象实现了用户间数据的共享,可存放全局变量
- application对象开始于服务器的启动,结束予服务器的关闭。
- 常见应用场景
- 1、获得全局变量(getAttribute或者getInitParameterNames)
- 2、配置虚拟目录
<Context path="/mldn" docBase="D:\myweb" />
以上表示的是在浏览器中使用“”/mldn“”访问 "D:\myweb"目录,这时如果希望在Web开发中取得docBase对应的真实路径,就需要使用application对象中的getRealPath()方法来完成。
5、config—>(ServeltConfig)
- config 对象的主要作用是取得服务器的配置信息。
- 通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。
- 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
- config是对象是javax.servlet.ServletConfig接口的实例化对象,主要功能是取得一些初始化的配置信息。
- 常见应用场景:
- 获取web.xml中的配置信息
<context-param> <param-name>username</param-name> <param-value>Tom</param-value> </context-param> <context-param> <param-name>password</param-name> <param-value>123456</param-value> </context-param>
String pusername = config.getInitParameter("username"); String pencoding = config.getInitParameter("encoding");
6、pageCotext—>(PageContext)
-
pageContext对象是javax.servlet.jsp.PageContext 类的实例,用来代表整个JSP页面。
-
pageContext对象提供了对JSP页面内所有的对象及名字空间的访问。
-
pageContext对象可以访问到本页所在的session,也可以取本页面所在的application的某一属性值。
-
pageContext对象的本类名也叫pageContext。pageContext对象是javax.servlet.jsp.PageContext类的实例,主要表示一个JSP页面的上下文。
-
这个对象主要用来访问页面信息,同时过滤掉大部分实现细节。
-
这个对象存储了request对象和response对象的引用。application对象,config对象,session对象,out对象可以通过访问这个对象的属性来导出。
-
pageContext对象也包含了传给JSP页面的指令信息,包括缓存信息,ErrorPage URL,页面scope等。
-
常见应用场景
- 获得其它八大内置对象 getXxx()
pageContext.getRequest(); pageContext.getResponse(); pageContext.getServletConfig(); pageContext.getServletContext(); pageContext.getSession(); pageContext.getOut(); pageContext.getPage(); pageContext.getException();
- 对作用域的属性进行操作(四大作用域)
//对默认作用域的属性进行操作。page
pageContext.getAttribute(name); //获得page作用域数据
pageContext.setAttribute(name,value); //给page作用域设置内容
pageContext.removeAttribute(name); //给page作用域移除内容
- 一次获得指定名称内容
findAttribute(name); //依次从page、request、session、application 获得内容
7、out—>(JspWrite)
-
out对象用于向客户端发送文本数据。
-
out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。
-
JSP页面中的out对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
-
只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
1、设置page指令的buffer属性关闭了out对象的缓存功能
2、out对象的缓冲区已满
3、整个JSP页面结束 -
out对象的工作原理
8、page—>(Object(this))
-
这个对象就是页面实例的引用。它可以被看做是整个JSP页面的代表。
-
page 对象就是this对象的同义词。
9、exception—>(Throwable)
- exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设置为true,否则无法编译。
- exception对象是java.lang.Throwable的对象。
JSP的指令介绍
1、page
- 指令定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
- 属性
属性 | 描述 |
---|---|
buffer | 指定缓存大小,当autoFlush设为true时有效,例如<%@ page buffer=10kb%> |
autoFlush | 是否运行缓存,如果为true,则使用out.println()等方法输出的字符串并不是立刻到达客户端服务器的,而是暂时存到缓存里,缓存满了或者程序执行完毕或者执行out.flush()操作时才到客户端,默认为true。 |
contentType | 指定当前JSP页面的MIME类型和字符编码,户端浏览器根据该属性判断文档类型,例如 HTML格式为text/html、纯文本格式为text/plain等 |
errorPage | 指明一个错误页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面,errorPage指定的页面通常 |
isErrorPage | 指定该页面是否为错误显示页面,如果为true,则该JSP内置有一个Exception对象exception,可直接使用,否则没有,默认为false |
extends | 编译该JSP文件时继承哪个类,JSP为Servlet,因此当指明继承普通类时需要实现Servlet的init、destroy等方法 |
import | 引入该JSP中用到的类、包等,import是唯一可以声明多次的page指令属性,一个import可以引用uogelei,中间用英文逗号隔开,如<%@ page import=“java.util.List,java.util.ArrayList”%> |
info | 指明JSP的信息,该信息可以通过Servlet.getServletInfo()方法获取到 |
isThreadSafe | 指定对JSP页面的访问是否为线程安全 |
language | **解释该JSP文件时采用的语言,一般为java语言,默认为java ** |
session | 该JSP内是否内置Session对象,如果为true,则内置Session对象,可直接使用,否则反之,默认为true |
isELIgnored | 指定是否执行EL表达式 |
isScriptingEnabled | 确定脚本元素能否被使用 |
2、taglib
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
Taglib指令的语法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀。
等价的XML语法:
<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />
3、include
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
Include指令的语法格式如下:
<%@ include file="文件相对 url 地址" %>
include 指令中的文件名实际上是一个相对的 URL 地址。
如果您没有给文件关联一个路径,JSP编译器默认在当前路径下寻找。
等价的XML语法:
<jsp:directive.include file="文件相对 url 地址" />
JSP的动作标签
- 所有的动作要素都有两个属性:id属性和scope属性。
属性 | 描述 |
---|---|
id | id属性是动作元素的唯一标识,可以在JSP页面中引用。动作元素创建的id值可以通过PageContext来调用 |
scope | 该属性用于识别动作元素的生命周期。 id属性和scope属性有直接关系,scope属性定义了相关联id对象的寿命。 scope属性有四个可能的值: (a) page, (b)request, ©session, 和 (d) application。 |
1、<jsp:userBean>
属性 | 描述 |
---|---|
id(必须的) | id属性是动作元素的唯一标识,可以在JSP页面中引用。 该名称大小写敏感,必须符合JSP页面中脚本语言的命名规则。假如你使用的是Java语言,则该名称遵守的是Java命名规范。动作元素创建的id值可以通过PageContext来调用 |
class | 指定Bean的完整包名。 |
scope | 该java bean对象的作用范围,可以写的就四个,也就是JSP的四大作用域,page、request、session、application |
type | 指定将引用该对象变量的类型 |
beanName | beanName属性值要么是一个完整类名,要么是一个可以转化为完整类名的表达式。用来传给Beans.instantiate方法。type属性值可和beanName属性值同,或为其超类、接口。beanName和type属性所指定的包名,类名均大小写敏感。 |
2、<jsp:setProperty>
- <jsp:setProperty name=“beanName” property=“propertyName” value="">
- jsp:setProperty用来设置已经实例化的Bean对象的属性,有两种用法。首先,你可以在jsp:useBean元素的外面(后面)使用jsp:setProperty,如下所示:
第一种
<jsp:useBean id="myName" ... />
<--此时,不管jsp:useBean是找到了一个现有的Bean,还是新创建了一个Bean实例,jsp:setProperty都会执行-->
<jsp:setProperty name="myName" property="someProperty" .../>
第二种
<jsp:useBean id="myName" ... >
<--此时,jsp:setProperty只有在新建Bean实例时才会执行,如果是使用现有实例则不执行jsp:setProperty。-->
<jsp:setProperty name="myName" property="someProperty" .../>
</jsp:useBean>
对Java Bean对象进行属性的设置
属性 | 描述 |
---|---|
name | java bean对象的名称,它表示要设置属性的是哪个Bean。也就是在useBean行为中的id |
property | property属性是必需的。它表示要设置哪个属性。对象中的属性名,有一个特殊用法:如果property的值是"*",表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set方法。 |
value | value 属性是可选的。要对其属性进行赋值的值,字符串数据会在目标类中通过标准的valueOf方法自动转换 |
param | param 是可选的。它指定用哪个请求参数作为Bean属性的值。如果当前请求没有参数,则什么事情也不做,系统不会把null传递给Bean属性的set方法 |
3、<jsp:getProperty>
语法格式如下:
<jsp:useBean id="myName" ... />
<--jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出-->
<jsp:getProperty name="myName" property="someProperty" .../>
属性 | 描述 |
---|---|
name | 要检索的Bean属性名称。Bean必须已定义。 |
property | 表示要提取Bean属性的值 |
jsp:useBean、jsp:setProperty、jsp:getProperty的举例:
cn.syj.Myclass.Bean包下面的Student.java类和/day07/WebRoot/JSP下的jspAction.jsp:
Student.java
package cn.syj.Myclass.Bean;
public class Student {
private String username;
private String password;
public Student() {
super();
}
public Student(String username, String password) {
super();
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
jspAction.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>动作标签jsp:userBean</title>
</head>
<body>
<jsp:useBean id="name" class="cn.syj.Myclass.Bean.Student" ></jsp:useBean>
<jsp:setProperty property="username" name="name" value="我是由userbean设置的username属性值"/>
<jsp:setProperty property="password" name="name" value="我是由userbean设置的password属性值"/>
<jsp:getProperty property="username" name="name" /><br>
<jsp:getProperty property="password" name="name" />
</body>
</html>
可以查看jspAction.jsp变为servlet后的源代码,看看我们写的javabean行为会被转换为何种语句:
源码位于:Tomcat9.0\apache-tomcat-9.0.13\work\Catalina\localhost\day07\org\apache\jsp\JSP
4、<jsp:include>
- include行为用于运行时包含某个文件,如果被包含的文件为JSP程序,则先会执行JSP程序,然后在把执行的结果包含进来。
- 作用是跟include指令一样的,唯一的区别就在于
- include指令是将被包含的文件的源码加入到了本JSP程序中,然后在进行编译,属于静态包含
- 而include行为只是将被包含的文件的运行结果包含进自己。属于动态包含
属性 | 描述 |
---|---|
page | 包含在页面中的相对URL地址。 |
flush | 布尔属性,定义在包含资源前是否刷新缓存区。 |
5、<jsp:forward>
<--jsp:forward动作把请求转到另外的页面。jsp:forward标记只有一个属性pagg-->
<jsp:forward page="相对 URL 地址" />
属性 | 描述 |
---|---|
page | page属性包含的是一个相对URL。page的值既可以直接给出,也可以在请求的时候动态计算,可以是一个JSP页面或者一个 Java Servlet. |
6、<jsp:param>
- param 标签以“名字-值”对的形式为其他标签提供附加消息,这个标签与jsp:include、jsp:forward、jsp:plugin标签一起使用。
- <jsp:param name=“名字”value =“指定给param的值”/>
- 当该标签与jsp:include标签一起使用时,可以将param标签的值传递到include指令要加载的文件中去,因此include动作标签如果结合param标签,可以在加载文件的过程中向该文件提供消息。
jsp:include、jsp:forward、jsp:param的例子:
访问forwordMain.jsp
<title>forwordMain</title>
</head>
<body>
<jsp:forward page="includeMain.jsp">
<jsp:param value="jsp:forward" name="forwordName"/>
</jsp:forward>
</body>
</html>
includeMain.jsp
<title>jsp:include</title>
</head>
<body>
<jsp:include page="head.jsp">
<jsp:param value="20" name="num"/>
</jsp:include>
</body>
</html>
head.jsp
<body>
<%=new Date() %><br>
<%=request.getParameter("num") %>
</body>
</html>
结果展示:
实现请求转发功能,Servlet中通过request.getRequestDispatcher(“someServlet”).forward(request,response);而在JSP中也能够实现相同的功能,只不过用的是<jsp:forward />行为,实际上forward行为就是对其进行了封装。
地址值并没有发生变化:
7、<jsp:element>
8、<jsp:attribute>
9、<jsp:body>
来自菜鸟教程
jsp:element 、 jsp:attribute、 jsp:body动作元素动态定义XML元素。动态是非常重要的,这就意味着XML元素在编译时是动态生成的而非静态。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<jsp:element name="xmlElement">
<jsp:attribute name="xmlElementAttr">
属性值
</jsp:attribute>
<jsp:body>
XML 元素的主体
</jsp:body>
</jsp:element>
</body>
</html>
结果展示:
10、<jsp:plugin>
-
jsp:plugin动作用来根据浏览器的类型,插入通过Java插件 运行Java Applet所必需的OBJECT或EMBED元素。
-
如果需要的插件不存在,它会下载插件,然后执行Java组件。 Java组件可以是一个applet或一个JavaBean。
-
plugin动作有多个对应HTML元素的属性用于格式化Java 组件。param元素可用于向Applet 或 Bean 传递参数。
-
建议参考:https://blog.csdn.net/liuchang54/article/details/48245721
11、<jsp:text>
来自菜鸟教程
语法格式如下:
<jsp:text>
<jsp:text>动作元素允许在JSP页面和文档中使用写入文本的模板
</jsp:text>
text.jsp
<body>
<books>
<book>
<jsp:text>
Welcome to JSP Programming
</jsp:text>
</book>
</books>
</body>
运行结果展示