今日内容
1. JSP:
1.指令
2.注释
3.内置对象
2. MVC开发模式
3. EL表达式
4. JSTL标签
5. 三层架构
一、JSP
1.指令
* 作用:用于配置JSP页面,导入资源文件
* 格式:
<%@ 指令名称 属性名1=属性值1 属性名2=属性值2...%>
* 分类:
1. page:用于配置JSP页面的
* contentType:等同于response.setContentType()
1.设置响应体的mime类型以及字符集
2.设置当前jsp页面的编码(针对于高级开发工具才起作用,如果使用低级工具,
则需要设置pageEncoding属性设置当前页面的字符集)。
* import:导包
* errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
* isErrorPage:标识当前页面是否是错误页面。
* isErrorPage="true":是错误页面,此时可以使用内置对象exception
<%
String message = exception.getMessage();
out.println(message);
%>
* isErrorPage="false":默认值,不是错误页面。不能使用内置对象exception
2. include:页面包含的。导入页面的资源文件
* <%@include file="top.jsp" %>
3. taglib:导入资源
一般用于导入标签库,比如导入JSTL标签库。
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
* prefix:前缀自定义的。
2.注释:
1.html注释:
<!-- -->:只能注释html代码片段
使用html注释的代码,它的html源码会被发送到我们的response响应里面。只不过它告
诉浏览器这些数据不解析不显示而已。
其实浏览器可以看到这些信息。
2.jsp注释
<%-- --%>:可以注释所有
被JSP注释的源码都不会发送到response响应里面。
浏览器根本看不到这些信息。
* 推荐使用jsp注释。
3.内置对象
* 在jsp页面中不需要创建,直接使用的对象
* 一共9个:
1.pageContext
2.request
3.session
4.application
5.response
6.page
7.out
8.config
9.exception
指令isErrorPage="true",才可以使用该内置对象。
1.本地项目在:
E:\Idea_Project\day0508_EL&JSTL\out\artifacts\day0508_EL_JSTL_war_exploded
2.但是IDEA真正将项目部署在:
C:\Users\13099\.IntelliJIdea2019.3\system\tomcat\Tomcat_8_5_31_day0508_EL&JSTL\work\Catalina\localhost\day0508
3.当我们请求.jsp页面时,服务器会将.jsp文件转成.java和.class文件。然后放到work文件夹中。
打开一个.java文件,可以发现在_jspService()方法里面定义者上面9个内置对象
真实类型 变量名 作用
PageContext pageContext 当前jsp页面共享数据,还可以获取其他8
个内置对象
HttpServletRequest request 一次请求访问的多个资源(转发)
HttpSession session 一次会话的多个请求间
ServletContext application 域最大:所有用户间共享数据。随服务器
创建创建,随服务器销毁销毁。
HttpServletResponse response 响应对象
Object page 代表当前(Servlet)页面的对象
JspWriter out 输出对象,可以把数据输出到页面上
ServletConfig config Servlet的配置对象
Throwable exception 异常对象
二、MVC开发模式
1.jsp演变历史
1.早期只有servlet,只能使用response输出标签数据,非常麻烦。
2.后来有了jsp,简化了Servlet的开发。
但是如果过度的使用jsp,在jsp中即写大量的java代码,又写html标签,造成难于维护,
难于分工协作。
3.再后来,java的web开发借鉴了mvc开发模式,使得程序的设计更加的合理性。
2.MVC:不是设计模式,是一种软件开发的思想。软件设计开发典范
1.M:Model,模型-----JavaBean
* 完成具体的业务操作,如查询数据库,封装对象。
2.V:View,视图------SP
* 展示数据
3.C:Controller,控制器------Servlet
* 获取用户输入(请求参数)
* 调用模型
* 将数据交给视图展示
* 优缺点:
1.优点:
1.耦合性低,方便维护,可以利于分工协作。
2.重用性高
2.缺点:
1.使得项目架构变得复杂,对开发人员要求高。
通过MVC的学习,我们知道在JSP页面作为表现层,只做展示功能。但是如果有些时候又需要写一些逻辑代码时,我们可以用下面两种技术来使用。
三、EL表达式
* jsp默认支持EL表达式的
1.概念:Expression Language 表达式语言
2.作用:替换和简化jsp页面中java代码的编写。
3.语法:${表达式}
4.注意:
* jsp默认支持jsp表达式,会将其解析。
* 如果要忽略EL表达式
1.设置jsp中page指令:isELIgnored="true",但是会忽略当前页面的所有EL表达式
2.\${表达式}:忽略一个EL表达式。
5.使用:
1.运算:
* 运算符:
1.算数运算符: + - * / %; 其中/可以用div,%可以用mod表示
2.比较运算符:> < >= <= == !=
3.逻辑运算符:&& || ! 也可以用 and or not表示
4.空运算符:empty
* 功能:用于判断字符串,集合,数组对象是否为null并且长度是否为0
* ${empty list}
2.获取值
1.el表达式只能从域对象中获取值
1.pageContext
2.request
3.session
4.application
2.语法:
1.${域名城.健名}:从指定域中获取指定键的值。
* 域名城:
1.pageScope
2.requestScope
3.sessionScope
4.applicationScope
* 举例:在request域中存储了name=zhangsan
* 获取:${requestScope.name}
有的话原样展示,如果没有不会显示null,而是空字符串。
2.${键名}:表示一次从最小的域中查找是否有该键,直到找到为止。
pageContext-->request-->session->application(ServletContext)
如果每个域的键名称都不同,那么就可以直接${键名}这样写。
3.获取其他类型的值:对象,List集合,Map集合
1.获取对象中的成员变量对象:${域名城.健名.属性名}
* 本质上回去调用对象的getter方法
* 详见:ek3.jsp package cn.itcast.domain.User
2. List集合:${域名城.健名[索引]}
* ${list[2]}
* 如果索引越界不会报错,显示空字符串
3. Map集合:${域名称.键名.key}
${map.gender}
${map.sname}
${map["gender"]}
${map["sname"]}
4.空运算符:empty
* 功能:用于判断字符串,集合,数组对象是否为null并且长度是否为0
* ${empty str}:先从各个域中找str键,然后判断str键是否为空或0.
* ${not empty str}:判断是否不为null或长度大于0
5.隐式对象:
* el表达式中有11个隐式对象
1.pageScope
2.requestScope
3.sessionScope
4.applicationScope
* pageContext:也是一个隐式对象
* 获取其他8个内置对象:实际上也是通过pageContext对象中的getXxx()方法
${pageContext.request}
${pageContext.session}
${pageContext.out}
${pageContext.servletContext}
${pageContext.servletConfig}
${pageContext.page}
${pageContext.response}
${pageContext.exception}
* 在jsp页面动态获取虚拟目录
${pageContext.request.contextPath}
四、JSTL
1.概念:JavaServer Pages Tag Library JSTL标准标签库
* 是由Apache组织提供的开源免费的jsp标签
2.作用:用于简化和替换jsp页面上的java代码
3.使用步骤:
1.导入JSTL相关的jar包
2.引入标签库:taglib指令 <%@ taglib %>
3.使用标签
4.常用的JSTL标签
1.if :相当于Java代码的if语句
*.属性:test必须属性:接收boolean表达式
* 如果表达式为true,则显示if标签体内容,如果为false不显示内容
* 一般情况下,test属性值会结合el表达式一起使用
*.注意:c:if标签没有else情况,想要else请况,可以在定义一个c:if。
2.choose :相当于Java代码的switch语句
1.域中存储数字
2.使用choose标签去除数字 :相当于switch声明
3.使用when标签做数字的判断 :相当于case
4.otherwise标签做其他情况的声明 :相当于default
5.完成数字编号对应星期几的案例:
```
<%
request.setAttribute("number", 8);
%>
<c:choose>
<c:when test="${number == 1}">星期一</c:when>
<c:when test="${number == 2}">星期二</c:when>
<c:when test="${number == 3}">星期三</c:when>
<c:when test="${number == 4}">星期四</c:when>
<c:when test="${number == 5}">星期五</c:when>
<c:when test="${number == 6}">星期六</c:when>
<c:when test="${number == 7}">星期天</c:when>
<c:otherwise>数字输入有误</c:otherwise>
</c:choose>
```
3.foreach :相当于Java代码的for语句
1.完成重复的操作
for(int i=0; i<10; i++){
....
}
* 属性:
begin: 开始值
end: 结束值
var: 临时变量
step: 步长(i++ i+=2)
varStatus: 循环状态对象
index:容器中元素的索引,从0开始。在普通for循环里使用展示的是:临时变量i的值,和i一样了
count:循环次数,从1开始
2.遍历容器
List<User> list;
for(User user : list){
...
}
属性:
items:容器对象------------list
var: 容器中元素的临时变量---user
* 详见jstl3.jsp
5.练习:
* 需求:在request域中有一个存有User对象的List集合,需要使用jstl和el将list集合数据
展示到jsp页面的表格table中。
```
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入jstl标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Test</title>
</head>
<body>
<%
ArrayList list = new ArrayList();
list.add(new User("张三", 24, new Date()));
list.add(new User("李四", 27, new Date()));
list.add(new User("王五", 29, new Date()));
request.setAttribute("myList", list);
%>
<table border="1" width="500" align="center">
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>生日</th>
</tr>
<%--数据行--%>
<c:forEach items="${myList}" var="user" varStatus="s">
<%--偶数行--%>
<c:if test="${s.count % 2 == 0}">
<tr bgcolor="red">
<td>${s.count}</td>
<td>${user.name}</td>
<td>${user.age}</td>
<td>${user.birStr}</td>
</tr>
</c:if>
<%--奇数行--%>
<c:if test="${s.count % 2 != 0}">
<tr bgcolor="green">
<td>${s.count}</td>
<td>${user.name}</td>
<td>${user.age}</td>
<td>${user.birStr}</td>
</tr>
</c:if>
</c:forEach>
</table>
</body>
</html>
```
* 详见jstl_test.jsp
五、三层架构:软件设计架构
1.界面层(表示层):用户看的到的界面,用户可以通过界面上的组件和服务器进行交互
2.业务逻辑层:处理业务逻辑的。
3.数据访问层:操作数据存储文件的。
六、案例:用户信息列表展示
1.需求:用户信息的增删改查操作。
2.设计:
1.技术选型:Servlet+JSP+MySql+JDBCTemplate+Druid+BeanUtils+tomcat
2.数据库设计:
create database day0509; ---创建数据库
use day0509; ---使用数据库
create table user{ ---创建表
id int primary key auto_increment,
name varchar(20) not null,
gender varchar(5),
age int,
address varchar(32),
qq varchar(20),
email varchar(50)
};
3.开发:
1.环境搭建
1.创建数据库环境
2.创建项目,导入需要的jar包
2.编码
4.测试
5.部署运维