jsp九大默认对象

来源:互联网 发布:淘宝店铺名怎么取 编辑:程序博客网 时间:2024/05/20 22:35


详细请见: www.sky8848.cn/post/jspobj.html

在jsp中定义类变量

写在<%%>之间的代码,在转换成servlet之后都会service()方法内运行,所以我们不必担心出现上边this.username的问题。

但是我们可以用<%!%>(注意多出来的感叹号)定义类变量或类方法,把上一个罪大恶极的servlet改造成jsp的话,就像这样。

<%@ page contentType="text/html; charset=gb2312"%><%! String username;%><% this.username = request.getParameter("username"); try { Thread.sleep(10000); } catch(InterruptedException ex) { } out.write(this.username);%>

注意

使用其例子可以测试jsp出错的效果,记得要在10秒之内点击两次。

<%!%>似乎是一个巨大的陷阱,如果我们使用它定义类变量就一定会出现多线程错误。

不过凡事都有正反两面,当我们需要在jsp中定义一个通用方法时,就需要借助<%!%>的力量了,假设我们需要一个方法,根据用户的性别显示不同的html内容,如果sex = 0就输出红色的“男”,如果sex = 1就输出绿色的“女”。为实现这个功能,我们可以定义一个sexRenderer()方法。

index.jsp页面显示效果如下:

jsp九大默认对象 - 达呈·博林 - 达呈·博林

index.jsp中的代码分两部分。

第一部分定义sexRenderer()方法和

<%! public String sexRenderer(int sex) { if (sex == 0) { return "<span style='color:red;'>男</span>"; } else if (sex == 1) { return "<span style='color:green;'>女</span>"; } else { return ""; } }%>

第二部分循环显示保存了性别信息的数组,显示的时候将会调用sexRenderer()方法。

<% int[] people = {0, 1, 1, 0}; for (int i = 0; i < this.people.length; i++) {%> <tr> <td><%=this.sexRenderer(this.people[i])%></td> </tr><% }%>

好的,现在我们知道可以在<%!%>中定义方法和变量了。但是同时也要了解的是<%!%>已经脱离了service()方法,这就导致不能在它里边使用request,response这些默认变量了,如果想要调用request只能写成void doSomething(HttpServletRequest request)的形式了,稍微注意一下即可。

jsp九大默认对象

分别是request, response, out, pageContext, session, application, page, config, exception。

让我们看看它们与servlet中变量的对应关系。

首先要明确的是,这九个变量都只在<%%>中有效,<%!%>中是无法调用这九个对象的。实际上<%%>最后会成为service()方法中的代码,我们这里就看看如何在service()方法中获得这些对象吧。



  1. request

    public void service(ServletRequest req, ServletResponse res) { HttpServletRequest request = (HttpServletRequest) req;}

    jsp中的request就是service()中传入的req参数,因为service中定义的是ServletRequest类型,我们还需要转换成HttpServletRequest类型。


  2. response

    public void service(ServletRequest req, ServletResponse res) { HttpServletResponse response = (HttpServletResponse) res;}

    与上例相同,response也是service()中传入的res参数。


  3. out

    Writer out = response.getWriter();

    out对应着从response中取出的writer对象,负责向响应中输出数据。不过jsp和servlet中的out还是有一点区别,虽然它们都实现了java.io.Writer接口,但servlet中实际类型是java.io.PrintWriter,而jsp中实际类型是javax.servlet.jsp.JspWriter。


  4. pageContext

    这是jsp独有的,servlet里没有page的概念。


  5. session

    HttpSession session = request.getSession();

    直接从request中获得会话。


  6. application

    ServletConext application = getServletConfig().getServletContext();

    可以通过servletConfig获得ServletContext,这是整个web应用共享的一个对象。


  7. page

    Object page = this;

    page就代表当前jsp对象,也可以直接使用this引用。


  8. config

    ServletConfig config = getServletConfig();

    这是在servlet初始化时由服务器传入的对象,可以通过它获得web.xml中定义的初始化参数。

  9. l black', 'avant garde';">

    exception

    想在jsp中使用这个对象需要满足一些条件了。

    首先我们要在14-05/index.jsp中故意抛出一个异常。

    <%@ page contentType="text/html; charset=gb2312" errorPage="error.jsp"%><% String str = null; str.length();%>

    str值是null,直接在null上调用length()方法会引发NullPointerException,然后我们可以看到页面第一行使用jsp指令(directive)设置了errorPage="error.jsp",这样在出现异常的时候就会自动forward到error.jsp中。现在看看error.jsp中有些什么。

    <%@ page contentType="text/html; charset=gb2312" isErrorPage="true"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>index</title> </head> <body> <%=exception%> </body></html>

    最主要的是在jsp指令(directive)中设置isErrorPage="true",这样我们就可以在jsp中使用exception对象了,实际上这个异常是从request中取出来的。


到此为止,jsp九大默认对象已经讲解完毕,其中常用的还是四个作用域对应的对象,其他的了解即可。

 

原创粉丝点击