一个路径问题
老师原来的代码中department是小写的


而我的路径里的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
同学这个地方配置了两个路径:

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

CategoryController类通过@Controller注入类型名称为categoryController,所以同学需要将链接改为: ../category/list.do 再跳转的时候就可以正常跳转了。
科室管理:如果DepartmentController的注解为@Controller("departmentController"),那么链接应该改为 ../department/list.do
建议同学根据上面的思路,将所有设置链接的地方进行检查修改。
祝学习愉快!


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

先转化为小写的,再传给beanName,这样就不会出现找不到的现象
登陆过滤器是这个:
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() {
}
}
另外,我也有像老师一样做了一个初始页面
这样就能成功跳转,但老师的页面是用小写的,而我的是大写的,我不太懂为什么会有这种区别,而且我的需要通过../来返回上级才能从User/路径里跳出来,不然会形成User/category/list.do这种错误路径
- 参与学习 人
- 提交作业 205 份
- 解答问题 4317 个
Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!
了解课程



恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星