jsp(1)笔记

4.1 Jsp引入
Servlet的作用: 用java语言开发动态资源的技术!!!
Jsp的作用:用java语言(+html语言)开发动态资源的技术!!! 
Jsp就是servlet!!!
4.2 Jsp的特点
1)jsp的运行必须交给tomcat服务器!!!!
tomcat的work目录: tomcat服务器存放jsp运行时的临时文件
2)jsp页面既可以写html代码,也可以写java代码。
(html页面不能写java代码 。而jsp页面可以写java代码)
4.4 Jsp的执行过程
问题: 访问http://localhost:8080/day12/01.hello.jsp  如何显示效果?

1)访问到01.hello.jsp页面,tomcat扫描到jsp文件,在%tomcat%/work把jsp文件翻译成java源文件
(01.hello.jsp   ->   _01_hello_jsp.java) (翻译)
2)tomcat服务器把java源文件编译成class字节码文件 (编译)
(_01_hello_jsp.java  ->  _01_hello_jsp.class)
3)tomcat服务器构造_01_hello_jsp类对象
4)tomcat服务器调用_01_hello_jsp类里面方法,返回内容显示到浏览器。
第一次访问jsp: 走(1)(2)(3)(4)

第n次访问jsp:  走(4)

注意:
1)jsp文件修改了或jsp的临时文件被删除了,要重新走翻译(1)和编译(2)的过程

问题: 为什么Jsp就是servlet!!!
jsp翻译的java文件:
public final class _01_hello_jsp extends org.apache.jasper.runtime.HttpJspBase(tomact里面的一个包)
    implements org.apache.jasper.runtime.JspSourceDependent {

HttpJspBase类:
public abstract class org.apache.jasper.runtime.HttpJspBase extends javax.servlet.http.HttpServlet implements javax.servlet.jsp.HttpJspPage {
(HttpJspBase继承HttpServlet)
结论: Jsp就是一个servlet程序!!!
servlet的技术可以用在jsp程序中
jsp的技术并不是全部适用于servlet程序!

Servlet的生命周期:
1)构造方法(第1次访问)
2)init方法(第1次访问)
3)service方法
4)destroy方法
Jsp的生命周期
1)翻译: jsp->java文件
2)编译: java文件->class文件(servlet程序)
3)构造方法(第1次访问)
4)init方法(第1次访问):_jspInit()
5)service方法:_jspService()
6)destroy方法:_jspDestroy()


5 Jsp语法
5.1 Jsp模板
jsp页面中的html代码就是jsp的模板
5.2 Jsp表达式
语法:<%=变量或表达式%>
作用: 向浏览器输出变量的值或表达式计算的结果
注意:
1)表达式的原理就是翻译成out.print(“变量” );通过该方法向浏览器写出内容
2)表达式后面不需要带分号结束。
5.3 Jsp的脚本
语法:<%java代码 %>
作用: 执行java代码
注意:
1)原理把脚本中java代码原封不动拷贝到_jspService方法中执行。
5.4 Jsp的声明
语法:<%! 变量或方法 %>
作用: 声明jsp的变量或方法
注意:
1)变量翻译成成员变量,方法翻译成成员方法。
(脚本中不能写入方法,因为脚本中的内容添加到方法里面,再写方法只会形成方法嵌套方法,但是方法不能嵌套方法)
2)jsp声明中不能重复定义翻译好的一些方法,比如声明里面编译中里面已经存在的public void _jspInit()
5.5 Jsp的注释
语法: <%!--  jsp注释  --%>
注意;
1)html的注释会被翻译和执行。而jsp的注释不能被翻译和执行。
(html注释:<!-- -->)

6 Jsp的三大指令
6.1 include指令
作用: 在当前页面用于包含其他页面
语法: <%@include file="common/header.jsp"%>   (ctrl按住鼠标键能够点击进去就是可以)
注意:
1)原理是把被包含的页面(header.jsp)的内容翻译到包含页面(index.jsp)中,合并成翻译成一个java源文件,再编译运行!!,这种包含叫静态包含(源码包含)
2)如果使用静态包含,被包含页面中不需要出现全局的html标签了!!!(如html、head、body)
6.2 page指令
作用: 告诉tomcat服务器如何翻译jsp文件
<%@ page 
language="java"   --告诉服务器使用什么动态语言来翻译jsp文件
import="java.util.*" --告诉服务器java文件使用什么包
导入包,多个包之间用逗号分割
pageEncoding="utf-8"  --告诉服务器使用什么编码翻译jsp文件(成java文件)
 contentType="text/html; charset=utf-8" 服务器发送浏览器的数据类型和内容编码
