为什么核心控制器这样写报错?
package com.imooc.sm.global;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@WebServlet(name = "DispatcherServlet")
public class DispatcherServlet extends HttpServlet {
private ApplicationContext context;
public void init() throws ServletException {
super.init();
context = new ClassPathXmlApplicationContext("spring.xml");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.service(req, resp);
/**Servlet核心控制器需要处理的请求url
* /staff/add.do login.do
* staffController
* public void add(HttpServletRequest request,HttpServletResponse response){
*
* }
*/
String path = req.getServletPath().substring(1);
String beanName = null;
String methodName = null;
int index = path.indexOf('/');
if (index != -1) {
beanName = path.substring(0,index)+"Controller";
methodName = path.substring(index+1,path.indexOf(".do"));
}else {
beanName = "selfController";
methodName = path.substring(0,path.indexOf(".do"));
}
Object obj = context.getBean(beanName);
try {
Method method = obj.getClass().getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
method.invoke(obj,req,resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
老师,为什么我直接让Servlet继承HTTPServlet会报反射405的错误,但是按照老师那样写就不会报错呢??这个把request和response
强转为Http类型的和直接使用HttpServlet的request对象在反射的时候有什么不同呢???正在回答

这个是HttpServlet中可以重写的方法,同学可以看到通过传参的不同,重载的方法也是不同的。
反射失败应该和这个也有关系,建议同学按照老师的方法,选择底下的方法,ServletRequest和ServletResponse为参数的方法。
void service(ServletRequest, ServletResponse)方法是重写的其父类GenericServlet类的方法,这个方法是公共的(public),其作用是接受客户端的请求并将其传递给protected void service(HttpServletRequest, HttpServletResponse)方法;
protected void service(HttpServletRequest, HttpServletResponse)方法是HttpServlet类定义的方法,是受保护的(protected),主要作用是接受标准的Http请求(HttpServletRequest),并根据请求方式不同分发到不同的doXXX(HttpServletRequest, HttpServletResponse)方法
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
将你的代码粘贴到老师的源码中,会出现下图报错,我测试了老师的源码,即使继承HttpServlet也是不会报错,建议同学将你的报错提示粘贴一下,方便我们具有针对性的为你解答,祝学习愉快~

同学问的是下图代码吗?为什么要强转成HttpServletRequest和HttpServletResponse类型的。

如果是,你可以参考一下这个被采纳的问答,如果还有问题,可以继续提问哦,祝学习愉快~
http://class.imooc.com/course/qadetail/74259
- 参与学习 人
- 提交作业 205 份
- 解答问题 4317 个
Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星