ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

JSP篇之JSP基础语法

JSP篇之JSP基础语法

JSP简介

(图片来源:慕课网)

常见的动态网站开发技术对比


(图片来源:慕课网)

JSP页面元素简介以及page指令

JSP元素的构成


(图片来源:慕课网)

  1. 指令:JSP指令一共有三种,分别为:page指令、include指令、taglib指令。
  2. 三个指令详解:

    (图片来源:慕课网)

page指令语法

<%@page 属性1="属性值" 属性2="属性值1,属性值2"....属性n="属性值n"%>
属性描述默认值
language指JSP页面使用的脚本语言Java
import通过该属性来引用脚本语言中使用到的类文件无
contenType用来指定JSP页面所采用的编码方式text/html,ISO-8859-1

例子说明:

JSP注释

(图片来源:慕课网)

<body> <h1>真好</h1> <!-- 这是HTML注释,在客户段可见 --> <%--这是JSP注释,在客户端不可见--%> <% //单行注释 /*多行注释*/ %> </body>

运行效果

JSP脚本


(图片来源:慕课网)
下面通过out内置对象做个实验
结果如下

JSP声明


(图片来源:慕课网)
具体实例


PS:我的理解是与java中的静态static类似,写在声明中的方法和属性可以在全局中使用,而写在脚本中的方法和属性只能在代码块<%%>中使用。
至于官方一点的学说:
分别在脚本和声明中编写java语言,然后部署运行后,到apache的work文件夹下找到jsp转换为_jsp.java的文件,你会发现:
声明: 将声明的变量和方法,作为Servlet类的变量和方法。
脚本: 将代码插入到Servlet的service方法中。
所以:
声明中的变量你都可以定义private public 因为它定义的是类的变量。
脚本中因为是方法中,只能是局部变量,所以你在脚本中不能够定义方法 或者是 private public类型的变量。

JSP表达式


(图片来源:慕课网)
具体实例

效果呈现

JSP页面的生命周期

JSPservice()方法被调用来处理客户端的请求。对于每一个请求,JSP引擎创建一个新的线程来处理该请求。如果有多个客服端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可以大大降低对系统的资源需求,提高系统的并发量及相应时间。但也要注意多线程编程带来的同步问题(临界资源或者保护问题等),由于该SERvlet始终常驻于内存,所以相应的非常快的。

ps:
如果JSP文件不是第一次运行,但是操作者在JSP页面内更改或添加了某些JSP文件的代码,那么,该JSP文件会重新编译,生成最新的字节码文件,而用户下次访问的就是最新生成的字节码文件。
具体实例
首先新建一个项目

将工程发布到Tomcat上

打开Tomcat文件的work文件

啥都没有(没有接收到用户请求,没有被访问过)

之后打开网页,运行访问index.jsp,然后回到Tomcat文件中的work文件中的love,很明显,访问过的jsp会生成和jsp文件有关的一个字节码文件和将jsp文件转化成Servelt的一个源代码


jspInit()方法是一个初始化方法,只是在jsp页面第一次被请求的时候才执行这个方法点击jspInit详解

实验小项目


(图片来源:慕课网)
代码呈现

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %><!DOCTYPEHTMLPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><basehref="<%=basePath%>"><title>My JSP 'ninenine.jsp' starting page</title><metahttp-equiv="pragma"content="no-cache"><metahttp-equiv="cache-control"content="no-cache"><metahttp-equiv="expires"content="0"><metahttp-equiv="keywords"content="keyword1,keyword2,keyword3"><metahttp-equiv="description"content="This is my page"><!-- <link rel="stylesheet" type="text/css" href="styles.css"> --></head><body><%! String printMultiTable(){ String s=""; for(int i=1;i<=9;i++){ for(int j=1;j<=i;j++){ s+=i+"*"+j+"="+(i+j)+"&nbsp;&nbsp;&nbsp;&nbsp;"; } s+="<br>";//追加换行标签 } return s; } %><h1>舅舅乘法表</h1><hr><%=printMultiTable()%></body></html>

效果呈现

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进