JSP动态网页开发技术概述_JSP编程

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

在jsp出现之前,人们的确2113是在用servlet做部分网页设计。但5261是渐渐的人们发现servlet在设4102计界面上1653远远不如jsp简洁美观。于是程序员便将代码分为了视图层(view)和业务逻辑层(control),这样明确的分工,极大的提高了编码效率了和程序的可维护性,也就形成了jsp+servlet技术风格,很简单,2113Servlet是java代码,JSP是java标签。用servlet编写页面很繁琐,5261需要注意和4102多余的代码很多(1653比如引号),并且它把页面代码和逻辑代码捆绑在一起,不易于维护。试想做页面的看的懂业务代码吗,做逻辑的熟悉精通页面吗?所以sun公司推出了jsp来把页面与逻辑层分开,这样不经易于分工开发,并且方便维护......本回答被提问者采纳www.zgxue.com防采集请勿采集本网。

  在动态web项目的开发中,经常需要动态生成HTML内容(如系统中的当前在线人数需要动态生成)。如果使用Servlet实现HTML页面数据的统计,则需要使用大量的输出语句。同时,如果静态内容和动态内容混合在一起,那么也将导致程序非常臃肿。为了客服Servlet的这些缺点,Oracle(Sun)公司推出了JSP技术。

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

1.JSP概述

html主要是显示,而jsp作为一种java的技术其初始点就是为了方便在页面上进行开发,所以也就有了最初开始的model1开发模式,但是由于可以在页面上写html代码和java代码(造成了很大的不便),所以到

  JSP(Java Server Pages)是建立在Servlet规范之上的动态网页开发技术,其实质是一个简化的Servlet。在JSP文件中,HTML和Java代码共同存在,其中,HTML代码用于实现网页中静态内容的显示,Java代码用于实现网页中动态内容的实现。为了和传统的HTML有所区别,JSP文件扩展名为jap。

