JavaWeb之Jsp/EL(八)

JSP(Java Server Page)

 

1. jsp简单介绍

JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术

JSP这门技术的最大的特点在于,写jsp就像在写html,但:
它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据
相比servlet而言,servlet很难对数据进行排版,而jsp除了可以用java代码产生动态数据的同时,也很容易对数据进行排版

 

2. jsp应用

servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。其原因为,程序的数据通常要美化后再输出:
让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。
让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。
因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做

即Servlet不再负责显示页面,而由JSP来完成!而Servlet专注与控制层内容!

3. jsp原理

当客户请求的是JSP页面时,服务器会查看JSP对应的Servlet是否存在,如果存在,那么直接调用Servlet的service()方法来处理请求。如果不存在,那么服务器会先把JSP编译成.java,再把.java编译成.class,然后调用service()方法。当这个JSP页面,第二处理请求时,就直接调用直身的service()方法了

4. jsp代码块

<%...%>:代码片段。代码片段会原模原样的出现在真身中,不会有变动。正常的Java代码都可以在代码片段中出现;
<%=…%>:表达式。表达式会在“真身”中输出,例如:<%=a%>,对应真身中的out.print(a)
<%!...%>:声明。声明对应“真身”中的属性和方法

jsp注释
<%-- … --%>,注释中的内容会被JSP编译系统忽略!
HTML的注释:<!-- … -->,因为最终向客户端响应的内容还是HTML,所以在HTML注释中的内容还是看不到的

5. JSP隐藏(隐含、内置)对象

隐藏对象是在JSP页面中无需创建就可以直接使用的变量

Request		javax.servlet.http.HttpServletRequest
Response	javax.servlet.http.HttpServletResponse
Config		javax.servlet.ServletConfig
Page		当前Servlet实例this
session		javax.servlet.http.HttpSession
application	java.servlet.ServletContext
exception	java.lang.Throwable
Out		javax.servlet.jsp.JspWriter
pageContext	javax.servlet.jsp.PageContext

6. Jsp四大域对象

pageContext 对象是PageContext类型,本身是域对象,而且还可以操作所有域对象,还可以获取其他隐藏对象

操作所有域(四个域):
可以使用pageContext对象操作所有域对象,在getAttribute()、setAttribute()、removeAttribute()三个方法中多添加一个参数,int scope来指定范围。在PageContext类中包含四个int类型的常量表示四个范围:
REQUEST_SCOPE:request范围
SESSION_SCOPE:session范围
APPLICATION_SCOPE:application范围

7. pageContext对象获取隐藏对象

获取其他隐藏对象:可以使用pageContext获取其他隐藏对象。
JspWriter getOut():获取out隐藏对象;
ServletConfig getServletConfig():获取config隐藏对象;
Object getPage():获取page隐藏对象;
ServletRequest() getRequest():获取request隐藏对象;
ServletResponse() getResponse:获取response隐藏对象;
HttpSession getSession():获取session隐藏对象;
ServletContext getServletContext():获取application隐藏对象;
JspException getException():获取exception隐藏对象转换后的JspException对象

8. jsp指令

<%@指令名  属性名="值"  属性名="值"  %>一般都会把JSP指令放到JSP文件的最上方,但这不是必须的

JSP中有三大指令:page、include、taglib,最为常用,也最为复杂的就是page指令
注意: Tomcat编译系统会根据JSP的指令信息来编译JSP,生成Java文件。
在生成的Java文件中,不存在指令信息!


---------------page指令-->import属性---------------
	import="java.util.*,java.text.*"
	<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
	errorPage="error.jsp"
	还可以配置web.xml配error-page,如果都配置了并且能处理,那么用errorPage
	isErrorPage="false"  是一个exception开关,改为true就有
	isELIgnored="false"不会忽略EL,
	contentType="text/html; charset=UTF-8"与response.setContentType()一样
	pageEncoding="UTF-8":指明了保存和读取jsp页面时采用什么编码
	在没有contentType时,同时还有contentType的作用

	autFlush和buffer一般我们也不会去特意设置,都是保留默认值
	常用的属性:
	import pageEncoding 

---------------iweb.xml配置error页面---------------
<error-page>
	<error-code>500</error-code>
	<location>/error500.jsp</location>
</error-page>
<error-page>
	<exception-type>java.lang.Exception</exception-type>
	<location>/error.jsp</location>
</error-page>

---------------include指令---------------
include指令表示静态包含!
include指令只有一个属性:file,指定要包含的页面,例如:<%@include file=”b.jsp”%>。两个页面合并成一个文件,然后再编译成Servlet(Java文件)

**动态包含是会为两个JSP页面都生成servlet,然后1.jsp的“真身”中会调用2.jsp的“真身”的_jspService()方法而已例如1.jsp<jsp:include page="2.jsp">

