当前位置: 首页 > 编程日记 > 正文

JavaWeb基础—JSP

一、什么是JSP

JSP 全称是 Java Server Pages,是一种开发动态web资源的技术

  在原HTML上添加JAVA脚本(灵魂工程师,为页面添加灵魂),可以说 jsp = html + java代码 +jsp标签

二、JSP的原理

 JSP基本原理:
  JSP本身是一个特殊的Servlet(类,即万物皆对象)
  JSP第一次被访问时,服务器会编译成JAVA文件(这个JAVA其实是Servlet类)
  然后创建对象
  调用对象的service()方法
  (第一次惩罚,第一次会慢一点)
  在tomcat的work的的对应jsp的.java文件(out.write(),java代码原封不动

  JSP的真身实际上是 Servlet,我们访问 index.jsp 时,实际上是访问它的真身 index_jsp 这个 Servlet

  并且是通过_jspService()这个方法处理请求,这个方法中放了 html 和 java 代码,所有java代码原样翻译过来,

   html 代码使用out.write("<标签>"\r\n)向页面输出给浏览器

  简单的流程可以概述为

  找到.jsp文件 ——> 转换为 .java文件 ——> 编译为 .class文件 ——> 服务器执行之

  若是第二次访问则直接找.class文件即可,若是进行了修改,则需要重新编译

三、基本语法

  HTML代码称之为模板元素,也就是网页的骨架和布局

 jsp3种java脚本

    <%...%>【尽量不要使用】
      JAVA代码片段(方法内可以写的它都可以写,例如调用方法等,但不能定义方法)
      一个代码段中声明的变量,其它片段可以用
    <%=...%>(out.print())
      JAVA表达式 (常用于输出)response.writer.print()里面能放的,他都能放。注意不能输出多个,即不能有分号
    <%!...%>
      声明(作了解) 基本不用,但会被考虑到(类体中可以放什么,这里就可以放什么)

jsp的注释

<%-- --%>(编译成java文件时自动忽略.java .class都没有,客户端看不见)  ——jsp的注释
    <!-- -->(HTML的注释,右键查看源代码可以看到)——HTML的注释
    // /**/ java的注释,此注释也是隐式的 ——JAVA的注释

四、JSP指令

  JSP指令(derictive)是用来告知引擎如何执行处理页面的

JSP三大指令:

   1.page指令:最复杂,可以存在任意个指令

   2.include指令:静态包含

   3.taglib指令:导入标签库

  指令的格式:<%@ 指令 key="value" %>

  一、page指令:一般放在第一行,定义了整个页面的属性

常用属性:
            pageEncoding:指定当前jsp页面编码,在服务器要把JSP编译成.java时用到
            contentType:相当于添加响应头:两人关系出现一个另外一个也相同。同时没有默认ISO
            import:用来导包的,可以出现多次
            errorPage和isErrorPage

如果没有设置isErrorPage="true",那么在jsp页面中是无法使用exception对象的
              前者:页面出错要转到哪个页面去
              后者:当前页面处理错误页面(500)
              <!-- 默认的错误处理页面 -->

      例如:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

        可以在web.xml中为整个项目配置

 <error-page>  <error-code>403</error-code>  <location>/403.html</location>  </error-page>  <error-page>  <error-code>404</error-code>  <location>/404.html</location>  </error-page>  <!-- 仅仅在调试的时候注视掉,在正式部署的时候不能注释 -->  <!-- 这样配置也是可以的,表示发生500错误的时候,转到500.jsp页面处理。 -->  <error-page>   <error-code>500</error-code>   <location>/500.html</location>   </error-page>   <!-- 这样的配置表示如果jsp页面或者servlet发生java.lang.Exception类型(当然包含子类)的异常就会转到500.jsp页面处理。 -->  <error-page>   <exception-type>java.lang.Exception</exception-type>   <location>/500.jsp</location>   </error-page>   <error-page>   <exception-type>java.lang.Throwable</exception-type>   <location>/500.jsp</location>   </error-page>  <!--   当error-code和exception-type都配置时,exception-type配置的页面优先级高  及出现500错误,发生异常Exception时会跳转到500.jsp  -->  

  二、include指令

    两种形式:

1.@include 静态包含

          与转发的包含类似{时间点不同} <%@include file="" %>,在生成.java时就包含了
          两页面合体了。作用主要是页面分解,将变量分离。以及实现可重用。建议包含的文件拓展名为 .jspf

       2.<jsp:inlcude> 动态包含

          先处理结果后包含,推荐的方式: <jsp:include page="top.jsp"></jsp:include>

  三、taglib指令 

 两个属性:prefix:指定本页面标签前缀 <pre:text>指定了前缀
      uri:指定标签库位置

      例如:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

五、JSP九大内置对象

  九大内置对象由JSP引擎负责创建于传递(在调用相应的_jspServlet时)

    九大内置详细对象见下表:

request请求对象 类型 javax.servlet.ServletRequest作用域 Request
response响应对象 类型 javax.servlet.SrvletResponse作用域 Page
pageContext页面上下文对象(1顶9) 类型 javax.servlet.jsp.PageContext作用域 Page
session会话对象 类型 javax.servlet.http.HttpSession作用域 Session
application应用程序对象 类型 javax.servlet.ServletContext作用域 Application
out输出对象 类型 javax.servlet.jsp.JspWriter作用域 Page
config配置对象 类型 javax.servlet.ServletConfig作用域 Page
page 页面对象(this) 类型 javax.lang.Object作用域 Page
exception例外对象 类型 javax.lang.Throwable作用域 Page

 

    

重点: >pageContext:1个顶9个,Servlet中有三大域对象,而JSP中有四大域对象,它就是最后一个。
        域对象它就有域对象的方法。

  • getException方法返回exception隐式对象
  • getPage方法返回page隐式对象
  • getRequest方法返回request隐式对象
  • getResponse方法返回response隐式对象
  • getServletConfig方法返回config隐式对象
  • getServletContext方法返回application隐式对象
  • getSession方法返回session隐式对象
  • getOut方法返回out隐式对象


        >ServletContext:整个应用程序
        >session:整个会话(锁定一个用户)
        >request:一个请求链中
        >pageContext:一个JSP页面(页面标签中共享数据)
        作为域对象,作为代理,获取其它内置对象,全域查找(从小到大)
        pageContext.setAttribute("aaa", "AAA", PageContext.SESSION_SCOPE);

  域对象:

  pageContext:page作用范围

    作用域仅限于当前页面对象,可以近似于理解为java的this对象,离开当前JSP页面(无论是redirect还是forward),则pageContext中的所有属性值就会丢失。

  request:

    作用域是同一个请求之内,在页面跳转时,如果通过forward方式跳转,则forward目标页面仍然可以拿到request中的属性值。如果通过redirect方式进行页面跳转,

  由于redirect相当于重新发出的请求,此种场景下,request中的属性值会丢失。

  session:例如购物车数据

    session的作用域是在一个会话的生命周期内,会话失效,则session中的数据也随之丢失。

  application:例如聊天数据

    作用域是最大的,只要服务器不停止,则application对象就一直存在,并且为所有会话所共享。

六、JSP标签(JSP动作)

JSP动作标签:
    与HTML提供的标签有本质的区别,是由服务器来解释执行。在服务器端执行
    <jsp:forward /> 转发,与servlet中转发作用类似

    例如:<jsp:forward page="/forwarddemo02.jsp"/>

    <jsp:include /> 包含,与RequestDispecher.include()类似  

    例如:<jsp:include page="/jspfragments/head.jsp"/>
    对比:
<%@include file="/jspfragments/demo.jsp"%>

    演示小案例
    <jsp:param>作为forward和include的子标签,作为传参标签。

    例如:

 <jsp:include page="/jspfragments/Inc.jsp"><jsp:param name="parm1" value="hello" /><jsp:param name="parm2" value="gacl" /></jsp:include>

转载于:https://www.cnblogs.com/jiangbei/p/6686205.html

相关文章:

react-native 常用命令

创建项目 react-native init AwesomeProject //AwesomeProject是项目名启动 Node.js web server react-native start启动android react-native run-android启动ios react-native run-ios运行特定模拟器&#xff1a;react-native run-ios --simulator "iPhone 5"

使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置

最近的项目要求写一个读写pcap文件的小程序&#xff0c;用来修改pcap中的部分信息&#xff0c;实现pcap的定制。 所以必须学会使用wireshark并能有利用WinPcap库和libpcap库进行开发。 虽然本文记录的都是windows下使用WinPcap进行开发&#xff0c;但是由于希望程序能够跨平台…

MySql忘记密码了咋办

对内 忘记密码终端修改操作&#xff1a; #停止mysql服务 sudo /opt/lampp/lampp stopmysql #参数启动mysqld sudo /opt/lampp/sbin/mysqld --skip-grant-tables #新建开一个终端&#xff08;复制会话&#xff09;进入 sudo /opt/lampp/bin/mysql -uroot #使用mysql权限&…

html资源文件记载进度条,用进度条显示文件读取进度《 HTML5:文件 API 》

在这个文档里&#xff0c;我添加了一个 标签 .. 上面定义了一个 ID 是 eventstatus … 我们可以把进度条放在这个容器里面 … 先找到用来显示进度条的容器 …// 找到显示事件状态的容器var eventStatus document.getElementById("eventstatus");然后再去创建进度条需…

JS中根据某个值进行大小排序

//从大到小排序 function compareBigToSmall(property){return function(a,b){var value1 a[property];var value2 b[property];return value2 - value1;} }; //从小到大排序 function compareSmallToBig(property){return function(a,b){var value1 a[property];var value…

react native 常用学习或查资料网址

react-native facebook官网&#xff1a;http://facebook.github.io/react-native/ 中文网&#xff1a;http://reactnative.cn/ react 官网地址&#xff1a;http://facebook.github.io/react/ Github地址&#xff1a;https://github.com/facebook/react 阮一峰教程&#xff1a…

使用WinPcap和libpcap类库读写pcap文件(002)PCAP文件格式

本文基本翻译自https://wiki.wireshark.org/Development/LibpcapFileFormat&#xff0c;主要分析pcap文件的格式。 其中一些字段可能和现在的WinPcap类库里的字段不同&#xff0c;请结合当前WinPcap库分析。 libpcap文件格式 libpcap文件格式是TcpDump/WinDump&#xff0c;Wir…

图论-最短路径--3、SPFA算法O(kE)

SPFA算法O(kE) 主要思想是&#xff1a; 初始时将起点加入队列。每次从队列中取出一个元素&#xff0c;并对所有与它相邻的点进行修改&#xff0c;若某个相邻的点修改成功&#xff0c;则将其入队。直到队列为空时算法结束。 这个算法&#xff0c;简单的说就是队列优化的bellman-…

如何在HHDI中进行数据质量探查并获取数据剖析报告

通过执行多种数据剖析规则&#xff0c;对目标表&#xff08;或一段SQL语句&#xff09;进行数据质量探查&#xff0c;从而得到其数据质量情况。目前支持以下几种数据剖析类型&#xff0c;分别是&#xff1a;数字值分析、值匹配检查、字符值分析、日期值分析、布尔值分析、重复值…

html5网页怎么实现内容追加,纯js实现网页内容复制后自动追加自定义内容

网页操作内容复制内容后纯js实现监听自动追加自定义内容不少网站技术或者博客上有这样的处理&#xff0c;当我们复制代码的时候&#xff0c;会自动加上一段本信息版权为XXXX&#xff0c;这是怎么实现的呢&#xff1f;其实实现的方式很简单&#xff0c;可以在我的网站页面上绑定…

ios Standard Framework和Umbrella Framework

Standard Framework&#xff1a;标准库&#xff0c;通过引用对应的header文件而不是引用master header 文件来引用类(也可以通过引用Master Header file来引用需要使用的类)&#xff0c;只需要暴露对应的header文件到Header文件夹下即可&#xff0c;不强制引用master header文件…

Win7使用Visual Studio 2010编译用于Qt4.8.6的MySQL驱动

其实编译过程在Qt Creator 的帮助文档里有&#xff0c;我就是照着做的&#xff0c;但是没成功&#xff0c;因为不能照搬照抄&#xff01; 1.确保path环境变量里有QTDIR&#xff0c;这个就不细说了。 2.打开"开始"->"Microsoft Visual Studio 2010"->…

ios 常见性能优化

1. 用ARC管理内存 2. 在正确的地方使用reuseIdentifier 3. 尽可能使Views透明 4. 避免庞大的XIB 5. 不要block主线程 6. 在Image Views中调整图片大小 7. 选择正确的Collection 8. 打开gzip压缩 9. 重用和延迟加载Views 10. Cache, Cache, 还是Cache&#xff01; 11. 权衡渲染方…

强化学习(七)时序差分离线控制算法Q-Learning

在强化学习&#xff08;六&#xff09;时序差分在线控制算法SARSA中我们讨论了时序差分的在线控制算法SARSA&#xff0c;而另一类时序差分的离线控制算法还没有讨论&#xff0c;因此本文我们关注于时序差分离线控制算法&#xff0c;主要是经典的Q-Learning算法。 Q-Learning这一…

react遇到的各种坑

标签里用到<label for>的&#xff0c;for 要写成htmlFor标签里的class要写成className组件首字母一定要大写单标签最后一定要闭合如果html里要空格转义&#xff0c; 注意不要漏了分号;style要写成style{{clear: both,backgroundColor:red,width:200px}}组件里能用<but…

html页面视频标签,html5基础标签(html5视频标签 html5新标签用法)

点评&#xff1a;html5基础&#xff0c;包括html5视频标签和html5新标签等标签用法&#xff0c;大家参考使用吧1、 声明的变化2、 指定字符编码的变化&#xff0c;html5中建议使用utf-83、 Html5中允许没有结束符&#xff0c;不算错误4、 不允许写结束标记的有&#xff1a;…

chronyd服务

一、makestep步进时间选项 最近做RHCE的实验&#xff0c;nfs用krb5p实现全程加密和身份认证&#xff0c;需要nfs服务端、客户端的时间与KDC的时间同步&#xff0c;否则kerberos分发的ticket就会失效&#xff0c;nfs不能挂载和访问。那么就需要在nfs的服务端、客户端都配置chro…

软件测试人员必备Linux命令(初、中、高级)

有些技能可以事半功倍&#xff0c;有些命运掌握在我们手中。熟练的掌握和使用这些命令可以提高工作效率&#xff0c;并且结合这些命令对测试过程中遇到的问题进行一些初步的定位。 1 目录与文件操作 1.1 ls(初级) 使用权限&#xff1a;所有人 功能 : 显示指定工作目录下之内容&…

酷派android手机怎么截屏,酷派S688怎么截屏截图?

夏普AQUOS S2事水滴全面屏&#xff0c;搭配骁龙630处理器&#xff0c;个人手里就是这货&#xff0c;目前售价千元内&#xff0c;按需求不高的人&#xff0c;可以考虑&#xff0c;不过系统不很行基于Android 7.1.1深度优化的Smile UX系统实在表现一般。~~~~根据美国FCC的认证信息…

01 多线程概念及其实现方式

多线程是编程过程里必不可少的内容&#xff0c;学习多线程&#xff0c;就先要了解进程和线程的概念。进程&#xff1a;是指当前正在运行的程序&#xff0c;是一个程序在内存里的执行区域&#xff1b;线程&#xff1a;是在进程里的一个执行控制单元&#xff0c;执行路径&#xf…

负载均衡层次分析

什么是负载均衡 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;将请求/数据【均匀】分摊到多个操作单元上执行&#xff0c;负载均衡的关键在于【均匀】。 常见的负载均衡方案 常见互联网分布式架构如上&#xff0c;分为客…

Python基础01-Python环境搭建与HelloWorld

目录 从今天开始学习Python Python环境搭建 安装gcc Python源码包安装 开始Python第一个代码HelloWorld&#xff01; 从今天开始学习Python 为啥选择Python&#xff0c;可能是跟随潮流吧。我现在不知道为什么学习Python&#xff0c;但是可能一年到一年半以后&#xff0c;…

oracle与mysql创建表时的区别

oracle创建表时&#xff0c;不支持在建表时同时增加字段注释。故采用以下方式&#xff1a; #创建表 CREATE TABLE predict_data as (id integer NOT NULL, uid varchar2(80),mid varchar2(80),time date ,conten…

在Linux上安装Memcached服务

下载并安装Memcache服务器端 服务器端主要是安装memcache服务器端. 下载&#xff1a;http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz 另外&#xff0c;Memcache用到了libevent这个库用于Socket的处理&#xff0c;所以还需要安装libevent&#xff0c;libevent的最…

图形化编程 html,用GoJS实现图形化交互编程界面示例

JavaScript语言&#xff1a;JaveScriptBabelCoffeeScript确定function init() {var $ go.GraphObject.make; //for conciseness in defining node templatesmyDiagram $(go.Diagram, "myDiagramDiv", //Diagram refers to its DIV HTML element by id{"undoMan…

枚举位移计算操作

如&#xff1a; typedef NS_ENUM(NSInteger, Test) { // 十进制 二进制 TestA 1 << 0, // 1 00001 TestB 1 << 1, // 2 …

Python基础02-Python基础

脚本的第一行 Python脚本的第一行&#xff0c;写Python解释器的路径。这样就可以直接执行Python脚本。 脚本编码 Python2需要指定脚本的编码&#xff0c;Python3不需要指定。 # -*- coding:utf8 -*- 使用input做简单的交互 username input(请输入用户名密码:) password …

SpringBoot上传文件大小限制

SpringBoot默认上传文件大小不能超过1MB&#xff0c;超过之后会报以下异常&#xff1a; org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.at org.apache.tomcat.…

html实时显示log,websocketd 实现浏览器查看服务器实时日志

操作系统CentOS7下载 websocketd安装 nc 命令yum install nmap-ncat创建监听脚本cat > cmd.sh <#!/bin/bashpkill -x ncwhile :; donc -nkl 10088sleep 1done创建 log.htmlbody{background-color: #0e1012;color: #ffffff;}*{margin: 0; padding: 0;}#msg{overflow:auto;…

git 合并两个分支的某个文件

软件开发基本都是多个feature分支并行开发&#xff0c;而在上线前有可能某个分支的开发或测试还没有完成&#xff0c;又或者是产品调整&#xff0c;取消了该分支功能的上线计划&#xff0c;我们在release前不合并该分支即可&#xff0c;然而如果该分支中的某些小调整却需要上线…