注意:在开发工具中,以后只需要设置pageEncoding即可解决中文乱码问题
errorPage="error.jsp"
isErrorPage="false"
buffer="8kb"
session="true"
isELIgnored="false"
%>
重要属性:3个
contentType:设置响应流的编码,及通知浏览器用什么编码打开.设置文件的mimetype
pageEncoding:设置页面的编码
import:导入所需要的包
contentType和pageEncoding联系:
若两者都出现的时候,各自使用各自的编码
若只出现一者,两个都使用出现的这个编码
若两者都不出现,使用服务器默认的编码 tomcat7使用的iso-8859-1
了解属性:
language:当前jsp页面里面可以嵌套的语言
buffer:设置jsp页面的流的缓冲区的大小
autoFlush:是否自动刷新
extends:声明当前jsp的页面继承于那个类.必须继承的是httpservlet 及其子类
session:设置jsp页面是否可以使用session内置对象
isELIgnored:是否忽略el表达式
errorPage:当前jsp页面出现异常的时候要跳转到的jsp页面
isErrorPage:当前jsp页面是否是一个错误页面
若值为true,可以使用jsp页面的一个内置对象 exception


异常错误相关的:
  errorPage:  指定当前jsp页面的错误处理页面。
  isErorrPage:  指定当前页面是否为错误处理页面。false,不是错误处理页面,则不能使用exception内置对象;true,是错误处理页面,可以使用exception内置对象。
errorPage:  
当前的页面出现问题后会跳转的另一个页面里面耐心等待

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>page指令</title>
  </head>
  
  <body>
    <%
     String name=null;
     name.charAt(1);
     %>
     
  </body>
</html>
跳转到一个等待的页面:error.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"
%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'error.jsp' starting page</title>
  </head>
  
  <body>
   系统发生一点小的错误,请耐心等待
  </body>
</html>
isErorrPage:   在error.jsp里面使用
isErrorPage="true"----->exception.getMessage()  isErrorPage为false就不能使用里面的内置对象exception.getMessage()
当前页面index,jsp发生错误后跳转到error.jsp里面显示错误的原因:
前提是指定错误显示页面在error.jsp里面
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" errorPage="common/error.jsp"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>page指令</title>
  </head>
  
  <body>
    <%
     String name=null;
     name.charAt(1);
     %>
     
  </body>
</html>
error.jsp:
<%@ page language="java" import="java.util.*"
 pageEncoding="UTF-8"
 isErrorPage="true"
%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'error.jsp' starting page</title>
  </head>
  
  <body>
   系统发生一点小的错误,请耐心等待
   错误的原因:<%= exception.getMessage() %>
  </body>
</html>
但是每个网页都要写把自己错误的信息配置到error.jsp里面太过麻烦,现在使用一个全局变量:
在web.xml里面配置全局变量:
 <!-- 全局错误处理页面配置 -->
  <error-page>     ******服务器错误
  	<error-code>500</error-code>
  	<location>/common/500.jsp</location>
  </error-page>
  <error-page>       *****客户端错误
  	<error-code>404</error-code>
  	<location>/common/404.html</location>
  </error-page>
相论优先级:在index.jsp里面errorPage的优先级高于全局变量
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>page指令</title>
  </head>
  
  <body>
    <%
     String name=null;
     name.charAt(1);
     %>
     
  </body>
</html>
500.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isErrorPage="true"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>500处理页面</title>
  </head>
  
  <body>
   500错误!系统正在抢修中
   <%= exception.getMessage() %>
  </body>
</html>
400.html:  (资源访问不到也是一种)
<!DOCTYPE html>
<html>
  <head>
    <title>404处理页面</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
   亲,你需要访问的页面已经被移除,你是不是想访问首页。
  </body>
</html>

