JSP概述
* JSP不需要web.xml配置
** JSP是一种servlet
JSP和HttpServlet都是servlet,但是通常说的Servlet都默认是HttpServle


HttpServlet是先编译为class文件,再部署在服务器
JSP先部署上去,后在服务器内编译。(第一次请求的时候编译出来,往后直接使用该编译出来的class文件)
JSP生命周期

和servlet一样,有初始化和销毁,此外调用方法也可以有_jspInit()和_jspDestroy()
JSP语法
JSP语法,分为HTML和Java两部分
JSP元素和模板数据


JSP脚本必须要使用<% %>括起来,否则被视为模板数据;中间部分必须遵循Java语法,否则发生编译错误。
JSP输出


JSP注释

java:// and /* */ JSP: <%-- --%>
JSP方法和声明

<%! %> 中声明变量和方法,注意叹号!
JSP中的if语句


JSP中的for/while语句

JSP中的return/break

带参数param=return时,程序会执行return语句,因此其后的html都不会显示出来。
break和return差不多,但是return是直接返回,break是跳出一个代码块(for,while或switch)
JSP指令
用<%@ directive %>来包含,directive位置可以取值为page、taglib、include
page指令

无论在哪个page指令里的属性,任何page允许的属性都只能出现一次(import除外),否则会编译错误

import、autoFlush、session、errorPage、info、contenType、trimDirectiveWhitespaces等都很常用

trimDirectiveWhitespaces="false"能够让输出有空白格,可是对html来说都是一样的。
include

include指令实现
<%@ include file="head.jsp" %>
include行为实现
<jsp:include page="foot.jsp"></jsp:include>

taglib指令

JSP行为
“包含”行为
<jsp:include flush="true" page="/head.jsp"></jsp:include>
<!-- page属性:是必须的,被包含的文件所在路径 -->
<!-- flush属性:读入被保存文件内容前,是否清空缓存 -->
需要区别的是,include指令和include行为执行的时刻,前者是编译时包含的,包含的是源代码;后者是运行时才包含的,而且只包含运行结果。
* 采用forward来包含的:request.getRequestDispatcher("relativeURI").forward(request,response);
“使用bean”行为

public class Person{
private String name;
private int age;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
}

id:java bean的名称(可以和类名不同),class:java bean的类名(URI),scope:java bean的可用范围

合理地使用作用域(page、request、session、application),可以很轻松实现丰富的效果。
”转向“行为
<jsp:forward page="/somepage.jsp">
<jsp:param name="param1" value="value1"/>
<jsp:param name="param2" value="value2"/>
</jsp:forward>
相当于是把dispatcher的forward方法封装了,只需要jsp标签就可以实现跳转页面的功能。还能捎带指定参数。
”JSP指令“行为

JSP隐藏对象

记住了,out\request\response\config\session\application\page\pageContext\exception
out输出流


request请求对象

ServletRequest直接可以拿来用
response相应对象

Config配置对象

Session会话对象

Session再服务端保存用户数据,Cookie在客户端保存用户信息
application应用程序对象

关于web应用程序的所有信息,因此在context上下文中取得
page页面对象

this,即当前jsp页面
pageContext页面上下文对象

context代表一些全局的属性,代表jsp编译后的内容,能够获取很多页面内部的属性和之前提到的隐藏对象
exception异常对象

就是用来处理异常的机制。但实际上经常失效。
JSP配置
虽然JSP文件不必像Servlet一样在web.xml中配置,但是要配置也是可以的。
<jsp-file>标签

和servlet基本一样,把servlet-class换成jsp-file即可。如果有init-param,在JSP中使用隐藏对象config的getInitParameter(String name)获取
<jsp-config>标签
![]()

EL表达式

用${}括起来的,只能出现在html代码中。
* 目的是为了简化短的JSP脚本(scriptlet)<% %>代码的书写
<jsp:useBean id="person" class="Person"></jsp:useBean> <!-- 先用useBean行为将Person对象放到request(如request没有,session找)中,再用EL表达式读取该对象 -->
Welcome, ${person}. <!-- 相当于request.getAttribute("person"); -->
Your name is ${person.name},
your age is ${person.age} <!-- 相当于person.getAge(); 或者 <jsp:getProperty name="person" property="age"/> -->
EL读隐藏对象

用EL表达式可以像访问Bean一样访问隐藏对象的各种参数


标识符(前缀)表明了EL表达式读取对象的范围。不带前缀的查找会先在request中查找,再到session中查找。
EL表达式的运算
![]()
![]()
基本的运算符,除法div、取余mod比较特别
注意英文缩写也能成立,gt/lt/eq/ne/ge/le

一些并列运算的连接符,字符比较时,EL表达式会调用int compare(char ss)来判断

可以对数组取值,以及一个新的方法empty来判断"is empty?"
小结
JSP是简化的Servlet,最总也会被编译成servlet。JSP中java代码和html代码放在一起,能够方便地输出html。
JSP中能生面个变量和方法,初始化时调用_jspInit(),销毁时调用_jspDestroy()。JSP种内置out、request、response、session等常用隐藏对象。
JSP=>html,Servlet=>java
JSP=>显示结果,Servlet=>处理业务逻辑



 JSP&spm=1001.2101.3001.5002&articleId=100780069&d=1&t=3&u=12b28084cb9a45419539167f6a4ca826)

被折叠的 条评论
为什么被折叠?



