Java Server Page = html + java脚本 + jsp动态标签
Jsp的执行流程:
JSP -> Servlet -> .class
服务器响应JSP过程:
JSP在项目发布后, 被编译后的Servlet在哪里?
在Tomcat的work目录下!
jsp注释: <%-- --%>
<%= %> 可以在jsp页面中输出一个变量
凡是能够在System.out.println()中的代码, 都可以用该脚本输出
<% %>
凡是能够写在Java方法中的代码, 都可以写在这里
<%! %>
凡是能够写在Java类中的代码, 都可以写在这里
比如:
定义方法, 定义成员变量(全局变量)
练习案例:
通过Java脚本使用循环, 打印一个表格
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP03title>
head>
<body>
<%--
打印表格
--%>
<table border="1" width="500px" align="center">
<caption>
学生信息
caption>
<tr>
<th>姓名th>
<th>年龄th>
<th>性别th>
tr>
<%
for (int i = 0; i < 10; i++ ) { %>
<tr>
<td><%= "狗娃" + i%>td>
<td><%= i+1%>td>
<td>
<%
if (i % 2 == 0) {
out.print("男");
} else {
out.print("女");
}
%>
td>
tr>
<%
}
%>
table>
body>
html>
a) page(可以出现多行)
language: jsp支持的语言
import: 导包, 该属性是唯一可以重复的属性
pageEncoding: 当前jsp页面的编码和ContentType保持一致
ContentType: 被编译成Servlet响应的编码,
相当于response.setContentType()
errorPage:
当前jsp页面如果报错, 就会跳转到指定的页面
isErrorPage:
将当前页面配置成一个错误页面, 那么可以使用exception内置对象
isThreadSafe:
配置jsp被编译后的servlet是否线程安全, 改变之后影响效率, 一般不用
isELIgnored:
该属性是true, 那么在jsp页面中不能使用EL表达式
session:
如果该顺序等于false, 那么不能在jsp页面中使用session对象
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
b) include指令:
静态包含: 两个jsp页面在编译时结合, 形成一个Servlet, 当然
每个jsp都是可以单独显示内容的
<%@include file="/jsp/jsp_02.jsp"%>
c) taglib: 用来导入第三方标签库, 很重要, 比如在使用jstl标签库的时候就需要
通过taglib来导入标签库
prefix: 可以随便写, 作为标签的前缀
uri: 标签库的路径
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
动态包含, 两个jsp文件会被编译成两个Servlet, 并且两个jsp都可以响应内容, 跟servlet的包含是一个意思
跟servlet的转发是一个意思
转发的时候用来传递参数, 在另个页面通过request.getParameter(name)
来获取该参数
分类:
输入输出对象 out, response, request
通信控制对象: pageContext, session, application
Servlet对象: context, config
错误处理对象: exception
a) page: Object 代表当前jsp页面对象, 相当于this, 几乎不用
b) config: ServletConfig 封装的是jsp被编译成servlet以后的配置信息, 几乎不用
c) exception: Throwable 该对象的使用需要配置
isErrorPage="true"
exception.getMessage()
用来获取异常信息
d) response HttpServletResponse
e) out: JspWriter 用来输出内容 out.print();
下面是四个域对象: 范围从小到大
f) pageContext PageContext 最小的域对象
g) request HttpServletRequest
h) session HttpSession
i) application ServletContext
pageContext.setAttribute("name", "haha", PageContext.REQUEST_SCOPE);
pageContext.getAttribute("name", PageContext.REQUEST_SCOPE);
pageContext.getOut()
语法: ${}
第一个作用:
1. 从四大域对象中获取数据
<%--
全域查找
查找顺序: pageContext, request, session, application
指定域:
${域名.变量名}
--%>
${name}
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
<%
String[] arr = {"java", "C#", "C++", "python", "PHP", "c"};
pageContext.setAttribute("arr", arr);
List list = new ArrayList<>();
list.add("123");
list.add("345");
list.add("789");
pageContext.setAttribute("list", list);
%>
${arr[0]}
${list[2]}
<%
// map集合
Map<String, String> map = new HashMap<>();
map.put("name", "haha");
map.put("age", "18");
map.put("school", "wtu");
pageContext.setAttribute("map", map);
%>
${pageScope.map.name}
<%--
底层实现分析: Map.Entry<K, V>
getValue()
--%>
${map.age}
// 四个域对象
pageScope
requestScope
sessionScope
applicationScope
pageContext // 该对象的作用主要是用来获取其它对象
如: request
${pageContext.request.contextPath} -> 项目名
param // 用来获取请求参数
paramValues // 用来获取请求参数(多个请求值的情形)
head // 获取请求头的头值
headValues // 对应一个请求头有多个值的情况
initParam // 获取全局初始化参数, 可以通过ServletContext对象获取
cookie // 获取浏览器发送过来的cookie
(Java Server Pages Standard Tag Library),JSP标准标签库
core: 核心标签库
先导入jstl核心标签库, 通过taglib
指令导入
<c:out value="" >
// 向页面输出内容
<c:out value="${name}" default="xxx">c:out>
// 先在域里找name属性, 没有就输出default的内容
<c:set var="name" value="haha" scope="session">c:set>
// 相当于调用session.setAttribute(name, value)
<%-- 从域中删除一个属性, 如果没有指定scope, 那么全域删除 --%>
<c:remove var="name" scope="session">c:remove>
<%-- 项目名:/day_1_13/ --%>
${pageContext.request.contextPath} --> /day_1_13
<c:url value="/">c:url>
<%-- if结构 --%>
<c:if test="${param.score>90}">
<c:out value="成绩优秀">c:out>
c:if>
<%-- if - elseif - else结构 --%>
<c:choose>
<c:when test="${param.score>100||param.score<0}">
分数不正确
c:when>
<c:when test="${param.score>90}">
成绩优秀
c:when>
<c:when test="${param.score>60}">
成绩一般
c:when>
<c:otherwise>
成绩很差
c:otherwise>
c:choose>
<%--
循环遍历
forEach:
end: 结束
begin: 开始
step: 每次增长的幅度
for (int i = 0; i <= 10; i++)
--%>
<c:set var="sum" value="0">c:set>
<c:forEach end="10" begin="0" step="1" var="i">
<c:set var="sum" value="${sum+i}">c:set>
c:forEach>
<c:out value="${sum}">c:out>
// 模拟数据
List<Item> itemList = new ArrayList<>();
Item item1 = new Item(1, "小米", 1500.0, 10, "非常好用");
Item item2 = new Item(2, "华为", 1800.0, 10, "非常好用");
Item item3 = new Item(3, "苹果手机", 5500.0, 10, "非常好用");
Item item4 = new Item(4, "OPPO", 1500.0, 10, "非常好用");
itemList.add(item1);
itemList.add(item2);
itemList.add(item3);
itemList.add(item4);
request.setAttribute("itemsList", itemList);
<%--
遍历list集合:
集合被遍历以后每个元素的名称
items: 域中被保存的变量的变量名
--%>
<c:forEach var="ite" items="${requestScope.itemsList}">
<tr>
<th>${ite.name}th>
<th>${ite.price}th>
<th>${ite.count}th>
<th>${ite.detail}th>
<th>
<a href="#">修改a>
<a href="#">删除a>
th>
tr>
c:forEach>
其它特殊:
Fmt: 格式化
注意导入的taglib不一样:
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>格式化title>
head>
<body>
<%
Date date = new Date();
pageContext.setAttribute("date", date);
%>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss">fmt:formatDate>
body>
html>
dao: jdbc 数据访问层, 只做增删改查
service: 处理业务逻辑
web: servlet, jsp
https://github.com/menglanyingfei/Java/tree/master/JavaWebTrain/day_1_13