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负责显示动态页面
> 域对象使用原则:
能用小的就不用大的