session:  是否开启session功能。false,不能用session内置对象;true,可以使用session内置对象。
buffer:  jsp页面的缓存区大小。
isELIgnore: 是否忽略EL表达式。

Jsp的内置对象(重点)

什么是内置对象?
在jsp开发中,会频繁使用到一些对象。例如HttpSession,ServletContext,ServletContext,HttpServletRequet。如果我们每次要使用这些对象都去创建这些对象就显示非常麻烦。所以Sun公司设计Jsp时,在jsp页面加载完毕之后就会自动帮开发者创建好这些对象,而开发者只需要直接使用这些对象调用方法即可!,这些创建好的对象就叫内置对象!!!!

9大内置对象
 内置对象名          类型
          request HttpServletRequest
  response      HttpServletResponse
  config        ServletConfig
  application        ServletContext
  session         HttpSession
  exception        Throwable
  page            Object(this)
  out             JspWriter
  pageContext     PageContext

Out对象
out对象类型,JspWriter类,相当于带缓存的PrintWriter
PrintWriter: 
wrier(内容): 直接向浏览器写出内容。
JspWriter
writer(内容): 向jsp缓冲区写出内容
当满足以下条件之一,缓冲区内容写出:
1)缓冲区满了
2)刷新缓存区
3)关闭缓存区
4)执行完毕jsp页面


<%
  out.write("abc");
  response.getWriter().write("123");
%>
输出:123abc   abc进入缓冲区,执行完jsp页面再输出

<%
  out.write("abc");
  //刷新缓存
  out.flush();
  response.getWriter().write("123");
%>
输出:abc123
关闭缓存:(设置缓存区大小为0)
01.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" buffer="0kb"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP '01.jsp' starting page</title>
  </head>
  
  <body>
    <%
  out.write("abc");
  //刷新缓存
  //out.flush();
  response.getWriter().write("123");
%>
  </body>
</html>
缓存区满的情况下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" buffer="1kb"%><%
		for(int i=1;i<=1024;i++){
    		out.write("a");
    	}
    	//查看缓存区大小
    	System.out.println("当前缓存区大小:"+out.getBufferSize());
    	//查看缓存区剩余大小
    	System.out.println("缓存区剩余大小:"+out.getRemaining());
    	//刷新缓存
    	//out.flush();
    	response.getWriter().write("123");
     %>
  </body>
</html>

先输出1024个a再输出123

如果i<=1023 缓冲区没有满 就先输出123再输出1023个a

pageContext对象
pageContext对象的类型是PageContext,叫jsp的上下文对象
pageContext对象是JSP技术中最重要的一个对象,它代表当前JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如包含和跳转其它资源、检索其它域对象中的属性等。 

1)可以获取其他八个内置对象
   getException方法返回exception隐式对象 
   getPage方法返回page隐式对象
   getRequest方法返回request隐式对象 
   getResponse方法返回response隐式对象 
   getServletConfig方法返回config隐式对象
   getServletContext方法返回application隐式对象
   getSession方法返回session隐式对象 
   getOut方法返回out隐式对象

本身是一个域对象
ServletContext context域
HttpServletRequet  request域
HttpSession    session域     --Servlet学习的
PageContext   page域       --jsp学习的
Servlet有三个域对象,jsp里面有四个域对象
作用: 保存数据和获取数据,用于共享数据

#保存数据
1)默认情况下,保存到page域
pageContext.setAttribute("name");
2)可以向四个域对象保存数据
pageContext.setAttribute("name",域范围常量)
#获取数据
1)默认情况下,从page域获取
pageContext.getAttribute("name")
2)可以从四个域中获取数据
pageContext.getAttribute("name",域范围常量)

<%
     //保存数据。默认情况下,保存在page域中
      	pageContext.setAttribute("message","page's message");
      	pageContext.setAttribute("message","request's messsage",PageContext.REQUEST_SCOPE);//保存到request域中
     //request.setAttribute("message","request's message"); 等价于上面的代码
%>
 <%
       	//获取数据
	//pageContext的page域范围只在这个页面所以就在这个页面里获取数据   
       	String message = (String)pageContext.getAttribute("message");
       	out.write(message);
	  
