Servlet

Source

Servlet的生命周期

  • 当servlet首次被访问时,调用构造方法,只调用一次(只有一个servlet对象被创建);
  • 紧接着调用初始化init方法,也只是调用一次;
  • 根据请求方式,调用service或doGet或doPost(请求几次调用几次);
  • 当前应用程序停止前调用destroy方法,只调用一次;
doGet(); //只关心get方法的请求,默认都是get方法
doPost(); //只关心post方法的请求
doInit(); //初始化方法
doDestroy(); //销毁方法

这些方法都是由tomcat容器来调用的,称为控制反转
注意不能直接调用父类的方法,会报错;当service和doGet或doPost同时存在时,service方法有效。

Servlet默认是在第一次被访问时被加载,也可以是启动服务器时就被加载和初始化;

@WebServlet(urlPatterns = "/servlet1",loadOnStartup = 1)

其中loadOnStartup后的数字越大表示加载的优先级越高

JSP中的EL表达式

expression language
主要是从作用域中取出变量并显示
做简单的运算

<h3>算术运算符 ${18+20}</h3>
<h3>比较运算符 ${18>20}</h3>
<h3>逻辑运算符 ${18>20 and 1>2}</h3>
<h3>逻辑运算符 ${18>20 or 1>2}</h3>
<h3>逻辑运算符 ${not(18>20 or 1>2)}</h3>
<h3>三元运算符 ${(false)?"真":"假"}</h3>
<h3>${empty 集合}</h3>

用来显示作用域中的变量
在servlet中将变量放入request的作用域中;

req.setAttribute("names",list);
//跳转到哪个jsp中
req.getRequestDispatcher("jsp2.jsp").forward(req,resp);

在jsp文件中将变量从作用域中取出并显示;

${ names } //显示全部变量
${ name[1] } //显示一个集合变量中某个元素

req.setAttribute("map",citys);
//若变量表示的是一个map集合
${ map.key值} //根据key找value值
${ map["key值"]} //同上,这里key只能是字符串
${ map.get("key值")} //调用方法来获取value
//建议map使用字符串作为key,如果非要用整数作为key必须使用Long类型,只能用[]语法取

加粗样式

${ user.name }//显示对象变量的属性,其实是访问的getName方法,而不是直接访问私有属性 ==user.getName();
//获取嵌套属性,即这个对象的属性是一个对象
${ user.Attr1.Attr2 }

11个隐式对象

  • param :代表请求参数map集合,用来获取参数值为单个值的情况;key对应参数名,value对应参数值;
<form action="Jsp02.jsp">
    用户名<input type="text" name="username">
    <input type="submit" value="提交">
</form>

${param["username"]}
  • paramValues:用于一个参数有多个值的情况;
<form action="Jsp02.jsp">
    北京<input type="checkbox" name="citys" value="BJ"><br>
    上海<input type="checkbox"  name="citys" value="SH"><br>
    深圳<input type="checkbox" name="citys" value="SZ"><br>

    <input type="submit" value="提交">
</form>


${paramValues.citys[0]}
${paramValues.citys[1]}

标准标签库

引入标签库jar包

 <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

在页面上声明要使用的标签库

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

核心标签

  • forEach 进行遍历
//names为要遍历的集合;name为临时变量名;在循环中再利用${}显示临时变量的值
//如果不用el表达式如items="names",则names会被当做字符串而不是集合
//varStatus临时变量 getIndex获取下标值从0开始;getCount()获取下表值从1开始
<c:forEach items="${names}" var="name">
    <p>${name}</p>
</c:forEach>

显示成一个列表

<ul>
<c:forEach items="${names}" var="name">
    <li>${name}</li>
</c:forEach>
</ul>

显示成一个表格

<table border="1px">
    <c:forEach items="${names}" var="name">
        <tr>
            <td>${name}</td>
        </tr>
    </c:forEach>
</table>

遍历map集合

<%--user相当于entry--%>
<c:forEach items="${users}" var="user">
    ${user.key}--->${user.value}
</c:forEach>

生成99乘法表

<table border="1">
    <c:forEach begin="0" end="9" var="i">
        <tr><c:forEach begin="0" end="${i}" var="j">
            <td>${i}*${j}=${i*j}</td>
        </c:forEach>
        </tr>
    </c:forEach>
</table>
  • if 做条件判断(适用于条件少的判断)
    <c:if test="条件">内容</c:if>
<c:if test="${empty names}">list为空</c:if>
//如果条件成立就显示内容,不成立就不显示
  • choose 条件判断(适用于条件多的判断)
<c:choose>
    <c:when test="${salary<=2000}">低等工资</c:when>
    <c:when test="${salary>2000 and salary<=5000}">中等工资</c:when>
    <c:when test="${salary>7000}">高等工资</c:when>
</c:choose>
  • remove 删除作用域中的变量
<%--删除作用域中的变量--%>
${salary}
<c:remove var="salary" />
<hr>
${salary}
  • set 将变量放入作用域
req.setAttribute("text","<span>hello world</span>");
<%--将变量放入作用域,相当于在servlet中的req.setAttribute("name","张三");--%>
<c:set var="name" value="张三" />
${name}
  • out 显示作用域中的变量
req.setAttribute("number",8888.6666);
req.setAttribute("date",new Date());

<c:out value="${text}"/> //会把字符串当成普通字符串,照原样输出
${text} //会解析字符串中的html

格式标签

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:formatNumber value="${number}" pattern="##,###.##" /><br>
<fmt:formatNumber value="${number}" pattern="00000.00000" /><br>
<fmt:formatDate value="${date}" pattern="yyyy年MM月dd日 HH:mm:ss" />