🚗 JSP
指令
- 作用:用于配置JSP页面,导入资源文件
- 格式:
<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
指令分类
page
配置JSP页面
- contentType:等同于response.setContentType()
- 设置响应体的mime类型以及字符集
- 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置
pageEncoding
属性设置当前页面的字符集)
- import:导包
- errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
- isErrorPage:标识当前也是是否是错误页面。
- true:是,可以使用内置对象exception
- false:否。默认值。不可以使用内置对象exception ```java <%@ page contentType=”text/html;charset=UTF-8” language=”java” pageEncoding=”GBK” errorPage=”index.jsp” isErrorPage=”false” %> <%@ page import=”apple” %>
<% String message = exception.getMessage(); out.print (message); %>
<a name="XaWOe"></a>
### include
> 页面包含的。导入页面的资源文件
```java
<%@include file="top.jsp"%>
路径必须使用相对路径
taglib
导入资源
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- prefix:前缀,自定义的
注释
- html注释:只能注释html代码片段
- jsp注释:推荐使用
<%-- --%>
:可以注释所有
内置对象
- 在jsp页面中不需要创建,直接使用的对象
- 一共有9个: | 变量名 | 真实类型 | 作用 | | —- | —- | —- | | pageContext | PageContext | 当前页面共享数据,还可以获取其他八个内置对象 | | request | HttpServletRequest | 一次请求访问的多个资源(转发) | | session | HttpSession | 一次会话的多个请求间 | | application | ServletContext | 所有用户间共享数据 | | response | HttpServletResponse | 响应对象 | | page | Object | 当前页面(Servlet)的对象 this | | out | JspWriter | 输出对象,数据输出到页面上 | | config | ServletConfig | Servlet的配置对象 | | exception | Throwable | 异常对象 |
🚤 MVC:开发模式
jsp演变历史
- 早期只有servlet,只能使用response输出标签数据,非常麻烦
- 后来有了jsp,简化了Servlet的开发,但是如果过度使用jsp,在jsp中即写大量的java代码,有写html表,造成难于维护,难于分工协作
- 再后来,java的web开发,借鉴mvc开发模式,使得程序的设计更加合理性
MVC
- M:Model,模型。JavaBean
- 完成具体的业务操作,如:查询数据库,封装对象
- V:View,视图。JSP
- 展示数据
- C:Controller,控制器。Servlet
- 获取用户的输入
- 调用模型
- 将数据交给视图进行展示
优缺点
- 优点:
- 耦合性低,方便维护,可以利于分工协作
- 重用性高
- 缺点:
- 使得项目架构变得复杂,对开发人员要求高
🚔 EL表达式
Expression Language 表达式语言
- 作用:替换和简化jsp页面中java代码的编写
- 语法:
${ 表达式 }
- 注意: jsp默认支持el表达式的。如果要忽略el表达式
- 设置jsp中page指令中:
isELIgnored="true"
忽略当前jsp页面中所有的el表达式 \${ 表达式 }
:忽略当前这个el表达式
- 设置jsp中page指令中:
EL使用
运算符运算
- 算数运算符: + - * /(div) %(mod)
- 比较运算符: > < >= <= == !=
- 逻辑运算符: &&(and) ||(or) !(not)
- 空运算符: empty
- 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
${empty list}
:判断字符串、集合、数组对象是否为null或者长度为0,如果是返回true;${not empty str}
:表示判断字符串、集合、数组对象是否不为null 并且 长度>0,如果符合,返回false。<%
String str = "";
request.setAttribute("str",str);
%>
${not empty str}
获取值
- el表达式只能从域对象中获取值
- 语法:
${域名称.键名}
:从指定域中获取指定键的值 ,域名称有以下几个: | pageScope | pageContext | | —- | —- | | requestScope | request | | sessionScope | session | | applicationScope | application(ServletContext) |
举例:在request域中存储了name=张三 。获取:${requestScope.name}
${键名}
:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
获取对象、List集合、Map集合的值
对象:
${域名称.键名.属性名}
- 本质上会去调用对象的getter方法
- 通过的是对象的属性来获取setter或getter方法,去掉set或get,在将剩余部分,首字母变为小写。setName —> Name - -> name
${requestScope.u}<br>
${requestScope.u.name}
${requestScope.u.age}
${requestScope.u.birthday.month}
<hr>
${u.birstr}
List集合:
${域名称.键名[索引]}
```java List list = new ArrayList(); list.add(“aaa”); list.add(“bbb”); list.add(user);
request.setAttribute(“list”,list);
el获取list中的值
${requestScope.list[0]} ${requestScope.list[1]} ${requestScope.list[2].name}
3. Map集合:
1. `${域名称.键名.key名称}`
1. `${域名称.键名["key名称"]}`
```java
Map map = new HashMap();
map.put("sname","李四");
map.put("gender","男");
map.put("user",user);
request.setAttribute("map",map);
<h3>el获取Map集合中的值</h3>
${map.gender}<br>
${map["gender"]}<br>
${map.user.name}
隐式对象
el表达式中有11个隐式对象
pageContext: 获取jsp其他八个内置对象 ${pageContext.request.contextPath}
:动态获取虚拟目录
<form action="${pageContext.request.contextPath}/toginServlet" method="post">
🚒 JSTL
JavaServer Pages Tag Library JSP标准标签库 。这是由Apache组织提供的开源的免费的jsp标签<标签>
作用:用于简化和替换jsp页面上的java代码
使用步骤
- 导入jstl相关jar包 (http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/)
- 引入标签库:taglib指令:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
- 使用标签
常用的JSTL标签
if
相当于java代码的if语句
- 属性: test 必须属性,接受boolean表达式
- 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
- 一般情况下,test属性值会结合el表达式一起使用
注意:
c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签
<%
//判断request域中的一个list集合是否为空,如果不为null则显示遍历集合
List list = new ArrayList();
list.add("aaa");
request.setAttribute("list",list);
request.setAttribute("number",4);
%>
<c:if test="${not empty list}">
集合遍历
</c:if>
<br>
<c:if test="${number % 2 != 0}">
${number}为奇数
</c:if>
choose
相当于java代码的switch语句
- 使用choose标签声明 相当于switch声明
- 使用when标签做判断 相当于case
使用otherwise标签做其他情况的声明 相当于default
<%
request.setAttribute("number",13);
%>
<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>
forEach
相当于java代码的for语句
作用一:完成重复的操作
for(int i = 0;i < 10;i++){ }
属性:
- begin:开始值
- end:结束值
- var:临时变量
- step:步长
- varStatus:循环状态对象
- index:容器中元素的索引,从0开始
- count:循环次数,从1开始
<c:forEach begin="1" end="10" var="i" step="2" varStatus="s">
${i}
${s.index}
${s.count}
</c:forEach>
作用二:遍历容器
List<User> list;
for(User user: list){
}
属性:
- items:容器对象
- var:容器中元素的临时变量
- varStatus:循环状态对象
- index:容器中元素的索引,从0开始
- count:循环次数,从1开始 ```java <% List list = new ArrayList(); list.add(“aaa”); list.add(“bbb”); list.add(“ccc”); request.setAttribute(“list”,list); %>
<a name="Zb0B4"></a>
## 练习
需求:在request域中有一个存有User对象的List集合。需要使用jstl+el将list集合数据展示到jsp页面的表格table中
```java
<%
List list = new ArrayList();
list.add(new User("张三",14,new Date()));
list.add(new User("李四",42,new Date()));
list.add(new User("王五",54,new Date()));
request.setAttribute("list",list);
%>
<table border="1" align="center">
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>生日</th>
</tr>
<%-- 数据行--%>
<c:forEach items="${list}" var="user" varStatus="s">
<c:if test="${s.count % 2 == 0}">
<tr bgcolor="red">
<td>${s.count}</td>
<td>${s.name}</td>
<td>${s.age}</td>
<td>${s.birStr}</td>
</tr>
</c:if>
<c:if test="${s.count % 2 != 0}">
<tr bgcolor="green">
<td>${s.count}</td>
<td>${s.name}</td>
<td>${s.age}</td>
<td>${s.birStr}</td>
</tr>
</c:if>
</c:forEach>
</table>
🛥 三层架构:软件设计架构
- 界面层(表示层):用户看的得界面。用户可以通过界面上的组件和服务器进行交互
- 业务逻辑层:处理业务逻辑的。
- 数据访问层:操作数据存储文件。
⛵️ 案例:用户信息列表展示
- 需求:用户信息的增删改查操作
设计:
- 技术选型:Servlet+JSP+MySQL+JDBCTempleat+Duird+BeanUtilS+tomcat
- 数据库设计:
create database day17; -- 创建数据库
use day17; -- 使用数据库
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)
);
开发:
- 环境搭建
- 创建数据库环境
- 创建项目,导入需要的jar包
- 编码
- 环境搭建
- 测试
- 部署运维