JSP简介
(图片来源:慕课网)
常见的动态网站开发技术对比
(图片来源:慕课网)
JSP页面元素简介以及page指令
JSP元素的构成
(图片来源:慕课网)
- 指令:JSP指令一共有三种,分别为:page指令、include指令、taglib指令。
- 三个指令详解:
(图片来源:慕课网)
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)+" "; } s+="<br>";//追加换行标签 } return s; } %><h1>舅舅乘法表</h1><hr><%=printMultiTable()%></body></html>效果呈现