在jsp开发中,为什么使用getServletContext()方法代替隐含对象application?

有比较多的方法可以调出ServletContext,哪一种方式更好些?
这是偶然,还是使用这种方法有更多的好处?
见下面代码:

<%@ page import="mypack.*" %>
<%@ page import="java.util.Properties" %>
<%@ page errorPage="errorpage.jsp" %>
<%@ page import="javax.ejb.*, javax.naming.*, javax.rmi.PortableRemoteObject, java.rmi.RemoteException" %>
<%!
    private BookDBEJB bookDB;

    public void jspInit() {

      bookDB =
          (BookDBEJB)getServletContext().getAttribute("bookDB");        // 为什么不直接用application?

      if (bookDB == null) {
        try {
          InitialContext ic = new InitialContext();
          Object objRef = ic.lookup("java:comp/env/ejb/BookDBEJB");
          BookDBEJBHome home = (BookDBEJBHome)PortableRemoteObject.narrow(objRef,
              mypack.BookDBEJBHome.class);
          bookDB = home.create();
          getServletContext().setAttribute("bookDB", bookDB);
        } catch (RemoteException ex) {
            System.out.println("Couldn't create database bean." + ex.getMessage());
        } catch (CreateException ex) {
            System.out.println("Couldn't create database bean." + ex.getMessage());
        } catch (NamingException ex) {
            System.out.println("Unable to lookup home: "+ "java:comp/env/ejb/BookDBEJB."+ ex.getMessage());
        }
      }
    }

   public void jspDestroy() {
      bookDB = null;
   }

 public String convert(String s){
    try{
    return new String(s.getBytes("ISO-8859-1"),"GB2312");
    }catch(Exception e){return null;}
   }


%>
阅读 4.7k
4 个回答

图片描述

没啥好纠结的,就是同一个对象,你在jsp中有application对象,但是你在java后端可能直接引用到application这玩意么,必然要getServletContext()

没搞过JSP, 我直接撸Spring MVC的。尝试解答一下。

Application的作用域大于Servlet。一个JSP应用只有一个Application对象,但可以有许多Servlet。Application.getAttribute是获取全局的信息,而getServletContext().getAttribute是获取当前Servlet的信息。所以两者功能并不相同。

ServletContext在整个web应用中就只有一个,application是隐含的servletContext对象;如果当前Servelt的信息是ServletConfig对象,不知我的理解正不正确

新手上路,请多包涵

楼上的回答都没在点上,有些更是误人子弟的理解……(比如Application.getAttribute是获取全局的信息,而getServletContext().getAttribute是获取当前Servlet的信息。所以两者功能并不相同。)醉了。楼主应该搜一下jsp转为servlet的过程,以及关于<%! %>符号的理解。

有感叹号的这个scriplet语句(<%! …… %>)是用来声明(jsp生成的)servlet类的成员,会增加到servlet类中,并且会至于服务方法之外。而application这个隐式对象是在服务方法里面自动声明的。而服务方法在jspInit方法之后,所以在jspInit里面要用servletContext这个对象只能通过getServletContext得到,因为这时候容器还没有声明application这个隐式对象。在jsp其他任何地方(除了jspInit方法内),getServletContext和application是完全等价的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进