zoukankan      html  css  js  c++  java
  • MVC模式与三层架构和表示层

    1.MVC模式
        - Model-View-Controller
        - 模型-视图-控制器
        - Model(模型)
            > 模型分为业务模型,和数据模型
            > 模型负责处理业务逻辑以及和数据库进行交互
            > Service和DAO
     
        - View(视图)
            > 视图用来渲染模型,将模型以页面的形式展现给用户
            > JSP
     
        - Controller(控制器)
            > 负责接收请求,调用模型处理请求,然后选择视图渲染模型
            > Servlet
     
    三层架构   
        表示层
            JSP+Servlet
     
        业务逻辑层
            Service
     
        持久化层
            DAO
     
    MVC和三层架构都是为了软件的层与层之间的解耦,其实我们日常开发的项目的实际上是综合了三层架构和MVC两种形式。
     
     
    表示层:
        HTML擅长显示一个静态的网页,HTML并不能运行Java程序
     
        Servlet擅长调用Java程序,但是不擅长显示一个网页
     
        HTML+Servlet=JSP
     
    1.JSP
        [1] 简介
            > Java Server Pages
            > Java的服务器页面
            > JSP是需要运行在服务器中,不能脱离服务器运行
            > JSP的本质就是一个Servlet
            > JSP就是一个披着HTML皮的Servlet
     
        [2] 运行原理
            > 我们在访问JSP时,服务器会先将JSP翻译为一个Servlet,然后再去调用Servlet去处理请求
            > jsp文件 --翻译--> java文件 --编译--> class
            > 服务器翻译过的java文件,和编译好的class文件都会放到Tomcat服务器的work目录下
            > 被服务器翻译生成java文件,该类已经继承HttpJspBase
                而HttpJspBase又继承HttpServlet。
              而在总的web.xml文件中又发现JSP对应Servlet的配置信息
                由此证明,JSP就是一个Servlet。
     
        [3] 基本语法
            > 模板元素   
                - 模板元素就是JSP中HTML代码
                - 模板元素中的内容会作为out.write()的参数输出到页面中来
                - 所以我们可以像编写一个HTML网页一样,在JSP中编写HTML代码
     
            > 脚本片段   
                - <% %>
                - 在脚本片段可以直接编写Java代码
                - 脚本片段中内容会原封不动的复制到JSP对应Java文件的的service方法中的指定位置
                - 所以在service()方法中可以写什么,在脚本片段中就可以写什么
                - 在JSP页面中可以编写多个脚本片段,但是多个脚本片段之间要保证结构完整
     
            > 表达式
                - <%= %>
                - 表达式可以用来将一个对象输出到页面中
                - 表达式中的内容,会作为out.print()的参数,最终输出到页面
                - 所以out.print()可以接收什么参数,则表达式中就可以些什么
                - 而该方法可以接收Object类型的参数,所以表达式可以传递任意的Java对象
     
            > 注释
                - <%-- --%>
                - JSP注释中的内容将不会被翻译到java文件中,只能在jsp页面中看见
                - JSP中一共可以使用三种注释:
                    1.jsp注释 <%-- --%>
                    2.HTML注释 <!-- -->
                    3.Java注释 // /**/ java注释只能在脚本片段写
     
            > 声明
                - <%! %>
                - JSP声明中的内容将会被写入到JSP对应的java类中
                - 所以在类中可以写什么,在声明中就可以写什么
                - 但是这个没什么用
     
        [4] JSP指令
            > JSP指令用来告诉JSP引擎,如何来翻译我们的JSP文件
            > JSP指令一共有三个:page include taglib
     
            > 格式:<%@ 指令名 属性名1=”属性值1” 属性名2=”属性值2”  %>
                - page指令
                    - import:用来导包的
                    - errorPage:当页面出现异常时转发到的页面
                    - isErrorPage:当前页面是否是一个错误页面,需要一个布尔值,默认是false
                        如果设置为true,则可以在页面中使用exception对象
                    - isELIgnored:是否忽略EL表达式,需要布尔值,默认值是false,不忽略,一般不动
                    - session:页面中是否可以直接使用session对象,需要一个布尔值,默认值为true,可以使用。一般不动
                    - contentType:设置响应内容及编码,实际上就是设置Content-Type这个响应头的
                    - pageEncoding:当前JSP页面使用的编码,jsp引擎需要根据该编码去解析JSP文件
     
                    - language:jsp将被翻译成的语言,默认值是java,可选值java
                    - extends:指定jsp翻译为java文件要继承的父类
                    - info:设置JSP的信息
     
                - include指令
                    - <%@ include file="/include/2.jsp" %>
                    - include指令用来将一个页面包含进另一个页面
                    - include指令是静态包含,使用该指令相当于将另一个页面,
                        原封不动的复制到当前页面的指定位置
                    - 使用静态包含,只会翻译当前页面,而不会翻译被包含页面
     
        [5] JSP动作标签
            > 格式:<jsp:标签名 属性名="属性值"></jsp:标签名>
            - 原理:
                JSP动作标签,最终在java文件中,都会被转换成java代码
                - 标签就是以标签的形式,去调用Java代码
            -     <jsp:forward page="/index.jsp">
                    <jsp:param value="zhubajie" name="username"/>
                </jsp:forward>
                用来做请求的转发,我们还可以通过forward标签内部使用param标签,为转发附加请求参数
     
            -     <jsp:include page="/include2/2.jsp"></jsp:include>   
                作用:将一个页面包含进另一个页面
                        jsp:include和include指令不同,include指令是静态包含,而jsp:include是动态包含
                      它会同时将当前页面和被包含页面都翻译为java文件
                        它是通过这行代码来包含另一个页面:
                        org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/include2/2.jsp", out, false);
     
        [6] 隐含对象
            > 隐含对象指的是可以直接在JSP中使用的对象
            > JSP中一共有九大隐含对象,这九个对象都可以在JSP中直接使用
            > 在JSP对应的Servlet中以及对这个九个变量进行声明并赋值
            > 九个隐含对象中有四个是域对象
            > 九大隐含对象有:
                1.pageContext
                    类型:PageContext
                    作用:通过pageContext可以获取到页面中的其他隐含对象
     
                2.request
                    类型:HttpServletRequest
     
                3.session
                    类型:HttpSession
     
                4.application
                    类型:ServletContext
     
                5.response
                    类型:HttpServletResponse
                    作用:代表服务器发送给浏览器的响应报文
                            和Servlet中的response一样,但是在JSP中这个对象不太常用
     
                6.out
                    类型:JspWriter
                    作用:通过out对象向浏览器输出一个内容
     
     
                7.config
                    类型:ServletConfig
                    作用:代表当前JSP的配置信息,基本不用
     
                8.page
                    类型:Object
                    作用:在JSP对应的Java文件中有这么一行代码:Object page = this;
                            page代表的当前对象,不咋用
     
                9.exception
                    类型:Throwable
                    作用:代表页面中的异常信息,可以通过该对象获取到页面中的异常
     
        [7] 域对象
            > 域指区域,地区,范围,在WEB项目中同样也存在很多不同的区域:
                不同的JSP页面、不同Servlet。总之,不同的WEB资源就是一个一个不同的区域。
            > 域对象的主要作用就是在不同的WEB资源之间共享数据。
            > JavaWeb中一共有四个域对象pageContext、request、session、application
            > 在JSP中可以获取到全部四个域对象,而在Servlet中只能获取三个,获取不到pageContext
            > 所有的域对象的内部,都维护着一个Map,这个Map用来保存属性
            > 域对象共有的3个方法:
                void setAttribute(String name , Object value) --> 以指定的属性名在域对象中保存一个属性
                Object getAttribute(String name) --> 根据属性名从域中获取一个属性值
                void removeAttribute(String name) --> 从域中移除一个指定的属性
     
                - pageContext
                    - 类型:PageContext
                    - 作用:当前页面
                            代表page域的域对象,作用范围就是当前页面
                                一旦切换页面,则域中的属性全部丢失
                                    该域对象主要在标签中使用
     
                - request
                    - 类型:HttpServletRequest
                    - 作用:当前请求
                            代表的是request域的域对象,作用范围时当前请求
                                一旦发送多个请求,则域中的属性会全部丢失
                                    注意:request域中的属性在转发时有效
                                        重定向时request域中属性会全部丢失
     
                - session
                    - 类型:HttpSession
                    - 作用:当前会话,会话指一次打开浏览器到关闭浏览器的过程
                            代表的是session域的域对象,一旦结束会话(关闭浏览器),
                                则session域中属性全部丢失
     
                - application
                    - 类型:ServletContext
                    - 作用:当前应用,只要服务器不停application中的属性一直都在
                            application域
     
        [7] JSP和Servlet的分工:
            > JSP本质就是一个Servlet,所以Servlet能干的事JSP全行。
            > 所以有一段时间人们已经将Servlet完全抛弃了,
                于是我们的项目中全都变成了JSP,一个项目可能会有成百上千JSP。
            > 但是经过长时间的实践发现,虽然JSP可以去调用java代码,
                但是当jsp中的java代码过多,jsp会变得非常不好维护,
                    所以人们又想起了被冷落已久的Servlet。
            > Servlet和JSP实际上是各有优势:
                Servlet擅长调用Java代码,不擅长显示一个页面
                JSP擅长显示一个动态页面,但是不擅长编写大量的java代码
            > 分工:
                1.Servlet负责调用后台程序处理用户请求
                2.JSP负责显示动态页面
            > 域对象使用原则:
                能用小的就不用大的
     
     
     
     

    转载请注明出处!

    http://www.cnblogs.com/libingbin/

    感谢您的阅读。如果文章对您有用,那么请轻轻点个赞,以资鼓励。

     
     
     
     
     
     
     
  • 相关阅读:
    招行面试
    今日头条面试[教育岗]
    四方精创 面试
    ArrayList 源码
    redis缓存,穿透,击穿,雪崩
    hashMap
    集合整理
    阿里CBU技术部一面
    网安面试
    php递归获取顶级父类id
  • 原文地址:https://www.cnblogs.com/libingbin/p/5976050.html
Copyright © 2011-2022 走看看