为什么这两个要放一起,只是我认为类似而已,并且运用的比较多
servlet
首先Servlet是继承HttpServlet实现方法,一般是doget,dopost,service等
package com.yang.Servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ShowServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("乱码"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
因为write():仅支持输出字符类型数据,字符、字符数组、字符串等所以中文肯定会乱码,
当然我们可以这样
resp.setCharacterEncoding("utf-8");
resp.getWriter().write("乱码");
但是不可能每一个都这样设置所以需要过滤器
Filter
Filter是实现Filter接口,重写方法
package com.yang.Filter; import javax.servlet.*; import java.io.IOException; public class EncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("初始化"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html;charset=UTF-8"); //chain链 System.out.println("执行前"); filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序到这里就被拦截停止这就是链下去,链 System.out.println("执行后"); } @Override public void destroy() { System.out.println("销毁"); } }
可以看到程序开始之前就初始化了
web.xml如下
<!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> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>ShowServlet</servlet-name> <servlet-class>com.yang.Servlet.ShowServlet</servlet-class> </servlet> <!-- //开启两个这样在servlet下就有过滤器,--> <servlet-mapping> <servlet-name>ShowServlet</servlet-name> <url-pattern>/servlet/show</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ShowServlet</servlet-name> <url-pattern>/show</url-pattern> </servlet-mapping> <filter> <filter-name>EncodingFilter</filter-name> <filter-class>com.yang.Filter.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <!-- 只要是servlet下的请求就会被过滤--> <url-pattern>/servlet/*</url-pattern> </filter-mapping> </web-app>
可以看到servlet路径下就会被过滤
但是没有在过滤器下就不会。
那么下面来看一个实际例子