现在的位置: 首页 > 综合 > 正文

5、Tomcat的JSP生成Servlet机制

2018年02月05日 ⁄ 综合 ⁄ 共 3825字 ⁄ 字号 评论关闭

JSP——JavaServer Pages

1、JSP介绍

     - 在传统的网页HTML文件(*.htm,*.html)中加入传统java程序片段(scriptlet)和JSP标签,就构成了JSP网页
     - Java程序片段可以操纵数据库、重新定向网页以及发送E-mail等,实现建立动态网站所需要的功能。
     - 所有程序操作都是在服务器端执行,网络上传送给客户端的仅是得到的结果,这样大大降低了对客户浏览器的要求,即使客户浏览器端不支持Java,也可以访问JSP网页。(结果是静态的html页面)

2、JSP执行过程:

更详细的过程分析:

3、验证jsp编译生成servlet:在Tomcat的安装目录里,有一个work子目录,在其下还有这样的目录:Catalina\localhost\webp1\org\apache\jsp,在这个目录下,我们可以看到很多.java和.class文件,文件名都是我们编写的jsp文件的名字+下划线+jsp+.java,例如我们写的result.jsp,转换成为了result_jsp.java和编译后的result_jsp.class。

jsp最终都会转换为servlet去执行。

4、JSP原始代码中包含了JSP元素和Template(模板)data两类;Template data指的是JSP引擎不处理的部分,即标记<%  %>以外的部分,例如代码中的HTML的内容等,这些数据会直接传送到客户端的浏览器;JSP元素则是指将由JSP引擎直接处理的部分,这一部分必须符合JAVA语法,否则就导致编译错误。

5、JSP语法分为三种不同的类型:

    - 编译器指令(DIRECTIVE)例如:<%@ page import="java.io.*" %>
    - 脚本语法(SCRIPTING)
    - 动作语法(ACTION)例如:<jsp:forward>,<jsp:getProperty>,<jsp:include>

脚本语法包括:HTML注释:<!--     -->——在客户端查看源代码能看到;隐藏注释(也叫JSP注释):<%--   --%>——源代码中看不见,即不会发送到客户端;

编译指令包括“包含指令”,“页指令”和“taglib指令”,它们包含在<%@ %>卷标里,两个主要的指令是page与include。

声明:<%!   %>,<%! int a = 3; %>与脚本段<% int a = 3; %>,举例:

<body>
    <%! int a = 3; %>
    <% int b = 3; %>
    
    <br>
    <%= a-- %>
    <%= b-- %>
  </body>

这样的例子,每刷新一次,页面上a的值都将减1,而b的值始终不变,究其原因,声明的变量在jsp转换为servlet后成为成员变量,而脚本段的变量成为_jspService这个方法里的局部变量,而且,对于servlet来说,是单例的,即服务器中只存在此servlet的一个实例(对象),所以成员变量也一份,每个用户都会访问到它,而脚本段中的值则是局部变量,每个用户访问时各有一份,互不影响。

表达式:<%=   %>

包含指令:include指令:<%@ include file="relativeURL"    %>

page指令用于定义JSP文件中的全局属性,import用于导入java包,以下包不需要导入:java.lang.*;javax.servlet.*;javax.servlet.jsp.*;javax.servlet.http.*

6、page指令详解

    - "<%@ page %>"指令作用于整个JSP页面,同样包括静态的包含文件。但是"<%@ page %>"指令不能作用于动态的包含文件,比如“<jsp:include>”
    - 可以在一个页面中用上多个"<%@ page %>"指令,但是其中的属性只能用一次,不过也有例外,那就是import属性。因为import属性和JAva中的import语句类似,所以此属性就能用多次。
    - 无论把"<%@ page %>"指令放在JSP的文件的哪个地方,它的作用范围都是整个JSP页面。不过,为了JSP程序的可读性,以及好的编程习惯,最好还是把它放在JSP文件的顶部。

7、taglib指令:

<%@ tablib uri="URIToTaglib" prefix="tagOrefix" %>,用于引入定制标签库

8、<jsp:forward page=  />指令用于转向页面,在该指令后面的所有代码都没有机会执行了,因为页面流程已经转向了另一个页面了。

 <jsp:include   page=>

   <jsp:param name=”username” value=”rasion”  />

   <jsp:param name=”password” value=”12345”  />

</jsp:include>

9、一个页面输入行列数,另一个页面动态生成对应行列表格:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'input.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <form action="output.jsp">
    	row:<input type="text" name="row"><br>
    	col:<input type="text" name="col">
    	<input type="submit" value="submit">
    </form>
  </body>
</html>

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'output.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <%
    	int row = 0;
    	int col = 0;
    try
    {
    	row = Integer.parseInt(request.getParameter("row"));
        col = Integer.parseInt(request.getParameter("col"));
    }
    catch(Exception e)
    {
    	out.println("input digit");
    	return;
    }
        int value = 0;
    %>
    <table width="80%" align="center" border=1>
    <%
    	for(int i = 0;i < row; i++)
    	{
    %>
    <tr>
    	<%
    		for(int j = 0; j < col; j++)
    		{
    	%>
    	<td><%= ++value %></td>
    	<% } %>
    </tr>
    <% } %>
    </table>
  </body>
</html>

 

抱歉!评论已关闭.