jsp就是servlet,其传统语法包含内容有: declaration,scriptlet,expression,comment,directives,Action,内置对象
declaration,scriptlet,expression
<%!
int a = 0; // 第一种声明语法 declaration,加感叹号,是成员变量
%>
<%
int b = 0; // 第二种声明语法 scriptlet,不加感叹号,是局部变量,位于 servlet 的service方法体内
%>
<%= ++a %> // expression 等号后面只能是字符串变量或者可以转化为字符串的表达式,只有一行,不需要分号结尾
<%= ++b %>
<%= session.getId() %> // session 是内置对象,第一次使用 session 对象就会创建 session
<%= request.getPemeter("xxx") %> // request 是内置对象
不断刷新 jsp,a 输出累加, b 一直为 1
directive 编译指令 (相当于在编译期间的命令,注意,这个时候程序是还没有开始执行呢
格式:<%@directive 属性="属性值"%> // 常见的 directive 有 page,include,taglib
page:
<%@page language="" // 现在只能写 java,不用管
extends="" // jsp 继承于哪个类,因为jsp 就是 servlet ,肯定继承了某个相关类,所以一般这里不指定
import="" // 导入某个类库
buffer="none|kb size" // 默认是使用缓冲8k, 使用缓冲的意思是输出页面的时候先输出到内存里,再一次性画到页面上
session="true|false" // 是否能使用 session,默认true
autoFlush="true|false" // 页面输出完之后是不是自动的 flush 到客户端,默认true
isThreadSafe="true|false" // 是不是实现了 SingleThreadModel 接口(已废弃),默认false,很少用
info="infoText" // jsp相关的描述性信息,很少用
errorPage="error page url" // 这个页面出了错会显示哪个页面的内容
isErrorPage="true|false" // 当前这个页面是不是一个显示错误的页面
contentType="contentTypeInfo"
%>
// 只有红色的属性需要注意,其余的不用管
<%@page import="java.util.*, java.text.*"%> // 可以连着引入,或者写两条指令都行
<%@page contentType="text/html;charset=utf-8"%>
errorPage="abc.jsp" // 出错给我显示abc.jsp的内容
在abc.jsp里:
<%@page isErrorPage="true"%> // 必须有,表示这个 abc.jsp 是出了错后显示的页面
<%= exception.getMessage() %> // exception 表示当前出错的 exception 对象
include:
<%@include file="/xxx/cc/aa.jsp"%> // 注意 include 是编译指令,所以是先包含代码,再执行,效率比较高,但是不能传参数,如aa.jsp?a=1这样的
// 常见的有 jsp:useBean jsp:include jsp:forward jsp:plugin(嵌入applet小程序,已经很少用)
jsp:include
// 包含,在程序执行到这个语句的时候才会动态编译,可以使用子标签 jsp:param 传参数,下面的 flush 不用管,意思是另外一个网页的内容赶快输出
<jsp:include page="" flush="true">
<jsp:param name="xxx" value="" />
</jsp:include>
jsp:forward
// 用于将一个 jsp 的内容传送到 page 所指定的 jsp 程序或 servlet 中处理 或者说是交给一个 URL 处理
<jsp:forward page="" flush="">
<jsp:param name="xxx" value="" />
</jsp:forward>
jsp:useBean
// 在 jsp 中使用 java bean
<% A a = new A() %>
<jsp:useBean id="a" class="xxxx.xxx.a" scope="page|request|session|application" type="java.lang.Object">
</jsp:useBean>
<jsp:setProperty name="a" property="sss" value="11" />
<jsp:getProperty name="a" property="sss" />
// type 属性的意思是把这个对象当成什么对象使用,type="java.lang.Object" 相当于 Object a = new A()
// scope="page" 相当于尖括号里的作用域,就是局部变量,页面范围内有效,出了页面没人认识了
// scope="request" 在请求范围之内有效,先到request 里面找,有就拿,没有就创建,相当于同一个 request 里面有效
<%
A a = (A)request.getAttribute("a");
if (a == null) {request.setAttribute("a", a);}
%>
<jsp:forword page="xxxx.jsp" flush="true" />
// 那么在 xxxx.jsp 里面就能通过 <jsp:useBean id="" class="" scope="request"> 获取到,因为转发是同一个 request
<jsp:setProperty name="a" property="sss" param="11" />
// 注意这里是param,相当于value="<%= request.getParameter("11") %>"
// 还有一种怪异的用法:
// 比如有页面提交表单到 a.jsp 页面,a.jsp页面里面有如下代码:
// 这时 * 会根据提交表单的 name 属性从 request.getParameter 取值,再set,提交表单的 name 属性和模型里要一一对应,手写用得少,Structs里用的多
<jsp:useBean id="" class="" scope="request">
<jsp:setProperty name="" property="*" />
</jsp:useBean>
// jsp:useBean 和写在尖括号里的代码是一个意思,只是另一种写法,这种写法更接近于标签而已
转发是发生在服务器端,对客户端来说是没有感知的,只请求了一次,使用的是同一个 request 对象(所以可传参数?xxx)
重定向对客户端来说是有感知的,重定向时服务器通知了客户端去请求新的地址,重定向请求了 2 次,使用的是 2 个 request 对象(所以不可传参数)
jsp 9 大内置对象
out
request
response
page 就是指当前页面,很少用,因为当前页面的内容我们能直接访问
pageContext 当前页面的上下文(或者说运行环境,和servletContext类似)
exception
session
config web.xml 对于当前 jsp 的配置application
jsp 和 servlet 之间的 通信
jsp 里可以通过 jsp:forward 和 response.sendRedirect( ) 到任何路径,包括servlet
servlet 到 jsp 重定向时一样的,但是转发麻烦点,如下代码:
public void doGet(HttpServletRequest request, HttpServletResponse response) {
response.setContent("text/html;charset=utf-8");
// 拿到 web.xml 对于当前 servlet 的配置,拿到上下文,再拿到分发器(整个web容器的路径管理者),然后转发,也可以是include把指定页面包含进来
getServletConfig().getServletContext().getRequestDispatcher("/xxx/zzz.jsp").forward(request, response);
}