关于程序跳转的问题

关于程序跳转的问题

CatalogController类中的add()方法和remove()方法最后都是跳转到“list.do”,难道这个跳转不需要经过GlobalController核心控制类吗?如果经过此核心控制类,这种写法又如何能提取到正确的类名和方法名呢?请老师解释一下。

public class CatalogController {
   private CatalogBiz catalogBiz = new CatalogBizImpl();

   //  /admin/Catalog/list.do
   public void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       Catalog root = catalogBiz.getRoot();
       request.setAttribute("root", root);
       request.getRequestDispatcher("/WEB-INF/pages/admin/catalog_list.jsp").forward(request, response);
   }

   //  /admin/Catalog/toAdd.do
   public void toAdd(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       Catalog root = catalogBiz.getRoot();
       request.setAttribute("root", root);
       request.getRequestDispatcher("/WEB-INF/pages/admin/catalog_add.jsp").forward(request, response);
   }

   //  /admin/Catalog/add.do
   public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       String[] titles = request.getParameterValues("title");
       String[] pids = request.getParameterValues("pid");
       String[] infos = request.getParameterValues("info");
       List<Catalog> list = new ArrayList<Catalog>();
       for (int i = 0; i < titles.length; i++) {
           Catalog catalog = new Catalog();
           catalog.setTitle(titles[i]);
           catalog.setPid(Integer.parseInt(pids[i]));
           catalog.setInfo(infos[i]);
           list.add(catalog);
       }
       catalogBiz.add(list);
       response.sendRedirect("list.do");
   }

   //  /admin/Catalog/remove.do
   public void remove(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       String id=request.getParameter("id");
       catalogBiz.remove(Integer.parseInt(id));
       response.sendRedirect("list.do");
   }
}

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好,相对路径可以这样理解:

这里老师如果将重定向的路径设置为response.sendRedirect("/list.do");,表示根路径进行跳转,如:

http://img1.sycdn.imooc.com//climg/5df3608b09cc13c607480111.jpg

则路径的映射地址就会跳转到,根目录下的list.do,是不正确的。

http://img1.sycdn.imooc.com//climg/5df360f9097a09ec03720048.jpg

而这里正确的路径是不需要添加/的,也就是相对路径,表示原本请求路径的同级目录开始构建的路径,原本请求路径为:http://localhost:8080/admin/Catalog/toAdd.do

则在这个路径response.sendRedirect("list.do"); 就表示在这个路径的同级目录/admin/Catalog上进行跳转到list路径。也就是最终的:http://localhost:8080/admin/Catalog/list.do

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

好帮手慕酷酷 2019-12-13 16:07:02

同学你好,这里在进行重定向后,路径中也是含有/admin/Catalog/的,因为这里使用的是相对路径。
具体如下:

http://img1.sycdn.imooc.com//climg/5df345e609559e3c06440113.jpg


http://img1.sycdn.imooc.com//climg/5df3436d0976c1a605450087.jpg

所以经过GlobalController控制类,根据路径判断是否包含 / ,这里包含/ 就会解析匹配CatalogController类中的list方法。

具体如下:

http://img1.sycdn.imooc.com//climg/5df34696094cade909310174.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!


  • 提问者 慕沐8221787 #1
    如何理解这里的相对路径,请解释一下,谢谢!
    2019-12-13 16:40:00
好帮手慕酷酷 2019-12-13 12:41:10

同学你好,这里的跳转是需要经过GlobalController核心控制类的。因为这里在web.xml中,对所有的以 .do结尾的路径进行了拦截,交给GlobalServlet进行处理。

具体如下:

http://img1.sycdn.imooc.com//climg/5df30d5f09049a6707640214.jpg

在GlobalController控制类中,list.do根据路径判断是否包含 /  如果包含,则会匹配CatalogController类,截取list方法名。

具体如下:

http://img1.sycdn.imooc.com//climg/5df346dd09ec00da09180172.jpg

建议同学可以回顾一下2-5《 核心控制器》小节,会更加清晰的理解哦~ 链接如下:

http://class.imooc.com/lesson/521#mid=20847 

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 慕沐8221787 #1
    问题就在于list.do的路径需要CatalogController中的list方法处理,而不是由DefaultController类来处理,这个怎么解释?
    2019-12-13 15:28:18
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java数据库开发与实战应用2018版
  • 参与学习           人
  • 提交作业       277    份
  • 解答问题       4297    个

Java数据库开发的必备技能,从流行的MySQL数据库开始,到Java原生的数据库管理接口JDBC的使用,再到常用的数据持久化框架MyBatis,让你向Java工程师的目标又迈进了一步!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师