1.jsp动作标签概述
Jsp动作标签是Javaweb内置的的动作标签,一共定义了20个,因为它们已经定义好了,所以我们可以直接拿来使用。它的作用就是用来简化Java脚本,其格式为:<jsp:标签名…>。
Jsp动作标签与HTML标签有本质的区别,动作标签是由服务器解释执行,它与Java代码一样,在服务器端执行,而HTML标签是由浏览器解释执行。
下面我们来一一了解jsp的几个动作标签:
2.jsp动作标签介绍
2.1<jsp:forward>标签
<jsp:forward>标签是用来做请求转发,它与RequestDispatcher接口的forward()方法一样,唯一不同的是它是在jsp页面中使用。
下面我们通过一个案例学习使用<jsp:forward>标签完成转发,具体如下所示:
(1)创建一个web应用,名称为Example4,在该应用的WebRoot目录下新建一个目录,名称为jspsForward,然后在该目录下新建一个jsp页面,名为first.jps,主要代码如例1-1所示:
例1-1 first.jsp
<body>
<h1>first.jsp</h1>
<!-- 转发到second.jsp -->
<jsp:forward page="second.jsp"/>
</body> |
(2)在jspsForward目录下再次新建一个jsp文件,名为second.jsp,主要代码如例1-2所示:
例1-2 second.jsp
<body>
<h1>second.jsp</h1>
</body> |
(3)将Example4发布到服务器中,然后启动服务器,在浏览器端访问:http://localhost:8080/Example4/jsps
Forward/first.jsp,浏览器显示结果如图1-1所示:
图1-1 浏览器显示结果
由图1-1可知,浏览器中显示的只有second.jsp页面的标题,而first.jsp页面中的标题“<h1>first.jsp</h1>”没有显示,我们在学习请求转发时说过请求转发“留头不留体“,即转发之前响应输出流中的信息会被清空,不会输出到浏览器端。<jsp:forward>标签有同样的功能。
2.2<jsp:include>标签
<jsp:include>标签的作用使用来包含其他jsp页面,之前学习的
include指令属于静态包含,而include动作标签是动态包含,它和RequestDispatcher接口的include()方法一样,是运行级别的包含,即当前jsp和被包含的jsp都会生成各自的Servlet,然后在执行当前jsp的Servlet时完成包含另一个Servlet,因此会存在两个Java文件和两个.class文件。
下面我们通过一个案例学习如何使用include动作标签完成包含,如下所示:
(1)在Example4应用的WebRoot目录下,新建一个jspsInclude目录,然后在该目录下创建一个jsp文件,名称为first.jsp,主要代码如例1-3所示:
例1-3 first.jsp
<body>
<h1>first.jsp</h1>
<!-- 包含second.jsp -->
<jsp:include page="second.jsp"></jsp:include>
</body> |
(2)在jspsInclude目录下再次创建一个jsp文件,名称为second.jsp,主要代码如例1-4所示:
例1-4 second.jsp
<body>
<h1>second.jsp</h1>
</body> |
(3)重新启动服务器,在浏览器端访问:http://localhost:8080/Example4/jspsInclude/first.jsp,浏览器显示结果如图1-2所示:
图1-2 浏览器显示结果
由图1-2可知,first.jsp和second.jsp中的内容都输出在浏览器端,符合请求包含的特点。
下面我们去Tomcat安装目录中查看first.jsp和second.jsp是否都被翻译成Java文件,如图1-3所示:
图1-3 翻译结果
由图1-3可知,first.jsp与second.jsp各自都被翻译成Java文件,然后我们打开first_jsp.java文件,观察该文件中的_jspService()方法,如图1-4所示:
图1-4 first_jsp.java
由图1-4可知,include动作标签转换成了一句代码:
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "second.jsp", out, false),该方法的效果和RequestDispatcher接口的include()方法一样。
了解了动态包含,现在查看静态包含时jsp页面被翻译之后的结果,根据
include指令中案例Example3中的静态包含页面,查看Tomcat安装目录中翻译之后Java文件,如图1-5所示:
图1-5 静态包含翻译之后的Java文件
由图1-5可知,静态包含时,包含页面与被包含页面合并之后翻译成一个Java文件,该Java文件的名字是以包含页面的名字命名的,现在我们来查看one_jsp.java文件,如图1-6所示:
图1-6 one_jsp.java
图1-6中,在one_jsp.java中,_jspService()方法中先将one.jsp页面中的内容使用out对象输出在浏览器端,然后再将two.jsp页面中的内容使用out对象输出在浏览器端。
include指令与include动作标签的区别就是静态包含于动态包含之间的区别,即包含页面与被包含页面被合并的时机。
2.3<jsp:param>标签
<jsp:param>标签作为<jsp:forward>标签和<jsp:include>标签的子标签,用来给转发或包含的页面传递数据。写法如下所示:
<jsp:forward page="second.jsp">
<jsp:param value="zhangsan" name="username"/>
<jsp:param value="123" name="password"/>
</jsp:forward> |
(1)下面,我们就在forward动作标签的基础上添加param动作标签,修改例1-1,如例1-5所示:
例1-5 first.jsp
<h1>first.jsp</h1>
<!-- 转发到second.jsp -->
<jsp:forward page="second.jsp">
<jsp:param value="zhangsan" name="username"/>
<jsp:param value="123" name="password"/>
</jsp:forward>
</body> |
(2)修改jspsForward目录下的second.jsp页面,在该页面中获取请求参数username和password,并输出在浏览器端,如例1-6所示:
例1-6 second.jsp
<body>
<h1>second.jsp</h1>
<%
String username =request.getParameter("username");
String password=request.getParameter("password");
out.print("username: "+username+",password: "+password);
%>
</body> |
(3)重启服务器,在浏览器端访问:http://localhost:8080/Example4/jspsForward/first.jsp,浏览器显示结果如图1-7所示:
图1-7 浏览器显示结果
在first.jsp页面利用param标签传递的参数成功的在second.jsp面获取,并显示在浏览器端。在include动作表标签中使用param标签和在forward标签中使用param标签一样,这里我们就不在演示了。
3.jsp在web.xml文件中的配置
这里给大家补充两个小知识:第一,在Tomcat安装目录下的conf/context.xml文件中配置一个属性,该属性的配置可以使我们修改了servlet之后不用重启服务器;第二,客户端访问jsp文件,其实是访问一个名为JspServlet的servlet。
首先来详细说明第一个小知识:
(1)找到Tomcat的安装目录,打开conf/context.xml文件,如图1-8所示:
图1-8 context.xml
(2)在图1-8中的<Context>标签中添加一个属性reloadable,如图1-9所示:
图1-9 context.xml
图1-9中,reloadable属性的值为true,表示如果修改了服务器端的servlet类的代码,不需要重启服务器。但是配置这个属性也有缺点,我们会在以后的数据库连接池中说明这个问题。
接着我们来说说第二个小知识:
我们知道在Tomcat的安装目录下的conf目录下有一个web.xml,这个web.xml可以理解是部署在Tomcat服务器下的所有web工程中的web.xml的父文件,现在我们来看看这个web.xml文件,如图1-10所示:
图1-10 web.xml
图1-10中,配置了一个名为JspServlet,然后根据它的名字jsp,在web.xml文件中查找它的映射标签<servlet-mapping>,如图1-11所示:
图1-11 web.xml文件
由图1-11可知,JspServlet的访问路径是“*.jsp”和“*.jspx”,也就是说当访问的是jsp页面,那么就是访问JspServlet这个类,然后由这个类来解析要访问的jsp文件,最后将文件的内容通过响应流输出到浏览器端。
本文版权归传智播客Java培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Java培训学院
首发:http://www.itcast.cn/javaee