JavaWeb体系结构的理解-5.Servlet与过滤器

Servlet

Servlet是运行于Web服务器端的Java应用程序,它使用Java语言编写,具有Java语言的优点。不同于其他Java程序,Servlet具有对HTTP进行处理的能力,但其运行需要Web容器的支持。

Servlet和JSP的差别在于:1.JSP更具有显示层的角色2.JSP符合脚本语言特点,通过JSP内置对象编程。Servlet是遵循的API标准,使用Servlet的API编程。3.速度上Servlet较快,因为它不是动态编译的。

Servlet继承自GenericServlet,而GenericServlet实现了接口ServletCofing、Servlet和Serializable。一般我们编写的Servlet都继承自Servlet的子类HttpServlet,HttpServlet实现了Servlet,并且对HTTP请求处理作出定义。HttpServlet的方法为do[Get|Post|Put],这三个方法处理提交的请求。HttpRequest封装了Http请求,通过它可以获取用户端传递的Http请求参数,他的方法有get[ContextPath|Cookies|Method|QueryString|Request|Session]。HttpResponse封装了http的请求回应,通过它可以向客户端发送回应,其常用方法为send[Error|Redirect]、addCookie等。

在创建了继承自HttpServlet的Servlet后,还必须在Web.xml中对它进行配置,使用<servlet>标签配置servlet对象,<servlet-mapping>配置Servlet映射。

Servlet的处理流程是:客户端请求Web容器,容器创建客户端对应的ServletRequest与ServletResponse对象,在创建完成后,容器调用HttpServlet的相关方法(do[Post|Get|Put]),do方法获取ServletRequst的参数,进行处理后使用ServletResponse同志Web容器对客户端返回响应,Web容器销毁ServletResponse和ServletRequest对象,完成请求处理过程。

以用户登录为例说明以上步骤:

Servlet代码如下:

package www.gongqingkui.cn;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class login extends HttpServlet {
         public voiddoGet(HttpServletRequest request, HttpServletResponse response)
                            throwsServletException, IOException {
                  doPost(request, response);
         }
         public voiddoPost(HttpServletRequest request, HttpServletResponse response)
                            throwsServletException, IOException {
                  response.setContentType("text/html");
                  PrintWriterout = response.getWriter();            
                  String user =request.getParameter("user");
                  Stringpassword =request.getParameter("password");
                  out.println(user+password);
                  if((user !=null && password !=null)&&(user.equals("admin")&& password.equals("123")))
                  {        out.println("ok");
                  }else{       out.println("unok");
                  }
                  out.flush();
                  out.close();
         }
}

配置信息为:

<servlet>
   <servlet-name>login</servlet-name>
   <servlet-class>www.gongqingkui.cn.login</servlet-class>
  </servlet>
 
  <servlet-mapping>
   <servlet-name>login</servlet-name>
    <url-pattern>/servlet/login</url-pattern>
  </servlet-mapping>

Index.jsp页面写法为:

<form action="servlet/login" method="GET">
             <input type="text" name="user"value="admin"/>
             <input type="text" name="password"value="123"/>
             <input type="submit"/>          
</form>

从index.jsp页面开始执行,传递参数到servlet/login,这个地址是web.xml配置的,对应于www.gongqingkui.cn.login这个servlet类,调用该类的doGet方法进行处理,判断如果用户名和密码正确,在页面返回相应信息。

过滤器

过滤器和Servlet的编写方法、配制方法类似。他拦截客户端的请求,对他们进行处理,之后再转发给过滤器链上的其它过滤器,一直到最后转发给目标Servlet,等待Servlet处理完成后,在反序通过过滤器返回给客户端。过滤器都必须实现Filter接口,这个接口的方法有init、doFilter和destory。此外FilterConfig接口用于获取过滤器的配置信息,由Web容器实现。FileterChain接口的doFilter方法用于将请求传给下一个过滤器,它也由Web容器实现。过滤器的配置信息也需要放在web.xml中,使用<filter>标签配置过滤器,使用<filter-mapping>标签配置映射信息。

一个典型的实例就是使用过滤器对字符进行转码:

首先建立过滤器Filter

package www.gongqingkui.cn;
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 characterFilter implements Filter {
 
         String encoding =null;
         public void destroy(){
                  encoding =null;
 
         }
 
         public voiddoFilter(ServletRequest arg0, ServletResponse arg1,
                            FilterChainarg2) throws IOException, ServletException {
                  if(encoding!= null){
                  arg0.setCharacterEncoding("UTF-8");
                  arg1.setContentType("text/html;charset="+encoding);
                  }
                  arg2.doFilter(arg0,arg1);
         }
 
         public voidinit(FilterConfig arg0) throws ServletException {
                  encoding =arg0.getInitParameter("encoding");
         }
 
}

在web.xml中配置如下: 

 <filter>
      <filter-name>characterFilter</filter-name>
      <filter-class>www.gongqingkui.cn.characterFilter</filter-class>
      <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
      </init-param>
  </filter>
 
  <filter-mapping>
      <filter-name>characterFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

这样所有的请求都转发到过滤器中,转变为汉字编码处理后再使用。

参考文献

1. JavaWeb体系结构的理解-1.基础

2. JavaWeb体系结构的理解-2.JSP语法

3. JavaWeb体系结构的理解-3.JSP内置对象

4. JavaWeb体系结构的理解-4.JavaBean技术

你可能感兴趣的:(JavaWeb体系结构的理解-5.Servlet与过滤器)