- jSP:java server pages
1. jsp:java服务器端页面
* 该页面内既可以定义html标签,又可以定义java代码
* 简化书写,避免所有页面信息写在Servl类的response.getWriter().write()中
2. jsp原理:
a. jsp本质上就是一个servlet
1. 客户端浏览器访问jsp文件资源
2. 服务器找到该jsp资源后,将该资源转化为java文件
-- 在访问过jsp资源后,在web项目目录下能找到work文件夹
-- work文件夹中存有的就是jsp转化后的java文件和class文件
3. 服务器将转化后的java文件编译为class文件
4. 服务器将class文件响应给浏览器
b. jsp自动生成的java类继承了HttpJspBase类
1. HttpJspBase类由tomcat实现,继承自HttpServlet,并实现了HttpJspPage接口
2. 在自动生成的java类中,具有_jspService方法(即service方法),里面有将html页面写给浏览器
3. jsp脚本:
a. 脚本定义格式:
1. <% java代码 %>:
* 该脚本在转化后的java代码生成在_jspService方法中
* 该脚本类型用于定义在Service方法可实现的内容
2. <%! java代码 %>:
* 该脚本类型用于定义类的成员:成员变量,成员方法,静态代码块等
* 一般不在共享资源中定义成员变量,避免出现数据安全问题
3. <%= java代码 %>:
* 该脚本用于输出内容到页面上
* 该脚本中可以定输出语句中可以定义的内容
4. jsp内置对象:
* 在jsp中不需要创建可以直接使用的对象
* jsp内置对象:
1. request:
-- HttpServletRequest对象
-- 用于一次请求访问多个资源(转发方式)
2. response:
-- HttpServletResponse对象
3. out:
-- JspWriter字符输出流对象
* out.write()与response.getWriter().write()区别
-- tomcat在回复响应消息之前,会先获取response缓冲区的数据,再获取out缓冲区的数据
-- 即,response中内容的输出总是先于out中内容输出于页面上
4. pageContext:
-- PageContext对象,可以用于获取其他8个对象
-- 仅限于当前页面的资源共享
5. session:
-- HttpSession对象
-- 一次会话的多个请求间共享数据
6. application:
-- ServletContext对象
-- 所用用户共享数据
7. page:
-- Object类型对象,并赋值为this,指当前页面本身
8. config:
-- ServletConfig对象
9. exception:
-- Throwable对象
-- 只有声明了isErrorPage属性为true的页面中才包含该对象,普通页面只有前8中对象
- jsp指令
1. 指令:作用于jsp页面,用于导入资源文件
a. 格式:
<%@ 指令名称 属性1=属性值1 属性2=属性值2 ... %>
b. 分类:
1. page指令:用于配置jsp页面
<%@ page 属性1=属性值1 属性2=属性值2 ... %>
* contentType属性:相当于response.setContentType()
-- 设置响应体的Mime属性和字符集
-- 设置当前jsp页面的字符集,高级开发工具(IDEA)可以自动识别contentType属性的字符集,并设置相同字符集
-- 低级开发工具需要额外设置pageEncoding属性
* import属性:用于导入java文件包
* errorPage属性:当前页面出现错误后,会跳转到该属性指定的错误页面。即不让用户看到错误信息
* isErrorPage属性:表示该页面为错误页面,用于其他页面出现错误后,跳转到该页面
-- 错误页面的isErrorPage属性标注为true后,才可以在该页面使用exception对象
-- 错误页面可以使用exception对象记录错误信息到日志文件中
2. include指令:用于导入页面包含的资源文件
如果需复用使用其他页面上的内容,使用include指令
<%@ include 属性1=属性值1 属性2=属性值2 ... %>
* file属性:需要引入的文件名
3. taglib指令:用于导入资源,一般导入标签库
<%@ taglib 属性1=属性值1 属性2=属性值2 ... %>
* prefix属性:标签库别名,自己定义
* uri属性:标签库路径
c. 注释:
1. <!-- -->:只能在jsp页面注释html内容,不能注释脚本内容,浏览器检查可以查看到该注释信息
2. <%-- -- %>:在jsp页面可以注释所有内容,使用该注释的信息不会随页面发送到浏览器,推荐使用
- MVC开发模式
1. MVC开发模式:规则代码书写格式,使得程序设计更加合理
2. MVC内涵:
a. Model:模型
-- JavaBean用作模型
3. 执行业务操作,将结果返回给控制器
b. View:视图
-- Jsp用作视图展示,不再书写脚本代码
5. 展示数据
c. Controller:控制器
-- Servlet用作控制器
1. 获取客户端输出
2. 调用指定模型进行业务操作
4. 将结果提交给视图用于展示数据
- EL表达式/JSTL标签
1. 为了遵从MVC开发模式的规范,我们仅使用jsp来展示页面
* 为了解决原jsp中脚本代码的必要,使用EL表达式或JSTL标签替代
2. EL表达式:Expression Language
a. 格式:
${ 表达式 }
b. jsp页面是默认支持EL表达式
-- 如果要忽略当前jsp页面中所有EL表达式,在页面属性中isELIgnored设为true
-- \${ 表达式 }表示忽略该EL表达式,即将$转义输出
c. EL表达式只能从域对象获取值(4个域)
1. 格式:
${ 域名.键名 }
2. 域名 --> 对应的域对象
* pageScope --> pageContext
* requestScope --> request
* sessionScope --> session
* applicationScope --> application(ServletContext类型对象)
-- ${ requestScope.name }可以取出在request域中存储的name键对应的值
-- 如果域中没有该键,则返回空字符串,有则返回值
3. ${键名}
-- 会依次从最小的域中开始查找该键名,直到找到键名返回值,否则返回空字符
-- pageScope < requestScope < sessionScope < applicationScope
-- 如果4个域中的键名都不同,则可以直接省略域名
4. 获取类对象,数组,map集合的值
1. 获取类对象成员变量值
${域名.键名.类对象的属性名}
例如:
${ requestScope.user.name }
在request域中找到键名user所存储的User对象后,通过getName方法返回该对象成员变量name的值
即,只要对象中有对应的getter/setter方法,就可以直接通过(.)获取设置属性值
* 注意:
-- 如果没有对应属性的getter/setter方法而访问属性,则抛出异常
-- 可以专门为属性书写getter成员方法用于个性化返回值的格式(逻辑视图)
2. 获取List中的值
${ 域名.键名[索引] }
例如:
${ requestScope.list[0] }
如果索引越界,则返回空字符串
3. 获取Map中的值
${ 域名.键名.key名称 }
${ 域名.键名[key名称] }
例如:
${requestScope.userMap.name}
${requestScope.userMap["name"]}
d. empty运算符
* 用于判定字符串,集合,数据是否为null且长度是否大于0
-- ${ empty list }只有当list不为null且list长度大于0时才为true
4. EL表达式隐式对象:即EL表达式中不需要创建直接使用的对象(11个)
1. 除去4个域名对象,还需要注意pageContext对象
* 该pageContext对象可以用于获取jsp页面中的其他8个内置对象
* 该对象中有8个对象的getter方法,因此,直接(.)获取对象名即可
* 通过${pageContext.request.contextPath}可以在jsp页面动态获取虚拟目录,用于动态路径编写
- JSTL标签:javaServer page tag library
1. JSTL:
-- 由apache提供的开源的jsp标签
-- 用于简化和替换jsp中的java代码
2. 使用步骤:
a. 导入jar包
b. jsp页面引入标签库:<%@ taglib prefix="" uri=""%>
c. 通过<别名:标签名></别名:标签名>格式使用标签
3. 常用JSTL标签:
a. if标签(if语句)
1. 格式:
<c:if test=""> 标签体 </c:if>
2. 属性:
* test属性:必要属性。属性值为布尔表达式,表达式值为true则显示标签体内容,否则不显示
b. choose标签(switch语句)
1. 格式:
<c:switch >
<c:when test="情况1"> 标签体1 </c:when>
...
<c:otherwise> 其他情况标签体 </c:otherwise>
</c:switch>
c. foreach(for语句)
1. for(int i = 0;i < 10; i++){}形式标签:
* 格式:
<c:foreach var="i" begin=0 end=9 step=1>
</c:foreach>
* 需要设置标签属性:
begin:开始值(>=开始值)
end:结束值(<=结束值)
step:步长
var:声明的临时变量
* 例如:
<c:foreach var="i" begin=0 end=9 step=1>
${i}<br>
</c:foreach>
2. for(Object obj : list){}形式标签:
* 格式:
<c:foreach items="${list}" var="obj" varStatus="s">
</c:foreach>
* 必须先将list对象存入域中,然后使用${键名}取出该list对象才可以遍历
3. varStatus属性:循环状态对象
为该属性设置一个临时变量名后,可以访问该对象的两个属性值index和count
<c:foreach ... varStatus="s">
${s.index}
${s.count>
</c:foreach>
* count:表示循环次数,从1开始
* index:表示容器中对象的索引,从0开始