JSP动态网页开发原理详解_JSP编程

来源:脚本之家  责任编辑:小易  

这样 我先问你2113个问题 首先 你吃东西5261用你的手抓就可以吃吧?对不对?那是不4102是就没理由1653用筷子啊?如果你觉得我说的无理 那么 你可以想想你问的问题首先 了解下MVC 任何人开发一种东西都有他存在的意义 SERLVET的主要目的是给JSP提供一个后台 让页面与逻辑最大限度的分离 让一个本来不需要显示的只需要业务操作东西 放到SERVLET中去执行 如果要求显示比较多的话 那就得用JSP了 不是为了别的 最主要是JSP做显示是专业的 而SERVLET做业务是专业的 虽然他们互相都能替代对方 但是这就像你吃饭一样 用手抓也是吃 用筷子也是吃 都能完成目的 但是 用筷子吃会比较卫生 而用手抓呢 则会弄脏手 并且有脏的东西也会吃到肚里(就像光用SERVLET难以维护一样 开发视图部分太笨重)那样的话 说明什么问题?即使能完成目的 但也会出现一些不在预算内的东西 那要怎么办?用筷子 用筷子也有麻烦 比如你不会用筷子 那么就得学 直到熟练之后 你就会发现筷子真的很好用www.zgxue.com防采集请勿采集本网。

一、什么是JSP?

HI我。。

     JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。

基于此题目图书资料检索系统 ,可以为你提供一份适用于初学者的代码, 还有别的要求么,可以与我们联系,,联系我们需要提供你的问题和电子邮件,有可能帮你,但肯定救急,请用BaiduHi为我留言, 此回复对于所有需求和和来访者有效, ES:\\A609C970FD530

  JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

servlet 是java2e 提供的一个基本实现, java 分三个平台j2se , j2ee ,j2me , 区分就在于不同平台的应用, servelt是j2ee实现web一个最基础的平台如果没有servlet这个规范,那也不存在 j2ee 平台之说, jsp只是servlet人性化实现, 早期开发人员用se

二、JSP原理

javascript一般用在客户端做一些验证之类的工作, jsp主要应用于服务器端,动态生成网页, 但是现在随着ajax技术的发展,javascript的应用越来越广,已经超越了传统的客户端应用的范畴,可以代替一部分服务器端功能了。

2.1、Web服务器是如何调用并执行一个jsp页面的?

jsp是种制作动态网页的技术,你要知道怎么制作就得去学习这门技术,就单单一个回答肯定是不能告诉你的。 希望能帮助到你

  浏览器向服务器发请求,不管访问的是什么资源,其实都是在访问Servlet,所以当访问一个jsp页面时,其实也是在访问一个Servlet,服务器在执行jsp的时候,首先把jsp翻译成一个Servlet,所以我们访问jsp时,其实不是在访问jsp,而是在访问jsp翻译过后的那个Servlet,例如下面的代码:

index.jsp

<%@ 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%>" rel="external nofollow" > <title>First Jsp</title> </head> <body> <% out.print("Hello Jsp"); %> </body></html>

  当我们通过浏览器访问index.jsp时,服务器首先将index.jsp翻译成一个index_jsp.class,在Tomcat服务器的work\Catalina\localhost\项目名\org\apache\jsp目录下可以看到index_jsp.class的源代码文件index_jsp.java,index_jsp.java的代码如下:

package org.apache.jsp;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;import java.util.*;public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory(); private static java.util.List _jspx_dependants; private javax.el.ExpressionFactory _el_expressionfactory; private org.apache.AnnotationProcessor _jsp_annotationprocessor; public Object getDependants() { return _jspx_dependants; } public void _jspInit() { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName()); } public void _jspDestroy() { } public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _jspx_out = null; PageContext _jspx_page_context = null; try { response.setContentType("text/html;charset=UTF-8"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; out.write('\r'); out.write('\n');String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; out.write("\r\n"); out.write("\r\n"); out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n"); out.write("<html>\r\n"); out.write(" <head>\r\n"); out.write(" <base href=\""); out.print(basePath); out.write("\">\r\n"); out.write(" \r\n"); out.write(" <title>First Jsp</title>\r\n"); out.write("\t\r\n"); out.write(" </head>\r\n"); out.write(" \r\n"); out.write(" <body>\r\n"); out.write(" "); out.print("Hello Jsp"); out.write("\r\n"); out.write(" </body>\r\n"); out.write("</html>\r\n"); } catch (Throwable t) { if (!(t instanceof SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { out.clearBuffer(); } catch (java.io.IOException e) {} if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } }}

  我们可以看到,index_jsp这个类是继承 org.apache.jasper.runtime.HttpJspBase这个类的,通过查看Tomcat服务器的源代码,可以知道在apache-tomcat-6.0.20-src\java\org\apache\jasper\runtime目录下存HttpJspBase这个类的源代码文件,如下图所示: 

