JSP页面
-
JSP的全称是Java Server Pages,即Java的服务器页面
-
JSP的主要作用是代替Servlet程序回传HTML页面的数据
-
JSP页面包含指令标识,HTML代码,Java代码,注释等
指令标识
- jsp指令标识语法
<%@ 指令名 属性 = "属性值"%>
-
指令名:包括page,include,taglib
-
属性:用于指定属性名称,一个指令中可存在多个属性,用逗号或空格分隔
-
属性值:指定属性值
-
JSP指令标准(IDEA)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
- page指令(共包含15个)
- language属性:用于设置1JSP页面使用语言,目前只支持Java
<%@ page language="java" %>
-
extends属性:用于设置JSP页面继承的Java类,所有JSP页面执行前都会被服务器解析为Servlet,且Servlet由Java类定义的(不常用,有可能影响服务器性能)
-
import属性:用于设置JSP导入的类包,JSP页面可写Java代码,执行代码要导入API时用此属性
<%@ page import="java.util.*"%>
- pageEncoding属性:用于定义JSP页面的编码格式,指定文件编码
<%@ page pageEncoding="GB18030"%>
- contentType属性:用于设置JSP页面的MIME码和字符编码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
- session属性:设定JSP页面是否用HTTP页面的session对话对象,属性值是true和false
<%@ page session="true"%>
- buffer属性:用于设置JSP的out输出对象的缓冲区大小,默认为8KB,一般用8KB的倍数为属性值:如16KB,128KB等
<%@ page buffer="128KB"%>
- autoFlush属性:用于设置JSP页面缓存满时是否自动刷新,属性值是true和false
<%@ page autoFlush="true"%>
- isErrorPage属性:将当前JSP页面设置为错误处理页面,如doGet和doPost的效果,属性值是true和false
<%@ page isErrorPage="true"%>
10.errorPage属性:用于指定当前JSP处理异常的另一个JSP页面,另一个JSP页面的isErrorPage属性一定得是true,出现错误时会优先处理当前属性指定的错误页面。
<%@ page errorPage="error/loginErrorPage.jsp"%>
-
include指令:可在一个JSP页面中包含另一个JSP页面,静态包含
-
该属性大大提高代码的重用性,方便维护升级
-
语法格式
-
<%@ include file="path"%>
- file属性用于指定要包含文件的路径。
-
taglib指令:该属性用于声明该页中所使用的标签库
- 语法格式
<%@ taglib prefix="tagPrefix" uri="tagURI"%>
- prefix:用于指定标签的前缀
- uri:用于指定标签库文件存放的位置
脚本标识
- JSP脚本标识包括:JSP表达式(Expression) , 声明标识(Declarction)和脚本程序(Scriptlet)
- 意义:通过标识可使JSP像Java代码一样用于声明变量,定义函数和进行各种表达式运算
-
JSP表达式
- 语法格式
<%= 表达式%>
表达式可以是任何Java语言完整表达式,最终运算结果会被转换成字符串。不仅可放到网页的文本中,用于输出内容。还可插到HTML标记中,用于动态设置属性值
<% String manager = "Anton";%>
管理员:<%= mangaer%> :Anton
<%= 1+2%> :3
<img src="images/<%= url%>"> :<img src="images/123456.jpg">
-
声明标识:用于在JSP页面中定义全局的变量或方法,该变量可被整个JSP页面使用;生命周期从创建开始到服务器关闭结束。
- 语法格式
<%! 声明的变量或方法%>
- 例子
<%!
int number = 0; 全局变量
int count(){ 全局方法
number++;
return number;
}
%>
调用方式: <%= count()%>
-
代码片段:在JSP页面中加入Java代码或脚本代码。Java可用于实现定义变量或是流程控制等;脚本代码可应用JSP内置对象在页面输出内容,处理请求和响应,访问session会话等。生命周期从创建开始到页面关闭即销毁。
- 语法格式
<% Java代码或是脚本代码 %>
- 例子:输出乘法表
<body>
<%
String str = ""; //用字符串的形式声明并保存
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= i;j++){
str += j + "*" + i "=" j * i
str += " "
}
str += "<br>"
}
%>
<table width = "440" height = "85" border = "1" cellpadding = "0"
cellspacing = "0" style = "font:9pt" bordercolordark = "#666666"
bordercolorlight = "#FFFFFF" bordercolor = "#FFFFFF">
<tr>
<td height = "30" align = "center">九九乘法表</td>
</tr>
<tr>
<td style = "padding:3pt">
<%= str %>
</td>
</tr>
</table>
</body>
-
JSP注释
- HTML注释:
//单行注释
- JSP表达式注释
//单行注释
/*多行注释*/
/**
提示文档注释
*/
- 隐藏注释:在浏览器看源码时不显示,安全性高
<%-- 注释 --%>
- 动态注释:由于HTML注释对JSP嵌入的代码不起作用,可利用它们构成动态的HTML注释文本
<!-- <%= new Date()%>--> 将时间和日期作为HTML的注释文本
-
动作标识
- 包含文件标识<jsp:include>
用于向当前页面包含其他文件,被包含文件可以说静态,也可是动态
语法格式
1.<jsp:include page = "url" flush = "true|false"/>
2.<jsp:include page = "url" flush = "true|false">
子动作标识<jsp:param>
</jsp:include>
参数:page:用于指定被包含文件的相对路径
flush:设置是否刷新缓冲区
<jsp:param>:向被包含的动态页面传递参数
注:被包含页面建议删除<html></html>,<body></body>等标记。
-
请求转发标识<jsp:forward>
-
该指令可以将请求转发到其他Web资源去执行
-
语法格式
-
1.<jsp:forward page="url"/>
2.<jsp:forward page="url">
子动作标识<jsp:param>
</jsp:forward>
参数:page:用于指定请求转发的页面目标
<jsp:param>:向被包含的动态页面传递参数
-
传递参数标识<jsp:param>
-
可作为其他标识的子标识,用于传递参数
-
语法格式
-
<jsp:param name = "参数名" value = "参数值"/>
参数:
name:用于指定参数名称
value:用于设置对应的参数值
- 例子
<jsp:forward page = "index.jsp">
<jsp:param name = "userId" value = "10">
</jsp:forward>
- **作用等同于文件名后面加: ?Key = Value**
JSP内置对象
-
实质:为了减去Java脚本中实例化对象的繁琐,提供内置对象来实现应用。这些对象不需要定义,可直接使用。
-
一共有九个这样的内置对象
- request
- response
- session
- application
- out
- pageContext
- config
- page
- exception
-
request : 封装了由客户端生成的HTTP请求的所有细节。包括HTTP头信息,系统信息,请求方式和请求参数。可提供方法处理客户端浏览器提交的HTTP请求中的各项参数
- 例:发一个请求到delete.jsp页面中,附带一个id参数,name参数
<a href = "delete.jsp?id = 1 & name = 张三">删除</a>
**getParameter():**在delete.jsp页面中,获取参数
<% request.getParameter("id","name")%>
- 例:转发时把数据传递到转发后的页面并处理,使用setAttribute方法将数据保存到Request范围内的变量中
request。setAttribute(String name,Object obj);
name:Key,通过这个Key来获取Value
获取该变量的值
request.getAttribute(String name);
-
获取cookie : cookie指小段的文本信息,在服务器上生成,发送给浏览器。浏览器将以key / value保存到指定的目录中
- 作用:可用于标识客户身份,记录用户名和密码,跟踪重复用户等
- 例子:通cookie保存并读取用户登录信息
-
解决中文乱码问题
-
所有的request请求编码模式都是ISO-8859-1,页面一般采用UTF-8编码模式。
解决方式:在解析时重新构造一个对象并指定为ISO-8859-1编码即可
-
例:在index.jsp页面中,用超链接传两个中文参数
-
<body>
<a href = "show.jsp?name = 张三 & sex = 男">解决中文乱码</a>
</body>
在show.jsp中进行编码转换
<body>
name参数值:<%= new String(request.getParameter("name").getBytes("ISO-8859-1"),UTF-8)%>
sex参数值:<%= new String(request.getParameter("sex").getBytes("ISO-8859-1"),UTF-8)%>
</body>
-
获取客户端信息
- 通过request相应方法获取客户端信息
-
显示国际化信息:浏览器可通过accept-language的HTTP头报向Web指定它的本地语言
request的getLocale()和getLocales()方法允许JSP开发人员获取。
开发者可使用java.util.Local对象封装对应国家的语言
- 例
<%
java.util.Locale locale = request.getLocale();
String str = "";
if(locale.equals(java.util.Locale.US)){
str = "Welcome to access our company's web!"
}
if(locale.equals(java.util.Locale.CHINA)){
str = "欢迎访问"
}
%>
<%=str%>
-
response : 用于响应客户端请求,向客户端输出信。它封装了JSP产生的响应,并发送到客户端以响应客户端请求。
- 作用范围:JSP页面内。
- 作用:
-
重新定向网页:sendRedirect()方法
-
使用该方法可将网页重新定向到另一个页面。(重定向)
-
语法格式
-
response.sendRedwirect(String Path)
参数:Path:路径,也可以是URL地址
- 例:重定向到login.jsp页面
response.sendRedirect("login.jsp")
-
处理HTTP头文件
-
可进行禁用缓存,设置页面自动刷新,定时跳转页面等操作.
-
禁用缓存:默认情况,浏览器会对显示的网页进行缓存,再次访问同样的网页时,会直接显示缓存内容,提高显示速度。但对于安全性较高的网站,一般要禁用缓存。
-
<%
response.setHeader("Cache-Control-stone");
response.setDateHeader("Expirse",0);
%>
- 自动刷新
<%
response.setHeader("refresh",10);
%>
- 定时跳转页面
<%
response.setHeader("refresh","10");
%>
-
设置输出缓冲
-
通常,服务器输出到客户端会先写入一个缓冲区,加强效率。以下三种情况会把缓冲区的内容送到客户端。
- JSP页面的输出信息已全部写入了缓冲区
- 缓冲区已满
- jsp页面在,调用了response的flushBuffer方法或out对象的flush方法
-
response对象提供了以下对缓冲区进行配置的方法
- flushBuffer:强制将缓冲区的内容输出到客户端
- getBufferSize:获取响应所使用的缓冲区实际大小
- setBufferSize(int size):设置缓冲区大小
- reset:清楚缓冲区内容。同时清楚状态码和报头
- isCommitted:检查服务器是否把数据写入到了客户端
-
例:设置一个大小为32KB的缓冲区
-
response.setBufferSize(32);
可设置缓冲区为0,表示不缓冲
-
session对象
-
session:会话。通过session可在应用程序的Web页面间进行跳转时,保存用户状态,使会话一直存在。一般,Tomcat在30分钟不向服务器发出请求,session就会消失。
-
作用范围大于request对象。
-
创建,获取,移除及销毁客户的会话
- 通过session对象可储存或读取客户信息。通过setAttribute方法和getAttribute方法实现
-
将信息保存在session范围内
seesion.setAttribute(String name,Object obj)
参数:name:用于指定作用域在session范围内的变量名
obj:保存在session访问内的对象
例:session.setAttribute("username","root")
将session范围内保存的信息读出
getAttribute(String name)
参数:name:session范围内保存时使用的关键字
例:session.getAttribute("username")
取出:
String username = (String)session.getAttribute("username")
将会话中指定的绑定对象移除
removeAttribute(String name)
参数:name:session范围内保存时使用的关键字
例:<% session.removeAttribute("username")%>
销毁session
session.invalidate();
- 会话超时管理:以下设置会话生命周期的方法
- getLastAccessedTime() : 客户端最后一次会话的时间
- getMaxInactiveInterval() : 以秒为单位返回两个请求最大的时间间隔
- setMaxInactiveInterval() : 以秒为单位设置session的有效时间
例:设置有效时间为10000秒
session.setMaxInactiveInterval(10000);
-
applicationd对象
- application对象用于保存所有应用程序中的共有数据。
存入数据:
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
取出数据:
application.getInitParameter("username");
-
out对象
-
用于在Web浏览器内输出信息,并管理服务器上的输出缓冲区
-
输出数据:
-
out.print("Hello world!")
- 管理缓冲区
out.clear() 清除缓冲区中的内容
out.clearBuffer() 清除当前缓冲区中的内容
out.flush() 刷新流
out.isAutoFlush 检查缓冲区满时自动情空,抛出异常
out.getBufferSize() 设置缓冲区大小
-
pageContext对象
- 可用于获取JSP页面内的一些对象
EL表达式
- 主要作用
- 从某域中取数据(1.pageContet 2.request 3.session 4.application)
- 将取出数据转为字符串
- 将字符串输出到浏览器
<%= request.getAttribute("vjnek") ? "" : request.getAttribute("vjnek")%>>
使用EL表达式为:${vjnek}
如结果无法变量时,EL表达式进行了空操作,不会输出null,会输出空
-
禁用EL方式
- 单行禁用:在EL前加斜杠
/${表达式}
- 忽略page中的EL:使用page的isELIgnored属性
<%@page isELIgnoerd = "true"%>
- 禁用web应用中所有JSP页面中的EL:在web.xml文件中配置
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
-
通过EL访问数据
- 使用"[]“和”."运算符访问数据,通常两符号作用相等
${user.id} == ${user["id"]}
- 当出现特殊符号时,如(-或.),使用"[]"符号
-
访问四大作用域(1.pageContet 2.request 3.session 4.application 从小到大)内的隐含对象时
EL提供了四个用于访问作用域范围的隐式对象
<%--EL表达式中内置了4个隐含的隐式对象与四个域一一对应--%>
${pageScope.data}<br>
${requestScope.data}<br>
${sessionScope.data}<br>
${applicationScope.data}<br>
出现key相同时,可加隐式对象加以区分;若没有key相同时,可省略
- 使用EL从Map中取出数据
<%
Map<String,String> map = new HashMap<>();
map.put("useranme","zhangsan");
map.put("password","111111");
request.setAttribute("mapObj",map);
%>
${mapObj.username}<br>
${mapObj["password"]}<br>
- 使用EL从数组中取数据
<%
String[] strings = {"zhangsan","lisi","wangwu"};
request.setAttribute("strObj",strings);
%>
${strObj[0]}<br>
${strObj[1]}<br>
${strObj[2]}<br>
<%--越界就显示空--%>
${strObj[100]}<br>
- 在EL中判断对象是否为空:使用empty运算符
${empty 表达式}
例:<%request.setAttribute("id","")%>
${empty id} //返回true
${not empty id} //返回false
-
EL环境信息的隐含对象
- pageContext
应用的根路径${pageContext.request.contextPath}<br>
- param
<%--获取文本框中的第一个值--%>
<%--等同于:<%=request.getParameter("key")%>--%>
${param.key}
- paramValues
<%--获取一个请求参数名对应的多个值--%>
<%--等同于:<%=request.getParameterValues("aihao")%>--%>
${paramValues.aihao[0]}${paramValues.aihao[1]}
- InitParam
<%--获取web应用初始化参数的值--%>
<%--等同于:<%=application.getInitParameter("author")%>--%>
${initParam.author}
JSTL标签库
-
标准标签库:由5个功能不同的标签库组成。
-
使用时通<%@ taglib%>指定标签库和访问前缀
-
<%--核心标签库--%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
-
<%--格式化标签库--%> <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-
<%--sql标签库--%> <%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
-
<%--xml标签库--%> <%@taglib prefix="xml" uri="http://java.sun.com/jsp/jstl/xml" %>
-
<%--函数标签库--%> <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
-
-
核心标签库:主要用于完成JSP页面的常用功能
- 表达式标签:包括4个
<c:out></c:out> 将表达式值输出到JSP页面中,相当于<%=%>
<c:set></c:set> 在指定范围中定义变量,或为指定对象设置属性值
<c:remove></c:remove> 在指定的JSP范围中移除指定变量
<c:catch></c:catch> 捕捉程序异常,相当于try...catch
- URL标签:包括4个
<c:import></c:import> 导入站内或其他网站的资源
<c:redirect></c:redirect> 向客户端发出的request请求重定向到其他URL服务
<c:url></c:url> 使用正确的URL重写构造规划员工URL
<c:param></c:param> 为其他标签提供参数信息,等同于:request.setParameter("")
- 流程控制标签
<c:if></c:if> 根据条件处理不同业务,类似if
<c:choose></c:choose>
<c:when></c:when>和<c:otherwise></c:otherwise>
联合使用,类似if...else if...else
- 循环标签
<c:forEcsh></c:forEcsh> 根据条件,遍历数组,类似foreash
<c:forTokens></c:forTokens>迭代字符串中由分隔符分割的各成员
-
格式标签库:提供了一个简单的国际化标签,称为II8N标签库。
用于处理国际化相关问题,还提供了格式化数字和日期显示格式的标签
-
SQL标签库:提供了基本的访问类型数据的能力
-
XML标签:可处理和生产XML标记
-
函数标签库:提供了一系列字符串操做函数