Servlet 与 JSP(二)

本文详细解析Servlet的生命周期,包括构造方法、初始化、服务和销毁阶段,并介绍EL表达式的使用,涵盖基本运算、显示作用域变量及11个隐式对象的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.Servlet 的生命周期

* 当 servlet 首次被访问时 ,调用构造方法,只调用一次(只有一个servlet对象被创建)
* 紧接着调用初始化 init 方法,也是只调用一次
* 根据请求方式,调用 service,或 doGet 或 doPost (请求几次,就会被调用几次)
* 当应用程序停止前,调用 destroy 方法,只调用一次

这些方法都是由 tomcat 容器来调用, 这种方式称之为控制反转

Servlet 默认是在第一次访问时被加载,也可以配置服务器启动时被加载 loadOnStartup = 数字
数字代表优先级,数字小的表示优先级高

还可以设置初始化参数(了解)

initParams = {
        @WebInitParam(name="姓名", value = "张三"),
        @WebInitParam(name="年龄", value= "18")
}

获取初始化参数值

System.out.println(this.getInitParameter("姓名"));
System.out.println(this.getInitParameter("年龄"));

doPost()和doGet(): 不要直接调父类方法super.doXXX(req, resp); 会引发405错误

测试代码如下:

@WebServlet(urlPatterns = "/servlet1", loadOnStartup = 2, initParams = {
        @WebInitParam(name="姓名", value = "张三"),
        @WebInitParam(name="年龄", value= "18")
})
public class Servlet1 extends HttpServlet {

//    @Override
//    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        System.out.println("执行了service");
//    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//      super.doGet(req, resp); // 会引发 405 错误
        System.out.println("执行get请求");
        System.out.println(this.getInitParameter("姓名"));
        System.out.println(this.getInitParameter("年龄"));
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//      super.doPost(req,resp); // 会引发 405 错误
        System.out.println("执行post请求");
    }

    public Servlet1() {
        System.out.println("执行 Servlet1 构造方法");
    }

    @Override
    public void init() throws ServletException {
        System.out.println("执行初始化 init 方法");
    }

    @Override
    public void destroy() {
        System.out.println("执行销毁 destroy 方法");
    }
}

二. Servlet 2.5 以前的版本

webapp/WEB-INF/web.xml (部署描述符 Deployment Descriptors)
在这里 Project Structure -> Modules ->Web 也可以配置servlet中的所有功能,

例如:在web.xml中,

<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   主要作用是从作用域中取出变量并显示

servlet中,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()

@WebServlet(urlPatterns = "/servlet3")
public class Servlet3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        req.setAttribute("names", list);
        req.getRequestDispatcher("el1.jsp").forward(req, resp);
    }
}
<h3>显示list的数据 ${names[1]} </h3>
<h3>显示list的数据 ${names.size()} </h3>

 

* map 显示  可以用  ${map.key}
  map 显示  可以用  ${map["key"]}
  map 显示  可以用  ${map.get("key")}

@WebServlet(urlPatterns = "/servlet3")
public class Servlet3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Map<String, String> map = new HashMap<>();
        map.put("beijing", "北京");
        map.put("shanghai", "上海");
        req.setAttribute("cities", map);
        req.getRequestDispatcher("el1.jsp").forward(req, resp);
    }
}
    <h3>
        显示map的数据 ${ cities.beijing }
    </h3>
    <h3>
        显示map的数据 ${ cities["beijing"] }
    </h3>
    <h3>
        显示map的数据 ${ cities.get("beijing") }
    </h3>

 

* 建议map使用字符串作为key,如果非要用整数作为key,必须用 Long, 只能用[]语法取,不能用.语法

@WebServlet(urlPatterns = "/servlet3")
public class Servlet3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Map<Integer, String> map2 = new HashMap<>();
        map2.put(1, "张三丰");
        map2.put(2, "王重阳");
        req.setAttribute("gaoshou", map2);
        req.getRequestDispatcher("el1.jsp").forward(req, resp);
    }
}
    <h3>
        ${ gaoshou[1] }
    </h3>

 

* 显示java bean, 底层实际调用的是get方法,嵌套的对象可以多次调用.语法

@WebServlet(urlPatterns = "/servlet3")
public class Servlet3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Address addr = new Address();
        addr.setCity("西安");
        addr.setStreet("太白南路");
        Student student = new Student();
        student.setName("王二");
        student.setAge("18");
        student.setHomeAddress(addr);
        req.setAttribute("s1", student);
        req.getRequestDispatcher("el1.jsp").forward(req, resp);
    }
}
    <h3>
        显示学生对象的信息
        ${s1.name} ${s1.age}
        ${s1.homeAddress.city} ${s1.homeAddress.street}
        // s1.getHomeAddress().getCity()
    </h3>

3. 11 个隐式对象 (先讲2个,其他参见后续博客)

* param 代表是请求参数的map集合,用在一个参数有一个值的情况, key对应参数名,value对应参数值
* paramValues 代表是请求参数的map集合,用在一个参数有多个值的情况, key对应参数名,value对应参数值的数组

 例如:

form.jsp

<form action="/servlet3">
    <p>姓名<input type="text" name="username" ></p>
    <p>
        爱好
        睡觉<input type="checkbox" name="hobby" value="睡觉">
        游戏<input type="checkbox" name="hobby" value="游戏">
        吃饭<input type="checkbox" name="hobby" value="吃饭">
    </p>
    <p><input type="submit" value="提交"></p>
</form>

el1.jsp

    <h3>${ param.username }</h3>
    <h3>${ param["username"] }</h3>
    <h3>${ paramValues.hobby[0] } ${ paramValues.hobby[1] }</h3>

四.标准标签库

简称 jstl

1. 引入标签库 jar包

打开pom.xml,添加:

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


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

<%@ taglib prefix="标签前缀" uri="标签的唯一标识" %>


核心标签

* forEach 进行遍历

<c:forEach items="要遍历的集合" var="临时变量名" begin="起始的下标" end="结束下标" varStatus="保存下标的对象">
</c:forEach>

其中 varStatus 中有两个属性 count(从1开始) , index(从0开始)

注意: items 中如果不用 el 表达式,那么会把 要遍历的集合 当成一个字符串!

 

* 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>

例如: 9 * 9 乘法表

<%@ 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>
    <table border="1" width="100%">
        <c:forEach begin="1" end="9" var="i">
            <tr>
                <c:forEach begin="1" end="${i}" var="j">
                    <td> ${j} * ${i} = ${i*j} </td>
                </c:forEach>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

效果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值