我们可以看看HttpJsBase这个类的源代码,如下所示:

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.jasper.runtime;import java.io.IOException;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.jsp.HttpJspPage;import javax.servlet.jsp.JspFactory;import org.apache.jasper.compiler.Localizer;/** * This is the super class of all JSP-generated servlets. * * @author Anil K. Vijendran */public abstract class HttpJspBase extends HttpServlet implements HttpJspPage{ protected HttpJspBase() { } public final void init(ServletConfig config) throws ServletException { super.init(config); jspInit(); _jspInit(); } public String getServletInfo() { return Localizer.getMessage("jsp.engine.info"); } public final void destroy() { jspDestroy(); _jspDestroy(); } /** * Entry point into service. */ public final void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { _jspService(request, response); } public void jspInit() { } public void _jspInit() { } public void jspDestroy() { } protected void _jspDestroy() { } public abstract void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;}

  HttpJspBase类是继承HttpServlet的,所以HttpJspBase类是一个Servlet,而index_jsp又是继承HttpJspBase类的,所以index_jsp类也是一个Servlet,所以当浏览器访问服务器上的index.jsp页面时,其实就是在访问index_jsp这个Servlet,index_jsp这个Servlet使用_jspService这个方法处理请求。

2.2、Jsp页面中的html排版标签是如何被发送到客户端的?

浏览器接收到的这些数据

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <base href="http://localhost:8080/JavaWeb_Jsp_Study_20140603/" rel="external nofollow" > <title>First Jsp</title> </head> <body> Hello Jsp </body></html>

都是在_jspService方法中使用如下的代码输出给浏览器的:

out.write('\r'); out.write('\n');String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; out.write("\r\n"); out.write("\r\n"); out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n"); out.write("<html>\r\n"); out.write(" <head>\r\n"); out.write(" <base href=\""); out.print(basePath); out.write("\">\r\n"); out.write(" \r\n"); out.write(" <title>First Jsp</title>\r\n"); out.write("\t\r\n"); out.write(" </head>\r\n"); out.write(" \r\n"); out.write(" <body>\r\n"); out.write(" "); out.print("Hello Jsp"); out.write("\r\n"); out.write(" </body>\r\n"); out.write("</html>\r\n");

  在jsp中编写的java代码和html代码都会被翻译到_jspService方法中去,在jsp中编写的java代码会原封不动地翻译成java代码,如<%out.print("Hello Jsp");%>直接翻译成out.print("Hello Jsp");,而HTML代码则会翻译成使用out.write("<html标签>\r\n");的形式输出到浏览器。在jsp页面中编写的html排版标签都是以out.write("<html标签>\r\n");的形式输出到浏览器,浏览器拿到html代码后才能够解析执行html代码。

2.3、Jsp页面中的java代码服务器是如何执行的?

  在jsp中编写的java代码会被翻译到_jspService方法中去,当执行_jspService方法处理请求时,就会执行在jsp编写的java代码了,所以Jsp页面中的java代码服务器是通过调用_jspService方法处理请求时执行的。

2.4、Web服务器在调用jsp时,会给jsp提供一些什么java对象?

  查看_jspService方法可以看到,Web服务器在调用jsp时,会给Jsp提供如下的8个java对象

PageContext pageContext;HttpSession session;ServletContext application;ServletConfig config;JspWriter out;Object page = this;HttpServletRequest request,HttpServletResponse response

  其中page对象,request和response已经完成了实例化,而其它5个没有实例化的对象通过下面的方式实例化

pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true); application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut();

 这8个java对象在Jsp页面中是可以直接使用的,如下所示:

<% session.setAttribute("name", "session对象");//使用session对象,设置session对象的属性 out.print(session.getAttribute("name")+"<br/>");//获取session对象的属性 pageContext.setAttribute("name", "pageContext对象");//使用pageContext对象,设置pageContext对象的属性 out.print(pageContext.getAttribute("name")+"<br/>");//获取pageContext对象的属性 application.setAttribute("name", "application对象");//使用application对象,设置application对象的属性 out.print(application.getAttribute("name")+"<br/>");//获取application对象的属性 out.print("Hello Jsp"+"<br/>");//使用out对象 out.print("服务器调用index.jsp页面时翻译成的类的名字是:"+page.getClass()+"<br/>");//使用page对象 out.print("处理请求的Servlet的名字是:"+config.getServletName()+"<br/>");//使用config对象 out.print(response.getContentType()+"<br/>");//使用response对象 out.print(request.getContextPath()+"<br/>");//使用request对象%>

