JavaWeb(十)——jetty服务器、创建jsp项目、servlet生命周期及url的匹配规则

1. jetty服务器的下载与安装

1.1 jetty简介

Jetty是当下非常流行的一款轻量级Java Web服务器和Servlet容器实现,类似于Tomcat,它由Eclipse基金会托管,完全免费而且开放源代码,因此所有人均可以从其官网下载最新源代码进行研究。由于其轻量、灵活的特性,Jetty被广泛用于一系列知名产品,例如ActiveMQ、Maven、Spark、Google App Engine、Eclipse、Hadoop等等。

1.2 jetty的下载与安装

  • 从http://www.eclipse.org/jetty/previousversions.html网址可以下载不同版本的jetty,不同版本要求的jdk版本是不同的,根据自己jdk版本进行下载。
    在这里插入图片描述

  • 下载完成之后,直接解压就可以使用,博主解压之后的路径是:D:\Environment\jetty。下面是这个路径下解压后目录和文件的解释。
    在这里插入图片描述

  • 下面是这个路径下解压后目录和文件的解释
    在这里插入图片描述

  • jetty的启动
    为了防止与Tomcat的端口号:8080 冲突,编辑start.ini文件,将jetty的端口号改为:8888
    在这里插入图片描述
    一般情况下都可以通过安装目录下的start.jar包来启动jetty,除此之外,还可以通过dos命令,先进入jetty的安装文件夹,再输入命令来进行启动。
    启动命令为:java -jar start.jar
    在这里插入图片描述

2. idea创建jsp项目

  • 先创建一个工作空间
    在这里插入图片描述
    打开IDEA软件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    至此,工作空间创建完毕!

  • 创建项目
    File->New->Module
    在这里插入图片描述
    在这里插入图片描述
    设置jetty服务器
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 测试访问结果:
    在这里插入图片描述
    由于支持热部署,修改index.jsp里的代码后,直接刷新就可以更新显示
    在这里插入图片描述
    在这里插入图片描述

3. idea给jsp项目导入jar包

  • 一般放在 WEB-INF/lib 目录里面
    在这里插入图片描述
  • 配置项目依赖
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 编写测试类测试
package com.zz.test;
import java.sql.Connection;
import java.sql.DriverManager;

/*
 * 测试一下是否能加载MySQL的JDBC的驱动,如果能说明,jar能被识别。
 *
 * */
public class Test {

    public static void main(String[] args) {

        String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=UTF-8";
        try{

            Class.forName("com.mysql.jdbc.Driver"); //加载驱动
            Connection conn = DriverManager.getConnection(url,"root","123456");
            if(conn!=null){
                System.out.println("连接MySQL成功!");
            }else{
                System.out.println("连接MySQL失败!");
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}

在这里插入图片描述

  • 分析:虽然可以这样手工导入 jar包,但是显然不利于大型项目开发,也不易于依赖维护管理,很容易出现依赖的版本冲突和依赖缺失的现象。因此,团队开发时必须使用具有依赖管理的建构工具比如:maven,gradle等等。

4. 编写第一个servlet

  • HelloWorldServlet 代码:
package com.zz.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//通过注解方式配置Servlet
@WebServlet(value = "/HelloWorldServlet")
public class HelloWorldServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("执行了HelloWorldServlet的doGet()...");
    }

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

    @Override
    public void destroy() {
        super.destroy();
    }

    @Override
    public void init() throws ServletException {
        super.init();
    }
}

  • index.jsp 代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <h1>我的jsp页面</h1>

  <%--使用表单实现发送一个post请求,请求的动作地址HelloWorldServlet--%>
  <form action="HelloWorldServlet" method="post">
    <input type="submit" value="执行了HelloWorldServlet">

