3个编译指令,7个动作指令,编译指令和动作指令的区别在于:
编译指令是通知Servlet引擎的处理消息,只在编译成servlet的时候起作用,动作指令是运行时起作用,可以替换成jsp脚本,它只是JSP脚本的标准写法。
JSP动作指令的7个兄弟是写什么呢:
老大:
- jsp:forward
书上说:执行页面转向,将请求的处理转发到下一个页面。其实转发的时候,不一定是一个纯纯的页面。可以是动态的页面,也可以是静态的页面。更可以转发到容器中的Servlet,至于这个指令一般什么时候使用,需要开发中总结了。其中的page属性就是指定页面的跳转。
如何获取呢? 转发是要发送请求的,所以我们很容易想到用JSP的内置对象之一,HttpServletRequest 类来 所以用request.getParameter获取就好了
<jsp:forward page="result.jsp">
<jsp:param value="20" name="age"/>
</jsp:forward>
<jsp:param value="20" name="age"/>
</jsp:forward>
result.jsp
<%=request.getParameter("age")%>
再转发的时候,浏览器的请求地址是不会发生改变的,也就是说,浏览器向客户端发送的请求并没有改变。而是服务器内部进行转发。
forward指令转发的实惠,客户端不会丢失参数。
- jsp:param
转发的时候,我们的参数就靠它来装载了,所以它是依赖于支持参数的标签使用,主要是和include forward plugin结合使用。比如转发,比如setProperty
jsp:include
这个指令在
3个编译指令已经阐述过了,它是动态的,编译指令是静态的,到底有哪里不同,通过源码可以看到,
- jsp:include
是通过JspRuntimeLibrary动态运行库的include方法导入。静态的是全部导入
动态的不会导入编译指令,静态的会。
动态的还可以增加参数
查看源码,静态的include是整个被包含到页面当中,而动态的是调用include方法,forward是调用forward方法。
- useBean: setProperty getProperty
useBean: 含义就是在JSP中实例一个java实例 包含的属性是:
id:实例的名字,也就是new出来的对象的名字,class是指定实现类,scope 是指定javaBean的范围,一共四个值,这个和jsp中 四个域的概念有关系后面继续讲解。
id:实例的名字,也就是new出来的对象的名字,class是指定实现类,scope 是指定javaBean的范围,一共四个值,这个和jsp中 四个域的概念有关系后面继续讲解。
name 就等同于id 是实例的名字。property才是参数的名字
<jsp:useBean id="person" class="com.webjsp.bean.PersonBean" scope="page"></jsp:useBean>
<jsp:setProperty property="name" name="person" value="zhangyi"/>
<jsp:setProperty property="age" name="person" value="20"/>
<jsp:getProperty name="person" property="name"/>
<jsp:setProperty property="name" name="person" value="zhangyi"/>
<jsp:setProperty property="age" name="person" value="20"/>
<jsp:getProperty name="person" property="name"/>
查看源码:
out.write("\t");
com.webjsp.bean.PersonBean person = null;
person = (com.webjsp.bean.PersonBean) _jspx_page_context.getAttribute(" person", javax.servlet.jsp. PageContext. PAGE_SCOPE);
if (person == null){
person = new com.webjsp.bean.PersonBean();
_jspx_page_context.setAttribute("person", person, javax.servlet.jsp. PageContext. PAGE_SCOPE);
com.webjsp.bean.PersonBean person = null;
person = (com.webjsp.bean.PersonBean) _jspx_page_context.getAttribute(" person", javax.servlet.jsp. PageContext. PAGE_SCOPE);
if (person == null){
person = new com.webjsp.bean.PersonBean();
_jspx_page_context.setAttribute("person", person, javax.servlet.jsp. PageContext. PAGE_SCOPE);
org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(_jspx_page_context.
findAttribute("
person"), "
name", "
zhangyi", null, null, false);
out.write('\r');
out.write('\r');
org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(_jspx_page_context.
findAttribute("
person"), "
age", "
20", null, null, false);
out.write(org.apache.jasper.runtime.
JspRuntimeLibrary.
toString((((com.webjsp.bean.PersonBean)_jspx_page_context.
findAttribute("
person")).
getName())));
scope的四个属性:
page:JavaBean在本页有效
request:JavaBean在本次请求中有效
session:javaBean在本次会话中有效
application:javaBean在本次应用中有效
这几个域到底什么区别,请看关于
4个域
将javabean放到域中的时候:
pageContext.setAttribute("person1",p1);
pageContext.setAttribute("person1",p1);
request.setAttribute("person2",p2);
session.setAttribute("person3",p3);
application.setAttribute("person4",p4);
最后一个动作指令:
- plugin
这个指令我目前用的很少,是用于下载服务器端的javaBean或者Applet到客户端运行,由于程序要到客户端运行,必须安装虚拟机。
实际上,我们完全可以使用支持Applet的 HTML标签,所以不再介绍,有时间去研究。
参考《轻量级javaEE企业应用实战》