穷且益坚,不坠青云之志

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>

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

  1. 引入标签库 jar包
<dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
  1. 在页面上声明要使用的标签库
<%@ 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>

jsp 底层原理

在第一次发送请求时,会把 jsp 文件转义为 java(servlet) 代码,并进一步编译为 class 文件

把页面上的静态内容(html代码),使用 out.write 方法进行打印,其中 out 对应着响应的字符输出流
至于 <% 代码 %> 中的代码会原封不动搬移到 jsp 转义生成的 java 代码中

本质仍是一个 servlet

新的方式

jstl 标签 + EL 表达式 (推荐)

旧的生成动态内容的方式

  1. <% 代码 %> 称为jsp脚本, 其中的变量是方法内的局部变量
  2. <%= 表达式%> 称为jsp表达式, 用来输出值,不用加;结束
    使用jsp表达式获取作用域内容 <%= request.getAttribute("name") %>
    使用el表达式获取作用域的内容 ${name}
  3. <%! 代码 %> jsp的声明, 其中的变量是类的成员变量
  4. 注释 <%-- 注释内容 --%> 会阻止java代码的运行,包括 jstl 标签和 EL 表达式 都可以使用这种办法注释
  5. <%@ 指令名 %>
    • page 用来指明页面的内容类型和编码方式 , isELIgnored=“true|false” 表示是否忽略 EL 表达式
    • taglib 用来引入一个标签库 prefix=“前缀” uri=“标签库的标识”
    • include 用来执行页面的包含操作
<%@ include file="文件路径" %>

综合例子

数据库表查询操作

存放java bean的包

  • ali - domain object(领域对象) 简称 DO
  • entity (实体)

存放 数据访问对象 的包
dao - data access object 对领域对象做增删改查操作的