jsp教程下,10分钟能学会jsp内置对象,域对象及jsp el表达式,并了解其作用,为什么说10分钟就能学会jsp的这3大知识点呢?因为太简单了,先来看看jsp内置对象,域对象,el表达式的概念及其作用。
jsp内置对象是在jsp页面中能直接拿来用而不需要new的对象就叫jsp内置对象,域对象是用于在jsp页面中能直接取值的对象就叫域对象,前两者都是在jsp页面写java代码,这样会使jsp页面变得很臃肿,所以出现了jsp el表达式,它是网页标签的形式取值,是一种开发标准,代替了域对象取值的方法。
下面的表格你将清晰的了解jsp内置对象和域对象的区别,先看看这个,"Student stu = new Student();",其中Student是对象的类名称,stu代表的就是new后的对象名称,学java的你应该很清楚吧!
对象名称 | 对象类名称 | 描述 |
pageContext | PageContext | page域对象,数据只在当前页面中有效 |
request | HttpServletRequest | request域对象,数据在request中有效 |
session | HttpSession | session域对象,数据在session中有效 |
application | ServletContext | application域对象,数据只要tomcat没关就有效 |
response | HttpServletResponse | response相应对象 |
config | ServletConfig | config配置文件管理对象 |
out | JspWriter | 带缓冲功能的输出对象 |
exception | Throwable | 异常对象(必须设置当前为错误页面时才能使用) |
page | this | 当前对象 |
其中最上面的4个是域对象,其实域对象也就是jsp内置对象,域对象都有一个特点,例如他们都有这两个方法:
//就是可以在jsp页面中设置值到域对象中以及从域对象中取值 对象名称 .setAttribute("name","张三"); 对象名称 .getAttribute("name");
它们的区别是什么呢?就是作用域范围不一样,分别从小到大排列page < request < session < application。
我们先来看看域对象在jsp中是怎么使用的?我们在myeclipse或者eclipse中创建一个web项目,然后新建一个test.jsp页面,写上如下jsp代码,意思就是把值存在各个域对象中,然后用对象名称 .getAttribute("name")方法分别把他们取出来。
<%@ 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>域对象测试</title> </head> <body> <% //分别在域对象中设置域对象的值 pageContext.setAttribute("name", "page张三"); request.setAttribute("name", "request李四"); session.setAttribute("name", "session王五"); application.setAttribute("name", "application李白"); %> <!-- 分别在jsp表达式中取域对象的值 --> <%=pageContext.getAttribute("name") %><br/> <%=request.getAttribute("name") %><br/> <%=session.getAttribute("name") %><br/> <%=application.getAttribute("name") %><br/> </body> </html>
上面页面的tomcat的运行结果分别是:
page张三 request李四 session王五 application李白
这样我们就可以通过域对象获取到各自域对象的值了,那么我们如何用jsp el表达式来获取这些域对象呢?方法很简单,只要把上面的jsp表达式的获取方法改成el表达式就可以获取值了,格式是:域对象+Scope点属性key,这是固定格式,如下。
<%@ 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>域对象测试</title> </head> <body> <% //分别在域对象中设置域对象的值 pageContext.setAttribute("name", "page张三"); request.setAttribute("name", "request李四"); session.setAttribute("name", "session王五"); application.setAttribute("name", "application李白"); %> <%--jsp el表达式的方式获取域对象的值--%> ${pageScope.name}<br/> ${requestScope.name}<br/> ${sessionScope.name}<br/> ${applicationScope.name}<br/> </body> </html>
以上的运行结果是一样的,其实前面的Scope部分是可以省略的,我们可以改成。
${name}<br/>
这样你会问上面的4个改成下面的1个jsp el表达式,省略掉前面的Scope范围,那么输出的结果是什么?结果一定是输出域对象范围最小的那一个,这也是我上面为什么首先说了一下他们范围的大小顺序,结果一定是,最小的那位。。
page张三
那么你又会问了,感觉el表达式在setAttribute部分不是一样不能省略吗?第二是我要输出4个结果,你却给我输出一个结果,怎么回事?
回答:其实在开发中,setAttribute部分是从后台java代码传过来的,jsp页面是不写逻辑处理的,只需要用jsp el表达式在页面取值就好了。第2个问题,在后台开发中,一般不会传给前台几个同样的name给同一个页面的,如果有的话,就要加上域范围的形式了,如上的那样,什么域对象设置的值,就用什么域对象的el表达式取值,这样就不会搞混了。
如果setAttribute("stu",student)设置的是对象作为值和setAttribute("list",list)集合作为值传入该怎么用jsp el表达式在页面中取值呢?方法也很简单,代码如下。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ page import="com.taotao.Student"%> <% 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>域对象测试</title> </head> <body> <% //备注,我新建了一个学生类,里面有两个属性,id和name,如果你们要测试,一定要新建一个学生类。 //将Student对象值通过request域对象传到页面 Student stu = new Student(); stu.setId("1"); stu.setName("域对象从student对象中拿到张三"); request.setAttribute("stu123", stu); //创建第2个学生 Student stu2 = new Student(); stu2.setId("2"); stu2.setName("域对象从list集合中拿到李四"); //将list集合作为值传到页面 List<Student> list = new ArrayList<Student>(); list.add(stu); list.add(stu2); request.setAttribute("list123", list); %> <!--el表达式从request域对象中取出学生姓名 --> ${requestScope.stu123.name}<br/> //因为学生中有getName()方法,el表达式可以直接去掉get,然后N小写,直接.name就可以获取name的属性值 <!--el表达式从request域对象中取出第2个学生的姓名 --> ${requestScope.list123[1].name}<br/> //因为学生中有getName()方法,el表达式可以直接去掉get,然后N小写,直接.name就可以获取name的属性值 </body> </html>
以上代码的输出结果是:
域对象从student对象中拿到张三 域对象从list集合中拿到李四
jsp内置对象,域对象,el表达式就讲到这里,希望你能轻松看懂,并自己新建一个项目测试一下。