一个路径问题

一个路径问题

老师原来的代码中department是小写的

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

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

而我的路径里的User首字母是大写的,为什么呢,附上核心控制器代码:

package com.imooc.hospital.global;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class DispatcherServlet extends GenericServlet {
    //访问IOC容器,创建Application对象
    private ApplicationContext context;

    public void init() throws ServletException {
        //采用init方法,在初始化阶段赋值
        super.init();
        context = new ClassPathXmlApplicationContext("spring.xml");

    }

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        /*servletRequest无法拿到请求路径,所以需要强制转化
         * */
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        /*
         * 访问路径:
         *  staff/add.do      /login.do
         *  staff的控制器   beanName=staffController
         *  具体方法:这里的add和上门要对应
         *  public void add(HttpServletRequest request, HttpServletResponse response){}
         * */
        //h获取用户请求的url,因为是分段截取,这里去掉根路径,所以是substring(1)
        String path = request.getServletPath().substring(1);
        //现在需要获取IOC容器中bean的名字和获取请求的方法名
        String beanName = null;
        String methodName = null;
        //现在判断路径中的“/”
        int index = path.indexOf('/');
        System.out.println("创建成功");
        //if (index!=-1)的格式为:staff/add.do
        if (index != -1) {
            //从/开始截取到index结束 注意实际上beanName的后面有一个Controller,所以在后边带上Controller
            //这里的index相当于staff
            String path1 = path.toLowerCase();
            beanName = path1.substring(0,index) + "Controller";
            //方法名从staff/后面开始截取,一直截取到.do
            methodName = path.substring(index + 1, path.indexOf(".do"));
        } else {
            //第二种情况/login.do 特殊模块没有根路径
            beanName = "selfController";
            //因为没有根路径,直接从头截取
            methodName = path.substring(0, path.indexOf(".do"));

        }
        //根据beanName获取对象
        Object obj = context.getBean(beanName);
        //获取方法
        try {
            Method method = obj.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);

            //调用invoke方法进行反射,第一个是method方法的对象,然后再把参数传入
            method.invoke(obj, request, response);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

我得要在截取Controller前将路径改为小写才能运行,但后面还是会有很多的路径问题,所以想问一下

正在回答 回答被采纳积分+1

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

5回答
一叶知秋519 2018-08-31 14:48:41

同学这个地方配置了两个路径:

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

科室分类管理:点击链接以后进入的是CategoryController,但是根据你上面贴出来的代码:

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

CategoryController类通过@Controller注入类型名称为categoryController,所以同学需要将链接改为:   ../category/list.do 再跳转的时候就可以正常跳转了。

科室管理:如果DepartmentController的注解为@Controller("departmentController"),那么链接应该改为  ../department/list.do  

建议同学根据上面的思路,将所有设置链接的地方进行检查修改。

祝学习愉快!

  • 提问者 error__404 #1
    可是,我按我这样做也是可以跳转的,这是为什么
    2018-08-31 15:29:32
  • 一叶知秋519 回复 提问者 error__404 #2
    同学是说按照你的这种书写格式也可以访问到数据,后台没有报错?
    2018-08-31 17:11:49
提问者 error__404 2018-08-31 14:19:07

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

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

但路径会是大写的,所以我在核心控制器里这样获取beanname:

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

先转化为小写的,再传给beanName,这样就不会出现找不到的现象

好帮手慕珊 2018-08-31 09:51:58

同学,看一下你的Controller是怎么设置的,例如下面的代码,前面的department的d是大写的吗?

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

祝学习愉快!

提问者 error__404 2018-08-30 19:24:25

登陆过滤器是这个:
package com.imooc.hospital.global;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        String path = request.getServletPath();
        if (path.toLowerCase().indexOf("login")!=-1){
            //放行
            filterChain.doFilter(request,response);
        }else {
            HttpSession session = request.getSession();
            Object obj = session.getAttribute("USER");
            //已经登陆的放行
            if (obj!=null){
                filterChain.doFilter(request,response);
            }else {
                //未登陆的跳转回登陆界面
                //.do可能会有问题,使用绝对路径
                response.sendRedirect(request.getContextPath()+"/toLogin.do");
            }
        }
    }

    @Override
    public void destroy() {

    }
}
另外,我也有像老师一样做了一个初始页面

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

这样就能成功跳转,但老师的页面是用小写的,而我的是大写的,我不太懂为什么会有这种区别,而且我的需要通过../来返回上级才能从User/路径里跳出来,不然会形成User/category/list.do这种错误路径

一叶知秋519 2018-08-30 17:51:33

老师的源码中访问的是

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

这个路径进入了DispatcherServlet中配置的默认Controller,也就是selfController;和同学的访问路径还是有所不同的~

同学贴出的本地路径是从哪个地方跳转过来的呢?如果是通过登录过滤器跳转过来的,建议同学把你的登录过滤器的代码贴一下,方便根据代码排查问题~

另外:老师的源码中有一个left.jsp配置了左边链接的访问路径,即:

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

配置了访问路径department小写;建议同学根据以上思路检查一下访问路径配置的地方,看是不是有笔误写成了首字母大写呢~

祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
SSM主流框架入门与综合项目实战2018版
  • 参与学习           人
  • 提交作业       205    份
  • 解答问题       4317    个

Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!

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

在线咨询

领取优惠

免费试听

领取大纲

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