---------------taglib指令---------------
JSP页面中使用第三方的标签库时,需要使用taglib指令来“导包”。例如:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
其中prefix表示标签的前缀,这个名称可以随便起。uri是由第三方标签库定义的,所以你需要知道第三方定义的uri	

13. Jsp动态标签

JSP动态标签是JSP自己的标签,不是由第三方提供的,所以使用JSP动态标签时无需使用taglib指令“导包”。
JSP动态标签的格式为:<jsp:xxx …>
无论是自定义的JSP标签,还是JSP自己的动态标签,还有第三方的标签,最终都会对应一组方法的调用

include动态标签
include标签是动态包含,与include指令不同,include标签与RequestDispatcher.include()方法的功能是相同的
用法: <jsp:include page="1/jsp"/>

forward动态标签
forward标签的作用是请求转发!forward标签的作用与RequestDispatcher.forward()方法相同
用法<jsp:forward page="1.jsp"/>

useBean、setProperty、getProperty动态标签
<jsp:userBean id="p1" class="com.itheima.domain.Person"/>
<jsp:setProperty property="*" name="p1"/>
<%=p1%>

 

EL

1. JSP2.0简介

JSP2.0要把html和css分离、要把html和javascript分离、要把Java代码块替换成标签。标签的好处是非Java人员都可以使用。
JSP2.0 – 纯标签页面,即:不包含<% … %>、<%! … %>,以及<%= … %>

2. 什么是EL?

EL(Expression Language)是一门表达式语言,它对应<%=…%>。我们知道在JSP中,表达式会被输出,所以EL表达式也会被输出
EL表达式的格式:${…},例如:${1+2}
在使用EL表达式时,要求page指令的isELIgnored属性为false。这样JSP在编译成.java时,才不会忽略EL表达式
如果你希望某个EL表达式被JSP编译器忽略,那么可以在EL表达式之前添加“\”,例如:\${1+2}

3. EL中隐藏对象

EL表达式中,无需创建就可以使用的对象称之为EL隐藏(隐含、内置)对象。在EL中一共有11个隐藏对象,它们都与Map相似

----------------操作操作对象的方式----------------
1). 操作List和数组:${list[0]}、${arr[0]};
2). 操作bean的属性:${person.name}、${person[‘name’]},对应person.getName()方法;
3). 操作Map的值:${map.key}、${map[‘key’]},对应map.get(key)

----------------隐式对象----------------
隐式对象名称		类型
pageContext		javax.servlet.jsp.PageContext	和jsp隐式对象完全一样
pageScope		java.util.Map			页面范围中的数据
requestScope		java.util.Map	
sessionScope		java.util.Map	
applicationScope	java.util.Map	
header			java.util.Map	
headerValues		java.util.Map	
param			java.util.Map	
paramValues		java.util.Map	
intiParam		java.util.Map	
cookie			java.util.Map<String,Cookie>	key:是cookie的name,value是cookie对象本身

----------------隐式对象说明----------------
1). param:param是Map<String,String>类型!param对象可以用来获取参数,与request.getParameter()方法相同
	注意,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而	不是null。这一点与使用request.getParameter()方法是不同的
2). paramValues:paramValues是Map<String, String[]>类型,当一个参数名,对应多个参数值时可以使用它
3). headerValues:headerValues是Map<String,String[]>类型。当一个请求头名称,对应多个值时,使用该对象
4). initParam:initParam是Map<String,String>类型。它对应web.xml文件中的<context-param>参数
5). cookie:cookie是Map<String,Cookie>类型,其中key是Cookie的名字,而值是Cookie对象本身

----------------操作所有域(四个域)----------------
可以使用pageContext对象操作所有域对象,
在getAttribute()、setAttribute()、removeAttribute()三个方法中
多添加一个参数,int scope来指定范围。在PageContext类中包含四个int类型的常量表示四个范围:
	REQUEST_SCOPE:request范围;
	SESSION_SCOPE:session范围;
	APPLICATION_SCOPE:application范围
示例: pageContext.setAttribute("user",user,pageContext.REQUESTSCOPE);

----------------获取其他隐藏对象----------------

可以使用pageContext获取其他隐藏对象。
JspWriter 		getOut():		获取out隐藏对象;
ServletConfig 		getServletConfig():	获取config隐藏对象;
Object 			getPage():		获取page隐藏对象;
ServletRequest 		getRequest():		获取request隐藏对象;
ServletResponse 	getResponse():		获取response隐藏对象;
HttpSession 		getSession():		获取session隐藏对象;
ServletContext 		getServletContext():	获取application隐藏对象;
JspException 		getException():	获取exception隐藏对象转换后的JspException对象
示例,如何调用: pageContext.request.contextPath

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。