JSP:Java Server Pages–>Java服务器页面
指令:用于配置JSP页面,导入资源文件
格式:<@ 指令名称 属性名1=属性值1 属性名2=属性名2…%><%@ page contentType="text/html;charset=UTF-8" language="java" %>
分类:
page:配置指令
page-> contentType:contentType="text/html
等同于response.setContentType("text/html;charset=utf-8");
1、设置响应体的mime类型以及字符集
2、设置当前jsp页面的编码(只能高级IDE才可生效,若使用低级工具,则需要设置pageEncoding属性设置页面字符编码)
language:指定为Java
buffer:buffer="8kb"
指定页面缓冲区大小
import:import="java.util.List"
导入Java的包
errorPage:errorPage="500.jsp"
发生异常后页面跳转到500.jsp,可设置显示服务器正忙…
isErrorPage:isErrorPage="true"
标注页面为错误页面,可使用内置对象exception,默认为false
include:页面包含的,导入页面的资源文件 <@include file="top.jsp"%>
taglib:导入资源<@taglib prefix="可自定义" uri="http://java.sun.com/jap/jst1/core"%>
可导入WEB-INF下的lib文件夹中的东西
注释
1、html注释:<!----!>
只能注释html代码片段
2、jsp注释:<%----%>
可以注释所有,推荐使用
内置对象
变量名 | 真实类型 | 作用 |
---|---|---|
pageContext | PageContext | 当前页面共享数据 ,还可以获取其他8个对象 |
request | HttpServletRequest | 一次请求访问的多个资源(转发) |
session | HttpSession | 一次用户间共享数据 |
application | ServletContext | 所有用户间共享数据 |
response | HttpServletResponse | 响应对象 |
page | Object | 当前页面(Servlet)的对象 this |
out | JspWriter | 输出对象,数据输出到页面上 |
config | ServletConfig | Servlet的配置对象 |
exception | Throwable | 异常对象 |
PageContext在获取其他8个对象的时候在comcat中将jsp.api.jar包引入到lib文件夹中
MVC开发模式
jsp演变历史
早期只有servlet,只能使用request输出标签数据,非常烦
后来有了jsp,简化servlet的开发,如果过度使用jsp,在jsp中写入大量java代码,有写html表,难以维护
再后来,Java的web开发,借鉴MVC开发模式,使得程序的实际更加合理性
M:Modle,模型,完成具体的业务操作,如:查询数据库,封装对象 JavaBean
V:View,视图,展示数据JSP
C:Controller,控制器,获取用户的输入,调用模型,将数据交给视图进行展示Servlet
MVC优缺点
优点:耦合性低,方便维护,可以利于分工协作,重用性高
缺点:使得项目架构变得复杂,对开发人员要求高
EL表达式 Expression Language表达式语言
替换和简化jsp页面中java代码的编写 ${表达式}
jsp默认支持el表达式
在page指令中可以忽略el表达式<%@isElIgnord="true">
true表示页面中的所有el表达式都不能被使用了
使用\
可控制局部el表达式被忽略
运算
运算符
算数运算符:+ - * /(div) %(mod)
比较运算符:> < >= <= == !=
逻辑运算符:&&(and)||(or)!(not)
<body>
${3>4}
<hr>
<h3>算数运算符</h3>
${3 + 4}<br>
${3 / 4}<br>
${3 div 4}<br>
${3 % 4}<br>
${3 mod 4}<br>
<h3>比较运算符</h3>
${3 == 4}<br>
<h3>逻辑运算符</h3>
${3>4 && 3<4}<br>
</body>
空运算符:empty–>用于判断字符串、集合、数组长度是否为0或对象是否为null
${empty str}
${ not empty str} 判断不为空或长度不为0
<%
String str = null;
request.setAttribute("str",str);
%>
${empty str}
获取值
el表达式只能从域对象中获取值
语法1:${域名称.键名}:从指定域中获取指定键的值
域名称 | 获取值的地方 |
---|---|
pageScope | pageContext |
requestScope | request |
sessionScope | session |
applicationScope | application(ServletContext) |
==el如果没有获取到值,会显示空字符串,不会打乱页面排序,可用于验证码案例中使用div定义的用户名错误而显示null… ==
<head>
<title>el获取域中的数据</title>
</head>
<body>
<%
//在域中存储数据
request.setAttribute("name","张三");
session.setAttribute("age",34);
%>
<h3>el获取值</h3>
${requestScope.name}
${sessionScope.age}
</body>
语法2:${键名}:依次表示从最小的域中查找是否有该对应的值,直达找到为止
EL获取对象的值${域名称.键名.属性名}
${域名称.键名.属性名} 本质上会去调用对象的getter方法
对象User JavaBean
package cn.zg.domain;
import java.text.SimpleDateFormat;
import java.util.Date;
public class User {
private String name;
private int age;
private Date birthday;
//逻辑视图,没有对应的成员变量,只是为了提供页面上的一些好看的效果
public String getBirStr(){
if (birthday !=null){
//格式化日期对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//返回字符串即可
return sdf.format(birthday);
}else {
return "";
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
el.jsp
<%@ page import="cn.zg.domain.User" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>获取对象的数据</title>
</head>
<body>
<%
User user = new User();
user.setName("张三");
user.setAge(23);
user.setBirthday(new Date());
request.setAttribute("u",user);
%>
<h3>el获取对象中的值</h3>
${requestScope.u}<%--获取到的是u的hashCode值--%>
<%--
通过对象的属性来获取值
setter或getter方法,去掉set或get,在将剩余的部分,首字母变小写
getUsername()->Username->username
--%>
${requestScope.u.name}<br><%--所以说u.name找的其实是getName这个方法--%>
${requestScope.u.age}<br>
${requestScope.u.birthday}<br><%--这里获取的日期是美国时间,所以需要进行转换--%>
${requestScope.u.birStr}
</body>
</html>
EL获取List集合的值${域名称.键名[索引]}
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="cn.zg.domain.User" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
User user = new User();
user.setName("张三");
user.setAge(23);
user.setBirthday(new Date());
request.setAttribute("u",user);
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add(user);
request.setAttribute("list",list);
%>
<h3>el获取List集合中的值</h3>
${list}<%--[aaa,bbb]--%>
${list[0]}<%--aaa--%>
${list[1]}<%--bbb--%>
${list[10]}<%--如果因为下标越界,不会报错就只是什么也不显示--%>
${list[2].name}<%----%>
</body>
</html>
EL获取Map集合的值${域名称.键名.key名称} && ${域名称.键名.[“key名称”]}
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.Date" %>
<%@ page import="cn.zg.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
User user = new User();
user.setName("张三");
user.setAge(23);
user.setBirthday(new Date());
Map map =new HashMap<>();
map.put("sname","李四");
map.put("gender","男");
map.put("user",user);
request.setAttribute("map",map);
%>
<h3>el获取Map集合中的值</h3>
${map.gender}<%--男--%>
${map["gender"]}<%--男--%>
${map.user.name}<%--张三--%>
</body>
</html>
隐式对象11个
pageContext:获取jsp其他8个隐式对象
在jsp页面动态的获取虚拟目录
${pageContext.request.contextPath}->获取虚拟目录
JSTL :JavaServer Pages Tag Library JSP标准标签库
由Apache组织提供的开源免费的jsp标签
作用:用于简化和替换jsp页面上的Java代码
步骤
1、导入jstl相关jar包
2、引入标签库:taglib指令:<%@ taglib%>
3、使用标签
常用JSTL标签
1、if:相当于Java代码的if语句
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>if</title>
</head>
<body>
<%--c:if标签
属性:test必须属性,接收boolean表达式
如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
一般情况下,test属性值会结合el表达式一起使用
注意:c:if标签没有else情况,想要else情况,则可以重新定义一个c:if标签
--%>
<c:if test="true">
hhhh
</c:if>
<%
//判断request域中的一个list集合是否为空,如果不为null则显示遍历集合
List list = new ArrayList();
list.add("aaa");
request.setAttribute("list",list);
%>
<c:if test="${not empty list}">
遍历集合
</c:if>
</body>
</html>
2、choose:相当于Java代码的switch语句
<%--
Created by IntelliJ IDEA.
User: 64359
Date: 2021/10/20
Time: 19:10
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--完成数字编号对应星期几的案例
1、在域中存储一数字
2、使用choose标签取出数字 相当于switch声明
3、使用when标签zuo数字判断 相当于case
4、otherwise标签做其他情况的声明 相当于default
--%>
<%
request.setAttribute("number",3);
%>
<c:choose>
<c:when test="${number == 1}">星期一</c:when>//如果number是1,则显示星期一
<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>
</body>
</html>
3、foreach:相当于Java代码的for语句
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: 64359
Date: 2021/10/20
Time: 19:18
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--foreach:相当于Java代码的for语句
1、完成重复的操作
for(int 1 = 0;i < 10;i ++){
}
属性:begin:开始值0
end:结束值10,这里表示包含开始值也包含结束值
var:临时变量i
step:步长,也就是临时变量var每次增长多少
varStatus:循环状态对象
index:容器中元素的索引,从0开始
count:循环次数
2、遍历容器
List<User> list;
for(User user : list){
}
属性:items:容器对象list
var:容器中元素的临时变量user
varStatus:循环状态对象
index:容器中元素的索引,从0开始
count:循环次数
--%>
<c:forEach begin="1" end="10" var="i" step="1" varStatus="s">
${i} ${s.index} ${s.count}<br>
</c:forEach>
<%
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="str" varStatus="s">
${s.index}${s.count}${str}
</c:forEach>
</body>
</html>
案例
在request域中由一个存有User对象的List集合,需要使用JSTL+EL将list集合数据展示到jsp页面的表格table中
<%@ page import="cn.zg.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Date" %><%--
Created by IntelliJ IDEA.
User: 64359
Date: 2021/10/20
Time: 19:36
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
List list = new ArrayList();
list.add(new User("bob",23,new Date()));
list.add(new User("Alice",22,new Date()));
list.add(new User("Mallory",33,new Date()));
request.setAttribute("list",list);
%>
<table border="1" width="500" 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="#f0f8ff">
<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="#faebd7">
<td>${s.count}</td>
<td>${user.name}</td>
<td>${user.age}</td>
<td>${user.birStr}</td>
</tr>
</c:if>
</c:forEach>
</table>
</body>
</html>