Servlet开发(1)-----基础及MVC设计模式
一、Servlet介绍
Servlet简单的说就是一个Java程序,目的和Javabean差不多,为了使得JSP页面中代码简洁、清晰;
Servlet也是放在 WEB-INF/classes/中,并在web.xml中配置如下形式:
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
Servlet可以处理客户端传来的请求,即request,并且可以返回给客户端回应,即response,这个操作通过
public voidservice(HttpServletRequest req,HttpServletResponse resp)throws ServletExeption,IOException{}完成;
一般如果我们要自定义Servlet,则需要继承HttpServlet类,并覆盖相应的方法即可;
二、Servlet的结构
Servlet生命周期为:加载-->初始化--->服务--->销毁--->卸载;
继承HttpServlet后,可以覆写以下方法:
1.public void init()throws ServletException{} //初始化Servlet
2.public void init(ServletConfig config)throws ServletExeption{} //初始化Servlet,可以得到配置信息
3.public void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletExeption,IOException{} 当get方式传递,则调用此方法
4.public void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletExeption,IOException{}当post方法传递,则调用此方法
5.public voidservice(HttpServletRequest req,HttpServletResponse resp)throws ServletExeption,IOException{}
6.public void destroy(){} //销毁时调用
注意:
1. 当1,2同时出现时,2有较高优先级;
2.当3或4和5同时出现时,5具有较高优先级;
3 .PrintWriter writer = resp.getWriter();可以获得输出流;
三、Servlet常见问题
1.在init方法中,通过config.getInitParameter()方法取得配置信息;
2.通过req.getSession()取得Session对象,通过super.getServletContext();取得application对象;
四、Servlet跳转
1.客户端跳转:resp.sendRedirect("....");
2.服务器跳转:req.getRequestDispatcher("hello.jsp").forward(req,resp);能够跳转到hello.jsp中;
注意:
1.客户端跳转属性只能通过session传递,不能通过request传递;
五、MVC设计模式
在之前我们讲过JSP+JAVABEAN的DAO开发模式,这个适用于小型开发;
MVC(Model View Control)是一种以Servlet为核心的开发模式,流程如下:
步骤如下:
1.客户端发送请求给Servlet;
2.Servlet接收请求后处理,并可以调用JavaBean;
3.Servlet返回结果给JSP显示;
因此JSP只是用于显示,而JavaBean只和Servlet通信;
注意:在MVC中,使用requestDispatcher的机会很多,我们都是通过这个类进行服务器跳转的;
六、过滤器
实现javax.servlet.Filter接口;
一般客户端发出请求后会交给Servlet;如果过滤器存在,则客户端发出的请求都是先交给过滤器,然后交给Servlet;
我们可以完成一些在执行Servlet之前必须要做的事,比如request.setCharacterEncoding("GB2312");
必须实现以下方法:
1.public void init(FilterConfig config) throws ServletException{}
2.public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain){}
3.public void destroy(){}
注意:
1.init方法在Web容器初始化时就会调用;
2.doFilter的参数是ServletRequest和ServletResponse而不是Http的;
3.FilterChain含有public void doFilter(ServletRequest req,ServletResponse resp){}
4.一般代码形式如下:
public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain){
chain.doFilter(req,resp);//执行Servlet操作;
}
则这个函数会调用两次,一次是执行chain.doFilter之前,一次是执行chain.doFilter()之后;
写完过滤器后,我们必须要限制过滤器调用的范围,即域名为多少时会调用过滤器,我们在web.xml 中进行配置;
<filter>
<filter-name></filter-name>
<filter-class></filter-class>
</filter>
<filter-mapping>
<filter-name></filter-name>
<url-pattern></url-pattern><!--过滤器应用的范围,如果为/*,则如果域名设置形如/a 或/abc等都会调用过滤器-->
</filter-mapping>