context root相关问题和过滤器的映射地址问题
老师好,问几个问题:1.设置项目的context root为“/"为什么request.getContextPath();和request.getServletContext().getContextPath()都得到空字符串而ServletContextListener监听器的实现类中System.out.println(sce.getServletContext().getContextPath());还能得到项目名?2.过滤器的映射地址设置为"/",讲师说"过滤器的映射地址设置为/,只对servlet生效。",为什么我在项目中并不能过滤任何一个Servlet类的映射地址设置为“/xxservlet”的Servlet,而只能过滤Servlet类的映射地址设置为"/"的Servlet类。这句话的理解是什么?
正在回答
同学你好,测试贴出代码,结果以及建议如下:
1、测试代码,监听器输出内容,并没有输出两遍,比如:
如上所示,只输出了一次,并没有多次输出,同学用的是什么版本的呐,换一个再来试试。
2、在过滤器中,一个是使用了System.err.println输出形式,会在控制台中输出红色内容,另一个在过滤器中,只有一个输出语句,并没有什么实质拦截内容,所以程序会继续向下执行,但是输出语句还是会执行的,例如:
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
老师帮忙看看,目录结构:
context root设置:
监听器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为空,第二次为项目名。
浏览器直接访问localhost:8080/testServlet能够出现响应结果:
过滤器的映射地址为/,不能拦截/testServlet啊,
过滤器代码如上,如果拦截到了控制台会输出loginFilter过滤器,而且浏览器发出的请求也不会提交到Servlet类上去吧,那么Servlet类更不会响应结果显示在浏览器上啊。
老师好,1问题.
public void contextInitialized(ServletContextEvent sce) { System.out.println("监听器:"+sce.getServletContext().getContextPath());//打印的上下文路径
}
代码位置图:
运行结果:有两个第一个是,第二个是项目名
2.问题是context root设置为/,Servlet类的映射地址是/loginServlet、/addBookServlet等,过滤器的映射地址设置为/可以拦截上面说的Servlet类吗?还是说拦截的是映射地址设置为/的Servlet类?
因为是登陆注册功能最后的作业代码很多就没有复制了。
- 参与学习 人
- 提交作业 676 份
- 解答问题 9666 个
本阶段将从前端网页搭建入手,到Java Web基础,前后端结合助你完成Java Web小白的蜕变!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星