美文网首页Java后端
原理解析,从Servlet 到Spring MVC

原理解析,从Servlet 到Spring MVC

作者: 程序员Anthony | 来源:发表于2018-09-03 12:12 被阅读14次

    Servlet 介绍

    Servlet 是什么?

    Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

    使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。


    servlet 接口
    • Servlet接口在最基本的Servlet类中,需要实现Servlet接口定义的init()、servic()、destroy()、getServletConfig()和geServletInfo()方法,其中业务逻辑在service中编写,在service方法中最常用的是通过PrintWriter对象进行内容的输出。
      下面是创建servlet的方法:
    //一次创建,到处服务
    //一个Servlet只会有一个对象,服务所有的请求
    /*
     * 1.实例化(使用构造方法创建对象)
     * 2.初始化  执行init方法
     * 3.服务     执行service方法
     * 4.销毁    执行destroy方法
     */
    public class ServletDemo1 implements Servlet {
    
        //public ServletDemo1(){}
    
         //生命周期方法:当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次
        public void init(ServletConfig arg0) throws ServletException {
                    System.out.println("=======init=========");
            }
    
        //生命周期方法:对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法
        public void service(ServletRequest arg0, ServletResponse arg1)
                throws ServletException, IOException {
            System.out.println("hehe");
    
        }
    
        //生命周期方法:当Servlet被销毁时执行该方法
        public void destroy() {
            System.out.println("******destroy**********");
        }
    //当停止tomcat时也就销毁的servlet。
        public ServletConfig getServletConfig() {
    
            return null;
        }
    
        public String getServletInfo() {
    
            return null;
        }
    }
    

    在tomcat/webapps目录下创建上述目录结构,所有HTML,静态文件直接保存在应用程序目录下,所有的Servlet类保存在web-inf/classe目录或子目录下,web.xml(部署描述符)文件保存在web-inf目录下。

    servlet 生命周期
    servlet 常用方法

    1、httpServlet类中的方法;

    • 1) getServletContext().getRealPath("/")返回的路径:
      D:\Program Files\Apache Software Foundation\apache-tomcat-8.0.33\webapps\web_day3\

    • 2)response.setContentType("text/heml;charset=gbk");

    用来设置报头信息,主要设置响应浏览器的编码格式gbk和文本类型html,多用来解决汉字乱码

    • 3)getServletContext().getContextPath();无参,返回的是相对路径,项目路径

      /web_day3

    • 4)getServletContext().getServletContextName()

      web_day3

    2、 request的常用方法:

    • 1)request.setAttribute(name,object)

    • 2)request.getAttribute(name)返回的是Object类型

    • 3)request.removeAttribute(name);

    • 4)request.getRemoteAddr();获取远程主机IP

    • 5)request.getRemoteHost():获取远程主机名

    • 6)request.getRemotePort():主机端口号等

    • 7)request.getRequestDispatcher("转发地址").forward(request,response)这是一个常用方法,多用来进行转发数据

    3、response的常用方法:

    1)response.addCookie(cookie);多用来发送cookie对象

    2)response.getAttribute(name)返回的是Object类型

    3)response.getOutputStream();获取输出流

    4)response.sendRedirect(location);重定向,也叫做客户端转发,多用来跳转到新的本地页面

    从servlet 到Spring MVC的演进过程:

    演进1:GenericServlet抽象类实现Servlet接口的时候必须将所有的方法实现,即使方法中没有任何代码。在GenericServlet抽象类的帮助下,只需要重写service方法即可。
    下面是创建servlet的方法(继承自GenericServlet):

    public class ServletDemo2 extends GenericServlet {
    
        @Override
        public void service(ServletRequest arg0, ServletResponse arg1)
                throws ServletException, IOException {
            System.out.println("heihei");
    
        }
    }
    

    演进2:HttpServlet抽象类HttpServlet覆盖了GenericServlet类,将ServletRequest和ServletResponse对象分别封装为HttpServletRequest和HttpServletResponse对象。HttpServlet同时实现了service方法,在请求进来时,Web容器首先调用HttpServlet的service方法,并根据请求的类型调用doGet或doPost方法,搜易我们只需要覆盖doGet()和goPost()方法即可。
    下面是创建servlet的方法(继承自HttpServlet):

    public class ServletDemo3 extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("haha");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("ee");
            doGet(req,resp);
        }
    
    }
    
    这里在IDEA 中,在类上右键Diagram 可以查看当前的类层级关系

    演进3:JSP的加入

    写过Servlet的朋友应该知道,Servlet的最大缺点就是在Servlet类中编写大量繁杂的HTML代码,使得Java代码与HTML代码糅杂在一起,所以JSP应运而生。

    JSP本质也是Servelt,然而其不需要编译,JSP页面是一个以.jsp扩展名的文本文件。简单的JSP页面在第一次请求后被翻译为(JSP名)_jsp的servlet,翻译之后的Servelt可以看到:_jspInit(),_jspDestory(),_jspService()这样的方法其实都是和Servlet相对应的。

    演进4:Spring横空出世

    Spring提供了强大的控制反转(IOC)和依赖注入(DI)功能,达到项目组件的解耦。

    演进5:Spring Web模块 - Spring MVC

    学过Servlet的朋友应该知道,当要使用Servlet完成的复杂的功能时,需要编写多个Servlet类,并且在web.xml进行注册,这对于完成复杂的Web应用,代码编写会变得很复杂,开发成本也会很高。所以Spring提供了强大的Web开发框架Spring MVC。Spring MVC是Spring产品的一部分,享有Spring松耦合等所有优点。

    Spring MVC 介绍

    Spring MVC是一个模型-视图-控制器的Web框架,建立在前端控制器servlet(DispatcherServlet),它负责发送每个请求到合适的处理程序,使用视图来返回响应结果。

    Spring web MVC框架提供了MVC(模型 - 视图 - 控制器)架构和用于开发灵活和松散耦合的Web应用程序的组件。MVC模式导致应用程序的不同方面(输入逻辑,业务逻辑和UI逻辑)分离,同时提供这些元素之间的松散耦合

    模型(Model):封装了应用程序的数据,通常由POJO类组成

    视图(View):负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出

    控制器(Controller):负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染

    DispatcherServlet组件类Spring MVC框架是围绕DispatcherServlet设计的,它处理所有的请求和响应。Spring MVC DispatcherServlet的工作流程:



    DispatcherServlet处理HTTP请求的工作流程:

    接受HTTP请求后,DispatcherServlet

    会查询HandlerMapping以调用相应的Controller(根据请求的url)

    Controller接受请求并根据请求的类型Get/Post调用相应的服务方法,服务方法进行相应的业务处理,并设置模型数据,最后将视图名称返回给DispatcherServlet

    DispatcherServlet根据返回的视图名称从ViewResolver获取对应的视图

    DispatcherServlet将模型数据传递到最终的视图,并将视图返回给浏览器。

    相关文章

      网友评论

        本文标题:原理解析,从Servlet 到Spring MVC

        本文链接:https://www.haomeiwen.com/subject/pecbwftx.html