jsp Servlet与Filter

来源:互联网 发布:数据恢复软件比较 编辑:程序博客网 时间:2024/04/30 05:09

         servlet说白了就是请求处理中心,一般的jsp都是通过js发出异步请求,通过servlet做具体的业务处理,像什么查数据,读文件之类的,是一个业务层;而jsp页面负责显示和呈现数据,是一个显示层。一个完整的请求是由客户端发起由request携带数据,到服务器进行处理,然后由response携带处理后的数据返回到客户端,而servlet就是一个业务处理中心。但假如说我在没有登录的情况下想进入后台界面这个肯定是要进行拦截的,对于这个问题我们完全可以在servlet业务层进行判断,但这样会显得没有层次,你想我一个简单的没有输密码的登录却要跑到我的实际业务层中去,累不累啊,中间看到你小子没有挂牌进来直接就打回去了,还让你进里面去逛一圈?另一个问题是编码集的问题,每次到servlet层进行业务处理之前都要设置一次编码集,处理完之后带回去又要设一个编码集,烦不烦啊,而且又跟我的业务搅在一起,好讨厌!这时候用Filter就显得比较清爽了些,在请求和业务处理之间横插一脚,对请求进行过滤,防止坏的东西污染我纯洁的业务块,让后者专心干自己的本职工作,而且一旦出了问题查找起来也比较方便,多好!

          这两者其实看起来差不多,不论是在web.xml中配置还是通过注解方式进行注释都差不多。先来看看servlet的使用,servlet必须要实现javax.servlet.http.HttpServlet这个接口,核心是service函数,这里面主要进行业务的处理。简单的例子要登录,得把账号密码传过来,ok在servlet中先通过request取出来,在数据库里面查询一下,合法的就进行下一步,不合法就打回去,简单代码如下:

<span style="font-size:14px;">package com.yc.servlet;import java.io.IOException;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/login")//登录的校验处理,比如账户密码是否正确public class LoginServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String uname=request.getParameter("uname");/* * 数据库的查询操作 * */request.getSession().setAttribute("user",uname);}@Overridepublic void init(ServletConfig config) throws ServletException {// TODO Auto-generated method stubsuper.init(config);}}</span>

我这里只是一个简单的示例,一般情况是通过异步请求到这里业务处理之后返回数据(一般是json形式的数据),如果不是异步请求的话一定记得在处理完之后页面的跳转。那么问题来了,我不能什么请求都往这里来吧?得有一个限制吧?那样的话我的多个servlet和一个servlet还有啥区别?所以就要给是servlet配置参数,这里面有两种配置方式一个是在web.xml里面:

 <span style="font-size:14px;"><servlet>    <servlet-name>HelloServlet</servlet-name>    <servlet-class>com.yc.Hello.HelloServlet</servlet-class>    <init-param>      <param-name>encoding</param-name>      <param-value>utf-8</param-value>    </init-param> </servlet>  <servlet-mapping>    <servlet-name>HelloServlet</servlet-name>    <url-pattern>/hello</url-pattern>    <url-pattern>/*</url-pattern>    <url-pattern>/*h</url-pattern>  </servlet-mapping></span>

 其中servlet主要是用来配置基本的名字和处理类之类的,servlet-mapping中就限定那些URL会触发这个,注意两个servlet-name要一致。还有一种是注解方式:就像我前面写的那种,在类前面加上@WebServlt()括号里面写上路径注意以/开头,后面没有分号。这种方式相对而言比较简单和容易操作些。

  然后是Filter,跟servlet差不多,我就直接上代码了:

<span style="font-size:14px;">package com.yc.filter;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.annotation.WebFilter;@WebFilter("/*")//所有的请求都要设置编码集public class EncodingFilter implements Filter {@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println();request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");response.setContentType("text/html; charset=utf-8");System.out.println("编码集设置过滤");chain.doFilter(request, response);}@Overridepublic void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}}</span>
这个的功能就是对所有的页面进行设置编码集。

       还必须意识到的一个问题是,当多个Filter和多个servlet的地址是一样的时候怎么搞,谁先谁后?大的原则是Filter在servlet之前,当多个Filter的地址是一样的时候,就会形成一个所谓的Filter链,这个链的先后顺序是由你web.xml里面写的先后顺序来决定的,如果是注解方式,就是里的类的顺序(在Eclipse里面就是安字母顺序拍的好像),当一个Filter中的doFilter执行之后会交给Filter链中的下一个Filter进行处理操作,只有当所有的filter都执行了doFilter之后才会进行servlet操作,这样就意味着我可以在这个filter链中的任意一个地方来中断这个请求,或者修改我的请求。当多个Filter的拦截地址一样的时候,具体执行的顺序是根据web.xml中的配置先后顺序来执行(当然,你的拦截地址不一样就不会有这个问题)。

       我在这里只是一个简单示例使用,这两者放在实际的项目中用起来才会意思,在配上EL,让各个层更加的独立,界面只负责显示,业务层只处理业务,过滤层只负责自己的本职工作,再把底层封装好,配好接口,到那时就会发现整个项目清爽多了

1 0