%>
域范围常量:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext..SESSION_SCOPE
PageContext.APPLICATION_SCOPE
<%
   //保存数据。默认情况下,保存在page域中
   pageContext.setAttribute("message","page's message");
   pageContext.setAttribute("message","request's messsage",PageContext.REQUEST_SCOPE);//保存到request域中
   //request.setAttribute("message","request's message"); 等价于上面的代码
   pageContext.setAttribute("message","session's messsage",PageContext.SESSION_SCOPE);//保存到sessio域中
   pageContext.setAttribute("message","application's messsage",PageContext.APPLICATION_SCOPE);//保存到context域中
 %>

<%--从request域中取出数据 --%>
<%--
    原则: 
1)在哪个域中保存数据,就必须从哪个域取出数据!!!
 --%>
<%=pageContext.getAttribute("message",PageContext.PAGE_SCOPE) %>
<%=pageContext.getAttribute("message",PageContext.REQUEST_SCOPE) %>
<%=pageContext.getAttribute("message",PageContext.SESSION_SCOPE) %>
<%=pageContext.getAttribute("message",PageContext.APPLICATION_SCOPE) %>

自动在四个域中搜索数据
   pageContext.findAttribute("name");
顺序: page域 -> request域 -> session域- > context域(application域)
 <%=pageContext.findAttribute("message") %>

3 Jsp中的四个域对象
四个域对象:
pageContext      page域
request          request域
session          session域
application       context域

1)域对象作用:
保存数据  和 获取数据 ,用于数据共享。

2)域对象方法:
setAttribute("name",Object) 保存数据
getAttribute("name")  获取数据
removeAttribute("name") 清除数据

3)域对象作用范围:
page域: 只能在当前jsp页面中使用(当前页面)
request域: 只能在同一个请求中使用(转发)
session域: 只能在同一个会话(session对象)中使用(私有的)
context域: 只能在同一个web应用中使用。(全局的)
5 EL表达式:

   5.1 EL作用:

jsp的核心语法: jsp表达式 <%=%>和 jsp脚本<%  %>。
以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码。
使用EL表达式替换掉jsp表达式
EL表达式作用: 向浏览器输出域对象中的变量值或表达式计算的结果!!!
语法: ${变量或表达式}

   5.2 EL语法
1)输出基本数据类型变量
1.1 从四个域获取
${name}
1.2 指定域获取
${pageScope.name}
     域范围: pageScoep / requestScope / sessionScope / applicationScope

2)输出对象的属性值
Student
3)输出集合对象
List  和 Map
4)EL表达式计算

(1)从域中获取:
   一般的访问方式:
      <%String name = "rose";%>
      <%=name%>
   使用EL获取方式:
      <%
       String name = "rose";
       //放入到域中:默认是放到page域中
       pageContext.setAttribute("name", name);
     %>
     EL表达式:${name}
(2)输出对象的属性值:
<%@ page language="java" import="java.util.*,gz.itcast.b_student.*" pageEncoding="UTF-8"%>    ********导包
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>EL显示对象的属性</title>
  </head>
  
  <body>
    <%--EL输出对象的属性 --%>
    <%
    	//保存数据
    	Student student = new Student("eirc",20);
    	//将数据放到域中
    	pageContext.setAttribute("student", student);  ******第一个student带表着下面的student的调用的引用,第二个代表着上面创建的对象
     %>
    ${student.name}-${student.age}
  </body>
</html>
package gz.itcast.b_student;
public class Student {
	private String name;
	private int age;
	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 Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}	
}
注意:
    ${student.name}等价于    (.相对于调用getXX()方法)
<%((Student)pageContext.findAttribute("student")).getName()%>
在Student里面name和age都是私有的变量,所以不能够直接的调用,调用的只是里面的getXX()方法,所以$(student.name)里面的name就是
public String getName() getName的Name小写,和变量无关


(3)输出集合对象:List

<% 
   //List
   List<Student>  list = new ArrayList<Student>();
   list.add(new Student("rose",18));
   list.add(new Student("jack",28));
   list.add(new Student("lucy",38));
   //放入域中
   pageContext.setAttribute("list",list);
