jsp详解(3个指令、6个动作、9个内置对象、11个隐式对象)
jsp概述
SP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是Servlet。 jsp=html+java
jsp包含3个指令,6个动作,9个内置对象。
html:静态内容
servlet:服务器端的小应用程序。适合编写java逻辑代码,如果编写网页内容--苦逼。
jsp:适合编写输出动态内容,但不适合编写java逻辑。
所以开发中常使用servlet做为控制器,重点是编写java逻辑;jsp作为代码显示模板,重点是显示数据。
jsp原理
浏览器在访问服务器的某个应用下的jsp文件时,服务器会把这个jsp文件翻译为java文件然后编译成class文件(字节码文件),服务器底层执行字节码文件。生成的java文件和class文件存在于tomcat目录下的work/Catalina...下的项目目录中。生成时间是浏览器访问服务器的时候。
生成的java文件继承了org.apache.jasper.runtime.HttpJspBase类。而这个HttpJspBase类继承了HttpServlet类。所以我们可以说jsp就是Servlet。
服务器怎么处理jsp文件中的标签? 服务器才不会去解读html标签!他会将标签通过out.write()方法通过http协议写给客户端。如下图所示:
服务器怎么处理java代码? 直接执行,将执行结果通过out.write()方法写给客户端。
jsp最佳实践
jsp建议少些java代码,纯业务逻辑写在jsp中会造成服务器做不必要的操作,我们可以在jsp中写入普通java代码,我们把业务逻辑一般写在Servlet中。例如:我们写一个Login小项目,需要与用户交互的表单页面我们用jsp写,业务逻辑如判断用户合法性我们用Servlet写。
有的时候我们的jsp中可以不含有任何的java代码,这样的文件是可以被html替代的。但是jsp的好处是,我们需要回显消息的时候,就需要在页面上接收回显消息,因为jsp可以写java代码的原因,就不再使用html了。
JSP基础
基本语法
jsp的脚本
小脚本的格式:
<%
//脚本内容java代码
%>
表达式格式:
<%=表达式 %>
通过对编译后的java文件分析发现,表达式脚本的底层就是<% 定义变量的语句; out.write(变量) %>
比如下面两个代码块的输出是相同的:
<% int i=10;
out.print(i);
%>
<%=i%>
等于说表达式中的值在底层就是传入print()的参数中,所以定义表达式的时候结尾是不加分号的。
声明格式:
<%! %> 表示定义全局变量和静态代码块,也可以声明方法。
成员变量我们直接在<% %>中定义即可。
<%! %>是我们用来声明全局变量、创建静态代码块、声明方法的地方。
<% %>相当于是一个方法,所以不能在这里声明方法,在这里定义的变量也是局部变量。
<%=10%>相当于是out.print(10);的作用,将表达式10发送给客户端。
jsp注释
jsp文件中包含html的结构,当然可写html注释:<!-- -->。html注释可以在客户端源码中看到,是不安全的;并且是服务器write过来的,耗流量。
jsp注释:<%-- --%> 。jsp注释不能在客户端看到,是安全的。不发送给客户端,是不耗流量的。
jsp指令(3个)
JSP指令(directive)是为JSP引擎设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
JSP2.0规范中共同定义了三个指令:page指令、include指令、taglib指令
page指令
jsp指令基本语法格式:<%@ 指令 属性名="值" %> 如果一个指令中有多个属性,那么多个指令可以写在一个指令中,也可以写在多个指令中。例如:
例如:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.Date"%>
也可以写作:
<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>
jsp2.0中规定中定义page指令的完整语法(下面给出的都是默认值):
<%@ page
[ language="java" ] 目前只支持java语言
[ extends="package.class" ] 因为是单继承,所以我们最好不要写这个指令,除非自己写的比HttpJspBase等类好!
[ import="{package.class | package.*}, ..." ] 用来导包,多包用逗号隔开
[ session=“true | false” ]//true创建session对象
[ buffer="none | 8kb | sizekb" ]
[ autoFlush="true | false" ] 是否开启自动刷新功能
[ isThreadSafe=“true | false” ] false才继承SingleThreadModel接口,线程安全问题将变量写成局部变量即可。上面方法过时了。
[ info="text" ]
[ errorPage="relative_url" ] 如果网页出现500错误,跳转到指定url
[ isErrorPage="true | false" ] 如果是true则导入execption包,我们可以使用exception对象操作错误信息
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] 告诉浏览器解码方式
contentType包含在pageEncoding中,由后者可以不写前者。
[ pageEncoding="characterSet | ISO-8859-1" ] 告诉服务器转译java文件的编码方式
[ isELIgnored="true | false" ] 是否支持EL表达式
%>
这些我们开发的时候大多只保留pageEncoding,其他取默认就行了。导包的话也是自动的。
include指令
包含,有静态包含和动态包含两种。
静态包含是把其他资源包含当当前页面中,在编译(转译)之前就包含了,所以只生成了一个java文件。例如: <%@ include file="/5.jsp" %>
转译结果bbbb...来自5.jsp文件就生成一个java文件一个class文件,java文件中有两套html标签。
动态包含,例如: <jsp:include page="/5.jsp"></jsp:include> 会生成两套java和class文件,因为执行到这句话的时候才包含。
区别:编译时间不同。
开发原则:能用动不用静。
taglib指令
用来导标签库。
作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
jsp动作(6个)
jsp动作的作用是:使用标签的形式来替代一段java代码,好处是可以让前端开发人员读懂,书写简答不带java思想。
<jsp:include > 动态包含
<jsp:forward> 请求转发
<jsp:param> 设置请求参数
<jsp:useBean> 创建一个对象
<jsp:setProperty> 给指定的对象属性赋值
<jsp:getProperty> 取出指定对象的属性值
基本语句java和jsp动作给属性中变量赋值比较
<%
Student stu = new Student();
stu.setName("tom");
out.print(stu.getName());
%>
<jsp:useBean id="stu" class="com.aloha.entity.Student"></jsp:useBean>
<jsp:setProperty property="name" name="stu" value="tom"/>
<jsp:getProperty property="name" name="stu"/>
请求转发基本语句java和jsp动作比较
<%
request.getRequestDispatcher("/7.jsp").forward(request, response);
%>
<jsp:forward page="/7.jsp"></jsp:forward>
jsp内置对象(9个)
指在JSP的<%=%> 和<% %>中可以直接使用的对象
对象名
类型
说明
request
javax.servlet.http.HttpServletRequest
response
javax.servlet.http.HttpServletResponse
session
javax.servlet.http.HttpSession
由session="true"开关
application
javax.servlet.ServletContext
exception
java.lang.Throwable
由isErrorPage="false"开关
page
java.lang.Object当前对象this
当前servlet实例
config
javax.servlet.ServletConfig
out
javax.servlet.jsp.JspWriter
字符输出流,相当于 printWriter对象
pageContext
javax.servlet.jsp.PageContext
通过这个对象可以得到其他8个对象
标红的是域对象,pageContext只在当前页面有效,所以开发时很少用。
pageContext本身也是一个域对象,他可以操作其他三个域对象,但是作用域只在当前页面有效。有三个主要方法:
void setAttribute(String name,Object o);
设置属性名,值
Object getAttribute(String name);
通过属性名获取属性值
void removeAttribute(String name);
通过属性名删除属性
这些方法在其他页面都不好使用,pageContext提供了操作其他域对象的方法:
void setAttribute(String name,Object o,int Scope);
Object getAttribute(String name,int Scope);
void removeAttribute(String name,int Scope);
scope的值在pageContext中给出了四个字段,对应四种操作方式(见名知意好吧):
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
由Servlet&Http的学习中可知,request需要请求转发建立关系。
pageContext还提供了一个自动查找,找到就取值的方法:
findAttribute(String name);
这个方法会通过名字自上而下的查找传值页面的各值setAttribute的值,匹配为null继续找下一条,直到匹配到了就得到它的值并停止查找。
四大域对象在实际开发
PageContext : pageConext 存放的数据在当前页面有效。开发时使用较少。
ServletRequest: request 存放的数据在一次请求(转发)内有效。使用非常多。
HttpSession: session 存放的数据在一次会话中有效。使用的比较多。如:存放用户的登录信息,购物车功能。
ServletContext: application 存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用。
EL表达式
全称是expression language 表达式语言,可以简化jsp中的java语言。不是一种开发语言,是jsp中获取数据的一种规范。EL表达式的容错性好,出现语法错误时只会空输出,不会导致500错误。
等效java的代码
基本表达式是:${ } 底层是java代码 pageContext.findAttribute(String name) 。
比如我们需要找User类中的name属性,有两种办法:
${u.name }
${u['name']} == ${u["name"]}
[ ]的作用条件要大于“.”的,不过“.”在大多数情况下都适用。点运算符相当于是用了get方法,点后面跟的是属性名。
运算
empty 用来判断是否为null,空字符串和空的集合都会返回null ,则表达式返回true 。
三元运算符 和java中类似,如果条件为ture执行冒号前的内容,如果条件为false则执行冒号后面的内容。
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String str1 = null;
request.setAttribute("str1", str1);
String str2 = "";
request.setAttribute("str2",str2);
String str3 = "abc";
request.setAttribute("str3", str3);
List list1 = new ArrayList();
request.setAttribute("list1", list1);
List list2 = new ArrayList();
list2.add("asdf");
request.setAttribute("list2", list2);
int sex = 0;
request.setAttribute("s", sex);
%>
${ empty str1 } ---- true<br/>
${ empty str2 } ---- true<br/>
${ empty str3 } ---- false <br/>
${ empty list1 } ---- true <br/>
${ empty list2 } ---- false<br/>
${ empty list2 ? "你还没有买商品":"你卖的商品如下" }
<input type="radio" name="sex" value="m" ${s==0 ? "checked='checked'":"" }/>男<br/>
<input type="radio" name="sex" value="f" ${s==1 ? "checked='checked'":"" }/>女<br/>
</body>
</html>
隐式对象(11个)
EL隐式对象引用名称
类型
JSP内置对象名称
说明
pageContext
javax.servlet.jsp.PageContext
pageContext
一样的
pageScope
java.util.Map<String,Object>
没有对应的
pageContext范围中存放的数据,页面范围
requestScope
java.util.Map<String,Object>
没有对应的
请求范围数据
sessionScope
java.util.Map<String,Object>
没有对应的
会话范围数据
applicationScope
java.util.Map<String,Object>
没有对应的
应用范围数据
param
java.util.Map<String,String>
没有对应的
一个请求参数
paramValues
java.util.Map<String,String[]>
没有对应的
重名请求参数
header
java.util.Map<String,String>
没有对应的
一个请求消息头
headerValues
java.util.Map<String,String[]>
没有对应的
重名请求消息头
initParam
java.util.Map<String,String>
没有对应的
web.xml中全局参数
cookie
java.util.Map<String,Cookie>
没有对应的
key:cookie对象的name值
前面已经说了,${ }的底层是pageContent.getAttribute(String name) ,那么我们现在希望使用EL表达式获取参数parameter,该怎么搞呢?
————我们使用隐式对象param获取表单中的
比如说我们需要获取userName 这个参数,那么写法为: ${param.userName } 这样的写法相当于request.getParameter(String name)。
paramValues隐式对象获取的是值对象数组,我们可以加入角标获取想要的位置元素
header可以取到消息头,比如我们要获得浏览器信息: ${header["User-agent"]}
cookie 获取cookieid的示例: ${cookie.JSESSIONID.value}
JSTL——jsp标准标签库
可以实现jsp页面中的逻辑处理功能。
在JSP页面添加taglib指令
使用JSTL标签
核心标签库:
> 通用标签: set、 out、 remove
> 条件标签:if choose
> 迭带标签:foreach
普通循环
迭带器
for(类型 变量名:数组或集合)
c:forEach中的varStatus属性。
指向一个字符串,该字符串引用一个对象。 map.put("vs",一个对象);
这个对象记录着当前遍历的元素的一些信息:
getIndex():返回索引。从0开始
getCount():返回计数。从1开始
isLast():是否是最后一个元素
isFirst():是否是第一个元素
jsp详解(3个指令、6个动作、9个内置对象、11个隐式对象)的更多相关文章
- 四大域对象,和jsp的九大隐式对象,已经el表达式的11个隐式对象
四大域对象 1.PageContext :页面范围的数据 2.ServletRequest:请求范围的数据 3.HttpSession:回话范围的数据 4.ServletContext:应用范围的数据 ...
- JavaWeb学习笔记--2.jsp指令元素、动作元素、内置对象
目录: 一.指令 1.1 page指令 :page指令有13种属性 1.2 include指令:include指令有1种属性,为file.(注意<%@ include%>和<jsp: ...
- JavaWeb学习篇之----Jsp详解
今天我们来看一下Jsp的相关知识,首先来看看一下Jsp的相关定义: 简介: JSP全称是JavaServer Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术 ...
- JSP——JavaServer Page中的隐式对象(implicit object)、指令(directive)、脚本元素(scripting element)、动作(action)、EL表达式
目录 1.JSP概述 2.注释(comment) 2.1.JSP注释 2.2.HTML注释 3.隐式对象(implicit object) 3.1.隐式对象清单 3.2.request对象 3.3.o ...
- JSP 4个域对象-9个内置对象-11个EL隐式对象
一. 四大域对象 1. PageContext :页面范围的数据 2. ServletRequest:请求范围的数据 3. HttpSession:会话范围的数据 4. ServletContext: ...
- jsp隐式对象
隐式对象使用位置 隐式对象在转译为Servlet后,是_jspService()中的局部变量.隐式对象只能在<%与%>之间,或<%=与%>之间直接使用. 无法在<%!与% ...
- 转载 《AngularJS》5个实例详解Directive(指令)机制
<AngularJS>5个实例详解Directive(指令)机制 大漠穷秋 本文整理并扩展了<AngularJS>这本书第六章里面的内容,此书近期即将由电子工业出版社出版,敬请 ...
- Java Web(五) JSP详解(四大作用域九大内置对象等)
前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编 ...
- 【转载】JSP详解(四大作用域九大内置对象等)
前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编 ...
随机推荐
- python方法参数:*和**操作符
* def test_args_kwargs(arg1, arg2, arg3): print("arg1:", arg1) print("arg2:", ar ...
- MyEclipse使用过程中的问题及对应设置的总结
1.关闭 Javaweb项目中的updating index : Window => Preferences => Myeclipse Enterprise Workbench => ...
- 数字电路的与门、或门、非门--FPGA--005
作者:young cc 链接:https://www.zhihu.com/question/23829080/answer/123791730来源:知乎著作权归作者所有,转载请联系作者获得授权. 数字 ...
- 数据挖掘:周期性分析SMCA算法
数据挖掘:周期性分析SMCA算法 原文地址:http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1423978 算法介绍 以时间顺序挖掘周期性的模式 ...
- delphi 异形窗体可半透明
unit xDrawForm; interface uses Windows, Messages, SysUtils, Classes, Controls, Forms, Menus, Graphic ...
- 使用Microsoft.Practices.Unity 依赖注入
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...
- 杂项-网络-DNS-IP:8.8.8.8
ylbtech-杂项-网络-DNS-IP:8.8.8.8 8.8.8.8是一个IP地址,是Google提供的免费DNS服务器的IP地址,Google提供的另外一个免费DNS服务器的IP地址是:8.8. ...
- SAS中的Order By - Proc Sort
SAS中的Order By - Proc Sort 1.排序proc sort proc sort在按数据集中某一个变量或几个变量的升序或降序将记录重新排列,并把结果保存在输出数据集中,如果不另外指定 ...
- Linux(Ubuntu)常用命令(四)
权限修改: 先知: u user 表示该文件的所有者 g group 表示与该文件的所有者属于同一组( group )者,即用户组 o other 表示其他以外的人 a all 表示这三者皆是 r r ...
- bat 需注意
1. 注释 :: 注释内容,下一行不能是空行,必须是语句否则报错. goto blabla rem 注释内容,则无上述限制. goto blabla 2. if rem 1. 要注意左括号前的空格以及 ...