jsp的基本知识

来源:互联网 发布:软件改变生活 编辑:程序博客网 时间:2024/06/05 12:02
一、jsp概述
sun公司提供的动态web资源开发技术之一。看起来非常像HTML,但是其中可以编写java代码,是一种动态web资源。它的出现是为了解决Servlet不适合向外输出页面内容的问题。JSP非常适合编写HTML页面,其中又可以写java代码,所以非常完好的解决了输出页面,和书写逻辑的问题。
如果说Serlvet是在java代码中嵌入HTML,那么JSP计是在HTML中嵌入java代码。
jsp会在第一次访问时被翻译成Serlvet,对jsp的访问其实是翻译过来的Servlet在向外进行输出。


二、JSP语法
1.模版元素:直接写在jsp页面中的HTML内容称之为JSP页面中的模版元素
模版元素在翻译过来的Servlet被out.write()原样输出到浏览器中
2.脚本表达式:<%=java表达式 %> 
在翻译过来的Servlet中,计算表达式的值原样输出
3.脚本片段:<% 若干java语句 %>
在翻译过来的Servlet中,被复制粘贴到对应位置执行
多个脚本片段之间的变量可以互相访问
在某一个脚本片段中java代码可以时不完整的,但要求在翻译过来的Servlet中整体的代码必须完整符合java语法。
4.jsp声明:<%! java代码 %>
写在JSP声明中的内容在翻译过来的Servlet中会和Service方法平级称为类的成员。 
5.jsp注释:<%-- 被注释的内容 --%>
被jsp注释注释的内容在翻译的过程中被丢弃,不被翻译。
被java注释注释的内容,被当做脚本片段翻译到Servlet中,但是被注释了,编译的过程中被抛弃,不会执行
被html注释注释的内容,被当做模版元素输出到浏览器,但是浏览器认为是注释,不予显示。
6.jsp指令:<%@ 指令名称 若干属性声明 %> --不会直接产生输出,而是用来指挥解析引擎如何翻译当前jsp页面中的其他内容。
page指令 -- 用来声明当前jsp页面的基本属性的,page指令可以写在jsp页面的任意位置,但是一般为了可读性的考虑,最好放置在jsp页面的最前面。
<%@ page ..... %>
[ language="java" ] 当前JSP使用的开发语言
[ extends="package.class" ] 当前jsp翻译成servlet后要继承的类,注意此值必须是一个servlet的子类,一般情况下不要改
!!![ import="{package.class | package.*}, ..." ] 导入需要使用到的包 java.lang.*;javax.servlet.*;javax.servlet.jsp.*;javax.servlet.http.*;可以在一个page指令的import属性中引入多个包,也可以写多个page指令分别导包。
!![ session="true | false" ] 用来指定当前页面是否使用session,如果设置为true,则翻译过来的servlet中将会有对session对象的引用,于是可以直接在jsp中使用session隐式对象。但是这将导致一旦访问jsp就会调用request.getSession()方法,可能导致不必要的空间浪费。如果确定jsp中不需要session可以设为false
!![ errorPage="relative_url" ] 如果页面出错,将要跳转到的页面,除了在jsp中使用此属性指定错误页面外也可以在web.xml中配置整个web应用的错误页面,如果两个都设置则jsp中的此属性起作用
!![ isErrorPage="true | false" ] 如果设置此属性为true,翻译过来的servlet中将含有Exception隐式对象,其中封装的就是上一个页面中抛出的异常对象
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] 和jsp乱码相关的指令,用来指定jsp输出时,设置的Content-Type响应头用来指定浏览器打开的编码
!![ pageEncoding="characterSet | ISO-8859-1" ] 服务器翻译jsp时使用的编码集.如果向防止jsp乱码,应该保证文件的保存编码和jsp翻译成servlet用的编码以及输出到浏览器后浏览器打开的编码一致.此属性一旦设置好,翻译引擎会间接帮我们设置content-type属性.
[ buffer="none | 8kb | sizekb" ] out隐式对象所使用的缓冲区的大小
[ autoFlush="true | false" ] out隐式对象是否自动刷新缓冲区,默认为true,不需要更改
[ isELIgnored="true | false" ] 当前页面是否使用el表达式,设置为false时表示启用el,j2ee4.0开始默认支持,j2ee4.0一下做开发时,如果要使用el表达式,需将此属性设置为fals


include指令
<%@include file=""%> -- 可以实现页面包含的效果


include指令实现的包含叫做静态包含:多个jsp翻译成一个Servlet,最终由这一个Servlet向外输出数据,这是源文件级别的合并。
其他方式实现的包含叫做动态包含:被包含的页面各自翻译成Servlet,包含的过程其实是各个Servlet分别执行后在输出流上的合并。


静态包含在效率上略高,尽量使用静态包含。

taglib指令
导入tld标签库文件
三、jsp的九大隐式对象
jsp被翻译成Serlvet的过程中,在翻译过来的Servlet中预先定义了九个对象,我们可以在jsp页面中的java代码中直接使用。


page
response
request
config
application
session
out
exception
pageContext




