今日内容
1. JSP:
1) 指令
2) 注释
3) 内置对象
2. MVC开发模式
3. EL表达式
4. JSTL标签
5. 三层架构
1、JSP补充
1、指令
* 作用:用于配置JSP页面,导入资源文件
* 格式:
<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
* 分类:
1. page : 配置JSP页面的
* contentType:等同于response.setContentType()
1. 设置响应体的mime类型以及字符集
2. 设置当前jsp页面的编码(只能是高级的IDE才能生效,高级的IDE会自动读取这个值来设置JSP页面的编码。如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)
* import:导包
* errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
* isErrorPage:标识当前也是是否是错误页面。
* true:是,可以使用内置对象exception
* false:否。默认值。不可以使用内置对象exception
2. include : 页面包含的。导入页面的资源文件
* <%@include file="top.jsp"%>
3. taglib : 导入资源,一般使用taglib来导入标签库,如JSTL等(相当于我们要使用java类需要import导入相应的包一样)
* <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
* prefix:前缀,自定义的
响应的代码如下
//index.jsp
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="utf-8" language="java" buffer="8kb" errorPage="404.jsp" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%--
contentType:text/html设置响应体的MIME类型,charset=UTF-8设置响应体的编码类型(字符集);
pageEncoding:普通的编码工具,需要使用pageEncoding属性设置JSP页面的编码方式(字符集);
import:导包;在JSP页面会写很多java代码,需要导入很多包,通过import导包,每次导入的包都会写成独立的一行;
buffer:缓冲区的大小,默认是8kb。将来JSP页面的数据使用out对象来输出,out相当于一个字符输出流,它有缓冲区,默认8kb;
errorPage:当前页面发生异常后,会自动跳转到指定的错误页面;
isErrorPage:标识当前也是是否是错误页面,是就可以使用内置对象exception。
--%>
<%--
将来如果多个页面的某一部分是相同的,外面可以将这部分封装为一个jsp,然后我们在需要使用到这个部分的jsp文件使用include导入这个相同jsp即可
比如我们设置top.jsp,它包含相同信息,当前页面需要用到这部分的信息,那么导入top.jsp即可
--%>
<%@include file="top.jsp"%>
<%--
演示使用taglib导入标签库JSTL,先导入JSTL需要的jar包(2个),放在WEN_INF的lib下
prefix是标签的前缀,一般使用c。这样引入的标签使用的时候就是: <c:catch></c:catch>的格式
--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
List list = new ArrayList();
//int i = 3/0;//制造异常
//我们创建一个404.jsp页面,将其设置为isErrorPage="true"。
//我们启动服务器,访问index.jsp,会报异常,显示异常的页面。这样对用户不友好,我们设置当前页面errorPage="404.jsp"。
//这样当前的页面发生错误的时候,就会跳转到当前页面指定的错误页面。
%>
<%--引入相应的JSTL标签库后,我们就可以使用相应的标签--%>
<c:catch></c:catch>
</body>
</html>
//404.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>服务器正忙...</h1>
<%--我们不将404.jsp标识:isErrorPage="true",其他错误页面也可以跳转到这个页面。但是标识了外面就可以使用JSP的内置对象exception--%>
<%
String message = exception.getMessage();
out.print(message);//将当前页面标识为错误页面,就可以使用exception对象打印错误,将来应该输出到日志文件。
%>
</body>
</html>
//top.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>页面logo页面标题</h1>
2、注释
1. html注释:
<!-- -->:只能注释html代码片段
2. jsp注释:推荐使用
<%-- --%>:可以注释所有
3、JSP 内置对象
* 在jsp页面中不需要创建,直接使用的对象
* 一共有9个:注意这些JSP的内置对象都对应一个java类
变量名(JSP) 真实类型(java) 作用
* pageContext PageContext 当前页面共享数据,还可以获取其他八个内置对象(出了当前页面就不能共享数据)
* request HttpServletRequest 一次请求访问的多个资源(请求转发)
* session HttpSession 一次会话的多个请求间
* application ServletContext 所有用户间共享数据
---前面4个是域对象,可以共享数据,注意它们域的范围
* response HttpServletResponse 响应对象
* page Object 当前页面(Servlet)的对象 this
* out JspWriter 输出对象,数据输出到页面上
* config ServletConfig Servlet的配置对象
* exception Throwable 异常对象,页面标注isErrorPage="true"才可以使用exception
测试:我们在index.jsp里面制造一个错误,并设置:errorPage=“404.jsp”,让这个页面被访问时跳转到404.jsp页面。访问这个页面:http://localhost/day09/index.jsp,然后在:G:\idea_java_project\java-demo1\out\artifacts\day09_war_exploded目录下面,可以找到当前项目的Tomcat项目,里面包含index.jsp、404.jsp,这个位置是Tomcat项目部属的位置。
但是项目真正运行是在C:\Users\Administrator.IntelliJIdea2017.3\system\tomcat_java-demo1\work\Catalina\localhost\day09\org\apache\jsp 目录(通过控制台Using CATALINA_BASE查找)下,可以找到index.jsp与404.jsp运行后所产生的class与java文件(这些文件只有在index.jsp与404.jsp运行后才会产生),在404.java下的_jspService方法,里面可以找到这9个对象。
2、MVC:开发模式
jsp演变历史(视频7解析)
1. 早期只有servlet,servlet类只能使用response输出标签数据以及程序获取的动态数据,非常麻烦
2. 后来又jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码,又写html表,造成难于维护,难于分工协作
3. 再后来,java的web开发,借鉴mvc开发模式,使得程序的设计更加合理性
MVC介绍
1. M:Model,模型。JavaBean
* 完成具体的业务操作,如:查询数据库,封装对象
2. V:View,视图。JSP
* 展示数据。
3. C:Controller,控制器。Servlet(控制器就是一个中转)
* 获取用户的输入;
* 调用模型,使用模型封装的业务进行数据的查询与获取;
* 将模型查询出来的数据交给视图进行展示。
MVC是开发模式而不是设计模式,设计模式解决的是一些细小的问题,MVC解决的是开发过程中架构的问题。MVC比设计模式的概念要大一些。
以后我们JSP仅仅进行数据的展示,不要在JSP中写业务逻辑的java代码。那么JSP里面不能写java代码,我们怎么展示相应的数据?可以使用EL表达式以及JSTL标签来替换JSP中的java代码。
* 优缺点:
1. 优点:
1) 耦合性低,方便维护,可以利于分工协作
2) 重用性高
2. 缺点:
1) 使得项目架构变得复杂,对开发人员要求高
3、EL表达式
我们不要在JSP中写java代码,但是有的时候需要写少量的java代码,可以使用EL表达式以及以及JSTL标签替换这些代码。
概念:Expression Language 表达式语言。EL表达式用于替换和简化jsp页面中java代码的编写。
语法:${
表达式}
注意:jsp默认支持el表达式的。如果要忽略EL表达式
1. 设置jsp中page指令中:isELIgnored="true" 忽略当前jsp页面中所有的el表达式
2. \${
表达式} :忽略当前这个el表达式(\相当于转义字符)
EL表达式主要有 运算和获取值 2个功能。
1、运算
1. 运算:
* 运算符:
1. 算数运算符: + - * /(div) %(mod)
2. 比较运算符: > < >= <= == !=
3. 逻辑运算符: &&(and) ||(or) !(not)
4. 空运算符: empty
* 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
* ${
empty list}:判断字符串、集合、数组对象是否为null或者长度为0
* ${
not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0
相应的代码如下:
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
下面是EL表达式的演示
我们在web目录下创建一个el目录,下面放EL表达式的演示,那么应该使用:http://localhost/day09/el/elTest1.jsp 来访问(加上el这一层文件夹)
--%>
${3 > 4} <%--展示一个boolea类型的数据false--%>
\${3 < 4} <%--使用反斜杠\忽略EL表达式,或者使用page指令设置isELIgnored="true"忽略当前页面所有的EL表达式--%>
<hr>
<h3>算数运算符</h3<