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/

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

 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/libingbin/p/5976050.html