本文共 3532 字,大约阅读时间需要 11 分钟。
JSP简介
JSP全称是Java Server Pages, 它和Servlet技术一样,都是SUN公司定义的一种用于开发动态WEB页面的技术
为什么JSP也是一种动态WEB资源的开发技术呢?
写JSP虽然就像是在写html,但JSP技术允许在页面中编写java代码,并且允许开发人员在页面中获取request、response等WEB开发常用对象,实现与浏览器的交互,所以JSP也是一种动态WEB资源的开发技术。
JSP页面的基本结构
<%@ page contentType="text/html;Charset=GB2312" %> <%@ page import="java.util.Date" %> <%! Date date = null; // 变量声明 int sum = 0; public int add(int m, int n) // 方法声明 { return m + n; } %>
程序片创建Date对象: <% date=new Date(); //java程序片 out.println(date); sum=add(12,34); %>
在下一行输出和: <%= sum+100 %>
例:在jsp页面中输出当前时间
JSP调用和运行原理
IE浏览器访问jsp页面时,web服务器是如何调用并执行一个JSP页面的? 无论访问html或者jsp都是在访问servlet 当我们访问index.jsp时,服务器会将index.jsp翻译成一个servlet D:\lessons\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\ work\Catalina\localhost\jd(我们的项目名称)\org\apache\jsp 我们发现它继承的是org.apache.jasper.runtime.HttpJspBase 我们继续查看 org.apache.jasper.runtime.HttpJspBase 我们便发现HttpJspBase继承自HttpServlet 那么现在我们可以确认当浏览器访问jsp时,服务器会将它翻译成servlet,然后再访问这个servlet WEB服务器在执行JSP页面时,是如何把JSP页面中的html排版标签输出给浏览器的?
我们可以通过index_jsp.java中的service方法查看到 我们可以通过index_jsp.java中的service方法查看到 浏览器显示的jsp页面时通过index_jsp.java中的service方法输出的 JSP页面中的java代码服务器是如何执行的?
通过index_jsp.java中的service方法我们发现 jsp页面中的java代码原封不动的写人了service方法中 WEB服务器在调用JSP时,会给JSP提供一些什么java对象?
通过index_jsp.java中的service方法我们发现 下面的便是为JSP准备的java对象 通过下面的图我们不难发现
通过下面的图我们不难发现它便是this,jsp页面本身。 request (请求对象) HTTP请求开始到结束这段时间 session ( 会话对象 ) HTTP会话开始到结束这段时间 会话失效时间,tomcat中默认是30分钟,可以设置,每个用户的会话空间是隔离的 application (应用程序对象) 服务器启动到停止这段时间(它就是一个ServletContext) response (响应对象) 向客户端浏览器输出信息,对客户的请求做成响应 pageContext (页面上下文对象) 可以通过它获取其他八个内置对象(例:pageContext.getRequest()) config(配置对象) 主要作用是取得服务器的配置信息 exception (例外对象) 在可能产生错误的文件中用page指令设置isErrorPage="true",才能在翻译的servlet中发现这个对象。 例:<%@page errorPage="error.jsp"%> 不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点, 在长期的软件实践中,人们逐渐把servlet作为web应用中控制组件来使用,而JSP技术作为数据显示模板来使用。 让jsp即用java代码产生动态数据,又做了美化会导致页面难以维护。 让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。 因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据, 并把数据通过转发技术带给jsp,数据的显示jsp来做 将JSP标记、变量和方法声明、Java程序片由tomcat服务器执行 JAVA表达式由Tomcat计算,然后将结果转化为字符串,交给客户浏览器显示。 当多个客户请求用一个JSP页面时,Tomcat为每个客户启动一个线程,这些线程共享成员变量,因此每一个线程对成员变量的改动都会影响其他线程。 为了防止多个用户同时操作一个成员变量,可以对操作该变量的方法加锁 加锁的方法是用synchronized关键字修饰该方法,当一个线程执行该方法时,其他线程只能等待 例4:synchronized方法举例
<%@ page contentType="text/html;Charset=GB2312" %> <%! long count = 0; //被客户共享的count synchronized void setCount() //synchronized修饰的方法 { count++; } %> <% setCount(); out.println("您是第"+count+"个访问本站的客户"); %>
java程序片
一个JSP页面可以有多个JAVA程序片,这个些程序片被JSP引擎顺序执行。 页面局部变量在该页面中后续的所有程序片及表达式部分有效 当多个客户请求一个JSP页面时,一个客户的局部变量和另一个客户的局部变量会被分配不同的内存空间 因此,一个客户对页面局部变量的操作结果不影响其他客户的这个局部变量。 页面被激活后,每次有用户调用,页面局部变量都被初始化。 表达式的值由服务器计算,并将计算结果以字符串的形式发送到客户端显示。