tomcat可以发布,但是有404错误,找了很久,问题不知道在哪里

tomcat可以发布,但是有404错误,找了很久,问题不知道在哪里

public class GlobalController extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        /**
            .do
            /login.do               DefaultController login
            /Cake/detail.do         CakeController    detail
            /admin/Cake/add.do      CakeController    add
         */
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;
        String path = request.getServletPath();
        if (path.indexOf("/admin")!=-1){
            path = path.substring(7);
        }else {
            path = path.substring(1);
        }

        /**
         * path = Catalog/list.do
         * path = 以下一种
             login.do               DefaultController login
             cake/detail.do         CakeController    detail
             Cake/add.do      CakeController    add
         */
        int index = path.indexOf("/");//indexof,判断是否包含 (index!=-1) 意思为包含
        String className = null;
        String methodName = null;
        if (index!=-1){
            className = "com.imooc.icake.controller."+path.substring(0,index)+"Controller";
            methodName = path.substring(index+1,path.indexOf(".do"));
        }else{
            className = "com.imooc.icake.controller.DefaultController";
            methodName = path.substring(0,path.indexOf(".do"));
        }

        try {
            Class cla = Class.forName(className);
//            Object object = cla.getDeclaredConstructor(int.class).newInstance();
            Object object = cla.newInstance();
            Method method = cla.getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
            method.invoke(object,request,response);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}
public class CatalogController {

    private CatalogBiz catalogBiz = new CatalogBizImpl();
    /**
     * /admin/Catalog/list.do
     * /admin/Catalog/toAdd.do
     * /admin/Catalog/add.do
     * /admin/Catalog/remove.do
     */

    //   /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 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 IOException {
        int id = Integer.parseInt(request.getParameter("id"));
        catalogBiz.remove(id);
        response.sendRedirect("list.do");
    }
}


正在回答

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

6回答

同学你好,建议同学再如下位置处再输出一下path,查看是否有值。另外建议同学在获取path的位置处打上断点,使用debug启动项目,查看是否有执行到该位置。

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

如果控制台有报错,建议同学将报错贴一下。

祝:学习愉快~

  • 慕码人5437048 提问者 #1
    问题已解决,我用的是java13,过滤器运行不了,改成java8之后就可以了 非常感谢
    2019-11-14 08:41:31
提问者 慕码人5437048 2019-11-13 16:45:42

有的,xml的配置是这样的

<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>com.imooc.icake.global.EncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>GlobalServlet</servlet-name>
        <servlet-class>com.imooc.icake.global.GlobalController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>GlobalServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>


</web-app>


好帮手慕阿满 2019-11-13 16:42:00

同学你好,问一下同学再web.xml中有如下配置吗?

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

将所有.do的请求跳转到GlobalController中。

祝:学习愉快~

  • 提问者 慕码人5437048 #1
    有的,这是当前的xml <?xml version="1.0" encoding="UTF-8" ?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <filter> <filter-name>encoding</filter-name> <filter-class>com.imooc.icake.global.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>GlobalServlet</servlet-name> <servlet-class>com.imooc.icake.global.GlobalController</servlet-class> </servlet> <servlet-mapping> <servlet-name>GlobalServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
    2019-11-13 16:44:13
好帮手慕阿满 2019-11-13 15:43:32

建议同学在如下位置处输出一下path,重启项目访问,然后查看控制台是否有输出呢?

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

另外建议同学将报404的错误页面截图贴一下。

祝:学习愉快~

  • 提问者 慕码人5437048 #1
    加了System.out.println(path);控制台居然没有输出 另外404页面是这的 HTTP Status 404 – 未找到 Type Status Report 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。 Apache Tomcat/9.0.27
    2019-11-13 15:52:58
  • 提问者 慕码人5437048 #2
    这个问题我调试了两天了,还没进展,麻烦啦
    2019-11-13 15:56:31
好帮手慕阿满 2019-11-13 15:35:19

同学你好,问一下同学使用的IDEA吗?在Application context中是否有些项目名呢?

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

如果有写项目名,访问路径中也需要加上项目名。

祝:学习愉快~

  • 提问者 慕码人5437048 #1
    没有项目名称,跟你的截图一样,只有/
    2019-11-13 15:37:24
  • 提问者 慕码人5437048 #2
    用的是idea
    2019-11-13 15:41:14
提问者 慕码人5437048 2019-11-13 10:49:36

输入的网页是:http://localhost:8080/admin/Catalog/list.do

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

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

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

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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