赞
踩
jsp在第一次被访问时会被Web容器翻译成servlet.执行过程:
被翻译后的servlet在Tomcat的work目录中可以找到
打开hello_jsp.java,会发现其中有这样一段代码:
由此可见,jsp的本质,其实就是一个Servlet.
jsp脚本元素
1)<%java代码%>: jsp Scriptlets
<%%>内部的java代码就相当于写在Servlet的service()方法中的代码.因此在里面声明的变量是局部变量.并且不能在里面定义方法.
2)<%=java变量或表达式> : jsp表达式
内部的代码就相当于使用了service()方法中的out.print().
3)<%!java代码%> jsp声明语句
内部的java代码用于声明成员变量,或者成员方法.由于Servlet线程不安全,所以我们一般也不会声明成员变量.在声明的方法中定义的变量是方法的局部变量.
代码演示
不同的注释可见范围是不同
1)Html注释:
可见范围 jsp源码、翻译后的servlet、页面显示html源码
翻译后的servlet
2)java注释://单行注释 /多行注释/
可见范围 jsp源码 翻译后的servlet
jsp源码
翻译后的servlet
3)jsp注释:<%–注释内容–%>
可见范围 jsp源码可见
jsp的指令是指导jsp翻译和运行的命令,jsp包括三大指令:
属性最多的一个指令,根据不同的属性,指导整个页面特性.但在实际开发中,page指定默认即可.
格式:<%@ page 属性名1= “属性值1” 属性名2= “属性值2” …%>
常用属性如下:
页面包含(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中
格式:<%@ include file=“被包含的文件地址”%>
demo2.jsp
now.jsp
然后我们访问demo2.jsp,效果如下:
注意,虽然我们写了两个jsp.但是静态包含不会生成两个servlet.在tomcat的work目录下,只有demo2_jsp.java.
但是打开demo2_jsp.java查看源码,它是已经把now.jsp的代码合并到了一个Servlet中.
用于在jsp页面中引入标签库(jstl标签库、struts2标签库),后面详解.
格式:<%@ taglib uri=“标签库地址” prefix=“前缀”%>
jsp被翻译成servlet之后,service方法中有9个对象定义并初始化完毕,我们在jsp脚本中可以直接使用这9个对象.
名称 | 类型 | 描述 |
---|---|---|
out | javax.servlet.jsp.JspWriter | 用于页面输出 |
request | javax.servlet.http.HttpServletRequest | 得到用户请求信息, |
response | javax.servlet.http.HttpServletResponse | 服务器向客户端的回应信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 |
session | javax.servlet.http.HttpSession | 用来保存用户的信息 |
application | javax.servlet.ServletContext | 所有用户的共享信息 |
page | java.lang.Object | 指当前页面转换后的Servlet类的实例 |
pageContext | javax.servlet.jsp.PageContext | JSP的页面容器 |
exception | java.lang.Throwable | 表示JSP页面所发生的异常,在错误页中才起作用 |
这9个内置对象中,request,response,cofig,session,application(ServletContext)这5个对象前面已经讲啦,page和exception几乎不用.所以我们重点讲out对象和pageContext对象.
out对象的类型是javax.servlet.jsp.JspWriter.他的作用与ServletResponse.getWriter()所返回的PrintWriter对象非常相似,功能都是用来向客户端发送文本形式的响应.不同的是out对象类型是JspWriter,是一种带缓存的PrintWriter.如下图:
demo3.jsp
测试结果
由此可见,out对象通过write()方法写入数据后,一直要等到整个JSP页面结束,out对象中缓冲区的数据才会真正写入servlet引擎提供的缓冲区中.而PrintWriter对象的write()方法是直接把数据写入servlet引擎的缓冲区中.Servlet引擎按照缓冲区中的数据存放顺序,向页面输出内容.
pageContext与page不是一个对象,大家注意区分.pageContext对象是javax.servlet.jsp.PageContext类的实例.代表当前JSP页面的运行环境.我们可以通过他,来获取其他8个内置对象.如:
pageContext.getOut() : 获取JspWriter对象
pageContext.getRequest(): 获取ServletRequest对象
pageContext还提供了数据存储功能,也是一个域对象.提供了以下方法
方法参数中,name是属性名,value是属性值,而scope是存放的范围,有以下几个取值:
demo4.jsp
测试结果
JSP动作标签用来控制JSP的行为,执行一些常用的JSP页面动作.通过动作标签可以实现多行Java代码才能够实现的效果,如包含页面文件,实现请求转发等.
可以使用<jsp:include page=” 页面”>实现动态包含.
创建demo5.jsp,使用动态包含jsp:include标签引入now.jsp
页面显示的效果:
在tomcat的work目录下,查看生产的java源文件:
那动态包含和静态包含有什么区别?
可以通过jsp动作标签进行请求的转发.格式如下:
<jsp:forward page=“要转发的资源” />
EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要简化jsp页面中脚本的编写.书写格式: ${表达式}
分类 | 内置对象名称 | 描述 |
---|---|---|
作用域 | pageScope | page作用域 |
requestScope | request作用域 | |
sessionScope | session作用域 | |
applicationScope | application作用域 | |
请求参数 | param | 获得一个请求参数 |
paramValues | 获得一组请求参数 | |
请求头 | header | 获得一个请求头 |
headerValues | 获得一组请求头 | |
JSP上下文对象 | pageContext | |
全局初始化参数 | initParam | |
cookie | cookie |
分别往四个作用域中存储数据,然后通过EL取出来,输出在页面上.
EL-demo1.jsp
测试结果
创建form.html,提供表单,提交路径为EL-demo2.jsp.然后在EL-demo2.jsp中获取表单数据.
使用param对象获取单个表单值
使用paramValues对象,获取多个值(数组)
form.html
EL-demo2.jsp
测试结果
使用EL内置对象header获取请求头参数
EL-demo3.jsp
测试结果
通过EL获取上下文对象,使用最多的场景就是获取项目名称.
EL-demo4.jsp
这其实就相当于:因为EL表达式的对象导航,其实是在调用对象的get()方法.
测试结果
在web.xml中设置初始化参数.
EL-demo5.jsp
测试结果
通过EL的cookie对象,可以获取所有cookie的数组.通过对象导航的方式,可以获得对应名称的cookie
EL-demo6.jsp
测试结果
EL最主要的作用是获得四大域中的数据,格式${EL表达式}
EL表达式依次从pageContext域,request域,session域,application域中获取属性,在某个域中获取后将不在向后寻找. 如果没找到,返回空串,而不是null.
使用EL表达式分别对多种数据进行获取.分别有:
使用EL进行取值.
测试结果
JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能。jstl出现的目的同el一样也是要提到jsp页面中的脚本代码。JSTL标准标准标签库有5个子库,但随着发展,目前常使用的是他的核心库.
标签库 | 标签库的URI | 前缀 |
---|---|---|
Core | http://java.sun.com/jsp/jstl/core | c |
I18N | http://java.sun.com/jsp/jstl/fmt | fmt |
SQL | http://java.sun.com/jsp/jstl/sql | sql |
XML | http://java.sun.com/jsp/jstl/xml | x |
Functions | http://java.sun.com/jsp/jstl/functions | fn |
要使用JSTL,首先需要导入其核心包和依赖包.
然后在jsp页面中通过taglib指令,引入标签库. 我们使用最多的就是核心库.
目前开发中,最常用的两个标签是<c:if>和<c:foreach>标签
<c:if>标签可在jsp页面中进行条件判断.如果有多种条件,就必须写多个<c:if>标签,因为JSTL中没有给我们提供else标签.
JSTL-if.jsp
测试结果
num值为3的时候:
修改num的值为4,页面结果
<c:foreach>标签可以指定多个属性:
测试结果
测试结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。