了解 Servlet 和 Filter
好了,我已经把环境搭起来了,接下来该干嘛呢?
前面的步骤为的是搭建一个测试的环境,然后让你了解一个最基本的 Java Web 项目的结构。
一个最基本的 Java Web 项目所需的 jar 包只需要一个 servlet-api.jar ,这个 jar 包中的类大部分都是接口,还有一些工具类,共有 2 个包,分别是 javax.servlet 和 javax.servlet.http。我把这个jar包放到了 webapp 目录外的一个独立 packages 文件夹里,这是因为所有的 Servlet 容器都带有这个包,你无需再放到Web项目里,我们放到这里只不过是编译的需要,运行是不需要的。如果你硬是把 servlet-api.jar 放到 webapp/WEB-INF/lib 目录下,那么 Tomcat 启动时还会报一个警告信息。
Java Web 项目还需要一个非常重要的配置文件 web.xml ,在这个项目中已经被我最小化了,只保留有用的信息:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>hello_world</servlet-name>
<servlet-class>demo.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hello_world</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
每个 servlet 都必须在 web.xml 中定义并进行 URL 映射配置,早期 Java 开发 Web 在没有框架满天飞的时候,这个文件会定义了大量的 servlet,或者有人为了省事干脆来一个 /servlet/* 来通过类名直接调用 Servlet。
Servlet 规范里还有另外一个非常重要而且非常有用的接口那就是 Filter 过滤器。
下面是一个最简单的 Filter 类以及相应的定义方法:
package demo;
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;
import javax.servlet.http.HttpServletRequest;
public class HelloFilter implements Filter {
/*
获取web.xml中配置的参数值。getInitParameter()或者getServletContext().getInitParameter()
web.xml中设置(不在filter标签下的配置获取通过FileterConfig.getServletContext().getInitParameter()):
<context-param>
<param-name>xxxx</param-name>
<param-value>xxxxxx</param-value>
</context-param>
或者:(在filter标签外配置的参数名值对,通过FilterConfig.getInitParameter()获取)
<init-param>
<param-name>xxxx</param-name>
<param-value>xxxxxx</param-value>
</init-param>
*/
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("Filter 初始化");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
System.out.println("拦截 URI="+request.getRequestURI());
chain.doFilter(req, res);
}
@Override
public void destroy() {
System.out.println("Filter 结束");
}
}
在 web.xml 中的配置必须放在 Servlet 的前面:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<filter>
<filter-name>helloFilter</filter-name>
<filter-class>demo.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>helloFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>hello_world</servlet-name>
<servlet-class>demo.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hello_world</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
访问 http://localhost:8080/hello 时看看 Tomcat 控制台有何输出信息。
servlet过滤器一般用来根据session的信息来控制登录页面权限。
本文引用了http://www.oschina.net/question/12_52027部分内容,另加自己的认知和理解融合而成。