%>
${list }
输出三个list对象:
[gz.itcast.b_student.Student@22e1469c,
 gz.itcast.b_student.Student@73e2bda7, 
gz.itcast.b_student.Student@2b115a61] 
现在拿出student对象的内容:
 ${list[0].name } - ${list[0].age }<br/>
 ${list[1].name } - ${list[1].age }<br/>
 ${list[2].name } - ${list[2].age }
<%--
<%--
list[0]等价于       (中括号相对于调用get(参数)方法)
             ((List)pageContext.findAttribute("list")).get(0)
 --%>
(3-1)输出集合对象:Map
<%//Map
     	Map<String,Student> map = new HashMap<String,Student>();
     	map.put("100",new Student("mark",20));
     	map.put("101",new Student("maxwell",30));
     	map.put("102",new Student("narci",40));
     	//放入域中
     	pageContext.setAttribute("map",map);
%>
${map}
输出三个对象:
{102=gz.itcast.b_student.Student@6d3cba41,
 101=gz.itcast.b_student.Student@2de8396e,
 100=gz.itcast.b_student.Student@69127c4d} 
输出对象里面的值:
<%--使用EL获取Map对象 --%>
${map['100'].name } -  ${map['100'].age }<br/>
${map['101'].name } -  ${map['101'].age }<br/>
${map['102'].name } -  ${map['102'].age }<br/>
(4)EL表达式计算:
表达式和一般的表达式没有区别:
 1)empty既可以判断空又可以判断null
<%
   //String name = "eric";
   //String name = null;
   String name = "";
   pageContext.setAttribute("name",name);
%>
另一种判空写法: ${empty name }

6.2 Jsp标签分类
1)内置标签(动作标签): 不需要在jsp页面导入标签
2)jstl标签: 需要在jsp页面中导入标签
3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签

转发标签:  <jsp:forward />
参数标签:  <jsp:pararm/>
包含标签:  <jsp:include/>
原理: 包含与被包含的页面先各自翻译成java源文件,然后再运行时合并在一起。
(先翻译再合并),动态包含

静态包含  vs  动态包含的区别?

1) 语法不同
静态包含语法: <%@inclue file="被包含的页面"%>
动态包含语法: <jsp:include page="被包含的页面">

  2)参数传递不同
静态包含不能向被包含页面传递参数
动态包含可以向被包含页面传递参数

  3)原理不同
静态包含: 先合并再翻译
动态包含: 先翻译再合并

(1)转发功能:
[1-1普通的转发]
09.action.jsp:
<%request.getRequestDispatcher("/09.action2.jsp?name=eric").forward(request, response);%>
09.action2.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  
    <title>动作标签09.action2.jsp</title>
  </head>
  
  <body>
    <%= request.getParameter("name")%><br>
    <%=request.getParameter("password") %>
  </body>
</html>
输出:eric null
[1-2] <jsp:forward />:
    <jsp:forward page="/09.action2.jsp">
        <jsp:param value="jacky" name="name"/>
        <jsp:param value="123456" name="password"/>
    </jsp:forward>
输出:jacky
123456 
(2)包含:
[2-1]普通的包含
09.action.jsp:
 <%@include file="common/header.jsp" %>
header.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>  
    <title>My JSP 'header.jsp' starting page</title>

  </head>
  
  <body>
    通用的头部页面的内容<br/>
    参数: <%=request.getParameter("name") %>
  </body>
</html>
输出:
通用的头部页面的内容
参数: null 

[2-2]<jsp:include/>并传递参数:
 <jsp:include page="/common/header.jsp">
   <jsp:param value="lucy" name="name"/>
 </jsp:include>
输出:
通用的头部页面的内容
参数: lucy 

6.4 JSTL标签
JSTL (全名:java  standard  tag  libarary   -  java标准标签库  )

核心标签库 (c标签库) 天天用
国际化标签(fmt标签库)
EL函数库(fn函数库)
xml标签库(x标签库)
sql标签库(sql标签库)
6.5 使用JSTL标签步骤
1) 导入jstl支持的jar包(标签背后隐藏的java代码)
注意:使用javaee5.0的项目自动导入jstl支持jar包
2)使用taglib指令导入标签库 
<%@taglib uri="tld文件的uri名称" prefix="简写" %>
3)在jsp中使用标签