运行结果如下:

 

2.5、Jsp最佳实践

  Jsp最佳实践就是jsp技术在开发中该怎么去用。

  不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。其原因为,程序的数据通常要美化后再输出:让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。

2.6、Tomcat服务器的执行流程

  

第一次执行:

    客户端通过电脑连接服务器,因为是请求是动态的,所以所有的请求交给WEB容器来处理 在容器中找到需要执行的*.jsp文件 之后*.jsp文件通过转换变为*.java文件 *.java文件经过编译后,形成*.class文件 最终服务器要执行形成的*.class文件

第二次执行:

因为已经存在了*.class文件,所以不在需要转换和编译的过程

修改后执行:

       1.源文件已经被修改过了,所以需要重新转换,重新编译。

到此这篇关于JSP动态网页开发原理详解的文章就介绍到这了,更多相关JSP动态网页开发原理内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

javascript是一种语言,用来处理页2113面的数5261据,jsp是一种页面格式,这种页面是动态页面,4102即是1653说,页面的内容不是固定的,举个简单的例子,比如有一个数据库,有10条语句,jsp把这个数据库的记录都显示到页面上是10条,后来,你又在数据库中添加了10条,这样,你不需要对页面更改,页面就能显示这20条数据,同理,可以用来动态显示图片、文本、数据 等等内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • jsp动态网页开发技术概述
  • jsp实现将动态网页转换成静态页面的方法
  • jsp开发之spring方法注入之替换方法实现
  • 解决jsp保存到数据库丢失格式的方法
  • jsp实现添加功能和分页显示实例分析
  • eclipse开发hibernate应用程序
  • spring组件自动扫描详解及实例代码
  • jbuilder2005实战jsp之登录页面实现代码[图]
  • 详解struts2中action访问servlet api的几种方法
  • jsp 多条sql语句同时执行的方法
  • jsp中为表格添加水平滚动条的实现方法
  • 页面自动刷新,不用按回车键来提交数据!
  • 网页制作中基本jascript和动态JSP 有何分别
  • servlet可以实现动态网页的开发,为什么还要JSP技术呢?
  • JSP页面是动态页面,“动态”怎么理解呢?
  • JSP动态网站开发要分几个方面?
  • 做一份JSP动态网页
  • 制作一个简易JSP动态网页
  • 请编程老鸟来给我解答一个疑惑啊!我想知道动态网...
  • 开发动态网页时,什么时候用jsp什么时候用javascri...
  • 在jsp中如何制作动态网页
  • jsp怎样实现了网页动态效果的?
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全javascriptasp.netphp编程ajax相关正则表达式asp编程jsp编程编程10000问css/htmlflex脚本加解密web2.0xml/rss网页编辑器相关技巧安全相关网页播放器其它综合dart首页jsp动态网页开发技术概述jsp实现将动态网页转换成静态页面的方法jsp开发之spring方法注入之替换方法实现解决jsp保存到数据库丢失格式的方法jsp实现添加功能和分页显示实例分析eclipse开发hibernate应用程序spring组件自动扫描详解及实例代码jbuilder2005实战jsp之登录页面实现代码[图]详解struts2中action访问servlet api的几种方法jsp 多条sql语句同时执行的方法jsp中为表格添加水平滚动条的实现方法页面自动刷新,不用按回车键来提交数据!jsp el表达式详细介绍jsp下页面跳转的几种方法小结jsp生成页面验证码的方法[附代码在jsp页面如何获得url参数spring mvc 框架搭建配置方法及详jsp web.xml文件的作用及基本配置jsp自定义标签taglib实现过程重点servlet+jsp实现图片或文件的上传将html页改成jsp的两种方式jsp 连接mysql配置与使用java session出现的错误jsp导出excel并支持分sheet导出的方法jsp 开发之spring security详解详解springboot集成jsp(附源码)+遇到的struts2中action实现modeldriven后无法返关于iis连接数和在线人数的详细说明jsp中解决session过期跳转到登陆页面并跳java/jsp学习系列之五(jdbc-odbc翻页例子浅谈jsp serverlet的区别与联系java soapheader的web service
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved