context root相关问题和过滤器的映射地址问题

context root相关问题和过滤器的映射地址问题

老师好,问几个问题:1.设置项目的context root为“/"为什么request.getContextPath();和request.getServletContext().getContextPath()都得到空字符串而ServletContextListener监听器的实现类中System.out.println(sce.getServletContext().getContextPath());还能得到项目名?2.过滤器的映射地址设置为"/",讲师说"过滤器的映射地址设置为/,只对servlet生效。",为什么我在项目中并不能过滤任何一个Servlet类的映射地址设置为“/xxservlet”的Servlet,而只能过滤Servlet类的映射地址设置为"/"的Servlet类。这句话的理解是什么?

正在回答

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

5回答

同学你好,测试贴出代码,结果以及建议如下:

    1、测试代码,监听器输出内容,并没有输出两遍,比如:

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

如上所示,只输出了一次,并没有多次输出,同学用的是什么版本的呐,换一个再来试试。

    2、在过滤器中,一个是使用了System.err.println输出形式,会在控制台中输出红色内容,另一个在过滤器中,只有一个输出语句,并没有什么实质拦截内容,所以程序会继续向下执行,但是输出语句还是会执行的,例如:

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

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

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

  • qq_酒半熏_0 提问者 #1
    感谢老师们的回答,就我上面回答贴出的代码来说,1.tomcat v8.5,jdk1.8.0,eclipse Version: 2020-03 (4.15.0)。为什么会打印两次信息呢,几个项目都是这样。2.为什么项目一启动浏览器没有请求,过滤器中doFilter会执行一次,输出打印信息。3.项目的context root设置为/,过滤器的映射地址设置为/,慕阿满老师回答此过滤器可以过滤所有servlet,可是我的TestServlet的映射地址为/testServlet,浏览器直接访问localhost:8080/testServlet为什么没有过滤,如果过滤了过滤器应该会打印输出信息,而且我给过滤器的chain.doFilter(request,response)注释了,请求应该不会转到TestServlet类上啊,TestServlet类更不会响应结果,在浏览器上也不会显示信息,可我浏览器访问localhost:8080/testServlet会有TestServlet类响应浏览器的信息啊,我哪里的理解有问题,是过滤器设置为/,拦截的是映射地址为/的Servlet类,还是拦截的是映射地址为/a、/b、/c等Servlet类,还是我对过滤器的doFilter(request,response,chain)方法理解有误,对chain.doFilter(request,response)理解有误?
    2020-06-20 08:13:48
  • 好帮手慕小班 回复 提问者 qq_酒半熏_0 #2
    同学你好,看同学提出这个问题挺长时间没解决了,并且同学的问题老师并没有复现出来,老师需要要详细了解一下细节,同学可以查看一下自己的私信。 继续加油 祝:学习愉快~
    2020-06-20 11:50:13
提问者 qq_酒半熏_0 2020-06-18 19:39:02

老师帮忙看看,目录结构:http://img1.sycdn.imooc.com//climg/5eeb4f790972816102970396.jpg

context root设置:http://img1.sycdn.imooc.com//climg/5eeb4f8f0935808805710448.jpg

监听器ContextListener.java代码:

package com.jiubx.web;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ContextListener implements ServletContextListener{

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		System.out.println("test项目的监听器:"+sce.getServletContext().getContextPath());
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		
	}

}

过滤器LoginFilter.java代码:

package com.jiubx.web;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class LoginFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.err.println("loginFilter过滤器!");
//		chain.doFilter(request, response);
		

	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

}

Servlet类TestServlet.java代码:

package com.jiubx.web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestServlet
 */
@WebServlet("/testServlet")
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TestServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=UTF-8");
		response.getWriter().println("拦截我?");
	}
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

web.xml代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>test</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <listener>
  	<listener-class>com.jiubx.web.ContextListener</listener-class>
  </listener>
  
  <filter>
  	<filter-name>loginFilter</filter-name>
  	<filter-class>com.jiubx.web.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>loginFilter</filter-name>
  	<url-pattern>/</url-pattern>
  </filter-mapping>
  
  
</web-app>

老师我运行的效果图:

监听器输出两次信息:第一次ContextPath为空,第二次为项目名。

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


浏览器直接访问localhost:8080/testServlet能够出现响应结果:

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

过滤器的映射地址为/,不能拦截/testServlet啊,

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

过滤器代码如上,如果拦截到了控制台会输出loginFilter过滤器,而且浏览器发出的请求也不会提交到Servlet类上去吧,那么Servlet类更不会响应结果显示在浏览器上啊。



好帮手慕阿满 2020-06-18 10:22:34

同学你好,根据同学的描述重新测试,只输出了一次监听器并且没有输出项目名,如:

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

问一下同学tomcat下是否加载了多个项目,在其他地方是否有输出。

2、拦截的所有的servlet。

祝:学习愉快~

  • 提问者 qq_酒半熏_0 #1
    1.老师我新建了一个web项目,tomcat服务器中只部署了一个web项目,设置context root为/,监听器还是会输出两次信息啊,第一次为空,第二次是项目名。2.过滤器的映射地址为/,同样还是不能拦截到/testServlet这个Servlet类啊?老师你看下我代码吧
    2020-06-18 19:26:20
提问者 qq_酒半熏_0 2020-06-18 07:48:58

老师好,1问题.http://img1.sycdn.imooc.com//climg/5eeaa96e090493c503940366.jpg

public void contextInitialized(ServletContextEvent sce) {	
		System.out.println("监听器:"+sce.getServletContext().getContextPath());//打印的上下文路径
}

代码位置图:

http://img1.sycdn.imooc.com//climg/5eeaa9fd0940ed6f09040208.jpg运行结果:有两个第一个是,第二个是项目名

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

2.问题是context root设置为/,Servlet类的映射地址是/loginServlet、/addBookServlet等,过滤器的映射地址设置为/可以拦截上面说的Servlet类吗?还是说拦截的是映射地址设置为/的Servlet类?

因为是登陆注册功能最后的作业代码很多就没有复制了。


好帮手慕阿满 2020-06-17 19:00:56

同学你好,关于同学的问题:

1、这个测试,设置上下文路径为/后,监听器中的System.out.println(sce.getServletContext().getContextPath());获取为空。

问一下同学是怎么操作的,建议同学详细描述一下,方便我们根据同学的步骤复现问题。

2、过滤器的映射地址设置为/,只对servlet生效,但是默认首页的会使其失效。同学是否设置了默认首页。建议同学将代码以及项目截图发一下,我们根据同学的代码具体测试一下。

祝:学习愉快~

  • 提问者 qq_酒半熏_0 #1
    老师好,详细描述图在上面我的问答中了,更完整的代码测试老师能否调取我提交的项目文件测试呢?
    2020-06-18 07:53:04
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星

相似问题

登录后可查看更多问答,登录/注册

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

在线咨询

领取优惠

免费试听

领取大纲

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