1.JSP标签技术
1)背景
1.开发JSP技术的目的,是解决Servlet非常不适合输出html内容的问题
2.原来是Java代码嵌入html的内容,JSP是html的内容嵌入Java代码
3.Sun公司在 JSP2.0 中推出了 JSP标签技术 ,可以以标签的方式来执行逻辑,动态输出内容,取代JSP中所有的Java代码。Sun公司建议,以后在JSP中,不要再出现任何的Java代码
2)EL表达式(表达式语言)
1.使用 ${表达式} 的表达式,来替代 <%=java表达式%>
示例:
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("username", "itcast");
request.setAttribute("password", "123");
RequestDispatcher dispatcher = request
.getRequestDispatcher("/myjsp.jsp");
dispatcher.forward(request, response);
}
用.jsp接受参数:
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<html><head></head><body>
用户名:<%=request.getAttribute("username")%><br />
密 码:<%=request.getAttribute("password")%><br />
<hr>
使用EL表达式:<br />
用户名:${username}<br />
密 码:${password}<br />
</body></html>
优点:
对象不存在时,使用EL表达式获取对象值时返回空字符串。
使用Java方式获取对象值时返回null,会报以空指针异常。
2.在EL表达式中,经常需要使用一些符号来标记一些名称,如 变量名、自定义函数名 等,这些符号被称为 标识符 。
EL表达式中的标识符可以由任意的 大小写字母、数字和下划线 组成,为了避免出现非法的标识符,在定义标识符时还需要遵循以下规范:
- 不能以数字开头;
- 不能是EL中的保留字,如and、or;
- 不能是EL隐式对象,如pageContext;
- 不能包含单引号(‘)、双引号(“)、减号(-)和正斜线等特殊字符。
下面的这些标识符都是合法的:
username
username123
user_name
_userName
注意,下面的这些标识符都是不合法的:
123username
or
user"name
pageContext
3.常见功能:
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>1.动态输出运算结果</h1>
算术运算:12*23=${12*23 }<br>
关系运算:12>23=${12>23 }<br>
<!-- & || ! 可以使用单词代替 and or not -->
逻辑运算:true and false=${true and false }<br>
三目运算:1<2?=${1<2?"1<2":"1>2"}<br>
<%
String name = "abc";
request.setAttribute("name", name);
%>
判断name属性是否为null:${empty name }<br>
<hr>
<h1>2.动态输出变量的值</h1>
<%
int age = 18;
request.setAttribute("age", age);
request.setAttribute("city", "北京");
session.setAttribute("city", "上海");
//session.removeAttribute("city");
//application 就是 ServletContext
application.setAttribute("city", "广州");
//application.removeAttribute("city");
%>
<!-- el默认只能输出作用域(scope)中的数据 -->
<!-- request、session、ServletContext(application)中的数据 -->
age=${age }<br>
city=${city }<br>
request.city=${requestScope.city }<br>
session.city=${sessionScope.city }<br>
application.city=${applicationScope.city }<br>
<hr>
<h1>3.输出数组、集合、map集合、Java对象中的数据</h1>
<%
String[] names = { "张无忌", "赵敏", "小昭" };
request.setAttribute("names", names);
%>
${names }<br>
${names[1] }<br>
${names[5] }<br>
<%
List<String> list = new ArrayList<String>();
list.add("妲己");
list.add("凯");
list.add("八戒");
request.setAttribute("list", list);
%>
${list }<br>
${list[2] }<br>
${list[5] }<br>
<%
Map<String,String> map = new HashMap<String,String>();
map.put("name", "刘备");
map.put("wife", "糜夫人");
map.put("wife.other", "孙尚香");
request.setAttribute("map", map);
request.setAttribute("wife", "wife.other");
%>
${map }<br>
${map.name }<br>
${map["wife"] }<br>
${map[wife] }<br>
${map["wife.other"] }<br>
<%
Person person = new Person("张三", 18);
request.setAttribute("person", person);
%>
${person }<br>
${person.name }<br>
</body>
</html>
运行结果:
- 1.在页面中动态输出运算结果
- 2.动态输出变量的值${变量名}
- 1.默认情况下,可以动态输出作用域中的数据
- 2.如果不指定作用域,el会从最小的作用域 开始查找对应的变量,如找到,则输出,如找不到,则继续向上找;如果都没找到,则什么都不输出
- 3.可以手动指定仅从某个作用域中查找变量,找到就输出,找不到就什么都不输出
- ${requestScope.city}
- ${sessionScope.city}
- ${applicationScope.city}
- 4.username=<%=request.getParameter(“username” )%>
- 可以 ${param.username} 限定从请求参数中获取username的值
- 3.输出数组中的数据
- 1.${arr[0]}
- 2.不会出现下标越界异常,什么都不显示
- 4.输出集合中的数据
- 1.${list[0]}
- 2.不会出现下标越界异常,什么都不显示
- 5.输出Map集合中的数据
- 1.${map.key}
- 2.${map[“key”]}
- 3.注意,第二种中的双引号不能省略,如果省略,则括号里的内容表示变量,会在作用域中找到相应的变量。
- 6.输出 Java对象 中的数据
- 1.${person.name}
- 2.el表达式会将person. name自动翻译成person.getName()
- 3.必须保证该类有对应的get方法,不然会抛出异常
4.EL中的变量
- EL表达式中的变量就是一个基本的存储单元,EL表达式可以将变量映射到一个对象上,例如:
${product} //其中:product就是一个变量。
- EL表达式中的变量不用事先定义就可以直接使用
例如,表达式${product}就可以访问变量product的值。
5.EL隐式对象
在学习JSP技术时,提到过隐式对象的应用。在EL技术中,同样提供了隐式对象。EL中的隐式对象共有11个,具体如表所示。
1).pageContext对象
使用EL表达式中的pageContext隐式对象可以获取JSP页面的隐式对象。
例如: ${pageContext.response.characterEncoding}
其中,pageContext对象用于获取response对象中的characterEncoding属性。
示例:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head></head>
<body>
请求URI为: ${pageContext.request.requestURI} <br />
Content-Type响应头: ${pageContext.response.contentType} <br />
服务器信息为: ${pageContext.servletContext.serverInfo} <br />
Servlet注册名为: ${pageContext.servletConfig.servletName} <br />
</body>
</html>
2).Web域相关对象
在Web开发中,PageContext、HttpServletRequest、HttpSession和ServletContext 这四个对象可以存储数据,是因为它们内部都定义了一个Map集合。
这些Map集合是有一定作用范围的,例如,HttpServletRequest对象存储的数据只在当前请求中可以获取到。
把这些Map集合称为域,这些Map集合所在的对象称为域对象。
在EL表达式中,为了获取指定域中的数据,提供了 pageScope、requestScope、sessionScope和applicationScope 4个隐式对象,示例代码如下:
${pageScope.userName}
${requestScope.userName}
${sessionScope.userName}
${applicationScope.userName}
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html><head></head><body>
<% pageContext.setAttribute("userName", "itcast"); %>
<% request.setAttribute("bookName", "Java Web"); %>
<% session.setAttribute("userName", "itheima"); %>
<% application.setAttribute("bookName", "Java 基础"); %>
表达式\${pageScope.userName}的值为: ${pageScope.userName} <br />
表达式\${requestScope.bookName}的值为:${requestScope.bookName} <br />
表达式\${sessionScope.userName}的值为: ${sessionScope.userName} <br />
表达式\${applicationScope.bookName}的值为:${applicationScope.bookName}
表达式\${userName}的值为:${userName}
</body></html>
3).param和paramValues对象
EL表达式提供了 param 和 paramValues 两个隐式对象,这两个隐式对象专门用于获取客户端访问JSP页面时传递的请求参数。
param对象用于获取请求参数的某个值,它是Map类型,与request.getParameter()相同。在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。 语法格式: ${param.num}
paramValues对象来获取请求参数的所有值,该对象用于返回请求参数所有值组成的数组,如果要获取某个请求参数的第一个值,可以使用如下代码:
${paramValues.num[0]}
示例:
<body style="text-align: center;">
<form action="${pageContext.request.contextPath}/param.jsp">
num1:<input type="text" name="num1"><br />
num2:<input type="text" name="num"><br />
num3:<input type="text" name="num"><br /> <br />
<input type="submit" value="提交" />
<input type="submit" value="重置" />
<hr>
num1:${param.num1}<br />
num2:${paramValues.num[0]}<br />
num3:${paramValues.num[1]}<br />
</form>
</body>
4).cookie对象
在EL表达式中,提供了Cookie隐式对象,该对象是一个代表所有Cookie信息的Map集合,Map集合中元素的键为各个Cookie的名称,值则为对应的Cookie对象,具体示例如下:
- 获取Cookie对象的信息: ${cookie.userName}
- 获取Cookie对象的名称: ${cookie.userName.name}
- 获取Cookie对象的值: ${cookie.userName.value}
示例:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head></head>
<body>
Cookie对象的信息:<br />
${cookie.userName } <br />
Cookie对象的名称和值:<br />
${cookie.userName.name }=${cookie.userName.value }
<% response.addCookie(new Cookie("userName", "itcast")); %>
</body>
</html>
2)JSP九大内置对象
1.JSP的九大内置对象,其实是翻译后的.java文件中_jspService()方法的局部变量
2.具体的九大内置对象
- 1.request
- 2.response
- 3.application:ServletContext
- 4.session
- 5.out:Jspwriter
- 6.pageContext
- 7.config:servletConfig
- 8.page:this,当前Servlet实例
- 9.exception:Throwable
3.pageContext : page上下文
- 1.代表当前jsp的运行环境
- 2.当请求到达当前jsp时,创建一个pageContext对象,当请求离开当前jsp时,销毁该对象
- 3.pageContext是JavaEE的四大作用域(Scope)之一,是最小的作用域,代表当前页面
- pageContext.setAttribute();
- pageContext.getAttribute();
- pageContext.removeAttribute();
- 4.pageContext的存活时间
4.可以开发一个错误提示页面,当项目出现500时,服务器自动使用该错误提示页面为用户生成响应内容
- 1.好处:可以有效提高用户体验
- 2.配置方式
<error-page>
<error-code>500</error-code>
<location>/500Page.jsp</location>
</error-page>
- 3.如果在错误提示页面中,希望获得上一个页面的异常信息,可以在页面中声明isErrorPage=“true”
- 4.服务器为会该JSP自动添加一个内置对象,exception,封装了上一个页面的异常信息
开发404页面:
- 1.创建新的jsp页面
- 2.
亲~您访问的页面走丢了~~<br>
<img alt="" src="404.gif" width="60%">
- 3.
<error-page>
<error-code>404</error-code>
<location>/404Page.jsp</location>
</error-page>