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技术