<%--
1、jsp
1、指令
2、注释
3、内置对象
2、mvc开发模式
3、el表达式
4、jstl标签
5、三层架构--%>
1、jsp
index.jsp
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" errorPage="500.jsp" language="java" %>
<%--<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%–// 错误的话就是 缺少jstl-impl 的jar包–%>--%>
<html>
<head>
<title>jsp指令</title>
</head>
<body>
<%
List list=new ArrayList();
int i=3/0;
%>
</body>
</html>
top.jsp
<%--
Created by IntelliJ IDEA.
User: 13498
Date: 2022/11/3
Time: 21:39
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>页面log页面标题</h1>
home.jsp
<%--
Created by IntelliJ IDEA.
User: 13498
Date: 2022/11/3
Time: 21:39
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ include file="top.jsp" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>主体内容</h3>
<%
pageContext.setAttribute("msg","hello");
pageContext.
%>
<%=pageContext.getAttribute("msg")%>
</body>
</html>
500.jsp
<%--
Created by IntelliJ IDEA.
User: 13498
Date: 2022/11/3
Time: 21:21
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>服务器正忙</h1>
<%
String message = exception.getMessage();
out.print(message);
//如果out.print()出现错误 ,就把包导入lib中
%>
</body>
</html>
2、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,视图 (jsp)
*展示数据
3、C:controller,控制器 (servlet)
*1、获取用户的输入 2、调用模型 3、将数据交给视图进行展示
3、优缺点
1、优点:耦合性低,方便维护,可以利于分工协作。2、重用性高,
3、缺点:使得项目架构变得复杂,对开发人员要求变高
表示:浏览器客户端请求服务器,首先要经过controller控制器,controller控制器调用model模型进行业务操作,操作完,model模型把数据返回给controller控制器,controller控制器把数据给view视图展示,展示后给浏览器做出对应的响应,
3、 el表达式
1、概念:expression language 表达式语言
2、作用:替换和简化jsp页面中java代码的编写
3、语法:${ 表达式 }
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="true" %>
* isELIgnored="true" 是否忽略el表达式
4、注意:
*jsp默认支持el表达式的。如果要忽略el表达式
1、设置page中的属性 isELIgnored="true" ,忽略当前jsp页面中所有的el表达式
2、\${表达式} ,表示忽略当前el表达式
5、使用
1、运算
1、算数运算符:+,-, *,/(div),%(mod)
2、比较运算符: >, >=, < ,<=, ==, !=
3、逻辑运算符: &&(and),||(or) ,!(not)
4、空运算符:emtpy
*功能强大,用于判断字符串,集合,数组对象是否为null,并且长度是否为0
*${empty list} :判断str 字符串、集合、数组对象是否为null,或者长度为0
*${not empty str} :判断str 字符串、集合、数组对象是否不为null,并且长度大于0
2、获取值
1、el表达式只能从域对象中获取值,
2、语法:
1、${域名城,键名}:从指定域中获取指定键的值
*域名城:
1、pageScope --> pageContext
2、requestScore --> request
3、sessionScope --> session
4、applicationScope --> application (servletcontext)
*举例:在request域中存储了name=张三
*获取:${requestScopr.name}
2、${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
${name}:现在pageScope中找有没有name,再去requestScore中找,直到找到name位置。找到就不再查找了。
3、获取对象、list集合、map集合的值
1、获取对象:
${域名城.键名.属性名}
*本质上会去调用对象的getter方法
2、list集合:
${域名称.键名[索引]}
3、map集合:
${域名城.键名.key名称}
${域名城.键名["key名称"]}
<%@ page import="com.example.domain.User" %>
<%@ page import="java.util.*" %><%--
Created by IntelliJ IDEA.
User: 13498
Date: 2022/11/14
Time: 21:18
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>el获取对象数据</title>
</head>
<body>
<%
User user=new User();
user.setName("张三");
user.setAge(22);
user.setBirthday(new Date());
request.setAttribute("u",user);
List list=new ArrayList();
list.add("aaa");
list.add("bbb");
list.add(user);
request.setAttribute("l",list);
Map map=new HashMap();
map.put("sname","李四");
map.put("gender","男");
map.put("user",user)
request.setAttribute("m",map);
%>
<h3>el获取对象中的值</h3>
${u}<br><%--获取的是一个地址com.example.domain.User@68b1cdb1--%>
<%--
通过的是对象的属性来获取
*setter或getter方法,去掉set或get,再将剩余部分,首字母变小写
*setName --> Name --> name
--%>
${requestScope.u.name}<br>
${u.age}<br>
${u.birthday}<br>
${u.birthday.month+1}<br>
${u.birstr}<br>
<h3>获取list中的值</h3>
${l}<br>
${l[0]}<br>
${l[1]}<br>
${l[10]}<br> <%--不报错 但是不显示--%>
${l[2].name}<br>
<h3>获取map中的值</h3>
${m}<br>
${m.gender}<br>
${m["gender"]}<br>
${m.user.name}<br>
</body>
</html>
user类
package com.example.domain;
import java.text.SimpleDateFormat;
import java.util.Date;
public class User {
private String name;
private int age;
private Date birthday;
/**
* 逻辑视图
* @return
*/
public String getBirstr(){
if (birthday!=null){
//1、格式化日期
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//2、返回字符串即可
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;
}
}
3、隐式对象
*el表达式有11个隐式对象
*pageContext :获取jsp其他八个内置对象
${pageContext.request.contextPath}<br> 动态获取虚拟目录
4、jstl
1、概念:javaserver pages tag library jsp标准标签库
*是由apache组织提供的开源的免费的jsp标签
2、作用:用于简化和替换jsp页面上的java代码
3、使用步骤:
1、导入jstl相关jar包
2、引入标签库,taglib指令: <%@ taglib % >
3、使用标签
4、常用的jstl标签 -------------- jstl1.jsp jstl2.jsp jstl3.jsp
1、if :相当于java代码的if语句 jstl1.jsp
1、属性: * test 必须属性:接收boolean表达式 *如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容 *一般情况下,test属性会结合el表达式一起使用 2、注意: *c:if标签没有else情况,想要el情况,则可以再定义一个c:if标签
2、choose :相当于java代码的switch循环 jstl2.jsp
1、使用choose标签取出数字 相当于switch声明<br> 2、使用when标签做数字判断 相当于case<br> 3、otherwise标签做其他情况的声明 相当于default<br>
3、foreach :相当于java代码的for循环 jstl3.jsp
1、完成重复的操作 for (int i=0;i<10;i++){ } *属性: begin开始值: end结束值: var临时变量: step:步长: varStatus:循环状态对象 index:容器中元素的索引,从0开始 conunt:循环次数,从1开始 2、遍历容器 List<User> list; for(User user: list){ } *属性: items:容器对象 var:容器中元素的临时变量 varStatus:循环状态对象 index:容器中元素的索引,从0开始 conunt:循环次数,从1开始
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: 13498
Date: 2022/11/15
Time: 19:53
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>if标签</title>
</head>
<body>
<%--
c:if 标签
1、属性:
* test 必须属性:接收boolean表达式
*如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
*一般情况下,test属性会结合el表达式一起使用
2、注意:c:if标签没有else情况,想要el情况,则可以再定义一个c:if标签
--%>
<h4>if标签</h4>
<c:if test="false">
我是真的
</c:if><br>
<%
//判断request域中的一个list集合是否为空,如果不为null则显示遍历集合
List list=new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
request.setAttribute("list",list);
request.setAttribute("number",3);
request.setAttribute("number1",4);
%>
<c:if test="${not empty list}">
不为空遍历 遍历集合
</c:if><br>
<c:if test="${number %2 !=0}">
${number}为奇数
</c:if><br>
<c:if test="${number1 %2 ==0}">
${number}为偶数
</c:if><br>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: 13498
Date: 2022/11/15
Time: 20: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>choose 标签</title>
</head>
<body>
完成数字编号对应星期几案例<br>
1、域中存储一串数字<br>
2、使用choose标签取出数字 相当于switch声明<br>
3、使用when标签做数字判断 相当于case<br>
4、otherwise标签做其他情况的声明 相当于default<br>
<br>
<%
request.setAttribute("number",51);
%>
<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>
</body>
</html>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: 13498
Date: 2022/11/15
Time: 20:17
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>foreach标签</title>
</head>
<body>
<%-- foreach:相当于java代码的for循环<br>
1、完成重复的操作
for (int i=0;i<10;i++){
}
*属性:
begin开始值:
end结束值:
var临时变量:
step:步长:
varStatus:循环状态对象
index:容器中元素的索引,从0开始
conunt:循环次数,从1开始
2、遍历容器
List<User> list;
for(User user: list){
}
*属性:
items:容器对象
var:容器中元素的临时变量
varStatus:循环状态对象
index:容器中元素的索引,从0开始
conunt:循环次数,从1开始
--%>
<c:forEach begin="1" end="10" var="i" step="2" varStatus="s">
${i} <h3>${s.index}</h3> <h4>${s.count}</h4><br>
</c:forEach>
<hr>
<%
List list=new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("lis",list);
%>
<c:forEach items="${lis}" var="str" varStatus="s">
${s.index} ${s.count} ${str}<br>
</c:forEach>
</body>
</html>
练习:需求:在request域中有一个存有User对象的List集合。需要使用jstl+el将list集合数据展示到jsp页面的表格table中
有个user类 如上: 就是多了个有参构造和无参构造
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="com.example.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Date" %><%--
Created by IntelliJ IDEA.
User: 13498
Date: 2022/11/15
Time: 21:40
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>练习</title>
</head>
<body>
<%
List list=new ArrayList();
list.add(new User("张三",23,new Date()));/*User 类中 要有有参构造加无参构造 传值*/
list.add(new User("李四",24,new Date()));
list.add(new User("王五",25,new Date()));
request.setAttribute("lis",list);
%>
<table border="1" width="500px" align="center">
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>生日</th>
</tr>
<%--数据行--%>
<c:forEach items="${lis}" 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>
<tr>
</tr>
</table>
</body>
</html>
5、三层架构:软件设计架构
1、界面层(表示层):用户可以通过界面上的组件和服务器进行交互
2、业务逻辑层:处理业务逻辑的。***
3、数据访问层:操作数据存储文件的。