Servlet
1) HttpServlet中的方法
doGet()/doPost()
方法
通过覆盖HttpServlet类中的doGet()方法,可以处理浏览器端发送过来的GET请求
post是一种邮寄的方式,在浏览器的地址栏不显示提交的信息,但是这种方式传送的数据是没有限制的;
get是一种手把手的提交到服务器上,最大的信息量是1K,而且提交的信息显示在浏览器上。
init()
在第一次调用servlet时,会创建servlet实例,在创建这个实例时,会调用HttpServlet中的init()方法(这个方法只会被调用一次)
service()
当客户端有一个对servlet的请求发送过来,则服务器会产生一个新的线程,并让它调用servlet的service()方法,service()会根据收到的客户端请求类型,决定调用doGet()还是doPost()方法
destroy()
在删除servlet实例之前,服务器会先调用destroy()方法
2) 什么是ServletContext?它由谁创建?
当Servlet容器启动时,它会部署并加载所有的web应用。当web应用被加载时,Servlet容器会一次性为每个应用创建Servlet上下文(ServletContext)并把它保存在内存里。Servlet容器会处理web应用的web.xml文件,并且一次性创建在web.xml里定义的Servlet、Filter和Listener,同样也会把它们保存在内存里。当Servlet容器关闭时,它会卸载所有的web应用和ServletContext,所有的Servlet、Filter和Listner实例都会被销毁。
从Java文档可知,ServletContext定义了一组方法,Servlet使用这些方法来与它的Servlet容器进行通信。
3) Servlet生命周期
当客户端第一次向web服务器提出一个对servlet的请求时,web服务器会创建一个该servlet的实例,并调用init()方法。如果当web服务器中已存在一个servlet实例,则直接使用此实例,然后再调用service()方法,service()方法根据客户端的请求方式决定调用对应的doXXX()方法,当servlet从web服务器中删除时,web服务器会调用servlet的destroy()方法
4) Forward与sendRedirect区别
forward是服务器端的转向而redirect是客户端的跳转。
使用forward浏览器的地址不会发生改变。而redirect会发生改变。
Forward是一次请求中完成。而redirect是重新发起请求。
Forward是在服务器端完成,而不用客户端重新发起请求,效率较高。
5) MVC设计模式
MVC全名是Model View Controller
,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
最简单的、最经典就是Jsp(view)
+Servlet(controller)
+ JavaBean(model)
1、当控制器收到来自用户的请求
2、控制器调用JavaBean完成业务
3、完成业务后通过控制器跳转JSP页面的方式给用户反馈信息
传统MVC模式问题
1、所有的Servlet和Servlet映射都要配置在web.xml中,如果项目太大,web.xml就太庞大,并且不能实现模块化管理。
2、Servlet的主要功能就是接受参数、调用逻辑、跳转页面,比如像其他字符编码、文件上传等功能也要写在Servlet中,不适合。
3、接受参数比较麻烦(String name = request.getParameter(“name”),User user=new User user.setName(name)),不能通过model接收,只能单个接收,接收完成后转换封装model.
4、跳转页面方式比较单一(forword,redirect),并且当我的页面名称发生改变时需要修改Servlet源代码.
现在比较常用的MVC框架有:
Struts2
Spring MVC
SpringBoot(推荐)
Filter与listener
- Filter接口中的方法
void init(FilterConfig filterConfig) throws ServletException
过滤器初始化是在启动容器(Tomcat)时自动初始化
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
如果过滤器要将内容传递到目的地,则需要FilterChain,将请求继续向下转发。
chain.doFilter(request,response) ;
过滤器会执行两次:FilterChain之前执行一次,之后再执行一次
void destroy()
在标准Servlet中的doGet或doPost方法中,传递的参数为HttpServletRequest、HttpServletResponse
在过滤Servlet中的doFilter中传递的是ServletRequest、ServletResponse