JSP标签技术

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&lt;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表达式提供了 paramparamValues 两个隐式对象,这两个隐式对象专门用于获取客户端访问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="提交" />&nbsp;&nbsp;
		<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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值