jsp概述
在Servlet中书写后台逻辑代码和前台页面代码,十分复杂,如果页面构成繁琐,则servlet编写有很大的难度,于是sun公司提供了一种在页面中既可以书写html又可以书写Java代码的技术,这门技术简化了前台和后台代码的切换操作,提升了开发的便利性,这门技术就是jsp技术。
jsp时sun公司提供的一种动态资源开发技术。
jsp原理:
a.jsp页面在第一次被访问的时候,会被jsp翻译引擎翻译为一个servlet文件,其中页面的html和Java代码全部包含在文件中。访问jsp页面,就是访问这个servlet文件,会使其中的service()方法执行。
b.index_jsp.java文件内的类继承了HttpJspBase,HttpJspBase是一个servlet,所以当前类也是一个servlet。
c.实验:
目录:apache-tomcat-7.0.62\work\Catalina\localhost\day13-jsp\org\apache\jsp
1.模板元素:
html页面中的html元素在被访问时,会被jsp翻译引擎翻译为模板元素。
页面中的模板元素,在翻译为servlet文件后,会以out.write()的方式输出到浏览器中。
2.jsp脚本表达式:
语法:<%=jsp脚本表达式%>直接量或具有返回值的表达式request.getContextPath(),脚本表达式会被jsp引擎翻译为表达式的结果值
页面中的jsp脚本表达式,在被翻译为servlet文的时候,会放在servlet文件对应的位置上,在计算结果后,通过out.print()输出页面。
3.jsp脚本片段
语法:<%jsp脚本片段%>
页面中的jsp脚本片段,在被翻译为servlet文件时,会被原封不动的翻译成Java语句,出现在servlet文件的对应位置。并且脚本片段可以书写成多个部分,每一个部分都不完整,但是需要保证这些不完整的脚本在翻译为servlet文件后,可以组成完整的Java代码,即可编写。
4.jsp语法<%!jsp声明%>
页面中的jsp声明,在被jsp引擎翻译为servlet文件时,会变成成员变量或者方法
这个jsp声明可以看成是整个类的变量和方法,如果需要调用,则可以在页面中的任意位置被调用。
5.jsp注释
语法:<%–jsp注释–%>
<!--html注释-->
html注释会被翻译为模板元素,但是由于是html注释的内容,不会再页面中产生输出
<%//Java注释%>
Java注释会被翻译成Java代码,出现再servlet文件对应的位置,由于是注释不会产生任何的输出
<%---jsp注释-%>
jsp注释再被翻译成servlet文件的过程中,就会被抛弃,不会出现在servlet文件中(注意:慎用)
6.jsp指令形式:
page指令:用于规定jsp翻译引擎如何翻译当前页面
include指令:用于导入页面
taglib指令:用于引入外部的标签库
i.page指令
b.include指令
<%@include file=""%>
在当前的jsp页面引入其它的jsp页面,组成一个jsp输出,如果页面的某部分重复出现很多次,则可以独立成一个jsp在其它的jsp中引入。
c.taglib指令
<%@ taglib uri="" prefix=""%>
在当前的页面引入标签库
案例:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" session="false" errorPage="exception.jsp"%><!-- errorPage="error.jsp" 当前页面适用-->
<%@page import="java.io.FileOutputStream,java.io.FileInputStream" %>
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<h1>今天的天气好晴朗</h1>
<%=request.getContextPath() %>
<%for(int i=0;i<5;i++){
%>
我是个学生。
<%
} %>
<%!
int i=0;
public void add(){}
static {}
{}
%>
<%
FileOutputStream o;
FileInputStream i;
HttpServletRequest req;
%>
<%-- <%=1/0 %> --%>
<%-- <%request.getRequestDispatcher("/foot.jsp").include(request, response); %> 动态的请求包含--%>
<%int ii =1/0; %>
</body>
</html>
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<!--当前web应用的友好错误提示 -->
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML">
<html>
<head>
</head>
<body>
服务器爆炸了,维修中~~~~~
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" isErrorPage="true"%>
<!DOCTYPE HTML">
<html>
<head>
</head>
<body>
<%=exception.getMessage() %>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML">
<html>
<head>
</head>
<body>
你访问的资源去了火星~~~~~
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML">
<html>
<head>
</head>
<body>
代码出错,检查代码去
</body>
</html>
7.九大隐式对象
page 代表servlet文件的隐式对象
request 代表HTTP请求隐式对象
response 代表HTTP响应的隐式对象
application 代表当前web应用的隐式对象
config 代表代表当前servlet配置信息的隐式对象
session 代表session会话的隐式对象
out 代表向页面输出的缓冲区的隐式对象
exception 代表上一个页面的错误信息的隐式对象
pagecontext 代表当前jsp页面的上下文的隐式对象
8.pagecontext
功能一:
获取其它八大隐式对象的入口
功能二:作为域对象使用
操作api:
setAttribute();
getAttribute();
removeAttribute();
getAttributeNames();
生命周期:
在访问jsp页面时,产生pageContext()对象,生命周期开始
在结束访问jsp页面时,pagecontext()对象销毁,生命周期结束
作用范围:
整个jsp页面
主要功能:
在整个jsp页面里共享数据
功能三:操作其它域中的属性
pageContext.setAttribute(String name, object obj, int scope)
//scope
pageContext.APPLICATION_SCOPE;
pageContext.SESSION_SCOPE;
pageContext.REQUEST_SCOPE;
pageContext.PAGE_SCOPE;
功能四:
自动搜索域
使用自动搜索域,会由小到大的搜索四个域中指定名称的域属性,一旦在较小的范围内找到结果,则不会再向更大范围的域去进行搜索。
功能五:便捷的请求转发:
案例:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML">
<html>
<head>
</head>
<body>
<h3>jsp隐式对象---pagecontext</h3>
<h3>功能一:获取其它八大隐式对象的入口</h3>
<%
pageContext.getPage();
pageContext.getRequest();
pageContext.getResponse();
%>
<%
pageContext.setAttribute("name", "lili");
%>
<%=pageContext.getAttribute("name") %>
<h4>获取设置其它域中的值</h4>
<%
pageContext.setAttribute("country", "china", pageContext.APPLICATION_SCOPE);
//pageContext.setAttribute("country", "us", pageContext.SESSION_SCOPE);
//pageContext.setAttribute("country", "uk", pageContext.REQUEST_SCOPE);
//pageContext.setAttribute("country", "canada", pageContext.PAGE_SCOPE);
%>
<%=pageContext.getAttribute("country",pageContext.APPLICATION_SCOPE) %>
<%=pageContext.getAttribute("country",pageContext.SESSION_SCOPE) %>
<%=pageContext.getAttribute("country",pageContext.REQUEST_SCOPE) %>
<%=pageContext.getAttribute("country",pageContext.PAGE_SCOPE) %>
<%=pageContext.findAttribute("country") %>
<h3>便捷的请求转发</h3>
<%pageContext.forward("/index.jsp"); %>
</body>
</html>
1.作用域概述
作用域:一个可以共享数据的范围可以称之为作用域
2.四大作用域:
有大到小排序:
servletcontext----application
代表当前web的应用
生命周期:
当web应用被加载,servletcontext对象创建
当web应用被销毁,servletcontext对象销毁
作用范围:
整个web应用
主要功能:
在整个web应用内共享数据
session—session
代表当前会话的对象
生命周期:
request。getsession()方法调用的时候,session对象产生,
意外身亡:服务器意外关闭,session对象立刻销毁,如果服务器正常关闭,数据会以文件的形式保存在磁盘上,这个过程称之为钝化,服务器再次启动的时候,会重新读取整个文件,这个过程称之为活化。
自杀:调用session.invalidate()方法可以主动释放session对象
超市死亡:如果一个session超过30分钟没有被使用,则会由服务器将其销毁,这个销毁的时间可以通过web.xml中的session-config标签来设置。默认为30分钟。
作用范围:
整个会话范围
主要功能:
在整个会话范围内共享数据
c.request
代表HTTP请求对象
生命周期:
请求链起始时,request对象创建
请求链结束时,request对象销毁
作用范围:
在这个请求链中共享数据
d.pagecontext
生命周期:在访问jsp页面时创建,在结束jsp页面访问时销毁
作用范围:
整个jsp页面
主要功能:
在整个jsp页面内共享数据
标签技术:
1.标签技术概述
在jsp页面中由html语句和Java语句相互嵌套,如果Java的逻辑代码和html代码都十分复杂,两者右都参杂在一起,页面的可读性和可维护性都将降低,为了解决整这个问题,产生了标签技术,用它来替换页面中的Java语句,这样页面中就只会出现html代码,整体的可读性和可维护性都会提升。
2、常用的jsp标签技术
jsp标签
sun公司提供的技术,目前很少用
el表达式:
便捷易用—使用非常广泛,但只是表达式无法实现复杂的功能
jstl标签库:
提供了大量强大的标签支持,是目前应用最广泛的标签库
自定义标签:开发人员使用
其它第三方标签:以后了解
EL表达式
1.el表达式概述:
在jsp页面内的<%=jsp脚本表达式%>都可以使用el表达式来代替
EL Expression Language 表达式语言
在Javaee5及其以上版本中,都已默认包含了el表达式的相关开发包,无需手动导入。
2.使用方法:
${}
可以获取常量、变量、数组、链表、映射、javabean等中的数据
3.el特点
EL表达式不能设置值,只能获取值
EL表达式只能获取域中的属性
EL表达式不能遍历
4.获取常量
5.获取变量
a.获取指定域中的属性
el表达式中的四大作用域:
el表达式 | jsp脚本表达式 |
---|---|
pageScope | PAGE_SCOPE |
requestScope | REQUSET_SCOPE |
sessionScope | SESSION_SCOPE |
applicationScope | APPLICATION_SCOPE |
b.自动搜索域
c.获取数组中的数据
d.获取链表中的数据
e.获取映射中的数据
f.获取javabean中的数据
在一个类中,如果存在私有化属性,这些属性包含get或者set中的任意一个方法,则这些私有化的属性就可以称之为javabean属性,类中存在这些属性,这个类就是javabean的类
package cn.tedu.domain;
//javabean
public class Person{
private String name;
private int age;
private String gender;
public Person(){}
public Person(String name, int age, String gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
在jsp脚本表达式中使用p.getXxx()方法获取的数据,在el表达式中都可以使用${p.xxx}的方法来获取
如果JavaBean中的getxxx()方法发生修改,则el表达式也要随之修改
例如:
getName() ${p.name}
getNamex() ${p.namex}
6.获取执行运算的结果
a。算数运算
b.关系运算
c.逻辑运算
d.empty运算
empty运算用于判断当前域中的属性是否为空
Empt运算规则:如果对象为null字符串为空,集合数组没有任何元素,empty操作都会返回true,否则为false
e.三元表达式运算
7.el表达式的内置对象(11个)
a.el表达式中的域对象—4个
pageScope
requestScope
sessionScope
applicationScope
b.代表请求头的内置对象
header | 获取一个返回值为Map<String,String>的内置对象 |
---|---|
headerValues | 获取一个返回值为Map<String,String[]>的内置对象 |
request.getHeader(“host”)
${header.host}
c.代表请求参数的内置对象
param | 获取一个返回值为Map<String,String>的内置对象 |
---|---|
paramValue | 获取一个返回值为Map<String,String[]>的内置对象 |
request.getParameter(“username”)
${param.username}
d.获取初始化请求参数的内置对象(基本不用)
initParam | 获取一个返回值为Map<String,String>的内置对象 |
---|
initParam.url
c.获取浏览器中cookie信息的内置对象
cookie | 获取一个返回值为Map<String,String>的内置对象 |
---|
cookie.JSESSIONID.name
cookie.JSESSIONID.value
f.获取pageContext内置对象
<%request.getContextPath()%>
${pageContext.request.contextPath}
8.el表达式调用Java方法:
略
案例:
<%@page import="cn.tedu.domain.Person"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<h3>el表达式获取常量</h3>
<%=123 %>
<%=123.123 %>
<%="abc" %>
<%=true %>
${123}
${123.123}
${"abc"}
${true}
<h3>el表达式获取变量</h3>
<%=request.getContextPath() %>
${pageContext.request.contextPath}
<h3>el表达式获取域中的变量</h3>
<%
pageContext.setAttribute("name", "1", pageContext.APPLICATION_SCOPE);
pageContext.setAttribute("name", "2", pageContext.SESSION_SCOPE);
pageContext.setAttribute("name", "3", pageContext.REQUEST_SCOPE);
pageContext.setAttribute("name", "4", pageContext.PAGE_SCOPE);
%>
<%=pageContext.getAttribute("name") %>
<%=request.getAttribute("name") %>
<%=session.getAttribute("name") %>
<%=application.getAttribute("name") %>
${pageScope.name }
${sessionScope.name }
${requestScope.name }
${applicationScope.name }
<h3>自动搜索域</h3>
<%=pageContext.findAttribute("name") %>
${name}
<h3>获取数组中的数据</h3>
<%
String[] names={"aa","bb","cc"};
pageContext.setAttribute("names", names);
%>
${names[0]}
${names}
<h3>获取链表中的数据</h3>
<%
List<String> list=new LinkedList<String>();
list.add("11");
list.add("22");
list.add("33");
list.add("44");
pageContext.setAttribute("list", list);
%>
${list}
${list[0] }
<h3>获取映射中的数据</h3>
<%
Map<String,String> map=new HashMap<String,String>();
map.put("aa", "11");
map.put("bb.cc", "22");
map.put("cc", "33");
request.setAttribute("map", map);
request.setAttribute("w", "aa");
%>
${map }
${map.aa }
<%-- ${map.bb.cc } --%>
${map["bb.cc"] }
${map[w] }
<h3>获取javabean中的数据</h3>
<%
Person p=new Person("曹阳",20,"男");
pageContext.setAttribute("p", p);
%>
${p.name }
</body>
</html>
<%@page import="cn.tedu.domain.Person"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<h3>el表达式执行运算</h3>
<h4>算数运算</h4>
${3+2 }
${3-2 }
${3/2 }
${3*2 }
${3%2 }
${3+"2" }
${3-"2" }
<%-- ${3+"a" } --%><!-- 运算报错 -->
<h4>关系运算</h4>
${3>2 }
${3<2 }
${3==2 }
${3!=2 }
${3>=2 }
${3<=2 }
<h4>逻辑关系</h4>
${true&&false }
${true||false }
${true and false }
${true or false }
${!true}
${not true}
<%-- ${true|false } 运行出错不认识--%>
<h4>empty运算</h4>
<%
String str=null;
pageContext.setAttribute("str", str);
String str2="";
pageContext.setAttribute("str2", str2);
String[] str3={};
pageContext.setAttribute("str3", str3);
List<String> list=new LinkedList<String>();
pageContext.setAttribute("list", list);
Map<String,String> map=new HashMap<String,String>();
pageContext.setAttribute("map", map);
List l=new ArrayList();
l.add("jkl");
pageContext.setAttribute("l", l);
%>
${empty str }
${empty str2 }
${empty str3 }
${empty list }
${empty map }
${empty l }
<h4>三元表达式</h4>
<%
Map<String,String> mapx=new HashMap<String,String>();
mapx.put("name", "ccc");
pageContext.setAttribute("mapx", map);
%>
${empty mapx.name?"曹阳":mapx.name }
<h4>el表达式的内置对象</h4>
${header.host }
${param.username }
${cookie.JSESSIONID.name }
${cookie.JSESSIONID.value }
</body>
</html>