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个隐式对象)的更多相关文章

  1. 四大域对象,和jsp的九大隐式对象,已经el表达式的11个隐式对象

    四大域对象 1.PageContext :页面范围的数据 2.ServletRequest:请求范围的数据 3.HttpSession:回话范围的数据 4.ServletContext:应用范围的数据 ...

  2. JavaWeb学习笔记--2.jsp指令元素、动作元素、内置对象

    目录: 一.指令 1.1 page指令 :page指令有13种属性 1.2 include指令:include指令有1种属性,为file.(注意<%@ include%>和<jsp: ...

  3. JavaWeb学习篇之----Jsp详解

    今天我们来看一下Jsp的相关知识,首先来看看一下Jsp的相关定义: 简介: JSP全称是JavaServer Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术 ...

  4. 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 ...

  5. JSP 4个域对象-9个内置对象-11个EL隐式对象

    一. 四大域对象 1. PageContext :页面范围的数据 2. ServletRequest:请求范围的数据 3. HttpSession:会话范围的数据 4. ServletContext: ...

  6. jsp隐式对象

    隐式对象使用位置 隐式对象在转译为Servlet后,是_jspService()中的局部变量.隐式对象只能在<%与%>之间,或<%=与%>之间直接使用. 无法在<%!与% ...

  7. 转载 《AngularJS》5个实例详解Directive(指令)机制

    <AngularJS>5个实例详解Directive(指令)机制 大漠穷秋 本文整理并扩展了<AngularJS>这本书第六章里面的内容,此书近期即将由电子工业出版社出版,敬请 ...

  8. Java Web(五) JSP详解(四大作用域九大内置对象等)

    前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编 ...

  9. 【转载】JSP详解(四大作用域九大内置对象等)

    前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编 ...

随机推荐

  1. python方法参数:*和**操作符

    * def test_args_kwargs(arg1, arg2, arg3): print("arg1:", arg1) print("arg2:", ar ...

  2. MyEclipse使用过程中的问题及对应设置的总结

    1.关闭 Javaweb项目中的updating index : Window => Preferences => Myeclipse Enterprise Workbench => ...

  3. 数字电路的与门、或门、非门--FPGA--005

    作者:young cc 链接:https://www.zhihu.com/question/23829080/answer/123791730来源:知乎著作权归作者所有,转载请联系作者获得授权. 数字 ...

  4. 数据挖掘:周期性分析SMCA算法

    数据挖掘:周期性分析SMCA算法 原文地址:http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1423978 算法介绍 以时间顺序挖掘周期性的模式 ...

  5. delphi 异形窗体可半透明

    unit xDrawForm; interface uses Windows, Messages, SysUtils, Classes, Controls, Forms, Menus, Graphic ...

  6. 使用Microsoft.Practices.Unity 依赖注入

    Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...

  7. 杂项-网络-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. ...

  8. SAS中的Order By - Proc Sort

    SAS中的Order By - Proc Sort 1.排序proc sort proc sort在按数据集中某一个变量或几个变量的升序或降序将记录重新排列,并把结果保存在输出数据集中,如果不另外指定 ...

  9. Linux(Ubuntu)常用命令(四)

    权限修改: 先知: u user 表示该文件的所有者 g group 表示与该文件的所有者属于同一组( group )者,即用户组 o other 表示其他以外的人 a all 表示这三者皆是 r r ...

  10. bat 需注意

    1. 注释 :: 注释内容,下一行不能是空行,必须是语句否则报错. goto blabla rem 注释内容,则无上述限制. goto blabla 2. if rem 1. 要注意左括号前的空格以及 ...