JSP(JavaServer Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP

  JSP技术所开发的Web应用程序是基于Java的,其具有以下特征:

  (1)预编译

  预编译指在用户第一次通过浏览器访问JSP页面时,服务器将对JSP页面代码进行编译,并且仅指向一次编译。编译好的代码将被保存,在用户下一次访问时会直接执行编译好的代码。这样不仅节约了服务器的CPU资源,还大幅度提升了客户端的访问速度。

  (2)业务代码相分离

  在使用JSP技术开发Web应用时,可以将界面的开发和应用程序的开发分离。

  (3)组件重用

  JSP可以使用JavaBean编写业务组件,也就是使用一个JavaBean类封装业务处理代码或者将其作为一个数据存储模型,在JSP页面甚至整个项目中,都可以重复使用这个JavaBean,同时,JavaBean也可以应用带其他Java应用程序中。

  (4)跨平台

  由于JSP是基于Java语言的,它可以使用Java API,所有它也是跨平台的,可以应用与不同的系统,如Windows和Linux。

JSP 运行原理

  JSP的工作模式是请求/响应模式,客户端首先发出HTTP请求,JSP程序收到请求后将进行处理并返回处理结果。在一个JSP文件第一次请求时,JSP引擎(容器)把该JSP文件转化成一个Servlet,而这个引擎本身也是一个Servlet。

  JSP运行过程:

  (1)客户端发出请求,请求访问JSP文件。

  (2)JSP容器先将JSP文件转化成一个Java源文件(Java Servlet源程序),在转换过程中,如果发现JSP文件存在任何语法错误,则中断转换过程,并向服务器和客户端返回出错信息。

  (3)如果转换成功,则JSP容器会将生成的Java源文件编译成相应的字节码文件*.class。该class文件就是一个Servlet,Servlet容器会像处理其他Servlet一样处理它。

  (4)有Servlet容器加载转换后的Servlet类(class文件)创建该Servlet(JSP页面的转换结果)的实例,并执行Servlet的jspInit()方法。jspInit()方法在Servlet的整个生命周期只会执行一次。

  (5)执行jspService()方法处理客户端的请求。对于每一个请求,JSP容器都会创建一个新的线程处理它。如果多个客户端同时请求该JSP文件,则JSP容器会创建多个线程,使每一个客户端请求都对应一个线程。

  (6)如果JSP文件被修改了,则服务器将根据设置决定是否对该文件重新进行编译,如果需要重新编译,则使用重新编译后的结果取代内存中的Servlet,并继续上述处理过程。需要注意的是,虽然JSP效率很高,但在第一次调用时往往需要转换和编译,所以会产生一些轻微的延迟。

  (7)如果系统出现资源不足等问题,JSP容器可能会以某种不确定的方式将Servlet从内存中移除,发生这种情况时,首先会调用jspDestroy()方法,然后Servlet实例会被作为垃圾进行处理。

  (8)当请求处理完成后,响应对象由JSP容器接收,并将HTML格式的响应信息送回客户端。

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

C1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Insert title here</title></head><body> This is my first JSP <% out.print("你好啊C1"); %></body></html>

当我们通过浏览器(http://localhost:8080/day11_01_jsp(项目名称)/C1.jsp)访问C1.jsp时,服务器首先将C1.jsp翻译成一个C1_jsp.class,在Tomcat服务器的work\Catalina\localhost\项目名\org\apache\jsp目录下可以看到C1_jsp.class的源代码。(1.jsp翻译成_1_jsp.class)

C1_jap.java的代码:

/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/7.0.52 * Generated at: 2018-10-05 08:32:50 UTC * Note: The last modified time of this file was set to * the last modified time of the source file after * generation to assist with modification tracking. */package org.apache.jsp;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;public final class C1_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private javax.el.ExpressionFactory _el_expressionfactory; private org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; } public void _jspInit() { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } public void _jspDestroy() { } public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.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\n"); out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n"); out.write("<html>\r\n"); out.write("<head>\r\n"); out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\r\n"); out.write("<title>Insert title here</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); out.write("\tThis is my first JSP \r\n"); out.write("\t"); out.print("你好啊C1"); out.write("\r\n"); out.write("</body>\r\n"); out.write("</html>"); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.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); else throw new ServletException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } }}

  我们可以看到,C1_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 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 { private static final long serialVersionUID = 1L; protected HttpJspBase() { } @Override public final void init(ServletConfig config) throws ServletException { super.init(config); jspInit(); _jspInit(); } @Override public String getServletInfo() { return Localizer.getMessage("jsp.engine.info"); } @Override public final void destroy() { jspDestroy(); _jspDestroy(); } /** * Entry point into service. */ @Override public final void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { _jspService(request, response); } @Override public void jspInit() { } public void _jspInit() { } @Override public void jspDestroy() { } protected void _jspDestroy() { } @Override public abstract void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;}

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

2.JSP的基本语法

2.1 JSP模板元素

  网页的静态内容。如:HTML标签和文本。

2.2 JSP脚本元素

(1)JSP Scriptlets(脚本片断)用于在JSP页面中编写多行Java代码。语法:

<% java代码(变量、方法、表达式等 )%>

<% int sum=0;//声明变量 /*编写语句*/ for (int i=1;i<=100;i++){ sum+=i; } out.println("<h1>Sum="+sum+"</h1>");%>

JSP脚本片断中只能出现java代码,不能出现其它模板元素, JSP引擎在翻译JSP页面中,会将JSP脚本片断中的Java代码将被原封不动地放到Servlet的_jspService方法中。JSP脚本片断中的Java代码必须严格遵循Java语法,例如,每执行语句后面必须用分号(;)结束。在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。如:out.println(x);单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句。

