`
superzhouych
  • 浏览: 22913 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

SCWCD之路——JSP技术

阅读更多

JSP介绍

 

        JSP是一种动态的服务器端语言,其页面由HTML代码和嵌入其中的Java代码组成,服务器在页面被客户端请求后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。

 

 

JSP的语法介绍

 

        一个典型的JSP页面主要有5种元素,分别是:

        1)模板元素:模板元素是指在JSP页面中的静态HTML(或XHTML等)内容,一般JSP的开发人员不怎么关心,主要由美工负责。

        2)脚本元素:脚本元素的内容主要是Java代码,由声明、表达式和脚本(Scriptlets)组成。

        3)指令元素:指令元素在编译期起作用,主要用来提供全局信息,如设置全局变量、声明类和要实现的方法等,它们不会向客户端输出任何东西,所有的指令都在JSP整个文件范围内有效,主要有page指令、include指令和taglib指令。

        4)动作元素:动作元素在运行期起作用,在JSP规范里定义了一系列的标准动作,这些动作都用jsp作为前缀,当然程序员也可以开发自己的动作元素。在考试中常考的动作元素主要有<jsp:param>、<jsp:include>、<jsp:setProperty>和<jsp:useBean>。

        5)注释元素:在JSP中注释分为HTML注释、隐藏注释和Java脚本中的注释,其中HTML注释使用<!--注释-->的形式,而隐藏注释使用<%--注释--%>,并且隐藏注释将不会发送给客户。

 

 

JSP的内建对象

 

        JSP的内建对象也是考试中经常考查的内容,需要提醒的是必须注意每个内建对象所对应的Servlet类(如request对应javax.servlet.ServletRequest接口),并且注意每个对象的作用域。关于这部分的内容教程很多,这里不再赘述。

 

 

JSP的生命周期

 

        JSP的生命周期与Servlet的生命周期息息相关,因为JSP会在第一次执行的时候转译成Servlet的Java代码,然后再编译为class文件,Servlet的声明周期有5个,而JSP则有7个,分别是:

        1)转换:将JSP源文件转换成Servlet源代码。

        2)编译:将Servlet源代码编译成类文件。

        3)装载:将类文件装载到服务器中。

        4)创建:创建一个Servlet类的实例。

        5)初始化:调用jspInit()方法,最终调用Servlet类的init()方法。

        6)服务:调用_jspService()方法,最终调用Servlet类的service()方法,将请求传递给相应的doXXX()方法处理。

        7)销毁:调用jspDestroy()方法,最终调用Servlet类的destroy()方法,销毁对象。

        注:jspInit()方法和jspDestroy()方法定义在javax.servlet.jsp.JspPage接口中,而_jspService()方法则定义在javax.servlet.jsp.HttpJspPage接口中。

 

 

JSP的编译原理

 

        JSP在第一次执行的时候会自动被转译,然后这个JSP就驻留在内存当中。Servlet容器把JSP转译成Servlet后自动编译该Servlet,不需要程序员手动去编译。如果使用的Servlet容器是Tomcat,可以到其安装目录下的work/Catalina/localhost下找到相应的项目文件夹来查看被转译成的Servlet源文件。比如下面是一个简单的JSP页面

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
        <title>JSP Page</title>
    </head>
    <body>
    </body>
</html>

        将会被Servlet容器转换成如下的Java源文件

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

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");
      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("\n");
      out.write("\n");
      out.write("<html>\n");
      out.write("    <head>\n");
      out.write("        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\">\n");
      out.write("        <title>JSP Page</title>\n");
      out.write("    </head>\n");
      out.write("    <body>\n");
      out.write("    </body>\n");
      out.write("</html>\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);
    }
  }
}

        这里提示几个要点

        1)每个类文件必须继承HttpJspBase类,HttpJspBase类继承了HttpJspPage接口,所以它也拥有jspInit()、_service()和jspDestroy()方法,并且注意HttpJspBase类中的_jspService()方法声明为abstract,不允许重写,但是service()方法则可以,但是不推荐。如果想了解更多可以查看Tomcat提供的JavaDoc文档和源代码。

        2)_jspInit()方法是JSP初始化时调用的方法,可以在JSP页面中重写该方法,并提供一些初始化工作。

        3)_jspDestroy()方法是销毁时调用的方法,可以重写。

        4)_jspService()方法是JSP处理客户请求的方法,该方法由Servlet容器自动定义,不能在JSP页面中重写该方法。

        5)JSP页面中的<%!%>被直接转译成成员变量和成员函数。

        6)JSP页面中的<%%>被直接转译成Java代码并放到_jspService()方法中。

        7)JSP页面中的<%@page%>被转译成一条条的response.setContentType()方法。

        ……

 

 

JSP文档

 

        在JSP规范中定义了两种语法编写JSP页面,一种是标准的JSP语法格式,大多数的资料介绍的也是这种语法格式;另一种是XML语法格式。使用标准语法的JSP文件叫做JSP页面,使用XML语法的JSP文件叫做JSP文档。JSP页面的后缀名是jsp,而JSP文档的后缀名是jspx。下面给出一个JSP文档的例子

<?xml version="1.0" encoding="UTF-8"?>

<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
    <jsp:directive.page contentType="text/html" pageEncoding="UTF-8"/>
    <!-- any content can be specified here, e.g.: -->
    <jsp:element name="text">
        <jsp:attribute name="lang">EN</jsp:attribute>
        <jsp:body>Hello World!</jsp:body>
    </jsp:element>
</jsp:root>

        使用JSP文档一定要遵照XML格式良好的定义,由于JSP文档是由容器解释运行的,所以容器会检查JSP文档的格式,一旦出错则报告。使用前需要向容器表明这是一个JSP文档,方法有三种:

        1)在web.xml中使用<jsp-property-group>元素的子元素<is-xml>来表明。

        2)如果web.xml文件遵循Servlet 2.4规范,那么容器会自动将后缀名jspx的文件看成JSP文档。

        3)如果JSP页面的元素是<jsp:root>,那么该文件就是JSP文档。

        JSP文档使用XML名称空间来标识标准的指令、脚本、动作元素和自定义的动作元素。JSP规范中定义的标准动作元素在"http://java.sun.com/JSP/Page"名称空间中,如:

        <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">

        如果想使用JSTL,则必须声明如下:

        <jsp:root xmlns:c="http://java.sun.com/jsp/jstl/core" version="2.0">

        有一点需要注意的是在JSP文档中允许使用的指令元素只有page和include,taglib是不允许使用的,考试中经常会出现,如:

        <jsp.directive.page language="java">和<jsp.directive.include file="">

        并且在JSP文档中的注释只能采用HTML类型的注释,尽管这可能会在客户端暴露代码的实现细节问题。

0
0
分享到:
评论

相关推荐

    MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost时间序列预测(含模型描述及示例代码)

    内容概要:本文档详细介绍了基于 MATLAB 实现的 LSTM-AdaBoost 时间序列预测模型,涵盖项目背景、目标、挑战、特点、应用领域以及模型架构和代码示例。随着大数据和AI的发展,时间序列预测变得至关重要。传统方法如 ARIMA 在复杂非线性序列中表现欠佳,因此引入了 LSTM 来捕捉长期依赖性。但 LSTM 存在易陷局部最优、对噪声鲁棒性差的问题,故加入 AdaBoost 提高模型准确性和鲁棒性。两者结合能更好应对非线性和长期依赖的数据,提供更稳定的预测。项目还展示了如何在 MATLAB 中具体实现模型的各个环节。 适用人群:对时间序列预测感兴趣的开发者、研究人员及学生,特别是有一定 MATLAB 编程经验和熟悉深度学习或机器学习基础知识的人群。 使用场景及目标:①适用于金融市场价格预测、气象预报、工业生产故障检测等多种需要时间序列分析的场合;②帮助使用者理解并掌握将LSTM与AdaBoost结合的实现细节及其在提高预测精度和抗噪方面的优势。 其他说明:尽管该模型有诸多优点,但仍存在训练时间长、计算成本高等挑战。文中提及通过优化数据预处理、调整超参数等方式改进性能。同时给出了完整的MATLAB代码实现,便于学习与复现。

    palkert_3ck_01_0918.pdf

    palkert_3ck_01_0918

    pepeljugoski_01_1106.pdf

    pepeljugoski_01_1106

    tatah_01_1107.pdf

    tatah_01_1107

    [AB PLC例程源码][MMS_046393]Motor Speed Reference.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    基于51的步进电机控制系统20250302

    题目:基于单片机的步进电机控制系统 模块: 主控:AT89C52RC 步进电机(ULN2003驱动) 按键(3个) 蓝牙(虚拟终端模拟) 功能: 1、可以通过蓝牙远程控制步进电机转动 2、可以通过按键实现手动与自动控制模式切换。 3、自动模式下,步进电机正转一圈,反转一圈,循环 4、手动模式下可以通过按键控制步进电机转动(顺时针和逆时针)

    [AB PLC例程源码][MMS_041234]Logix Fault Handler.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_042348]Using an Ultra3000 as an Indexer on DeviceNet with a CompactLogix.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    智慧校园平台建设全流程详解:从需求到持续优化

    内容概要:本文详细介绍了建设智慧校园平台所需的六个关键步骤。首先通过需求分析深入了解并确定校方和使用者的具体需求;其次是规划设计阶段,依据所得需求制定全面的建设方案。再者是对现有系统的整合——系统集成,确保新旧平台之间的互操作性和数据一致性。培训支持帮助全校教职工和学生快速熟悉新平台,提高效率。实施试点确保系统逐步稳定部署。最后,强调持续改进的重要性,以适应技术和环境变化。通过这一系列有序的工作,可以使智慧校园建设更为科学高效,减少失败风险。 适用人群:教育领域的决策者和技术人员,包括负责信息化建设和运维的团队成员。 使用场景及目标:用于指导高校和其他各级各类学校规划和发展自身的数字校园生态链;目的是建立更加便捷高效的现代化管理模式和服务机制。 其他说明:智慧校园不仅仅是简单的IT设施升级或软件安装,它涉及到全校范围内的流程再造和创新改革。

    AI淘金实战手册:100+高收益变现案例解析

    该文档系统梳理了人工智能技术在商业场景中的落地路径,聚焦内容生产、电商运营、智能客服、数据分析等12个高潜力领域,提炼出100个可操作性变现模型。内容涵盖AI工具开发、API服务收费、垂直场景解决方案、数据增值服务等多元商业模式,每个思路均配备应用场景拆解、技术实现路径及收益测算框架。重点呈现低代码工具应用、现有平台流量复用、细分领域自动化改造三类轻量化启动方案,为创业者提供从技术选型到盈利闭环的全流程参考。

    palkert_3ck_02_0719.pdf

    palkert_3ck_02_0719

    2006-2023年 地级市-克鲁格曼专业化指数.zip

    克鲁格曼专业化指数,最初是由Krugman于1991年提出,用于反映地区间产业结构的差异,也被用来衡量两个地区间的专业化水平,因而又称地区间专业化指数。该指数的计算公式及其含义可以因应用背景和具体需求的不同而有所调整,但核心都是衡量地区间的产业结构差异或专业化程度。 指标 年份、城市、第一产业人数(first_industry1)、第二产业人数(second_industry1)、第三产业人数(third_industry1)、专业化指数(ksi)。

    [AB PLC例程源码][MMS_046305]R2FX.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    精品推荐-通信技术LTE干货资料合集(19份).zip

    精品推荐,通信技术LTE干货资料合集,19份。 LTE PCI网络规划工具.xlsx LTE-S1切换占比专题优化分析报告.docx LTE_TDD问题定位指导书-吞吐量篇.docx LTE三大常见指标优化指导书.xlsx LTE互操作邻区配置核查原则.docx LTE信令流程详解指导书.docx LTE切换问题定位指导一(定位思路和问题现象).docx LTE劣化小区优化指导手册.docx LTE容量优化高负荷小区优化指导书.docx LTE小区搜索过程学习.docx LTE小区级与邻区级切换参数说明.docx LTE差小区处理思路和步骤.docx LTE干扰日常分析介绍.docx LTE异频同频切换.docx LTE弱覆盖问题分析与优化.docx LTE网优电话面试问题-应答技巧.docx LTE网络切换优化.docx LTE高负荷小区容量优化指导书.docx LTE高铁优化之多频组网优化提升“用户感知,网络价值”.docx

    matlab程序代码项目案例:matlab程序代码项目案例matlab中Toolbox中带有的模型预测工具箱.zip

    matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    pepeljugoski_01_0508.pdf

    pepeljugoski_01_0508

    szczepanek_01_0308.pdf

    szczepanek_01_0308

    oif2007.384.01_IEEE.pdf

    oif2007.384.01_IEEE

    stone_3ck_01_0119.pdf

    stone_3ck_01_0119

    oganessyan_01_1107.pdf

    oganessyan_01_1107

Global site tag (gtag.js) - Google Analytics