我有SampleServlet
类,其中我已覆盖doGet()
方法,如下所示
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
String userid = (String)request.getServletContext().getInitParameter("userid");
out.print("Name = " + name + "<br>");
out.print("User id= " + userid+ "<br>");
}
在我的Web.xml
中,我添加了上下文参数,如下所示,
<context-param>
<param-name>userid</param-name>
<param-value>ABC12345</param-value>
</context-param>
我使用request.getServletContext().getInitParameter("userid");
语句来访问该参数。request.getServletContext().getInitParameter("userid");
它的工作正常。但getServletContext().getInitParameter("userid");
和request.getServletContext().getInitParameter("userid");
之间是否有任何区别两者都给我相同的输出,但我对这两者没有正确的认识。
答案 0 :(得分:7)
getServletContext()
。那是因为HttpServlet基类定义了这个方法。
request.getSession().getServletContext()
返回的ServletContext与getServletContext()
相同.HttpSession包含对此会话所属的ServletContext的引用。
只要你的代码在servlet类中,就可以使用任何东西,因为两者都可以被调用。
如果您有一个不扩展servlet的自定义类,并且您需要传递会话对象以在该自定义类中处理它。当您有对该会话的引用时,您可以访问{{1使用方法ServletContext
。
答案 1 :(得分:1)
答案 2 :(得分:1)
尝试直接调用getInitParameter(“userId”)而不需要request.getServletConfig()
有效。原因是继承。您的servlet类是javax.servlet的子类。 GenericServlet 及其公共方法也可供您的类访问。它有以下方法
@Override
public String getInitParameter(String name) {
return getServletConfig().getInitParameter(name);
}
请求对象也有访问器来获取servletConfig,通过使用它,我们可以访问getInitParameter方法。
它最终访问GenericServlet类的private transient ServletConfig config
变量来获取ServletContext对象。
这就是你能够访问getServletContext()的原因.getInitParameter(“userid”);不使用“请求”参数。
PS:代码来自apache-tomcat源代码。通过它,你会更清晰。
答案 3 :(得分:0)
两种方法都提供对同一对象的访问。
当你写getServletContext().getInitParameter("userid");
时,方法左边有一个隐含的this
。这意味着您正在使用GenericServlet类中的方法。
答案 4 :(得分:0)
基本上它是一样的。但是如果你使用request.getSession()。getServletContext(),你将在实际不需要时创建一个会话。