  </form>
  </body>
</html>
  • 测试访问结果:
    输入地址HelloWorldServlet,发送get请求
    在这里插入图片描述
    在这里插入图片描述
    执行表单,发送post请求
    在这里插入图片描述
    在这里插入图片描述

5. Servlet的生命周期

(1)加载和实例化
当Servlet容器启动或客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet实例,若存在,则直接读取该实例响应请求,直接进入步骤(3);如果不存在,就通过构造方法创建一个Servlet实例。
(2) 初始化
实例化后,Servlet容器将调用Servlet的 init() 方法进行初始化(一些准备工作或资源预加载工作)。
(3)服务
初始化后,Servlet处于能响应请求的就绪状态。当接收到客户端请求时,调用service() 的方法处理客户端请求,HttpServlet的service()方法会根据不同的请求 转调不同的doXxx()方法:doGet()和doPost()
(4)销毁
重新发布项目,正常关闭tomcat时,会执行destroy() 方法,如果非正常关闭,相当于程序中断,不会执行方法。

  • 测试代码:
package com.zz.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//通过注解方式来配置Servlet,不用去写web.xml
@WebServlet(value = "HelloWorldServlet")
public class HelloWorldServlet extends HttpServlet {
    //构造方法
    public HelloWorldServlet() {
        System.out.println("HelloWorldServlet的构造方法()...");
    }

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

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

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

   //destroy()方法
    @Override
    public void destroy() {
        System.out.println("HelloWorldServlet的destroy()...");
    }

    //init()方法
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("HelloWorldServlet的init()...");
    }
}

第一次点击表单按钮:
在这里插入图片描述
在这里插入图片描述
第二次点击表单的按钮:
在这里插入图片描述
总结:

//从左到右的次序
1.如果是第一次请求。
                           --->doGet
   构造方法-->init-->service            --->destroy
                           --->doPost

 2.如果不是第一次请求

   说明这个servlet已经驻留内存了。

             --->doGet
   service --             ---->destroy
             --->doPost

注意:此测试是使用jetty服务器,没有试验出destroy的效果。如果使用tomcat服务器,重新发布项目,正常关闭tomcat时,会执行destroy()方法,如果非正常关闭,相当于程序中断,不会执行方法。

  • 如何实现预加载
    servlet必须是你第一次请求的时候,才加载到内存中,默认是一种懒加载。
    如何使用积极加载?即不管是否用到,都先加载到内存中。

方法:添加一个loadOnStartup属性,数字越小优先级别越高,来实现预加载。

如下图在注释后面,添加此属性,点击运行,没有点击请求,就运行了构造方法和初始化方法。
在这里插入图片描述

  • 一个servlet可以对应多个请求地址
    方法: 在注释处使用urlPatterns属性代替value属性

比如如下,servlet的url写法,必须以 / 开头

@WebServlet(urlPatterns ={"/HelloWorldServlet","/Haha","/Hehe"} ,loadOnStartup = 1)

6. Servlet的URL匹配规则

  • 精确匹配: /servlet/HelloWorldServlet ,找最准确的地址。(优先级最高)
  • 路径匹配: /abc/*
  • 扩展名匹配: * .action,注意:路径匹配和扩展名匹配不能混用。如 /abc/* .action 这样的写法都不对。
  • 默认匹配:/
  • 过滤器 : /* 过滤所有的请求,一般servlet不会这样配,一般使用在Filter过滤器上。

7. 字符集概念

  • 英文字符:
    占一个字节,ASCII,ISO_8859_1,Unicode,utf-8三者编码都是一样的,所以不存在乱码问题。

  • 中文字符:

         gbk
         gb2312        1个字节
         unicode       4个字节
         utf-8         3个字节         
         同时字符的编码值都不相同
    
  • 结论:
    (1)软件开发中一律使用utf-8,utf-8本身就是unicode字符编码的一种存储编码方案。
    (2)程序世界是一个英文的世界,能不用中文千万不要用中文。
    在程序中,中文只能出现在两个地方:①注释 ②字符串变量中

发布了62 篇原创文章 · 获赞 2 · 访问量 2724

猜你喜欢

转载自blog.csdn.net/nzzynl95_/article/details/104294275