有人可以请我解释这个java代码。我觉得很难理解。
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String firstName = request.getParameter("firstName").toString();
processRequest(request, response);
}
所以request是接口类HttpServletRequest的一个对象,它有一些空方法。
但如果方法getParameter()为空,它如何返回任何数据。
而且,我无法在HttpServletRequest接口中找到getParameter()。但是它不应该是一个,因为请求被声明为HttpServletRequest并因此拥有它的所有方法和字段吗?
哪个类来自toString()来自。
答案 0 :(得分:2)
所以HttpServletRequest是一个接口。接口声明实现类的实现方法。在这种情况下,您的servlet容器将为您提供实现(取决于您使用的是:Tomcat,Jetty等)。请记住,接口也可以相互扩展。在这种情况下,HttpServletRequest扩展了ServletRequest。您应该查看ServletRequest以了解其他方法。
为了清楚起见,HttpSerlvetRequest的方法不是“空”。已经由容器实现,所以当容器调用上面的方法时,它传递给你的对象是碰巧实现HttpServletRequest接口的完整对象。这就是你可以这样投射它们的原因。
编辑:toString()方法来自java.lang.Object class。这是所有java对象的基类。
答案 1 :(得分:2)
@ noname,@ darren很好地回答了你的问题,但是你的问题表明你需要解释更为基本的问题。所以......
request
是实现HttpServletRequest
的类的对象。当我们看到declaration of HttpServletRequest时,我们会看到:
public interface HttpServletRequest extends ServletRequest {
说一个类implements
一个接口,或一个接口extends
另一个接口,可以用更强的人工术语表达为 IS A 。因此,request
是是A HttpServletRequest
的类的对象,是A ServletRequest
。一路沸腾:
request
是A ServletRequest
。
这意味着可以为ServletRequest
对象调用任何request
声明的方法,the declaration of ServletRequest包含:
public String getParameter(String name);
这就是为什么我们可以致电request.getParameter(someString)
。
你说:
哪个类有它们 方法?我必须知道这一点 信息能够编码和 知道怎么想。
但那不对。您不需要知道哪个特定类包含该方法的实现,您将逐渐理解这一点。它是一种抽象,抽象是编程的核心;它就是所有权力所在。您发布的doPost()
方法可以接受 ANY HttpServletRequest
作为参数,而明确知道哪个实现已经传入 - 它只知道无论如何传入将遵循HttpServletRequest
接口。有一次可以使用来自库的类的请求调用它;下一次可以通过不同的请求调用它,来自您自己编写的课程。这就是为什么doPost()
可以在不同的环境中使用的原因;这才是它的强大之处。
答案 2 :(得分:1)
1)HttpServletRequest
继承自ServletRequest
方法的接口getParameter()
。
2)当Java方法将接口列为参数类型时,实现该接口的对象必须作为参数传入。该对象将具有实现getParameter()
的代码,而不是您在界面中看到的“空方法”。 (例如,一个这样的对象是HttpServletRequestWrapper
。)
所有这些信息都可以在JavaDocs中找到,例如:
答案 3 :(得分:1)
该方法不接受接口类型“HttpServletRequest”的对象。相反,它接受任何实现该接口的对象。类实现接口的方式是为接口所说的方法提供实现(即代码)。
例如,假设我们有一个狗的接口
interface Dog {
public String bark();
}
对于任何给定的类来实现该接口,它必须提供它自己的bark()版本。每个类都以最有意义的方式实现该方法。
class GoldenRetriever implements Dog {
public String bark() {
return "Woof!";
}
}
class YippyDog implements Dog {
public String bark() {
return "yip";
}
}
编辑评论:
当实际使用bark()命令时,你会编写一个方法,它接受任何实现Dog接口的类作为输入:
public dodog(Dog mydog) {
System.out.println(mydog.bark());
}
然后,您可以通过创建实现Dog Interface
的任何类型的Object来使用该方法public void usedog() {
GoldenRetriever golden = new GoldenRetriever();
dodog(golden);
YippyDog yippy = new YippyDog();
dodog(yippy);
}
dodog方法接受这两者,因为它们都是实现Dog接口的Class的实例。然后它可以调用bark()方法,因为它知道它们实现了它...因为它们实现了Dog接口。
我希望更清楚。