Servlet 的生命周期
- 当 servlet 首次被访问时 ,调用构造方法,只调用一次(只有一个servlet对象被创建)
- 紧接着调用初始化 init 方法,也是只调用一次
- 根据请求方式,调用 service,或 doGet 或 doPost (请求几次,就会被调用几次)
- 当应用程序停止前,调用 destroy 方法,只调用一次
这些方法都是由 tomcat 容器来调用, 这种方式称之为控制反转
Servlet 默认是在第一次访问时被加载,也可以配置服务器启动时被加载 loadOnStartup = 数字
数字代表优先级,数字小的表示优先级高
还可以设置初始化参数(了解)
Servlet 2.5 以前的版本
webapp/WEB-INF/web.xml (部署描述符)
在这里也可以配置servlet中的所有功能,例如:
<servlet>
<!-- servlet 名字 -->
<servlet-name>old</servlet-name>
<!-- servlet 对应的 java 类-->
<servlet-class>web.OldServlet</servlet-class>
<!-- 初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>李四</param-value>
</init-param>
<!-- 让 servlet 在启动时加载,优先级是 3 -->
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<!-- servlet 名字, 与上面对应 -->
<servlet-name>old</servlet-name>
<!-- servlet 访问路径 -->
<url-pattern>/old</url-pattern>
</servlet-mapping>
jsp 中的 EL 表达式
expression language
主要作用是从作用域中取出变量并显示
request.setAttribute(“变量名”, 值);
页面上可以使用 ${ 变量名.属性 }
1. 做简单运算
<h3>算数运算 ${ 18 + 20 }</h3>
<h3>比较运算 ${ 18 > 20 }</h3>
<h3>逻辑运算 ${ 18 > 20 and 19 < 30 }</h3>
<h3>逻辑运算 ${ 18 > 20 or 19 < 30 }</h3>
<h3>逻辑运算 ${ not (18 > 20) }</h3>
<h3>三元运算 ${ (false)?"真":"假" }</h3>
<h3>空运算 ${ empty names}</h3>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/1/14
Time: 15:35
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>
<c:forEach items="${names}" var="name" varStatus="s">
<p>${name}${s.index}</p>
</c:forEach>
<ul>
<c:forEach items="${names}" var="name">
<li>${name}</li>
</c:forEach>
</ul>
<table border="1" width="100%">
<tr>
<td>张三</td>
</tr>
<tr>
<td>李四</td>
</tr>
<tr>
<td>王五</td>
</tr>
</table>
<c:if test="${empty names}">
<table>
<tr>
<td>暂无数据</td>
</tr>
</table>
</c:if>
<c:if test="${not empty names}">
<table> border="1" width="100%">
<c:forEach items="${names}" var="n">
<tr>
<td>${n}</td>
</tr>
</c:forEach>
</c:if>
</table>
<ol>
<c:forEach items="${m}" var="e" >
<li>${e.key} ------${e.value}</li>
</c:forEach>
</ol>
<c:forEach begin="0" end="9" var="i">
${i}
</c:forEach>
${uname}
${param.username}
${param["username"]}
<h3>${paramValues.hobby[0]} ${paramValues.hobby[1]}</h3>
<h3>算数运算 ${18+20}</h3>
<h3>比较运算 ${18>20}</h3>
<h3>逻辑运算 ${18>20 and 18>12}</h3>
<h3>逻辑运算 ${18>20 or 18>12}</h3>
<h3>比较运算 ${not(18>20)}</h3>
<h3>三元运算 ${(false)?"aaa":"ccc"}</h3>
<h3>空运算 ${empty names}</h3>
${names}
<h3>显示list的数据 ${names[1]} </h3>
<h3>显示list的数据 ${names.size()} getSize()
${m}
${m.beijing}
${m.shanghai}
${m["beijing"]}
${m.get("beijing")}
</h3>
<h3>${m.key}---${m.value}</h3>
<h3>${stu.name}---${stu.age}</h3>
<h3>${stu.homeAddress.city}----${stu.homeAddress.street}</h3>
</body>
</html>
2. 用来显示作用域中的变量 (重点)
- list 显示 可以用 [下标]
- 要显示大小 list.size()
- map 显示 可以用 ${map.key}
- map 显示 可以用 ${map[“key”]}
- map 显示 可以用 ${map.get(“key”)}
- 建议map使用字符串作为key,如果非要用整数作为key,必须用 Long, 只能用[]语法取,不能用.语法
- 显示java bean, 底层实际调用的是get方法,嵌套的对象可以多次调用.语法
3. 11 个隐式对象
- param 代表是请求参数的map集合,用在一个参数有一个值的情况, key对应参数名,value对应参数值
- paramValues 代表是请求参数的map集合,用在一个参数有多个值的情况, key对应参数名,value对应参数值的数组
4. 标准标签库
简称jstl
- 引入标签库 jar包
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
- 在页面上声明要使用的标签库
<%@ taglib prefix="标签前缀" uri="标签的唯一标识" %>
核心标签
- forEach 进行遍历
<c:forEach items="要遍历的集合" var="临时变量名" begin="起始的下标" end="结束下标" varStatus="保存下标的对象">
</c:forEach>
其中 varStatus 中有两个属性 count(从1开始) , index(从0开始)
- if 条件判断
<c:if test="条件">内容</c:if>
- choose 条件判断
<c:choose>
<c:when test="条件1">内容</c:when>
<c:when test="条件2">内容</c:when>
<c:when test="条件3">内容</c:when>
<c:otherwise>内容</c:otherwise>
</c:choose>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/1/14
Time: 20:40
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" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:choose>
<c:when test="${salary < 2000}">低工资</c:when>
<c:when test="${salary >=2000 and salary < 8000}">中等工资</c:when>
<c:otherwise>高工资</c:otherwise>
</c:choose>
${salary}
<hr>
<c:remove var="salary"/>
${salary}
<!-- 把变量存入作用域, var=“变量名” value="变量值"-->
<c:set var="name" value="张三" />
${name}
<hr>
${text}
<hr>
<c:out value="${text}"/>
<hr>
${number}
<hr>
${date}
<hr>
<fmt:formatNumber value="${number}" pattern="¤##,###.##"/>
<fmt:formatNumber value="${number}" pattern="00000.00000"/>
<hr>
<fmt:formatDate value="${date}" pattern="yyyy年MM月dd日 HH:mm:ss"/>
</body>
</html>
综合例子
数据库表查询操作
存放java bean的包
- ali - domain object(领域对象) 简称 DO
- entity (实体)
存放 数据访问对象 的包
dao - data access object 对领域对象做增删改查操作的