1、JSP概述
1、介绍jsp发展.
- JSP MODEL1 : 在jsp中做所有事情. 业务处理, 页面显示。在这种模式下,jsp中代码量相当大,而且它不仅负 责显示页面,而且处理业务,无论修改哪里,都特别复杂麻烦
- JSP MODEL1 2代: 在jsp中做所有事情. 把业务逻辑抽取到javaBean中. 页面负责调用业务方法.(但是,这种方式不适合MVC的思想)
- JSP MODEL2 : servlet处理逻辑.jsp负责显示结果。(jsp只负责显示,把java代码放在servlet中)
2、JSP的本质
JSP本质就是Servlet。JSP(Java Server Pages)java服务器页面。它的根本是简化Servlet。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
JSP产生原因:
由于在Servlet中输出HTML语句非常麻烦,修改不方便。JPS能够大大简化和方便了网页的设计和修改。
JSP的运行:
访问jsp——>生成.java文件——>生成.class文件
因此可以从java文件中去了解jsp的实质
jsp的脚本
<% %> 出现在jsp对应service方法中
<%! %> 出现在jsp对应的类中
<%= %> 出现在service方法中,会使用out.print方法包裹.
JSP中的注释
<%-- --%> 被注释掉的内容不会出现在java文件中.
<!-- --> 浏览器端注释.
2、JSP代码分析
既然运行jsp最终产生java文件,那么在java文件中就可以看出jsp实质的问题
从org.apache.jasper.runtime.HttpJspBase中可以看出它继承HttpServlet。因此我们说的jsp的本质就是Servlet。
3、JSP三大指令
1、page指令
language=”java” 当前jsp使用的是java语言
import=”java.util.” 导包.该属性是可以唯一一个出现多个的属性.
*pageEncoding=”UTF-8” 保存到文件系统的码表
*contentType=”text/html; charset=ISO-8859-1” 告诉浏览器解码的码表 保证这两处码表一致就不会出现乱码.但是,其实不用两个属性都设置. 只设置一处码表,jsp解析时会自动设置另一个.
autoFlush=”true” 当缓冲区装满的时候,是否自动刷新缓冲区 . 如果不自动刷新,那么装满时,还继续装会跑出异常
buffer=”8kb” 设置缓冲区大小,8kb是默认值,并且是合理默认值。 以上两个属性开发时不用管.
errorPage=”/error.jsp” 当当前jsp中出现异常时,将请求转发给错误页面. 并将产生的异常对象传递给下一个jsp.
isErrorPage=”true” 该属性一般放在错误提示页面 , 设置为true那么, 在该页面中就可以使用exception对象来获得异常信息.
上面的errorPage属性在开发中不是很常用,因为该属性只影响当前页面,范围太小.
可以使用下面的配置 统一管理整个项目的错误页面
<error-page>
<!-- 当出现该异常时 跳转到错误页面 -->
<exception-type>NullpointExcept</exception-type>
<!-- 当出现500错误时 -->
<error-code>500</error-code>
<!-- 跳转到/jsp/error.jsp页面 -->
<location>/jsp/error.jsp</location>
</error-page>
isThreadSafe=”true” 默认值是false. 如果指定为true那么会以线程安全的方式运行jsp对应的servlet. 具体参照文档.(了解)
session=”true” 决定页面中是否可以直接使用session对象.默认值是true. 不要动该属性.
2、include指令
include指令:包含,包括。是通知jsp编译器把另一个jsp引入到当前文件中,就和复制到当然中一样。和c语言中#include功能相似。这样生成的java文件了合并的,并不是两个java文件,这两个java文件 可以共享。
3、taglib指令
taglib指令表示要引用JSP标签库
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
4、JSP的四大作用域
作用域的使用范围
5、JSP中的9大内置对象
从jsp源码中看出9大内置对象
JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。
6、JSP动作标签
JSP提供了动作标签来简化页面代码(尽量减少java代码),另一方面处理业务逻辑
7、EL表达式
EL表达式(Expression Language):让Jsp的代码更加简化
在jsp中一般还得使用<% = %>在这个脚本中写java代码,EL表达式可以代替这个脚本
<%=request.getAttribute(“user”) %> 等价于$ { requestScope.user }
主要作用:
获取数据:
1、EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
2、执行一些简单的运算:${user==null}
3、得对web常用对象的引用
4、调用Java类的方法。
<body>
<%
pageContext.setAttribute("a", "111", PageContext.PAGE_SCOPE);
pageContext.setAttribute("a", "222", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("a", "333", PageContext.SESSION_SCOPE);
pageContext.setAttribute("a", "444", PageContext.APPLICATION_SCOPE);
%>
page域:${pageScope.a} 代码相当于<%=pageContext.getAttribute("a")%><br />
request域:${requestScope.a} 代码相当于<%=request.getAttribute("a") %><br />
session域:${sessionScope.a} 代码相当于<%=session.getAttribute("a") %><br />
application域:${applicationScope.a} 代码相当于<%=application.getAttribute("a")%><br/>
访问list<br/>
<% List list =new ArrayList();
list.add("aaa");
list.add("bbb");
pageContext.setAttribute("list", list);
%>
${pageScope.list[0]}
${pageScope.list[1]}
</body>