JSP全称Java Server Pages,是一种动态网页开发技术。
jsp生命周期:
1.编译阶段:
当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。编译jsp文件的过程是把它转换成servlet进行编译的
2.初始化阶段:
执行服务前调用 jspInit()方法初始化,可以复写以实现自己想要的功能。
3.执行阶段:
完成初始化后,JSP引擎将会调用 _jspService()方法。这一阶段描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁。
4.销毁阶段:
调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
jsp基本语法:
1.注释:
第一种:<%-- 注释 --%> JSP注释,注释内容不会被发送至浏览器甚至不会被编译
第二种:< !-- 注释 --> HTML注释,通过浏览器查看网页源代码时可以看见注释内容
2.声明:
在jsp中声明格式:<%! 声明的变量、函数等 %>
例如:
<%!
int a = 0;
public void add(int a,int b){}
%>
3.表达式:
<%=expression%>
今天是:<%=(new java.util.Date()).toLocaleString()%>
4.程序段:
jsp程序段是包含在<%%>之间的
形如<%程序段%>
5.jsp指令:
&& page指令
置于最顶端,例如:
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
language 默认是java
import 用于导入相应的包,当需要导入多个包时,中间应用逗号隔开
示例:import="java.io.*,java.util.*"
session=”true(false)”,用于指明session对象是否可用默认为true
buffer=”none|8kb|sizekb”,用于指定输出缓冲。该值不为none时,意为需要输出缓冲,此时服务器不会直接输出内容到浏览器,而是等待缓存满或者脚本执行完毕才会输出显示。该设置默认值为8kb。
antoflush=”true|false”,指明缓存是否自动清除。默认为true,若手动设置为false,缓存溢出会抛出异常。
errorPage=”URL”,用于指定当前页面产生异常后,重定向的页面。
isErrorPage=”true|false”,用于指定当前页面可否用作其他页面的错误处理页面。默认值为false。
&& include指令
用于包含另一.jsp文件,被包含的文件和当前的文件形成一个整体。include包含的文件会在编译的时候被引入,不管是当前文件或者是include文件有更改都会重新编译。
基本语法:<%@ include file=" "%>
很简单的示例:
date.jsp
<%
Date date = new Date();
%>
<%=date.toString() %>
includeTest.jsp
今天是:<%@ include file = "date.jsp" %>
结果:
注意: 源文件和包含文件的变量和方法等不能重名,因为二者最后是生成同一个文件。
&& taglib指令
<%@ taglib … %> 引入标签库的定义,可以是自定义标签
6.jsp动作指令
动作指令是在jsp被客户端请求时动态执行的,其基本语法为:
语法 | 描述 |
---|---|
jsp:include | 用于在当前页面中包含静态或动态资源 |
jsp:useBean | 寻找和初始化一个JavaBean组件 |
jsp:setProperty | 设置 JavaBean组件的值 |
jsp:getProperty | 将 JavaBean组件的值插入到 output中 |
jsp:forward | 从一个JSP文件向另一个文件传递一个包含用户请求的request对象 |
jsp:plugin | 用于在生成的HTML页面中包含Applet和JavaBean对象 |
jsp:element | 动态创建一个XML元素 |
jsp:attribute | 定义动态创建的XML元素的属性 |
jsp:body | 定义动态创建的XML元素的主体 |
jsp:text | 用于封装模板数据 |
常用动作指令简析:
&& jsp:include
基础语法:
page是包含在页面中的相对URL地址。这里的page是一个属性,要区别于page指令
注意: 这里的动作指令include和刚才的是两回事,具体来说就是,include指令是包含另一个文件,二者最终形成的是一个 .java文件,而include动作指令编译时会生成两个 .java文件,是动态包含,即include动作指令可以对动态资源进行包含 ,如果被包含的文件中导入了某个包,那么在此文件中也要导入那个包。
&& jsp:forward
该指令的作用是:从该指令处停止当前页面的继续执行,而转向其他的一个JSP页面。
&& jsp:param 经常与jsp:forward一起使用。
基本语法:
jsp内置对象:
对象 | 描述 |
---|---|
request | HttpServletRequest类的实例 |
response | HttpServletResponse类的实例 |
out | PrintWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page | 类似于Java类中的this关键字 |
Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
还可以用这张图进行简单解释:
&& request内置对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。常用方法如下:
常用方法 | 方法介绍 |
---|---|
String getParameter(String name) | 返回name指定参数的参数值? |
String[] getParameterValues(String name) | 返回包含参数name的所有值的数组 |
void setAttribute(String,Object) | 存储此请求中的属性 |
Object getAttribute(String name) | 返回指定属性的属性值 |
String getContentType() | 得到请求体的MIME类型 |
String getProtocol() | 返回请求用的协议类型及版本号 |
String getServerName() | 返回接受请求的服务器主机名 |
int getServerPort() | 返回服务器接受此请求所用的端口号 |
String getCharacterEncoding() | 返回字符编码方式 |
void setCharacterEncoding() | 设置请求的字符编码方式 |
int getContentLength() | 返回请求体的长度(以字节数) |
String getRemoteAddr() | 返回发送此请求的客户端IP地址 |
String getRealPath(String path) | 返回一虚拟路径的真实路径 |
String request.getContextPath() | 返回上下文路径 |
参照慕课往网上的request示例如下
注册表单页面:
<%@ 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>request内置对象</title>
</head>
<body>
<h1>注册页面</h1>
<hr>
<form name="requestForm" action="reg1.jsp" method="post">
<table>
<tr>
<td>
用户名:
</td>
<td>
<input type="text" name="username"/>
</td>
</tr>
<tr>
<td>
密码:
</td>
<td>
<input type="checkbox" name="favorite" value="read"/>读书
<input type="checkbox" name="favorite" value="music"/>音乐
<input type="checkbox" name="favorite" value="travel"/>旅游
<input type="checkbox" name="favorite" value="internet"/>上网
</td>
</tr>
<tr>
<td cospan="2" ><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
</body>
</html>
注册成功页面:
<%@ 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>
<%
request.setCharacterEncoding("utf-8");
%>
<h1>注册成功,欢迎您 <%=request.getParameter("username") %></h1>
<hr>
<%
request.setAttribute("password","123456");
%>
用户名:<%=request.getParameter("username") %><br>
爱好:<%
if(request.getParameterValues("favorite") != null)
{
String[] s = request.getParameterValues("favorite");
for(String ss : s)
out.println(ss + " ");
}
%><br>
password为:<%=request.getAttribute("password") %><br>
请求体的MIME类型为:<%=request.getContentType() %><br>
请求用的协议类型及版本号为:<%=request.getProtocol() %><br>
接受请求的服务器主机名为:<%=request.getServerName() %><br>
服务器接受此请求所用的端口号为:<%=request.getServerPort() %><br>
字符编码方式为:<%=request.getCharacterEncoding() %><br>
请求体的长度为:<%=request.getContentLength() %>Bytes<br>
发送此请求客户端IP地址为:<%=request.getRemoteAddr() %><br>
请求的真实路径为:<%=request.getRealPath("reg1.jsp") %><br> <%--现在已基本不再使用 --%>
请求的上下文路径为:<%=request.getContextPath() %><br>
</body>
</html>
结果如下:
注意: request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了。
&& response内置对象
重定向和转发: 重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重 定向后,request内的对象将无法使用。
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
response.sendRedirect(“request.jsp”); 此调用是重定向。此方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;此方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求。
request.getRequestDispatcher(“request.jsp”).forward(request,response); 此调用是转发,此方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变,注意之前也说过转发的一种方式
注意:转发之后request不能再调用之前转发之前页面的元素,也就是说转发之后request会被替代。此方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
常用方法:
方法 | 用法 |
---|---|
String getCharacterEncoding() | 返回响应用的是何种字符编码 |
ServletOutputStream getOutputStream() | 返回响应的一个二进制输出流 |
PrintWriter getWriter() | 返回可以向客户端输出字符的一个对象 |
void setContentLength(int len) | 设置响应头长度 |
void setContentType(String type) | 设置响应的MIME类型 |
sendRedirect(java.lang.String location) | 重新定向客户端的请求 |
&& out内置对象
out对象是JspWriter类的实例,是向客户端输出内容常用的对象
常用方法:
方法 | 用处 |
---|---|
void clear() | 清除缓冲区的内容 |
void clearBuffer() | 清除缓冲区的当前内容 |
void flush() | 清空流 |
int getBufferSize() | 返回缓冲区以字节数的大小,如不设缓冲区则为0 |
int getRemaining() | 返回缓冲区还剩余多少可用 |
boolean isAutoFlush() | 返回缓冲区满时,是自动清空还是抛出异常 |
void close() | 关闭输出流 |
实例:
<%@ 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>
<h1>Out内置对象</h1>
<%
out.println("静夜思
");
out.println("
");
out.println("床前明月光
");
out.println("疑是地上霜
");
out.println("举头望明月
");
out.println("低头思故乡
");
%>
缓冲区大小为:<%=out.getBufferSize() %>
<br>
剩余缓冲区大小为:<%=out.getRemaining() %>
<br>
是否自动刷新:<%=out.isAutoFlush() %>
</body>
</html>
&& session内置对象
session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始, 直到客户端与服务器断开连接为止。它是HttpSession类的实例。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客 户,就需要Session对象。
常用方法:
方法 | 用法 |
---|---|
long getCreateTime() | 返回SESSION创建时间 |
public String getId() | 返回SESSION创建时JSP引擎为它设的唯一ID号 |
public Object setAttribute(String name,Object value) | 使用指定名称将对象绑定到此会话 |
public Object getAttribute(String name) | 返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null |
String[] getValueNames() | 返回一个包含在此SESSION中所有可用属性的数组 |
void setMaxInactiveInterval() | 设置两次请求间隔多长时间此SESSON被取消(单位秒) |
int getMaxInactiveInterval() | 返回两次请求间隔多长时间此SESSON被取消(单位秒) |
简单示例:
session——page1.jsp
<%@ page language="java" import="java.text.* ,java.util.*" 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>
<h1>session内置对象</h1>
<%
SimpleDateFormat sdt = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date d = new Date(session.getCreationTime());
session.setAttribute("username", "admin");
session.setAttribute("Age", 20);
session.setAttribute("sex", "femle/male");
//设置当前session最大生存周期
session.setMaxInactiveInterval(10);
%>
Session创建时间:<%=sdt.format(d) %><br>
Session的ID编号:<%=session.getId() %><br>
从Session中获取用户名:<%=session.getAttribute("username") %>
<br>
<br>
<a href="session_page2.jsp " target="_blank">跳转到Session_page2.jsp</a>
</body>
</html>
session——page2.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>
Session的ID编号:<%=session.getId() %><br>
从Session中获取用户名:<%=session.getAttribute("username") %><br>
Session中保存的属性有:
<%
String[] s = session.getValueNames();
for(int i = 0; i < s.length; i++)
out.println(s[i] + " ");
%>
</body>
</html>
&& application内置对象
application实现了用户间数据的共享,可存放全局变量,开始于服务器启动,终止于服务器关闭,在用户的前后连接或不同连接之间,可以对application的对象的同一属性进行操作,在任何地方对application对象属性的操作,都会影响到其他用户对此的访问。
常用方法:
方法 | 用法 |
---|---|
Object getAttribute(String name) | 返回给定名的属性值 |
Enumeration getAttributeNames() | 返回所有可用属性名的枚举 |
void setAttribute(String name,Object obj) | 设定属性的属性值 |
void removeAttribute(String name) | 删除一属性及其属性值 |
String getServerInfo() | 返回JSP(SERVLET)引擎名及版本号 |
String getRealPath(String path) | 返回一虚拟路径的真实路径 |
ServletContext getContext(String uripath) | 返回指定WebApplication的application对象 |
int getMajorVersion() | 返回服务器支持的Servlet API的最大版本号 |
int getMinorVersion() | 返回服务器支持的Servlet API的最大版本号 |
String getMimeType(String file) | 返回指定文件的MIME类型 |
URL getResource(String path) | 返回指定资源(文件及目录)的URL路径 |
InputStream getResourceAsStream(String path) | 返回指定资源的输入流 |
RequestDispatcher getRequestDispatcher(String uripath) | 返回指定资源的RequestDispatcher对象 |
Servlet getServlet(String name) | 返回指定名的Servlet |
Enumeration getServlets() | 返回所有Servlet的枚举 |
Enumeration getServletNames() | 返回所有Servlet名的枚举 |
void log(String msg) | 把指定消息写入Servlet的日志文件 |
void log(Exception exception,String msg) | 把指定异常的栈轨迹及错误消息写入Servlet的日志文件 |
void log(String msg,Throwable throwable) | 把栈轨迹及给出的Throwable异常的说明信息 写入Servlet的日志文件 |
实例:
<%@ page language="java" import="java.util.*" 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>
<h1>application内置对象</h1>
<%
application.setAttribute("city","南京");
application.setAttribute("postcode","10000");
application.setAttribute("email","[email protected]");
%>
所在城市为:<%=application.getAttribute("city") %><br>
application中的属性有:<%
Enumeration<String> en = application.getAttributeNames();
while(en.hasMoreElements()){
out.println(en.nextElement() + " ");
}
%><br>
JSP版本号:<%=application.getServerInfo() %><br>
</body>
</html>
&& page内置对象
page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例
常用方法:
方法 | 用法 |
---|---|
class getClass | 返回此Object的类 |
int hashCode() | 返回此Object的hash码 |
boolean equals(Object obj) | 判断此Object是否与指定的Object对象相等 |
void copy(Object obj) | 把此Object拷贝到指定的Object对象中 |
Object clone() | 克隆此Object对象 |
String toString() | 把此Object对象转换成String类的对象 |
void notify() | 唤醒一个等待的线程 |
void notifyAll() | 唤醒所有等待的线程 |
void wait(int timeout) | 使一个线程处于等待直到timeout结束或被唤醒 |
void wait() | 使一个线程处于等待直到被唤醒 |
void enterMonitor() | 对Object加锁 |
void exitMonitor() | 对Object开锁 |
&& pageContext内置对象
pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象,可以用来保存数据。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。,他相当于页面中所有功能的集大成者
常用方法:
方法 | 用法 |
---|---|
JspWriter getOut() | 返回当前客户端响应被使用的JspWriter流(out) |
HttpSession getSession() | 返回当前页中的HttpSession对象(session) |
Object getPage() | 返回当前页的Object对象(page) |
ServletRequest getRequest() | 返回当前页的ServletRequest对象(request) |
ServletResponse getResponse() | 返回当前页的ServletResponse对象(response) |
Exception getException() | 返回当前页的Exception对象(exception) |
ServletConfig getServletConfig() | 返回当前页的ServletConfig对象(config) |
ServletContext getServletContext() | 返回当前页的ServletContext对象(application) |
void setAttribute(String name,Object attribute) | 设置属性及属性值 |
void setAttribute(String name,Object obj,int scope) | 在指定范围内设置属性及属性值 |
public Object getAttribute(String name) | 取属性的值 |
Object getAttribute(String name,int scope) | 在指定范围内取属性的值 |
public Object findAttribute(String name) | 寻找一属性,返回起属性值或NULL |
void removeAttribute(String name) | 删除某属性 |
void removeAttribute(String name,int scope) | 在指定范围删除某属性 |
int getAttributeScope(String name) | 返回某属性的作用范围 |
Enumeration getAttributeNamesInScope(int scope) | 返回指定范围内可用的属性名枚举 |
void release() | 释放pageContext所占用的资源 |
void forward(String relativeUrlPath) | 使当前页面重导到另一页面 |
void include(String relativeUrlPath) | 在当前位置包含另一文件 |
&& Exception内置对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承 结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
常用方法:
方法 | 用法 |
---|---|
String getMessage() | 返回描述异常的消息 |
String toString() | 返回关于异常的简短描述消息 |
void printStackTrace() | 显示异常及其栈轨迹 |
Throwable FillInStackTrace() | 重写异常的执行栈轨迹 |
&& config内置对象
config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
常用方法:
方法 | 用法 |
---|---|
ServletContext getServletContext() | 返回含有服务器相关信息的ServletContext对象 |
String getInitParameter(String name) | 返回初始化参数的值 |
Enumeration getInitParameterNames() | 返回Servlet初始化所需所有参数的枚举 |