<% for (int i=1; i<5; i++) {%> <H1>http://localhost:8080/JavaWeb_Jsp_Study_20140603/</H1><% }%>

(2)JSP声明

  JSP页面中编写的所有代码,默认会翻译到Servlet的service方法中,而JSP声明中的java代码会被翻译到_jspService方法外面。

<%! java代码:定义变量或者方法%>

  多个静态代码块、变量和方法可以定义在一个JSP文件中,也可以分别单独定义在多个JSP声明中。

  JSP隐式对象的作用范围仅限于Servlet的_japService方法。所以在JSP声明中不能使用这些隐式对象。

JSP声明案例:

<%!static { System.out.println("loading Servlet!");}private int globalVar = 0;public void jspInit(){ System.out.println("initializing jsp!");}%><%!public void jspDestroy(){ System.out.println("destroying jsp!");}%>

(3)JSP 表达式

  JSP脚本表达式(expression)用于将程序数据输出到客户端,他将要输出的变量或者表达式直接封装在以<%= %>标记中,语法为:

<%=expression%>

举例:输出当前系统时间:

<%= new java.util.Date() %>

  JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(...)将数据输给客户端。

  JSP脚本表达式的变量或者表达式后不能有分号(;)。

3.JSP注释

  (1)显式注释:直接使用HTML风格的注释:<!- - 注释内容- -> 特点:不安全,费流量;HTML的注释在浏览器中查看源文件的时候是可以看得到的

  (2)隐式注释:直接使用JAVA的注释://、/*……*/

 JSP自己的注释:<%- - 注释内容- -%> 特点:安全,省流量

JAVA注释和JSP注释在浏览器中查看源文件时是看不到注释的内容的

<!--这个注释可以看见--><% //JAVA中的单行注释 /* JAVA中的多行注释 */%><%--JSP自己的注释--%>

参考:

https://www.zgxue.com/article/191459.htm

https://www.zgxue.com/article/191453.htm

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

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


  • 本文相关:
  • jsp实现将动态网页转换成静态页面的方法
  • jsp动态网页开发原理详解
  • 【算法】扑克发牌算法实现
  • jsp生成页面验证码的方法[附代码]
  • 深入浅析jsp中 out.print 和 out.write 的区别
  • 用jsp编写文件上传
  • jsp过滤器防止xss漏洞的实现方法(分享)
  • jsp播放视频文件的方法总结
  • jsp实现购物程序
  • 使用jsp制作一个超简单的网页计算器的实例分享
  • jsp页面中两种方法显示当前时间的简单实例
  • jsp经典学习笔记(包含各种入门常用语法)
  • servlet可以实现动态网页的开发,为什么还要JSP技术呢?
  • servlet可以实现动态网页的开发,为什么还需要jsp技术?
  • servlet可以实现动态网页的开发为什么还用jsp技术
  • 1、如果做动态网站的开发,以下()可以作为服务器端脚本语言 A、 HTML B、 JSP C、 JavaScript D、 Java
  • 开发动态网页时,什么时候用jsp什么时候用javascript,两者功能一样吗?
  • html是做静态网页的,JSP是做动态网页的,我想知道两者在语法上或者其他方面还有没有什么关系
  • 什么是jsp动态网页
  • ASP动态网页与JSP动态网页有什么区别?!
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全javascriptasp.netphp编程ajax相关正则表达式asp编程jsp编程编程10000问css/htmlflex脚本加解密web2.0xml/rss网页编辑器相关技巧安全相关网页播放器其它综合dart首页https://www.jb51.net/article/191459.htmjsp实现将动态网页转换成静态页面的方法jsp动态网页开发原理详解【算法】扑克发牌算法实现jsp生成页面验证码的方法[附代码]深入浅析jsp中 out.print 和 out.write 的区别用jsp编写文件上传jsp过滤器防止xss漏洞的实现方法(分享)jsp播放视频文件的方法总结jsp实现购物程序使用jsp制作一个超简单的网页计算器的实例分享jsp页面中两种方法显示当前时间的简单实例jsp经典学习笔记(包含各种入门常用语法)jsp el表达式详细介绍jsp下页面跳转的几种方法小结jsp生成页面验证码的方法[附代码在jsp页面如何获得url参数spring mvc 框架搭建配置方法及详jsp web.xml文件的作用及基本配置jsp自定义标签taglib实现过程重点servlet+jsp实现图片或文件的上传将html页改成jsp的两种方式jsp 连接mysql配置与使用jsp中隐式对象用法实例spring mvc实现restful返回xml格式数据实解决中文乱码的几种解决方法(推荐)struts2的select标签用法实例分析jsp入门教程之客户端验证、常用输出方式及用连接池提高servlet访问数据库的效率(1)使用jsp:include控制动态内容的方法jsp中select的onchange事件用法实例jsp动态网页开发原理详解jsp中param动作的实例详解
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved