JSP(Java Server Pages)
在html中加入java代码,就是jsp页面,jsp里可以加入java代码,也可以调用外部的java。jsp页面要想运行必须放到容器里,例如最流行的tomcat服务器。jsp就是用java程序动态生成html页面,浏览器不能解析java代码,所以tomcat这种服务器负责解析,生成最终的html ;
JSP页面中可以包括指令标识、HTML代码、JavaScript代码、嵌入的Java代码、注释、JSP动作标识等;(不是必需的)
>> 指令标识<%@ %>
指令标识用于设定整个JSP页面范围内都有效的相关信息,是被服务器解释并执行的,不会产生任何输出到网页中的内容,也就是说指令标识对客户端浏览器是不可见的;
<%@ 指令名 属性=属性值 属性=属性值 ......%>
(1)page 指令
定义整个JSP页面的相关属性,这些属性在JSP被服务器解析成Servlet时转换为相应的Java程序代码;
-
language:用于设置JSP页面使用的语言,默认Java;
<%@ page language="Java" %>
-
extends:用于设置JSP页面继承的Java类,所有JSP页面在执行之前都会被服务器解析成Servlet。而Servlet由Java类定义,所以JSP和Servlet都可以继承指定的父类;
-
import:用于设置JSP导入的类包;JSP页面可以嵌入Java代码片段,这些Java代码在调用API时需要导入相应的类包;
<%@ page inport="java.util.*" %>
-
pageEncoding:用于定义JSP页面的编码格式,也就是指定文件编码;
<%@ page pageEncoding="UTF-8" %>
-
contentType:用于设置JSP页面的MIME类型和字符编码,浏览器会据此显示网页内容;
<%@ page contentType="text/html; charset=UTF-8" %>
-
session:指定JSP页面是否使用HTTP的session会话对象,属性值是布尔型,默认true;
-
buffer:用于设置JSP页面的out输出输出对象使用的缓冲区大小,默认大小是8KB,且单位只能是KB,建议使用8的倍数作为该属性的属性值;
-
autoFlush:用于指定当前缓冲区已满时,自动将缓冲区的内容输出到客户端;默认值true;若值=False时,则当缓冲区已满时抛出“JSP Buffer overflow”异常;若buffer=none。则autoFlush属性值不能设置成False;
-
isErrorPage:通过该属性可以将当前JSP页面设置成错误处理页面来处理另一个JSP页面的错误,也就是异常处理,这意味着当前JSP页面业务的改变;
<%@ isErrorPage="true" %>
-
errorPage:用于指定处理当前JSP页面异常错误的另一个JSP页面,指定的JSP错误处理页面必须设置isErrorPage属性为true;errorPage属性的属性值是一个url字符串;
<%@ errorPage="error/loginErrorPage.jsp" %>
-
info
-
isELIgnored
-
isTheradSafe
(2)include 指令
include指令可以在一个JSP页面中静态包含(原样包含)另一个JSP页面,在被包含和包含的文件中不能有相同名称的变量;<%@ include file="path" %>
在用include指令进行文件包含时,为了使整个页面的层次结构不发生冲突,建议在被包含文件中将<html>
、<body>
等标记删除,因为在包含该文件的页面中已经指定这些标记了。
(3)taglib 指令
在JSP文件中。可以通过taglib指令标明该页面中所使用的的标签库,同时引用标签库,并指定标签的前缀;在页面中引用标签库后,就可以通过前缀来引用标签库中的标签;<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- prefix属性:用于指定标签的前缀,该前缀不能命名为jsp、jspx、java、javax、sun、servlet、sunw;
- uri属性:用于指定标签库文件的存放位置;
>> 脚本标识
JSP中的脚本标识包括JSP表达式(Expression)、声明标识(Declaration)、脚本程序(Scriptlet);
(1)JSP表达式(Expression) <%= %>
JSP表达式用于向页面中输出信息:<%= 表达式 %>
- 表达式可以是任何java语言的完整表达式,表达式的最终运算结果被转换为字符串;
- 表达式不仅可以插入到网页的文本中,用于输出文本内容,也可以插入到HTML标记中,用于动态设置属性值;
(2)声明标识(Declaration) <%! %>
声明标识用于在JSP页面中定义全局变量或方法;通过声明标识定义的变量和方法可以被整个JSP页面访问,所以通常使用该标识定义整个JSP都需要引用的变量或方法;服务器执行JSP页面时,会将JSP页面转换为Servlet类,在该类中,会把使用声明标识定义的变量和方法转换为类的成员变量和方法;
<%! 声明变量或方法的代码 %>
<%!
int number = 0;
int count(){
number++;
return number;
}
%>
(3)代码片段 <% %>
代码片段就是在JSP页面中嵌入的Java代码或者脚本代码;代码片段将在页面请求的处理期间被执行,通过Java代码可以定义变量或流程控制语句等,通过脚本代码可以应用JSP的内置对象在页面输出内容、处理请求和响应、访问session会话等;
>> 注释
(1)HTML中的注释 <!-- -->
HTML中的注释不会被显示在网页中,但是在浏览器中选择查看网页源代码时还是能看到注释信息的;
(2)隐藏注释 <%-- --%>
在浏览器中看不到,在查看HTML源代码时也看不到,安全性比较高;
(3)动态注释
由于HTML注释对JSP嵌入的代码不起作用,因此可以利用它们的组合构成动态的HTML注释文本:
<!-- <%=new Date() %> -->
: 将当前日期和时间作为HTML注释文本;
(4)代码片段中的注释
与Java中的注释相同;
- 单行注释://
- 多行注释:/* */
- 提示文档注释:/** */
>> 动作标识
JSP动作标识是在请求处理阶段按照页面中出现的顺序被执行的,用于实现某些特殊用途的标识(操作JavaBean、包含其他文件、执行请求转发等),
(1)操作JavaBean的动作标识
-
创建JavaBean实例的动作标识
<jsp:useBean>
<jsp:useBean id="实例名" scope="实例有效范围" class="完整类名" beanName="完整类名" type="数据类型" />
-
读取JavaBean属性值的动作标识
<jsp:getProperty>
<jsp:setProperty name="useBean创建的实例名" property="属性名" value="属性值" param="请求参数(参数的值赋给property)" />
-
设置JavaBean属性值的动作标识
<jsp:setProperty>
<jsp:getProperty name="useBean创建的实例名" property="属性名" />
(2)包含外部文件的动作标识 <jsp:include>
通过JSP的动作标识<jsp:include>
可以向当前页面中包含其他的文件;被包含的文件可以是动态文件,也可以是静态文件;
<jsp:include page="被包含文件的相对路径" flush="是否刷新缓冲区" />
两种包含文件的方法的区别:
- **
<%@ include %>
**指令包含的页面是在翻译阶段将页面的代码插入到主页面的代码中,最终包含页面与被包含页面生成了一个文件;被包含页面中有改动时需要重新编译该文件; - **
<jsp:include>
**动作标识包含的页面可以动态改变,它是在JSP文件运行过程中被确定的,执行的程序是两个不同的页面,即在主页面中声明的变量在被包含的页面中是不可见的; - 所以,当被包含的JSP页面中包含动态代码时,为了不和主页面中的代码相冲突,需要使用
<jsp:include>
动作元素包含文件;
(3)执行请求转发的动作标识 <jsp:forward>
通过该动作标识,可以将请求转发到其他Web资源,Eg:另一个JSP页面、HTML页面、Servlet等;执行请求转发后,当前页面将不再被执行,而是去执行该标识指定的目标页面;
<jsp:forward page="请求转发的目标页面" />
(4)设置参数的子动作标识 <jsp:param>
该标识可以作为其他标识的子标识,用于为其他标识传递参数;
<jsp:param name="指定参数名称" value="设置对应的参数的值" />
<jsp:forward page="modify.jsp">
<jsp:param name="userId" value="7" />
</jsp:forward>
代码将请求转到modify.jsp页面的同时传递了参数userId参数值是7;
通过<jsp:param>
动作标识指定的参数,将以“参数名=值”的形式加入到请求中,功能与在文件名后面直接加“?参数名=参数值”是相同的;
>> JSP内置对象(隐含对象)
JSP提供了由容器实现和管理的内置对象,也称隐含对象,这些内置对象不需要JSP页面编写者来实例化,可以直接在所有的JSP页面中直接使用,起到了简化页面的作用;
(1)request请求对象
request对象封装了由客户端生成的HTTP请求的所有细节,主要包括HTTP头信息,系统信息,请求方式,请求参数等;通过request对象提供的相应的方法,可以处理客户端浏览器提交的HTTP请求中的各项参数;
1、获取访问请求参数(超链接):
-
当通过超链接的形式发送请求时,可以为该请求传递参数,在超链接后面加上问号“?”实现;
<a herf="delete.jsp?id=1&name=aaa">
(同时指定多个参数时之间用&隔开,参数值不需要使用单引号或双引号括起来,包括字符型的参数); -
在delete.jsp页面中,通过**request对象的getParameter()**方法获取传递的参数值
<%request.getParameter("id");%>
;
若指定参数不存在,将返回null,若指定了参数名,没指定参数值,将返回空的字符串"";
2、获取表单提交的信息:
-
在Web应用程序中,经常还需要完成用户与网站的交互,例如用户填写表单后,需要把数据提交给服务器处理,这时服务器就需要获取这些信息;
-
通过**request对象的getParameter()**方法可以获取用户提交的表单信息
String userName = request.getParameter("username");
参数username与HTML表单的name属性对应,若参数值不存在,则返回一个null值, 该方法返回的是String类型; -
不是所有表单信息都可以通过getParameter()方法获取,复选框和多选列表框被选定的内容需要通过**getParameterValues()**方法获取;
3、解决中文乱码:
在通过request对象获取请求参数时,遇到参数值为中文的情况下,若不进行处理,获取到的参数值则是乱码;在JSP中,解决获取到的参数中文乱码问题可以分为以下两种情况:
-
1、获取访问请求参数时乱码:
当访问请求参数为中文时,通过request对象获取到的中文参数值为乱码,是因为该请求参数采用的是ios-8859-1编码,将获取到的数据通过String的构造方法使用UTF-8或GBK编码重新构造一个String对象,就可以正确的显示出中文;
String user = new String(request.getParameter("user").getBytes("ios-8859-1"),"utf-8")
-
2、获取表单提交的信息乱码:
当获取表单提交的信息时,通过request对象获取到的中文参数值为乱码,此时可以在page指令的下方加上调用request对象的setCharacterEncoding()方法,将编码设置为UTF-8或GBK;
<% request.setCharacterEncoding("UTF-8"); %>
4、通过request对象进行数据传输
-
在进行请求转发时,需要把一些数据传递到转发后的页面进行处理,需要使用request对象的setAttribute()方法将数据保存到request范围内的变量中;
request.setAttribute(String name,Object object);
-
name:表示变量名,为String类型,在转发后的页面取数据时,就通过这个变量名来获取数据;
-
object:用于指定需要在request范围内传递的数据,为Object类型;
-
将数据保存到request范围内的变量中后,就可以通过request对象的getAttribute()方法获取该变量的值;
request.getAttribute(String name);
//index.jsp文件
<%try{ //捕获异常信息
int money = 100;
int number = 0;
request.setAttribute("result", money/number); //保存执行结果
}catch{
request.setAttribute("request", "很抱歉,页面产生错误!")); //保存错误提示信息
}%>
<jsp:forward page="deal.jsp" />
//deal.jsp文件
<%Sting message = request.getAttribute("result".toString();) %>
<%=message %>
由于getAttribute()方法的返回值是Object类型,所以需要调用toString()方法,将其转换为字符串类型;
5、获取客户端信息
通过request对象可以获取到客户端的相关信息:HTTP报头信息、客户端提交方式、客户端主机IP地址、端口号等;
request获取客户端信息的常用方法:
|方法|说明|
|–|
|getHeader(String name)|获得HTTP定义的文件头信息|
|getHeaders(String name)|返回指定名称的requestHeader的所有值,其结果是一个枚举型的实例|
|getHeaderNames()|返回所有requestHeader的名称,其结果是一个枚举型的实例|
|getMethod()|获得客户端向服务器端传送数据的方法,get、post、header、trace|
|getProtocol()|获得客户端向服务器端传送数据所依据的协议名称|
|getRequestURI()|获得发出请求字符串的客户端地址,不包括请求的参数|
|getRequestURL()|获得发出请求字符串的客户端地址|
|getRealPath()|返回当前请求文件的绝对路径|
|getRemoteAddr()|获得客户端的IP地址|
|getRemoteHost()|获得客户端的主机地址|
|getServerName()|获得服务器的名字|
|getServerPath()|获取客户端请求的脚本文件的文件路径|
|getServerPort()|获取服务器的端口号|
…
6、获取cookie
- cookie:小段的文本信息,在网络服务器上生成,并发送给浏览器;
- 通过cookie可以标识用户身份,记录用户名和密码,跟踪重复用户等;
- 浏览器将cookie以 key/value 的形式保存到客户端的某个指定目录中;
- 在使用cookie时应该保证客户端上允许使用cookie;通过浏览器“工具 / Internet / 隐私 ”设置;
- 将一个cookie对象发送到客户端可以使用response对象的addCookie()方法;
|方法|说明|
|–|
|getCookies()|获取所有cookie对象的集合|
|getName()|获取到指定名称的cookie|
|getValue()|获取到cookie对象的值|
…
7、显示国际化信息
(2)response响应对象
- response对象用于响应客户请求,向客户端输出信息;
- 它封装了JSP产生的响应,并发送到客户端以响应客户端的请求;
- 请求的数据可以使各种数据类型,甚至是文件;
- response在JSP页面内有效;
1、实现重定向页面
- 使用response对象提供的sendRedirect()方法可以将网页重定向到另一个页面;
- 重定向操作支持将地址重定向到不同的主机上,这点与转发不同;
- 在客户端浏览器上将会得到跳转的地址,并重新发送请求链接;
- 用户可以从浏览器的地址栏中看到跳转后的地址;
- 进行重定向操作后,request中的属性全部失效,并且开始一个新的request;
- 在JSP页面中使用该方法时,不要再有JSP脚本代码(包括return语句),因为重定向之后,的代码已经没有意义了,并且还可能产生错误;
response.sendRedirect(String path); //path用于指定目标路径
2、处理HTTP文件头
通过response对象可以设置HTTP响应报头:设置响应的内容类型、禁用缓存、设置页面自动刷新、定时跳转网页;
-
(1)设置响应的内容类型:
通过response对象的**setContentType()**方法可以设置响应的内容类型,默认情况下采用的内容类型是text/html;通过指定响应的内容类型,可以让网页内容以不同的格式输出到浏览器中;
response.setContentType(String type);
-
(2)禁用缓存:
在默认的情况下,浏览器将会对显示的网页内容进行缓存,用户再次访问相同的网页时,浏览器会判断网页是否有变化,若没有,则直接显示缓存中的内容,这样可以提高网页的显示速度;对于一些安全系数较高的网站,通常需要禁用缓存;用过设置HTTP头的方法实现禁用缓存;
<%
response.setHeader("Cache-Control","no-store");
response.setDateHeader("Expries",0);
%>
-
(3)设置页面自动刷新:
<%response.setHeader("refersh","10");%>
//十秒自动刷新 -
(4)定时跳转网页:
<%response.setHeader("refersh","5;URL=login.jsp");%>
//5秒后自动跳转到指定的页面
3、设置输出缓冲
通常情况下,服务器要输出到客户端的内容不会直接写到客户端,而是先写到一个输出缓冲区,下面3种情况下才会把缓冲区的内容写到客户端:
- JSP页面输出的信息已经全部写入到客户端缓冲区;
- 缓冲区已满;
- 在JSP页面中调用了response对象的**flushbuffer()方法或out对象的flush()**方法;
对缓冲区进行设置的方法:
|方法|说明|
|–|
|flushBuffer()|强制将缓冲区的内容输出到客户端|
|getBufferSize()|获取响应所使用的缓冲区的实际大小,若没有使用缓冲区,则返回0|
|setBufferSize()|设置缓冲区的大小,若将缓冲区的大小设置成0KB,表示不缓冲|
|reset()|清除缓冲区的内容,同时清除状态码和报头|
|isCommitted()|检测服务器端是否已经把数据写入到了客户端|
(3)out输出对象
out输出对象可以向客户端浏览器输出信息,并且管理应用服务器上的输出缓冲区;在使用out对象输出对象时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间;数据输出完毕后,要及时输出输出流;
-
向客户端输出缓冲数据:
out对象一个最基本的应用,就是向客户端浏览器输出信息;out对象可以输出各种数据类型的数据,在输出非字符串类型的数据时,会自动转换为字符串进行输出;
print:<% out.print("盗情"); %>
<=等价于=><%="盗情" %>
println:<pre><% out.println(123); println("盗情") %></pre>
(在浏览器中看出来换行,需要<pre>
标记) -
管理相应缓冲区:
|方法|说明|
|–|
|clear()|清除缓冲区中的内容|
|clearBuffer()|清除当前缓冲区中的内容|
|flush()|刷新流|
|isAutoFlush()|检测当前缓冲区已满时是自动清空还是抛出异常|
|getBufferSize()|获取缓冲区的大小|
(4)session会话对象
session在网页中被称为会话,由于HTTP是一种无状态协议,也就是说,当一个客户向服务器发出请求,服务器接收请求并返回响应后,该链接就结束了,而服务器并不保存相关的信息;为了弥补这一点,HTTP提供了session,用户可以通过session在应用程序的Web网页间进行跳转时保存用户的状态,使整个用户会话一直保存下去,直到浏览器关闭;但是,如果在一个会话中,客户端长时间不向服务器发送请求,session对象就会自动消失,这个时间取决于服务器,Tomcat服务器默认30分钟,这个时间可以通过编写程序进行修改;
-
session.setAttribute(String name,Object obj); 将信息保存在session范围内,name用于指定作用域在session范围内的变量名,obj保存session范围内的对象;
-
session.getAttribute(String name); 用于获取保存在session范围内的信息;
(getAttribute返回值时object类型的,若需要将获取到的信息赋值给String类型的变量,需要进行强制类型转换或调用toString方法;String user = (String)session.getAttribute("username"); 或者 String user = session.getAttribute("username").toString();
) -
session.removeAttribute(String name); 用于将存储在session中的对象从session会话中移除;要保证变量name在session范围内有效,否则将抛出异常;
-
session.setMaxInactiveInterval(int time); 用于设置session的有效时间;time单位为秒;
-
session.getLastAccestedTime(); 返回客户端最后一次与会话相关联的请求时间;
-
session.getMaxInactiveInterval(); 返回一个会话内两个请求间的最大时间间隔,单位为秒;
-
session.invalidate(); 用于销毁session对象;销毁后再调用session对象的任何方法,都将报出异常“Session already invalidate”;
(5)application应用对象
- application对象用于保存所有应用程序中的公有数据,在服务器启动时自动创建,在服务器停止时自动销毁;
- 当application对象没有被销毁时,所有用户都可以共享该application对象;
- 与session对象相比,application对象生命周期更长,类似于全局变量;
- 在项目开发中,application对象常用于实现网页计数器或聊天室;
application对象提供了对应用程序初始化参数进行访问的方法,应用程序初始化参数在web.xml文件中进行设置,通过<context-param>
标记配置;
<context-param>
<param-name>url<parma-name>
<parma-value>jdbc:mysql://127.0.0.1:3306/db_database</parma-value>
</context-parma>
-
application.getInitParmeter(String name); 用于返回一下已命名的参数值;name用于指定参数名;
-
application.getInitAttributeNames(); 用于返回所有已定义的应用程序初始化参数名的枚举;
-
application.setAttribute(String name, Object obj); 用于保存应用程序环境属性,该属性在application范围内有效;
-
application.getAttributeNames(); 用于获取所有application对象使用的属性名;
-
application.getAttriibute(String name); 用于获取指定属性的属性值;
-
application.removeAttribute(); 用于从application对象中去除指定名称的属性;name指定的属性名在application范围内有效,否则将抛出异常;
(6)应答于请求的page对象
- page对象代表JSP本身,只在JSP页面内才是合法的;
- page对象本质上是包含当前Servlet接口引用的变量,可以看做是this关键字的别名;
|方法|说明|
|–|
|getClass()|返回当前Object类|
|hashCode()|返回object的哈希代码|
|toString()|把该Object类转换成字符串|
|equals(Object o)|比较该对象和指定对象是否相等|
(7)获取页面上下文的pageContext对象
- 通过它可以获取JSP页面的request、response、session、application、exception等对象;
- pageContext对象的创建和初始化都由容器来完成;
- JSP页面里可以直接使用pageContext对象;
(8)获取web.xml配置信息的config对象
- config对象主要用于取得服务器的配置信息;
- 通过pageContext对象的getServletConfig()方法可以获取一个config对象;
- 当一个Servlet初始化时,容器把某些信息将通过config对象传递给这个Servlet;
- 开发者在web.xml文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数;
|方法|说明|
|–|
|getServletContext()|获取Servlet上下文|
|getServletName()|获取Servlet服务器名|
|getInitParameter()|获取服务器所有初始化参数名称,返回值为java.util.Enumeration对象|
|getInitParameterNames()|获取服务器中name参数的初始化值|
(9)获取异常信息的exception对象
-
exception对象用来处理JSP文件执行时发生的所有错误和异常,只有在page指令中设置isErrorPage属性值为true的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件;
-
若在JSP页面中出现没有被try-catch捕捉到的异常,就会生成exception对象,并把exception对象传送到page指令中设定的错误页面中,然后再错误页面中处理相应的exception对象;
|方法|说明|
|–|
|getMessage()|返回exception对象的异常信息字符串|
|getLocalizemessage()|返回本地化的异常错误|
|toString()|返回关于异常错误的简单信息描述|
|fillInStrace()|重写异常错误的栈的执行轨迹|