Web阶段–JSP基础知识点
一、引言
1.作用
用来生成动态网页的技术,与servlet类似
2.特点
1.所有的jsp文件都必须以".jsp"为结尾,同时可以放在web应用的任意目录下(除了WEB-INF)
2.访问时,与html类似,通过文件名访问
3.jsp文件开发成功后不需要定义配置文件,修改后也不需要重启服务器
3. servlet和jsp的取舍问题
1.servlet:在大量的java代码中嵌入少量的html标签,java代码的比重比较大 --- 文件名+Action
2.jsp:在大量的html标签中嵌入少量的java代码,html标签比重大 --- 文件名+View
二. jsp的原生标签
1.分类
1.脚本元素:用来向jsp页面中嵌入纯java代码
2.指令元素:用来定义描述当前jsp页面的特征信息
3.动作元素:用来完成网页中的动作(包含,跳转forward , 对象创建 )
2.脚本元素(脚本标签)
1.表达式脚本 <%= java代码 %>
作用:用来计算表达式的结果,并且默认输出到浏览器 (唯一一个有输出功能的标签)
注意:里面的java代码不能以;结尾
2.声明脚本 <%! java代码 %>
作用: 用来定义 函数 和 变量
3.普通脚本 <% java代码 %>
作用: 用来定义一般的java代码 (尤其流程控制代码),除了不能定义函数
3.指令元素(页面指令 包含指令 标签库指令)
1.页面指令:通过属性来描述定义当前页面的信息
语法: <%@page 属性=值 属性=值%>
I.重要的页面指令属性
a.contentType:用来定义响应内容的类型以及编码------给浏览器看
<%@page contentType="text/html;charset=字节编码(GBK)" %>
b.pageEncoding:用来定义当前jsp页面的编码方式------tomcat服务器看的
c.import:等价于java代码里的import
<%@page import="包名" %>
d.isELIgnored:boolean类型属性,默认值为通常设置为false,表示当前页面支持EL技术
e.session:boolean类型属性,默认值为true,控制了jsp页面中session的创建时机
注意:true表示"饿汉式"创建session对象,false表示"懒汉式"
II.了解属性
a.errorPage:值为地址,表示如果当前页面出现异常,则跳转到属性指定的资源程序,底层采用forward方式跳转到下一个资源,所以路径使用的是"网名"
b.isErrorPage:boolean类型属性,表示当前页面是否为处理错误的页面,默认值false。isErrorPafe=true的页面里有一个可以直接使用的java对象exception
c.isThreadSafe = true 线程是否安全
d.language = "语言名称" 所使用的编程语言
2.标签库指令
<%@taglib uri=" 标签库的全球唯一标识" prefix=”简称,前缀“ %>
3.包含指令【了解】
语法: <%@include file="被包含的jsp文件的名称" %>
功能:将其他jsp页面的源代码直接包含(融入)到当前jsp页面里---jsp特有,也称为"静态包含",或者 “编译前包含” , 合并的是源代码
作用: 在jsp领域做代码复用
缺陷:只能在jsp领域代码复用,局限性比较大; 可以将需要复用的代码定义成普通的java程序,复用性更高
4.动作元素(包含,转发)
1. 包含动作 【重点】
a.语法: <jsp:include page="被包含网页资源的网名" />
b.功能: 将其他网页资源的“输出结果”包含到当前jsp页面里 --- 合并输出结果 , 也称为“动态包含”或者“编译后包含”
c.作用:做复杂网页的显示 ( 可能是由多个jsp包含完成)
2. 转发动作 【了解】
a.语法:<jsp:forward page="下一个资源的网名"/>
b.功能:与servlet里的forward完全一致( forward动作一般发生在servlet Action程序中 )
三、 Jsp的运行原理
1.html技术: 当client发出html请求后,tomcat根据请求里的文件名找到相应的html文件,将其直接发送给client浏览器,浏览器对html文件逐行解释执行,最终展示网页
注意:“html技术是一种运行在client端的技术”
2.servlet技术:当client发出servlet请求后,tomcat会根据请求里的网名找到对应程序的对象,调用service方法运行,将程序的执行结果发还给client浏览器显示(client收到的执行结果)
注意:”Servlet技术是运行在server端的技术“
3.jsp技术: 当client发出jsp请求后,tomcat会找到指定的jsp文件,将其翻译成java程序(servlet),然后按照servlet运行方式执行(client收到的执行结果)
四、JSP、Servlet里HttpSession的区别
jsp:采用"饿汉式"创建session对象,只要访问jsp页面的client,tomcat都会为其创建session
Servlet:采用"懒汉式"创建,需要client访问的程序显示调用request.getSession(true)创建
五、隐含对象(内置对象)
1. 概念
jsp页面里创建好,一直存在的,定义好名字的,可以直接使用的对象
2. 九大隐含对象
request ---- HttpServletRequest ( servlet程序中使用过的request对象)
response ---- HttpServletResponse
session ---- HttpSession ( tomcat采用饿汉式为jsp创建session对象)
application ---- ServletContext
config ---- ServletConfig (关于一个servlet的描述信息,是application的一部分)
out ---- JspWriter(等价于servlet里使用过的PrintWriter)
page ---- this
exception ---- Exception (只有isErrorPage=true的jsp页面里有 )
pageContext ---- PageContext (jsp特有的,功能最强大的隐含对象)
注意: 这些隐含对象只能在 表达式脚本 里 和 普通脚本里使用,不能在声明脚本里使用
3. 隐含对象的本质
隐含对象本质就是servlet程序service方法的局部变量,在当前页面代码翻译前,tomcat为service方法创建和初始化了这些局部变量。(声明脚本代码不属于service方法,不能使用service方法的局部变量)
4. PageContext对象
1.是一个作用域,可以存放命名属性
存数据: pageContext.setAttribute("name",value);
取数据:Object value = pageContext.getAttribute("name");
生命周期短,只在当前jsp页面中生效
作用: 用来在jsp页面 与 嵌入的其他技术(EL JSTL) 之间做数据传递
2)管理其他三个作用域里的数据
3.可以获取其他八个隐含对象
getRequest() getSession() getApplication() getResponse() getOut() ......
4.可以 include 和 forward
六、EL技术
1.使用EL技术的原因-----> 干净的jsp页面(无脚本标签 — 尽量减少)
1.声明脚本 --- 函数定义成普通java类 , 里面的变量线程不安全(不建议定义)
2.表达式脚本 ---- 输出java中的数据 (使用EL技术替换)
3.普通脚本 ---- 用来定义一般的java代码(使用JSTL替换 )
2. EL技术使用前的准备
1.使用页面指令声明当前页面支持EL技术 <%@page isELIgnored="false" %>
2.语法:${EL代码}
3.功能:计算表达式的值,并且默认输出浏览器
a.做运算
${ 1+1 } ${ 3>4 } <==> ${ 3 gt 4 } ${ empty 属性名 } ${ !empty 属性名}
注意:empty等价于null
b.可以访问请求参数并打印
语法:使用关键字param访问
${ param.请求参数名 } <---> <%= request.getParameter("name") %>
c.可以访问作用域里的命名属性
i:基础语法:使用关键字pageScope、requestScope、sessionScope、applicationScope 访问
${ xxxScope.命名属性名 }
ii:特殊的写法:${ 变量名 }---EL认为变量是一个命名属性,EL会去所有作用域里查找这个变量的value,按照生命周期由短到长的顺序查找,找到第一个返回。等价于 pageContext.findAttribute("..")
d.可以访问对象的属性
i:前提: 如果获取的 ”命名属性“ 值是一个对象,可以使用el进一步访问对象的属性
ii:语法: ${ 对象 . 属性名 }
iii:建议: 在将对象存入作用域时,命名属性的名最好与 变量(对象名)保持一致
iv:原理: el在执行时,会将给定的属性名首字母变大写,前面加get,去类里访问getXxx()
v:扩展: el访问的是类里的getXxx() , 根本不在乎是否有这个实例变量。反之如果类里的功能函数不是以get开头,则el无法访问调用
vi:特例: 在el技术里,只承认jsp页面中的pageContext隐含对象(其他八个不认识)
--- 请使用el技术调用request对象中的getContextPath()
${ pageContext.request.contextPath }
--- 请使用el技术访问并打印当前client对应的session的id值
${ pageContext.session.id }
2.EL其他标签【了解】
1. 可以访问浏览器上的cookie
语法:通过关键在cookie访问 ${ cookie.cookie的名字 } --- cookie对象
${ cookie.cookie的名字. value }
2. 可以访问配置文件中的初始化参数
语法:通过关键字initParam访问 ${ initParam.初始化参数名 }
3. 可以访问集合里或者数组中的一个元素
List<String> list ---- 请用el打印list里的第二个元素 ${ list[1] }
List<Person> list ---- 打印第二个元素的name属性值 ${ list[1]["age"]}
Map<String,Student> ---- 访问第二个元素的name属性 ${ map.key }
map.put("one",stu) --- { map.one.name } --- { map["one"]["name"]}
七、JSTL — jsp标准标签库
1. Jstl使用
1.apache组织定义的一组 ”用户自定义标签“
2.使用标签库需要引入相关当 jar包 和 配置文件
3.标签的构成: core(平常使用) fmt sql ....
4.准备: 在jsp页面中明确导入核心(core)标签库
<%@taglib uri=" http://java.sun.com/jsp/jstl/core" prefix="c" %>
2 条件判断标签
<c:if test="boolean值"> 标签体 </c:if>
如果test的值为true,则执行标签体;反之不执行。 这个标签没有对应的else
3. 循环标签----遍历集合(所有的集合 List Set Map )
1.遍历List或者Set集合
<c:forEach var="变量名" items=“${ 集合对象 }” varStatus=“循环状态变量”>
如果需要打印得到的数据,可以通过 ${ 变量名.属性名 }
</c:forEach>
注意: 在标签属性赋值的过程中,只有String,数字和boolean类型值可以直接通过字面值来赋值,其他类型的数据必须先通过EL获取值,然后再赋值
varStatus:循环状态变量,可以通过访问它的count属性,来做循环计数
${ varStatus的变量属性.count }
2.遍历Map集合
<c:forEach var="变量名" items="${Map集合对象}" varStatus="">--- 底层采用键值遍历
如果需要打印获取到的数据,可以通过 ${ 变量名.key } ${变量名.value }
</c:forEach>
4.JSTL其他标签
1. 定义变量的标签 set 【记住】
<c:set var="变量名" value=“值” scope=“作用域 page(默认)|request|session|application”/>
<c:set var="" scope=""> 值 </c:set>
2. 生成地址的标签 url 【记住】
<c:url value="资源的网名" var=“”>
<c:param name="" value=""></c:param> --- 用来向地址上拼接请求参数的
</c:url>
a.自动将给定的网名变成uri,在网名前面补齐当前应用名
b.自动检测浏览器是否支持cookie,如果发现不支持,则自动将当前网页所使用的session的id拼接到地址后面
c.利用自标签将多个请求参数拼接到地址后面
3. 重定向标签
<c:redirect url="下一个资源的网名"></c:redirect>
4. 做网页导入的标签
<c:import var="变量名" url="被导入的网页的地址"/>
功能类似于动态包含<jsp:include> , 可以导入任意网页资源
5. 输出标签
<c:out value="输出的值" escapeXml=“true|false” />
6. 移除命名属性标签
<c:remove var="命名属性名" scope="page|request|session|application"/>
注意:如果没有定义scope属性,则表示移除所有作用域里叫name的命名属性
八、MVC思想
1. 概念
在软件的设计过程中,人为的有意识的将软件的功能划分为3个层次,分别是 M(module 模型),V(view视图),C(controller 控制器)
2. MVC在现有web应用中的体现
1)V(view)---视图,显示逻辑,与用户交互的通道(表单页面--数据采集;表格页面--数据展示)
现有应用中的View程序 -- jsp 和 html
2)C(controller---控制器,控制应用请求的流程走向,现有的应用中Action程序--servlet
3)M(module)---模型层,对显示世界功能的模拟,通过一个具体的业务函数完成业务需求
现有应用中service和dao对应模型层 -- corejava jdbc
3. 好处
1.各司其职, 程序功能单一,便于多个程序员协同开发,提高开发效率
2.弱耦合 : 分层 接口 反射 配置文件