核心标签库的重点标签:
保存数据:
     <c:set></c:set>   
获取数据: 
             <c:out value=""></c:out>
单条件判断
            <c:if test=""></c:if>
多条件判断
          <c:choose></c:choose>
      <c:when test=""></c:when>
          <c:otherwise></c:otherwise>
        循环数据
          <c:forEach></c:forEach>
          <c:forTokens items="" delims=""></c:forTokens>
重定向
          <c:redirect></c:redirect>

<%@ page language="java" import="java.util.*,gz.itcast.b_entity.*" pageEncoding="utf-8"%>
<%--导入标签库 --%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
    <title>核心标签库</title>  
  </head>
  
  <body>
    <%--使用标签 --%>
    <%--set标签 :保存数据(保存到域中)默认保存到page域 --%>
    <c:set var="name" value="rose" scope="request"></c:set>

	<%--等同:pageContext.setAttribute("name","rose");%--> 

    <% 
    	String msg = null;
    	pageContext.setAttribute("msg",msg);
     %>
    
    ${msg }
    <br/>
    <%--out标签: 获取数据(从域中) 
    default: 当value值为null时,使用默认值
    escapeXml: 是否对value值进行转义,false,不转义,true,转义(默认)
    --%>
    <c:out value="${msg}" default="<h3>标题3</h3>" escapeXml="true"></c:out>
			default:里面没有转义就当做标签处理,转义了就当做文本处理。
    <hr/>
    
    <%--if标签 :单条件判断 没有else--%>
    <c:if test="${!empty msg}">
    	条件成立
    </c:if>
    
    <hr/>
    <%--choose标签+when标签+otherwirse标签: 多条件判断 --%>
    <c:set var="score" value="56"></c:set>
    
    <c:choose>
    	<c:when test="${score>=90 && score<=100}">
    		优秀
    	</c:when>
    	<c:when test="${score>=80 && score<90}">
    		良好
    	</c:when>
    	<c:when test="${score>=70 && score<80}">
    		一般
    	</c:when>
    	<c:when test="${score>=60 && score<70}">
    		及格
    	</c:when>
    	<c:otherwise>
    		不及格
    	</c:otherwise>
    </c:choose>
    
    <%-- forEach标签:循环 --%>
    <%
    	//List
     	List<Student>  list = new ArrayList<Student>();
     	list.add(new Student("rose",18));
     	list.add(new Student("jack",28));
     	list.add(new Student("lucy",38));
     	//放入域中
     	pageContext.setAttribute("list",list);
     	
     	//Map
     	Map<String,Student> map = new HashMap<String,Student>();
     	map.put("100",new Student("mark",20));
     	map.put("101",new Student("maxwell",30));
     	map.put("102",new Student("narci",40));
     	//放入域中
     	pageContext.setAttribute("map",map);
     %>
     <hr/>
     <%--
      begin="" : 从哪个元素开始遍历,从0开始.默认从0开始
      end="":     到哪个元素结束。默认到最后一个元素
      step="" : 步长    (每次加几)  ,默认1
      items="": 需要遍历的数据(集合) 
      var="": 每个元素的名称 
      varStatus="": 当前正在遍历元素的状态对象。(count属性:当前位置,从1开始)
      
     --%>
	<%-- <c:forEach begin="0" end="2" step="2" items="${list}" var="student" varStatus="varSta">   考虑选择奇偶性--%>
    <c:forEach items="${list}" var="student" varStatus="varSta">
    	序号:${varSta.count} - 姓名:${student.name } - 年龄:${student.age}<br/>
    </c:forEach>
    
    <hr/>
    
    <c:forEach items="${map}" var="entry">
    	${entry.key } - 姓名: ${entry.value.name } - 年龄:${entry.value.age }<br/>
    </c:forEach>
    <hr/>
    <%-- forToken标签: 循环特殊字符串 --%>
    <%
    	String str = "java-php- net-平面";
    	pageContext.setAttribute("str",str);
     %>
    
    <c:forTokens items="${str}" delims="-" var="s">
    	${s }<br/>
    </c:forTokens>
    
    <%--redrict:重定向 --%>
    <c:redirect url="http://www.baidu.com"></c:redirect>
    
  </body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值