JavaWeb(十)——jetty服务器、创建jsp项目、servlet生命周期及url的匹配规则
文章目录
- 1. jetty服务器的下载与安装
- 1.1 jetty简介
- 1.2 jetty的下载与安装
- 2. idea创建jsp项目
- 3. idea给jsp项目导入jar包
- 4. 编写第一个servlet
- 5. Servlet的生命周期
- 6. Servlet的URL匹配规则
- 7. 字符集概念
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 {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("执行了HelloWorldServlet的doGet()...");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("执行了HelloWorldServlet的doPost()...");}@Overridepublic void destroy() {super.destroy();}@Overridepublic 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()方法@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("执行了HelloWorldServlet的service()...");super.service(req, resp);}//doGet()方法@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("执行了HelloWorldServlet的doGet()...");}//doPost()方法@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("执行了HelloWorldServlet的doPost()...");}//destroy()方法@Overridepublic void destroy() {System.out.println("HelloWorldServlet的destroy()...");}//init()方法@Overridepublic void init(ServletConfig config) throws ServletException {System.out.println("HelloWorldServlet的init()...");}
}
第一次点击表单按钮:
第二次点击表单的按钮:
总结:
//从左到右的次序
1.如果是第一次请求。--->doGet构造方法-->init-->service --->destroy--->doPost2.如果不是第一次请求说明这个servlet已经驻留内存了。--->doGetservice -- ---->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三者编码都是一样的,所以不存在乱码问题。中文字符:
gbkgb2312 1个字节unicode 4个字节utf-8 3个字节 同时字符的编码值都不相同
结论:
(1)软件开发中一律使用utf-8,utf-8本身就是unicode字符编码的一种存储编码方案。
(2)程序世界是一个英文的世界,能不用中文千万不要用中文。
在程序中,中文只能出现在两个地方:①注释 ②字符串变量中
JavaWeb(十)——jetty服务器、创建jsp项目、servlet生命周期及url的匹配规则相关推荐
- 基于javaweb的日记系统(java+jsp+bootstrap+servlet+mysql)
基于javaweb的日记系统(java+jsp+bootstrap+servlet+mysql) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/idea/my ...
- Eclipse中安装配置Tomcat和创建JSP项目
这里写自定义目录标题 安装配置Tomcat 创建JSP项目 安装配置Tomcat 下载并解压Tomcat到指定目录 Eclipse菜单栏中找到Window–>Preperences->Se ...
- 【JavaLearn】#(23)JSP相关语法、HTTP协议、Servlet介绍、Servlet生命周期、请求和响应、相对路径、转发和重定向
1. JSP简单内容 1.1 JavaEE JavaEE 包含JSP JavaEE是一个开发分布式企业级应用的规范和标准.JavaEE包含之前学过的所有内容(JavaSE) 真正开发中,很少使用Jav ...
- JavaWeb——Servlet生命周期
Servlet生命周期 构造方法 init方法 service方法 destory方法 注意 Servlet的创建和销毁是由Servlet容器负责的(Tomcat) jsp页面 <%@ page ...
- 问题小结(一)——servlet生命周期、get和post请求、内置对象、单例模式等
文章目录 1. 说说jetty与tomcat的区别. 2. 如何修改jetty默认端口?如何修改tomcat默认端口? 2.1 修改jetty默认端口 2.2 修改tomcat 默认端口 3. 如何启 ...
- Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】...
tags: Servlet 什么是Serlvet?# Servlet其实就是一个遵循Servlet开发的java类.Serlvet是由服务器调用的,运行在服务器端. 为什么要用到Serlvet? 我们 ...
- Servlet 生命周期介绍
在面试的时候. 有时会被问到这个问题: 请描述一下Servlet的生命周期. 其实面试官就是想问你1个Servlet何时被创建, 何时被调用等.... 本文就是详细解答这个问题的. 总体流程图 上面的 ...
- Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
什么是Servlet? Servlet其实就是一个遵循Servlet开发的java类.Servlet是由服务器调用的,运行在服务器端. 为什么要用到Servlet? 我们编写java程序想要在网上实现 ...
- Servlet生命周期与工作原理
Servlet生命周期分为三个阶段: 1,初始化阶段 调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...
最新文章
- 服务器内存使用率高找不到是哪个进程,内存占用率高,但是找不到内存消耗大的程序...
- python polygon函数_Python 人脸识别就多简单,看这个就够了!
- C# 每月第一天和最后一天
- django连接redis(文章看着不错)
- ios 上传图片失败 小程序_iOS上传图片,就是有这种不一样的操作!
- apply()、call()、bind()
- Mysql函数Last_insert_id()的真正含义
- BZOJ 2733: [HNOI2012]永无乡
- 随机过程在计算机领域的应用,随机过程与排队论——及其在计算机领域中的应用.doc...
- 【GlobalMapper精品教程】011:添加China 2000大地坐标系的方法
- DDR扫盲——DDR中的名词解析
- wps缺少字体ubuntu
- 什么是ECS框架?讲解 + 实战带你入门ECS框架
- 软件测试基础知识 - 集成测试和系统测试的区别,以及它们的应用场景
- Vue-创建组件时报错:Component names should conform to valid custom element name in html5 specification.
- 【开发工具】Office Tool Plus 安装 Office
- 跨越数据的“叹息墙”:华为下一代数据湖与HPDA时代
- 【Java基础总结】类加载顺序,new关键字,访问权限修饰符与方法重载等【二】
- Android 10 SSL双向认证握手失败
- 佛系计算机二级 第六弹
热门文章
- SCI录用的最后一步——答复审稿人的策略和答复信的写作技巧
- oracle date类型,oracle 日期时间数据类型
- java跳转语句包含goto_Java 的跳转语句中 _______( 包含 / 不包含 )goto 语句。_学小易找答案...
- python云盘服务_Python无所不能?五分钟教会你用python打造个人云盘!
- excelutil java_JAVA实现Excel的读取--ExcelUtil工具类
- class.forname()中要写相对路径吗?_你喜欢这里吗?翻译成“Do you like here?”是错误的,为啥呢?...
- MySQL之最基本命令
- Codeforces 777E:Hanoi Factory(贪心+栈)
- 实现水电气一卡通 IC卡扇区分配
- 一千行MySQL学习笔记(十二)