~~1.out
相当于response.getWriter(),区别在于out自带缓冲区,如果out和response.getWriter()混用可能会造成输出顺序上的混乱。
page指令中的 buffer 和 autoflush 就是用来设置out缓冲区的。
总结起来一句话,如果想在jsp页面中输出内容,直接用out,尽量别用response.getWriter();


!!!2.pageContext
代表当前jsp页面的运行环境的对象。


(1)作为入口对象获取其他八大隐式对象
getException方法返回exception隐式对象 
getPage方法返回page隐式对象
getRequest方法返回request隐式对象 
getResponse方法返回response隐式对象 
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象 
getOut方法返回out隐式对象


(2)本身是一个域对象,也可以作为入口对象操作其他三大作用域中的数据


本身是个域
getAttribute(String name)
setAttribute(String name, Object value)
removeAttribute(String name)


getAttributeNames


生命周期:访问jsp页面开始时创建,访问jsp页面结束时销毁
作用范围:当前jsp页面
主要功能:在当前jsp页面中共享数据


入口对象,操作其他三大作用域
getAttribute(String name,int scope)
setAttribute(String name, Object value,int scope)
removeAttribute(String name,int scope)


其中pageContext中代表域的常量:
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE 
额外提供了:
findAttribute(String attName) //按照由小到大的顺序在四大作用域中搜寻指定名称的属性,找到就返回,如果都找不到返回null

(3)提供了便捷方法实现包含和转发
request.getRequestDispatcher("/index.jsp").forwared(request,response);
request.getRequestDispatcher("/index.jsp").include(request,response);

pageContext.forward("/index.jsp");
pageContext.include("/index.jsp");
================================================================================================================================================================
四、jsp标签技术 -- 在jsp页面中写入大量的java代码会导致页面中html和java代码混杂在一起造成页面非常的混乱难于维护。
于是在jsp的2.0版本中,sun提出了jsp标签技术,推荐使用标签来替代jsp页面中的java代码,并且推荐,jsp2.0以后不要在jsp页面中出现任何一行java代码。


~~1.jsp标签 -- sun开发的jsp页面的标签技术,包含了不少标签,但是不太好用,我们只要求掌握三个。
<jsp:forward>用来替代request.getRequestDispatcher().forward()
<jsp:inclue>用来替代request.getRequestDispatcher().include()
<jsp:param>配合前两个标签使用,可以在包含或转发时,带一些请求参数过去



2.el表达式 -- 表达式,可以非常方便的替代jsp页面中的jsp脚本表达式
基本的结构: ${el的表达式}


只能获取不能设置!!
只能获取不能遍历!!
使用中括号的地方都可以用点号替代,除了中扩中中是数字或包含特殊字符时(-.)除外
注意,在获取数据时,如果使用了双引号则为常量,不使用则为变量,区分如下区别:
${map["job"]}
${map[job]}

(1)获取数据
获取常量:支持 数字、字符串、布尔类型,整个el的值就时当前常量的值。


获取变量 : el可以获取变量的值,它的底层会调用pageContext的findAttribute方法按照由小到大的顺序在四大作用域中搜寻指定名称的值,找到就返回,找不到就什么都不打印。


获取数组中的数据:可以通过[数字]来获取数组中的内容


获取集合中的数据:可以通过[数字]来获取数组中的内容


获取Map中的数据:可以通过[键] 或 .键 来获取map中的数据


获取javabean的属性:在获取javabean属性值时,点什么就相当于get什么。
## ${pageContext.request.contextPath}经常用来获取当前应用的名称0

(2)执行运算
算数运算
关系运算
逻辑运算
三元表达式
empty运算:判断对象是否为null,判断字符串是否为空字符串,判断集合中是否没有任何内容,判断域中是否没有任何域属性

(3)获取常用开发对象
el中内置了11个常用对象,可以不用预先存入域就可以使用。


代表当前jsp页面环境的PageContext对象:
!!!pageContext - 有了它意味着el中就有了其他八大隐式对象


代表四大作用域的隐式对象,用来明确指定从哪个域中查找数据:
!!!pageScope
!!!requestSocpe
!!!sessionScope
!!!applicationScope


请求参数组成的Map
!!!param -- Map<String,String>
paramValues -- Map<String,String[]>


请求头组成的Map
header -- Map<String,String>
headerValues -- Map<String,String[]>


所有cookie信息组成的Map
!!!cookie -- Map<String,Cookie>


所有web应用初始化信息组成的Map
initParam -- Map<String,String>

~~(4)调用就JAVA方法
el调用的java方法必须时共有的静态方法。
第一步,写一个类包含要被调用的静态方法
第二部,写一个标签描述文件(.tld)来描述当前el要调用的方法,注意.tld文件必须放置在WEB-INF目录下除了classes和lib以外的目录中
第三部,在jsp页面中通过 taglib指令引入 标签描述文件(.tld)利用el调用其中定义的方法。


案例:开发一个el函数,实现将字符串转换为大写的el函数


调用JSTL中的fn函数需要掌握。

3.jstl标签库 -- 通用的jsp标签库,提供了实现java中最常见功能的操作标签


4.自定义标签 -- 如果有一些特殊的需求通用的标签搞不定,我们也可以自己开发标签来实现,自定义标签技术就是允许我们自己开发标签的技术


0 0
原创粉丝点击