JSP
1. JSP概论
JSP(JavaServer Pages)是SUN公司提供的动态web资源开发技术,Servlet也是动态web资源开发技术,Servlet是java程序,适合用来处理业务逻辑,但是在java中输出HTML页面是一个非常繁琐的问题,且不利于查看。
为了解决这一问题,所以开发了JSP 它改变了Servlet在java代码中嵌入HTML的过程,变成了在HTML中嵌入java代码,非常适合用在组织html页面进行输出。
2. JSP原理:
JSP在第一次被访问时,由服务器的内部的JSP引擎翻译为一个Servlet存放在(tomcat)work目录中,对JSP的访问最终是由Servlet执行并输出结果。
对于JSP的HTML内容是以out.write()输出。
JSP中的java代码,复制并翻译到Servlet中执行。
注意:在翻译的Servlet中预定义了9大对象。在JSP中可以直接使用,这9大对象被称为JSP的9大隐式对象。
3. JSP语法
1.JSP模板元素
直接书写在JSP中的html内容,最终会在翻译成Servlet的过程中,以out.wirte()输出。
2.JSP脚本表达式
<%java表达式%>在翻译过来的Servlet中,计算出表达式的值,并out.print()输出到浏览器。
3.JSP脚本片断
<%若干java语句%>在翻译过来的Servlet中,原样复制到对应的位置执行。
注意:
一个JSP中可以有多个脚本片断,多个片断之间可以相互引用。
一个JSP中的脚本片断可以是不完整的,但多个片断组合在一起必须是完整的。
4.JSP声明
<%!若干java语句%>在翻译过来的Servlet中,会放置在和service方法同级的位置,并成为类的成员。
5.JSP注释
<%--注释的内容--%>在被JSP注释的内容,在翻译成Servlet的过程中会被丢弃不会被翻译。
//java注释 java注释在翻译成Servlet的过程中会被认为成java代码复制粘贴到相应位置,但在java文件编译成.class文件时,注释被丢弃。
<!--html注释-->html注释,在翻译过来的Servlet的过程中会当作为模板元素,直接out.write()输出到浏览器中,浏览器能解析html注释,最终予显示。
注意:在JSP中,html注释为java语句,可能会影响运行结果。
6.JSP指令
<%@ 指令名 属性 = ‘值‘ %>指挥解析引擎如何处理JSP页面中的其它内容,不产生输出。可以写在任意位置,通常推荐写在JSP页面的最开始位置。
1.page
language=‘java‘ 设置JSP当前使用的语言,只有一个值:java ,所以可以不写忽略。
extends=‘‘ 设置翻译过来的Servlet继承谁,通常不需要进行设置,默认继承的类就可以。
import=‘‘ 导入开发包,可以import多个开发包,多个开发包之间用,分割。
session=‘true|false‘ 设置翻译过来的Servlet是否自动生成session,如果当前JSP页面用不到session可设置为false,防止造成空间浪费。
errorpage=‘‘ 设置错误提示页面。当JSP抛出异常时,转发到错误提示页面,做出提示。
配置通用错误提示页面,在web.xml中配置:
<!--配置通常错误提示页面--> <error-page> <error-code>500</error-code> <location>/error/500.jsp</locaton> </error-page> <error-page> <exception-type>java.lang.Throwable</exception-type> <location>/error/500.jsp</location> </error-page>isErrorPage=‘‘ 默认为false。在错误提示页面中设置为true,则翻译过来的Servlet中会多了一个Exception对象,这个对象就代表当前页面抛出的异常。
content-type 设置response.setContentType()的值,通知服务器发送的编码和浏览器解打开的编码。
pageEncoding 设置JSP引擎以指定的编码读取JSP页面,从而翻译成Servlet,这个指定的设置编码要与JSP保存时的编码一致,否则会有乱码。pageEncoding会自动设置content-type。
2.include
<%@include file=‘‘%> 实现页面包含
静态包含:利用JSP指令包含,这种包含叫静态包含。这种包含是源文件内级别包装好,生成一个Servlet。
动态包含:除了JSP指令包含,其它方式叫动态包含。在访问时,每个Servlet分别产生输出,最终将输出的结果合并,是输出流级别的合并。
注意:从效率上考虑,静态包含效率较高。
3.taglib
<%@ taglib uri="" prefix=""%>用来引入标签库。
uri指定被引入.tld文件的名称空间
prefix 对该名称空间的一个缩写
4. JSP九大隐式对象
在翻译引擎翻译JSP的过程中,自动在翻译成Servlet时预定义了九个变量,这九个变量可以不需要在JSP中定义直接使用,被称为JSP的九大隐式对象。
page
config
appcation
request
response
session
out
exception
pagecontext
5. pageContext
代表整个JSP页面。
1. 作为入口对象获取其它八大隐式对象
getException方法返回exception隐式对象。
getPage方法返回page隐式对象。
getRequest方法返回request隐式对象。
getResponse方法返回response隐式对象。
getServletConfig方法返回config隐式对象。
getServletContext方法返回appcation隐式对象。
getSession方法返回session隐式对象。
getOut方法返回out隐式对象。
2. 作为域对象,同时也可以作为入口对象,操作四大域属性。
作用范围:整个JSP页面。
生命周期:随着JSP页面被访问开始而创建,随着访问结束而销毁。
作用:在JSP页面范围内共享数据。
public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
pageContext的setAttribute方法可以将参数或者java对象绑定到appcation对象、session对象、request对象、page对象,以下为scope取值范围:
PageContext.APPLICATION_SCOPE 4 应用程序共享范围
PageContext.SESSION_SCOPE 3 会话共享范围
PageContext.REQUEST_SCOPE 2 请求共享范围
PageContext.PAGE_SCOPE 1 页面共享范围当scope参数的值为pageContext.SESSION_SCOPE时,调用PageContext对象的setAttribute()方法和调用session对象的putValue()方法是等效的,都是将某个参数或者Java对象和当前的session绑定起来。如果scope参数的值为如果scope参数的值为pageContext.APPLICATION_SCOPE,那么调用PageContext对象的setAttribute()方法和调用application对象的setAttribute()方法是等效的。
public java.lang.Object getAttribute(java.lang.String name,int scope)pageContext对象的方法getAttribute可以直接获取四大域互相绑定的参数或者java的对象的值。
public void removeAttribute(java.lang.String name,int scope)解除四大域绑定关系。
findAttribute(String name) 按照由小到大在四大作用域中搜寻指定名称的属性,如果找到则返回值,没找到返回null。
3.方便的实现请求转发和请求包含
request.getRequestDispatcher("").forward(request,response);
等价于:pageContext.forward("...");
request.getRequestDispathcer("").include(requset,response);
等价于:pageContext.include("...");
6.杂项
1.映射JSP
<servlet>
<servlet-name>5JSP</servlet-name>
<servlet-file>/5.jsp</servlet-file>
</servlet>
<servlet-mapping>
<servlet-name>5JSP<servlet-name>
<url-parrten>/xxx/5.jsp</url-parrten>
</servlet-mapping>
7.JSP标签
在html中嵌入大量java代码同样页面很难看,不易于维护。为了解决这问题,SUN开发了标签技术,开发标签去替代JSP页面中的源代码。
1.JSP标签
<jsp:include>标签:实现页面包含。
<jsp:foward>标签:实现页面转发。
<jsp:param>标签:配合包含和转发时添加请求参数。
2.EL标签
一种表达式,可以在JSP中使用,实现如下四个功能 ${...}。
1. 获取数据
获取常量:字符串,数字,布尔常量。
获取变量:在四大作用域中搜寻指定名称变量,如果没有找到则什么也不输出。
注意:
el获取的变量必须在域中才可以获取。
[]与.的区别: 使用[]的地方都可以换成. 但是[]中有特殊字符时除外。
el表达式只能获取值,不能设置值,也不能遍历数据。
如果需要在JSP中写web应用名称,不要写死,也不要写java代码
${pageContext.request.contextPath}
<!--获取数据--> <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@page import="com.itcast.domain.Person"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <h1>EL获JavaBean的属性</h1> <% Person p = new Person(); p.setName("金毛狮王"); p.setAge(200); pageContext.setAttribute("p",p); %> ${p.name } ${p.name } ${p.age } <a href="${pageContext.request.contextPath }/index.jsp">xx</a> <h1>EL获Map中的数据</h1> <% Map map = new HashMap(); map.put("name","张无忌"); map.put("age",19); map.put("wugong","乾坤大挪移"); map.put("wugong.2","九阳神功"); pageContext.setAttribute("wugong","age"); pageContext.setAttribute("map",map); %> ${map["wugong"] } xxx ${map[wugong] }xxx ${map["wugong.2"] } <h1>EL获集合中的数据</h1> <% List list = new ArrayList(); list.add("张翠山"); list.add("殷素素"); list.add("无忌孩儿"); list.add("赵敏"); request.setAttribute("list",list); %> ${list[3] } <h1>EL获取数组中的数据</h1> <% String [] addrs = {"武昌","汉口","汉阳"}; pageContext.setAttribute("ads",addrs); %> ${ads[1] } <h1>EL获取变量</h1> <% request.setAttribute("name","zhang"); %> ${name } <h1>EL支持的常量:字符串 数字 布尔</h1> ${"abc" } ${123.234} ${false } </body> </html>2. 执行运算
在el表达式中如果遇到非数字运算,会试图自动转换成数字,如果转换失败则报错。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <h1>三元运算符</h1><hr> ${3>2 ? "yes":"no" } <h1>empty运算符</h1><hr> <% List list = new ArrayList(); list.add("aaa"); pageContext.setAttribute("list",list); String str = "sdf"; pageContext.setAttribute("str",str); %> ${empty list} ${empty str } <h1>el支持逻辑运算符</h1><hr> && and || or ! not ${!(3>2 && 3<1)} <h1>el支持比较运算</h1><hr> > gt >= ge < lt <= le == eq != ne ${3>2 }${5<3 }${3 ne 2 } ${3 eq 2 } <h1>el支持算数运算</h1><hr> ${3+2 } ${3*2 } ${3+"5"} </body> </html>3. 获取常用开发对象
el内置了11个对象,可以不存入域中就直接使用。
pageContext : 可以作为入口通过el获取八大隐式对象。
pageScope
requestScope
sessionScope
appcationScope
四大域中所有域属性组成的Map.
注意:这是Map,而不是四大作用域对象本身。
param Map<String,String>
paramValues Map<String,String[]>
代表当前请求中,所有请求参数组成的Map。
header Map<String,String>
headerValues Map<String,String[]>
代表请求头组成的Map。
cookie Map<String,Cookie>
cookie信息组成的Map
initParam Map<String,String>
web初始化信息组成的Map
4. 调用java方法,限于调静态的共有方法
<1>写一个类包含要被调用的静态共有方法
<2>写一个tld描述文件,描述一下要被调用的方法 -- tld文件必须放置在WEB-INF目录下非classes和lib目录中
<3>再在jsp页面中使用taglib指令引入tld描述文件,从而在jsp页面中调用函数3.JSTL标签库
<c:out>标签:用于输出一段文本内容到pageContext对象当前保存的out对象中。
<c:set>标签:把某个对象存在指定域的范围内。或者设置web域中的java.util.Map类型的属性对象或javaBean类型的属性对象的属性。
<c:remove>标签:用于删除web域中的属性。
<c:catch>标签:用于捕获嵌套在标签体中的内容抛出的异常,其语法格式如下:
<c:catch [var="varName"]>nested actions</c:catch>
<c:if test=‘‘>标签:可以构造“if-then”简单的判断表达式。
<c:choose>标签:用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。
使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
<c:forEach>标签:用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。
<c:forTokens>标签:用来浏览一字符串中所有的成员,其成员是由定义符号所分隔的
<c:param>标签:在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。<c:param>标签可以嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。
<c:import> 标签:实现include操作
<c:url>标签:用于在JSP页面中构造一个URL地址,其主要目的是实现URL重。URL重写就是将会话标识号以参数形式附加在URL地址后面
<c:redirect>标签用于实现请求重定向4.自定义标签
四大作用域