动作指令与编译指令不同, 编译指令是通知 Servlet 引擎的处理消息, 而动作指令只是运行时的动作编译指令在将 JSP 编译成 Servlet 时起作用; 而处理指令通常可替换成 JSP 脚本, 它只是 JSP 脚本的标准化写法
JSP 动作指令主要有如下 7 个:
1jsp:forward: 执行页面转向, 将请求的处理转发到下一个页面
2jsp:param: 用于传递参数, 必须与其他支持参数的标签一起使用
3jsp:include: 用于动态引入一个 JSP 页面
4jsp:plugin: 用于下载 JavaBean 或 Applet 到客户端执行
5jsp:useBean: 创建一个 JavaBean 的实例
6jsp:setProperty: 设置 JavaBean 实例的属性值
7jsp:getProperty: 获取 JavaBean 实例的属性值
forward 指令
forward 指令用于将页面响应转发到另外的页面既可以转发到静态的 html 页面, 也可以转发到动态的 JSP 页面, 或者转发到容器中的 Servlet
forward 指令格式如下:
<jsp:forward page="{relativeURL | <%=expression%>}" />
对于 JSP1.1 以上规范, 可以使用如下形式:
- <jsp:forward page="{relativeURL | <%=expression%>}">
- {<jsp:param ... />}
- </jsp:forward>
第二种语法可以添加额外的参数, 增加的参数可通过 HttpServletRequest 实例的 getParameter() 方法获取
例子:
- <jsp:forward page="form.jsp">
- <jsp:param name="age" value="29" />
- </jsp:forward>
获取参数:
<input type="hidden" name="age" value="<%=request.getParameter("age")%>">
使用 forward 指令转发请求时, 用户请求的地址不会改变, 客户端的请求参数也不会丢失
从表面上看,<jsp:forward ... /> 指令似乎将用户请求转发到了一个新页面, 但实际上只是采用了新页面来对用户请求生成响应 -- 请求依然是一次请求, 所以请求参数请求属性都不会丢失
include 指令
include 指令是一个动态 include 指令, 也用于包含某个页面, 它不会导入被 include 页面的编译指令, 仅仅将被导入页面的 body 内容插入本页面
语法格式:
<jsp:include page="{relativeURL | <%=expression%>}" flush="true" />
或者:
- <jsp:include page="{relativeURL | <%=expression%>}" flush="true">
- <jsp:param name="parameterName" value="parameterValue" />
- </jsp:include>
flush 属性用于指定输出缓存是否转移到被导入文件中如果指定为 true, 则包含在被导入文件中; 如果指定为 false, 则包含在原文件中
表明上看, 该页面的执行效果与使用静态 include 导入的页面没有什么不同但查看生成的源码, 可以发现: 动态导入只是使用一个 include 方法来插入目标页面的内容, 而不是将目标页面完全融入本页面中
归纳起来, 静态导入和动态导入有如下三点区别:
1 静态导入是将被导入页面的代码完全融入, 两个页面融合成一个整体 Servlet; 而动态导入则在 Servlet 中使用 include 方法来引入被导入页面的内容
2 静态导入时被导入页面的编译指令会起作用; 而动态导入时被导入页面的编译指令则失去作用, 只是插入被导入页面的 body 内容
3 动态包含还可以增加额外的参数
useBeansetPropertygetProperty 指令
这三个指令都是与 JavaBean 相关的指令, 其中 useBean 指令用于在 JSP 页面中初始化一个 Java 实例; setProperty 指令用于为 JavaBean 实例的属性设置值; getProperty 指令用于输出 JavaBean 实例的属性
useBean 的语法格式如下:
<jsp:useBean id="name" class="classname" scope="page | request | session | application" />
其中, id 属性是 JavaBean 的实例名, class 属性确定 JavaBean 的实现类 scope 属性用于指定 JavaBean 实例的作用范围, 该范围有以下 4 个值:
page: 该 JavaBean 实例仅在该页面有效
request: 该 JavaBean 实例在本次请求有效
session: 该 JavaBean 实例在本次 session 内有效
application: 该 JavaBean 实例在本应用内一直有效
setProperty 语法格式如下:
<jsp:setProperty name="BeanName" property="propertyName" value="value" />
其中, name 属性确定需要设定 JavaBean 的实例名; property 属性确定需要设置的属性名; value 属性则确定需要设置的属性值
getProperty 语法格式如下:
<jsp:getProperty id="BeanName" property="propertyName" />
其中, name 属性确定需要输出的 JavaBean 的实例名; property 属性确定需要输出的属性名
例子:
- <jsp:useBean id="person" class="com.baiguiren.Person" scope="page" />
- <jsp:setProperty name="person" property="name" value="baiguiren" />
- <jsp:setProperty name="person" property="age" value="24" />
- <jsp:getProperty name="person" property="name" /><br/>
- <jsp:getProperty name="person" property="age" />
以上三个指令可以完全不使用, 我们可以换成以下写法, 其内部执行是完全一致的:
- <%
- // 实例化 JavaBean 实例, 实现类为 com.baiguiren.Person, 该实例的实例名为 person
- Person person = new Person();
- // 将 person 放入 page 范围中
- pageContext.setAttribute("person", person);
- // 设置 person 的 name 属性值
- person.setName("baiguiren");
- // 设置 person 的 age 属性值
- person.setAge(23);
- %>
- <!-- 输出 person 的 name 属性值 -->
- <%=person.getName()%> <br/>
- <!-- 输出 person 的 age 属性值 -->
- <%=person.getAge()%>
使用 useBean 标签时, 除在页面脚本中创建了 JavaBean 实例之外, 该标签还会将该 JavaBean 实例放入指定的 scope 中, 所以通常还需要在脚本中将该 JavaBean 放入指定 scope 中, 如下面的代码片段所示:
- // 将 p1 放入 page 的生存范围中
- pageContext.setAttribute("p1", p1);
- // 将 p1 放入 request 的生存范围中
- request.setAttribute("p1", p1);
- // 将 p1 放入 session 的生存范围中
- session.setAttribute("p1", p1);
- // 将 p1 放入 application 的生存范围中
- application.setAttribute("p1", p1);
param 指令
param 指令用于设置参数值, 这个指令本身不能单独使用, 因为单独的 param 指令没有任何实际意义
param 指令可以与以下三个指令结合使用
- jsp:include
- jsp:forward
- jsp:plugin
当与 include 指令结合使用时, param 指令用于将参数值传入被导入的页面; 当与 forward 指令结合使用时, param 指令用于将参数值传入被转向的页面
param 指令的语法格式:
<jsp:param name="paramName" value="paramValue" />
来源: http://www.bubuko.com/infodetail-2531484.html