首页
关于
Search
1
使用青龙自动领取京东京豆、微信红包
268 阅读
2
从PE导入USB驱动工具(解决鼠标键盘不能)
193 阅读
3
谷歌搜索、谷歌学术、Github的镜像网站
118 阅读
4
jar包配置开机自启
90 阅读
5
批量检测微信好友是否把我们删除了
87 阅读
Linux
杂类
Java
开发
数据库
实用教程
登录
/
注册
Search
标签搜索
Mybatis
maven
京东
软件
MySQL
问题
HTML
JavaScript
Javaweb
tomcat
idea
Servlet
Bitwarden
Typora
picgo-core
Vue
Element
小赵
累计撰写
45
篇文章
累计收到
1
条评论
首页
栏目
Linux
杂类
Java
开发
数据库
实用教程
页面
关于
搜索到
45
篇与
的结果
2022-12-28
Docker部署Vaultwarden(Bitwarden_RS)
拉取Vaultwarden镜像docker pull vaultwarden/server:latest创建储存数据目录mkdir /bitwarden/部署docker run -dit \ -v /bitwarden/:/data/ \ -p 3011:80 \ -e ADMIN_TOKEN=some_random_token_as_per_above_explanation \ --name vaultwarden \ --restart=always \ vaultwarden/server:latest注:/bitwarden/:数据存放位置ADMIN_TOKEN:管理员登录密钥,域名/admin,用你设置好的token登入--name=你想要在docker里面显示的名字 (可选,方便后续管理)--restart=always 自动重启访问域名:3011 显示如下,安装成功nginx 反向代理3011,开启ssl
2022年12月28日
4 阅读
0 评论
0 点赞
2022-12-28
Maven 仓库镜像
修改Maven settings.xml文件配置本地仓库地址 <!-- 本地仓库 --> <localRepository>C:\Program Files\maven\repository</localRepository>配置国内镜像maven的默认镜像是http://my.repository.com/repo/path,服务器在国外,一般项目构建如果使用这个镜像会十分缓慢,所以需要采用国内的maven镜像。<!-- 阿里云仓库 --> <mirror> <id>aliyunmaven</id> <mirrorOf>central</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/central</url> </mirror> <!-- 腾讯云仓库 --> <mirror> <id>nexus-tencentyun</id> <mirrorOf>central</mirrorOf> <name>Nexus tencentyun</name> <url>https://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url> </mirror> <!-- 华为 --> <mirror> <id>huaweicloud</id> <mirrorOf>central</mirrorOf> <name>huaweicloud maven</name> <url>https://repo.huaweicloud.com/repository/maven/</url> </mirror>
2022年12月28日
3 阅读
0 评论
0 点赞
2022-11-26
Servlet基础教程
1 简介Servlet是JavaWeb最为核心的内容,它是Java提供的一门==动态==web资源开发技术。使用Servlet就可以实现,根据不同的登录用户在页面上动态显示不同内容。Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet介绍完Servlet是什么以后,接下来我们就按照快速入门->执行流程->生命周期->体系结构->urlPattern配置->XML配置的学习步骤,一步步完成对Servlet的知识学习,首选我们来通过一个入门案例来快速把Servlet用起来。2 快速入门==需求分析: 编写一个Servlet类,并使用IDEA中Tomcat插件进行部署,最终通过浏览器访问所编写的Servlet程序。==具体的实现步骤为:创建Web项目web-demo,导入Servlet依赖坐标<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <!-- 此处为什么需要添加该标签? provided指的是在编译和测试过程中有效,最后生成的war包时不会加入 因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错 --> <scope>provided</scope> </dependency>创建:定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话package com.itheima.web; import javax.servlet.*; import java.io.IOException; public class ServletDemo1 implements Servlet { public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("servlet hello world~"); } public void init(ServletConfig servletConfig) throws ServletException { } public ServletConfig getServletConfig() { return null; } public String getServletInfo() { return null; } public void destroy() { } }配置:在类上使用@WebServlet注解,配置该Servlet的访问路径@WebServlet("/demo1")访问:启动Tomcat,浏览器中输入URL地址访问该Servlethttp://localhost:8080/web-demo/demo1器访问后,在控制台会打印servlet hello world~ 说明servlet程序已经成功运行。至此,Servlet的入门案例就已经完成,大家可以按照上面的步骤进行练习了。3 执行流程Servlet程序已经能正常运行,但是我们需要思考个问题: 我们并没有创建ServletDemo1类的对象,也没有调用对象中的service方法,为什么在控制台就打印了servlet hello world~这句话呢?要想回答上述问题,我们就需要对Servlet的执行流程进行一个学习。浏览器发出http://localhost:8080/web-demo/demo1请求,从请求中可以解析出三部分内容,分别是localhost:8080、web-demo、demo1根据localhost:8080可以找到要访问的Tomcat Web服务器根据web-demo可以找到部署在Tomcat服务器上的web-demo项目根据demo1可以找到要访问的是项目中的哪个Servlet类,根据@WebServlet后面的值进行匹配找到ServletDemo1这个类后,Tomcat Web服务器就会为ServletDemo1这个类创建一个对象,然后调用对象中的service方法ServletDemo1实现了Servlet接口,所以类中必然会重写service方法供Tomcat Web服务器进行调用service方法中有ServletRequest和ServletResponse两个参数,ServletRequest封装的是请求数据,ServletResponse封装的是响应数据,后期我们可以通过这两个参数实现前后端的数据交互小结介绍完Servlet的执行流程,需要大家掌握两个问题:Servlet由谁创建?Servlet方法由谁调用?Servlet由web服务器创建,Servlet方法由web服务器调用服务器怎么知道Servlet中一定有service方法?因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法4 生命周期介绍完Servlet的执行流程后,我们知道Servlet是由Tomcat Web服务器帮我们创建的。接下来咱们再来思考一个问题:==Tomcat什么时候创建的Servlet对象?==要想回答上述问题,我们就需要对Servlet的生命周期进行一个学习。生命周期: 对象的生命周期指一个对象从被创建到被销毁的整个过程。Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:==加载和实例化==:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象默认情况,Servlet会在第一次访问被容器创建,但是如果创建Servlet比较耗时的话,那么第一个访问的人等待的时间就比较长,用户的体验就比较差,那么我们能不能把Servlet的创建放到服务器启动的时候来创建,具体如何来配置? @WebServlet(urlPatterns = "/demo1",loadOnStartup = 1) loadOnstartup的取值有两类情况 (1)负整数:第一次访问时创建Servlet对象 (2)0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高==初始化==:在Servlet实例化之后,容器将调用Servlet的==init()==方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只==调用一次====请求处理==:==每次==请求Servlet时,Servlet容器都会调用Servlet的==service()==方法对请求进行处理==服务终止==:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的==destroy()==方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收通过案例演示下上述的生命周期package com.itheima.web; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; /** * Servlet生命周期方法 */ @WebServlet(urlPatterns = "/demo2",loadOnStartup = 1) public class ServletDemo2 implements Servlet { /** * 初始化方法 * 1.调用时机:默认情况下,Servlet被第一次访问时,调用 * * loadOnStartup: 默认为-1,修改为0或者正整数,则会在服务器启动的时候,调用 * 2.调用次数: 1次 * @param config * @throws ServletException */ public void init(ServletConfig config) throws ServletException { System.out.println("init..."); } /** * 提供服务 * 1.调用时机:每一次Servlet被访问时,调用 * 2.调用次数: 多次 * @param req * @param res * @throws ServletException * @throws IOException */ public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("servlet hello world~"); } /** * 销毁方法 * 1.调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用 * 2.调用次数: 1次 */ public void destroy() { System.out.println("destroy..."); } public ServletConfig getServletConfig() { return null; } public String getServletInfo() { return null; } }==注意:如何才能让Servlet中的destroy方法被执行?==在Terminal命令行中,先使用mvn tomcat7:run启动,然后再使用ctrl+c关闭tomcat小结这节中需要掌握的内容是:Servlet对象在什么时候被创建的?默认是第一次访问的时候被创建,可以使用@WebServlet(urlPatterns = "/demo2",loadOnStartup = 1)的loadOnStartup 修改成在服务器启动的时候创建。Servlet生命周期中涉及到的三个方法,这三个方法是什么?什么时候被调用?调用几次?涉及到三个方法,分别是 init()、service()、destroy()init方法在Servlet对象被创建的时候执行,只执行1次service方法在Servlet被访问的时候调用,每访问1次就调用1次destroy方法在Servlet对象被销毁的时候调用,只执行1次5 方法介绍Servlet中总共有5个方法,我们已经介绍过其中的三个,剩下的两个方法作用分别是什么?我们先来回顾下前面讲的三个方法,分别是:初始化方法,在Servlet被创建时执行,只执行一次void init(ServletConfig config) 提供服务方法, 每次Servlet被访问,都会调用该方法void service(ServletRequest req, ServletResponse res)销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servletvoid destroy() 剩下的两个方法是:获取Servlet信息String getServletInfo() //该方法用来返回Servlet的相关信息,没有什么太大的用处,一般我们返回一个空字符串即可 public String getServletInfo() { return ""; }获取ServletConfig对象ServletConfig getServletConfig()ServletConfig对象,在init方法的参数中有,而Tomcat Web服务器在创建Servlet对象的时候会调用init方法,必定会传入一个ServletConfig对象,我们只需要将服务器传过来的ServletConfig进行返回即可。具体如何操作?package com.itheima.web; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; /** * Servlet方法介绍 */ @WebServlet(urlPatterns = "/demo3",loadOnStartup = 1) public class ServletDemo3 implements Servlet { private ServletConfig servletConfig; /** * 初始化方法 * 1.调用时机:默认情况下,Servlet被第一次访问时,调用 * * loadOnStartup: 默认为-1,修改为0或者正整数,则会在服务器启动的时候,调用 * 2.调用次数: 1次 * @param config * @throws ServletException */ public void init(ServletConfig config) throws ServletException { this.servletConfig = config; System.out.println("init..."); } public ServletConfig getServletConfig() { return servletConfig; } /** * 提供服务 * 1.调用时机:每一次Servlet被访问时,调用 * 2.调用次数: 多次 * @param req * @param res * @throws ServletException * @throws IOException */ public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("servlet hello world~"); } /** * 销毁方法 * 1.调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用 * 2.调用次数: 1次 */ public void destroy() { System.out.println("destroy..."); } public String getServletInfo() { return ""; } }getServletInfo()和getServletConfig()这两个方法使用的不是很多,大家了解下。6 体系结构通过上面的学习,我们知道要想编写一个Servlet就必须要实现Servlet接口,重写接口中的5个方法,虽然已经能完成要求,但是编写起来还是比较麻烦的,因为我们更关注的其实只有service方法,那有没有更简单方式来创建Servlet呢?要想解决上面的问题,我们需要先对Servlet的体系结构进行下了解:因为我们将来开发B/S架构的web项目,都是针对HTTP协议,所以我们自定义Servlet,会通过继承==HttpServlet==具体的编写格式如下:@WebServlet("/demo4") public class ServletDemo4 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //TODO GET 请求方式处理逻辑 System.out.println("get..."); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //TODO Post 请求方式处理逻辑 System.out.println("post..."); } }要想发送一个GET请求,请求该Servlet,只需要通过浏览器发送http://localhost:8080/web-demo/demo4,就能看到doGet方法被执行了要想发送一个POST请求,请求该Servlet,单单通过浏览器是无法实现的,这个时候就需要编写一个form表单来发送请求,在webapp下创建一个a.html页面,内容如下:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/web-demo/demo4" method="post"> <input name="username"/><input type="submit"/> </form> </body> </html>启动测试,即可看到doPost方法被执行了。Servlet的简化编写就介绍完了,接着需要思考两个问题:HttpServlet中为什么要根据请求方式的不同,调用不同的方法?如何调用?针对问题一,我们需要回顾之前的知识点==前端发送GET和POST请求的时候,参数的位置不一致,GET请求参数在请求行中,POST请求参数在请求体中==,为了能处理不同的请求方式,我们得在service方法中进行判断,然后写不同的业务处理,这样能实现,但是每个Servlet类中都将有相似的代码,针对这个问题,有什么可以优化的策略么?package com.itheima.web; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/demo5") public class ServletDemo5 implements Servlet { public void init(ServletConfig config) throws ServletException { } public ServletConfig getServletConfig() { return null; } public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { //如何调用? //获取请求方式,根据不同的请求方式进行不同的业务处理 HttpServletRequest request = (HttpServletRequest)req; //1. 获取请求方式 String method = request.getMethod(); //2. 判断 if("GET".equals(method)){ // get方式的处理逻辑 }else if("POST".equals(method)){ // post方式的处理逻辑 } } public String getServletInfo() { return null; } public void destroy() { } } 要解决上述问题,我们可以对Servlet接口进行继承封装,来简化代码开发。package com.itheima.web; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; public class MyHttpServlet implements Servlet { public void init(ServletConfig config) throws ServletException { } public ServletConfig getServletConfig() { return null; } public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { HttpServletRequest request = (HttpServletRequest)req; //1. 获取请求方式 String method = request.getMethod(); //2. 判断 if("GET".equals(method)){ // get方式的处理逻辑 doGet(req,res); }else if("POST".equals(method)){ // post方式的处理逻辑 doPost(req,res); } } protected void doPost(ServletRequest req, ServletResponse res) { } protected void doGet(ServletRequest req, ServletResponse res) { } public String getServletInfo() { return null; } public void destroy() { } } 有了MyHttpServlet这个类,以后我们再编写Servlet类的时候,只需要继承MyHttpServlet,重写父类中的doGet和doPost方法,就可以用来处理GET和POST请求的业务逻辑。接下来,可以把ServletDemo5代码进行改造@WebServlet("/demo5") public class ServletDemo5 extends MyHttpServlet { @Override protected void doGet(ServletRequest req, ServletResponse res) { System.out.println("get..."); } @Override protected void doPost(ServletRequest req, ServletResponse res) { System.out.println("post..."); } } 将来页面发送的是GET请求,则会进入到doGet方法中进行执行,如果是POST请求,则进入到doPost方法。这样代码在编写的时候就相对来说更加简单快捷。类似MyHttpServlet这样的类Servlet中已经为我们提供好了,就是HttpServlet,翻开源码,大家可以搜索service()方法,你会发现HttpServlet做的事更多,不仅可以处理GET和POST还可以处理其他五种请求方式。protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) { long lastModified = getLastModified(req); if (lastModified == -1) { // servlet doesn't support if-modified-since, no reason // to go through further expensive logic doGet(req, resp); } else { long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); if (ifModifiedSince < lastModified) { // If the servlet mod time is later, call doGet() // Round down to the nearest second for a proper compare // A ifModifiedSince of -1 will always be less maybeSetLastModified(resp, lastModified); doGet(req, resp); } else { resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } } } else if (method.equals(METHOD_HEAD)) { long lastModified = getLastModified(req); maybeSetLastModified(resp, lastModified); doHead(req, resp); } else if (method.equals(METHOD_POST)) { doPost(req, resp); } else if (method.equals(METHOD_PUT)) { doPut(req, resp); } else if (method.equals(METHOD_DELETE)) { doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) { doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) { doTrace(req,resp); } else { // // Note that this means NO servlet supports whatever // method was requested, anywhere on this server. // String errMsg = lStrings.getString("http.method_not_implemented"); Object[] errArgs = new Object[1]; errArgs[0] = method; errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg); } }小结通过这一节的学习,要掌握:HttpServlet的使用步骤继承HttpServlet重写doGet和doPost方法HttpServlet原理获取请求方式,并根据不同的请求方式,调用不同的doXxx方法7 urlPattern配置Servlet类编写好后,要想被访问到,就需要配置其访问路径(==urlPattern==)一个Servlet,可以配置多个urlPatternpackage com.itheima.web; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; /** * urlPattern: 一个Servlet可以配置多个访问路径 */ @WebServlet(urlPatterns = {"/demo7","/demo8"}) public class ServletDemo7 extends MyHttpServlet { @Override protected void doGet(ServletRequest req, ServletResponse res) { System.out.println("demo7 get..."); } @Override protected void doPost(ServletRequest req, ServletResponse res) { } }在浏览器上输入http://localhost:8080/web-demo/demo7,http://localhost:8080/web-demo/demo8这两个地址都能访问到ServletDemo7的doGet方法。==urlPattern配置规则==精确匹配/** * UrlPattern: * * 精确匹配 */ @WebServlet(urlPatterns = "/user/select") public class ServletDemo8 extends MyHttpServlet { @Override protected void doGet(ServletRequest req, ServletResponse res) { System.out.println("demo8 get..."); } @Override protected void doPost(ServletRequest req, ServletResponse res) { } }访问路径http://localhost:8080/web-demo/user/select目录匹配package com.itheima.web; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; /** * UrlPattern: * * 目录匹配: /user/* */ @WebServlet(urlPatterns = "/user/*") public class ServletDemo9 extends MyHttpServlet { @Override protected void doGet(ServletRequest req, ServletResponse res) { System.out.println("demo9 get..."); } @Override protected void doPost(ServletRequest req, ServletResponse res) { } }访问路径http://localhost:8080/web-demo/user/任意==思考:==访问路径http://localhost:8080/web-demo/user是否能访问到demo9的doGet方法?访问路径http://localhost:8080/web-demo/user/a/b是否能访问到demo9的doGet方法?访问路径http://localhost:8080/web-demo/user/select是否能访问到demo9还是demo8的doGet方法?答案是: 能、能、demo8,进而我们可以得到的结论是/user/*中的/*代表的是零或多个层级访问目录同时精确匹配优先级要高于目录匹配。扩展名匹配package com.itheima.web; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; /** * UrlPattern: * * 扩展名匹配: *.do */ @WebServlet(urlPatterns = "*.do") public class ServletDemo10 extends MyHttpServlet { @Override protected void doGet(ServletRequest req, ServletResponse res) { System.out.println("demo10 get..."); } @Override protected void doPost(ServletRequest req, ServletResponse res) { } }访问路径http://localhost:8080/web-demo/任意.do==注意==:如果路径配置的不是扩展名,那么在路径的前面就必须要加/否则会报错如果路径配置的是*.do,那么在*.do的前面不能加/,否则会报错任意匹配package com.itheima.web; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; /** * UrlPattern: * * 任意匹配: / */ @WebServlet(urlPatterns = "/") public class ServletDemo11 extends MyHttpServlet { @Override protected void doGet(ServletRequest req, ServletResponse res) { System.out.println("demo11 get..."); } @Override protected void doPost(ServletRequest req, ServletResponse res) { } }访问路径http://localhost:8080/demo-web/任意package com.itheima.web; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; /** * UrlPattern: * * 任意匹配: /* */ @WebServlet(urlPatterns = "/*") public class ServletDemo12 extends MyHttpServlet { @Override protected void doGet(ServletRequest req, ServletResponse res) { System.out.println("demo12 get..."); } @Override protected void doPost(ServletRequest req, ServletResponse res) { } } 访问路径`http://localhost:8080/demo-web/任意==注意:==/和/*的区别?当我们的项目中的Servlet配置了 "/",会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet当我们的项目中配置了"/*",意味着匹配任意访问路径DefaultServlet是用来处理静态资源,如果配置了"/"会把默认的覆盖掉,就会引发请求静态资源的时候没有走默认的而是走了自定义的Servlet类,最终导致静态资源不能被访问小结urlPattern总共有四种配置方式,分别是精确匹配、目录匹配、扩展名匹配、任意匹配五种配置的优先级为 精确匹配 > 目录匹配> 扩展名匹配 > /* > / ,无需记,以最终运行结果为准。8 XML配置前面对应Servlet的配置,我们都使用的是@WebServlet,这个是Servlet从3.0版本后开始支持注解配置,3.0版本前只支持XML配置文件的配置方法。对于XML的配置步骤有两步:编写Servlet类package com.itheima.web; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; public class ServletDemo13 extends MyHttpServlet { @Override protected void doGet(ServletRequest req, ServletResponse res) { System.out.println("demo13 get..."); } @Override protected void doPost(ServletRequest req, ServletResponse res) { } }在web.xml中配置该Servlet<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- Servlet 全类名 --> <servlet> <!-- servlet的名称,名字任意--> <servlet-name>demo13</servlet-name> <!--servlet的类全名--> <servlet-class>com.itheima.web.ServletDemo13</servlet-class> </servlet> <!-- Servlet 访问路径 --> <servlet-mapping> <!-- servlet的名称,要和上面的名称一致--> <servlet-name>demo13</servlet-name> <!-- servlet的访问路径--> <url-pattern>/demo13</url-pattern> </servlet-mapping> </web-app>这种配置方式和注解比起来,确认麻烦很多,所以建议大家使用注解来开发。但是大家要认识上面这种配置方式,因为并不是所有的项目都是基于注解开发的。
2022年11月26日
10 阅读
0 评论
0 点赞
2022-11-25
Tomcat基础教程
1 简介1.1 什么是Web服务器Web服务器是一个应用程序(==软件==),对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是"提供网上信息浏览服务"。Web服务器是安装在服务器端的一款软件,将来我们把自己写的Web项目部署到Web Tomcat服务器软件中,当Web服务器软件启动后,部署在Web服务器软件中的页面就可以直接通过浏览器来访问了。Web服务器软件使用步骤准备静态资源下载安装Web服务器软件将静态资源部署到Web服务器上启动Web服务器使用浏览器访问对应的资源上述内容在演示的时候,使用的是Apache下的Tomcat软件,至于Tomcat软件如何使用,后面会详细的讲到。而对于Web服务器来说,实现的方案有很多,Tomcat只是其中的一种,而除了Tomcat以外,还有很多优秀的Web服务器,比如:Tomcat就是一款软件,我们主要是以学习如何去使用为主。具体我们会从以下这些方向去学习:简介: 初步认识下Tomcat基本使用: 安装、卸载、启动、关闭、配置和项目部署,这些都是对Tomcat的基本操作IDEA中如何创建Maven Web项目IDEA中如何使用Tomcat,后面这两个都是我们以后开发经常会用到的方式首选我们来认识下Tomcat。TomcatTomcat的相关概念:Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范。概念中提到了JavaEE规范,那什么又是JavaEE规范呢?JavaEE: Java Enterprise Edition,Java企业版。指Java企业级开发的技术规范总和。包含13项技术规范:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAF。因为Tomcat支持Servlet/JSP规范,所以Tomcat也被称为Web容器、Servlet容器。Servlet需要依赖Tomcat才能运行。Tomcat的官网: https://tomcat.apache.org/ 从官网上可以下载对应的版本进行使用。Tomcat的LOGO小结通过这一节的学习,我们需要掌握以下内容:Web服务器的作用封装HTTP协议操作,简化开发可以将Web项目部署到服务器中,对外提供网上浏览服务Tomcat是一个轻量级的Web服务器,支持Servlet/JSP少量JavaEE规范,也称为Web容器,Servlet容器。2 基本使用Tomcat总共分两部分学习,先来学习Tomcat的基本使用,包括Tomcat的==下载、安装、卸载、启动和关闭==。2.1 下载直接从官网下载大家可以自行下载,也可以直接使用资料中已经下载好的资源,Tomcat的软件程序 资料/2. Tomcat/apache-tomcat-8.5.68-windows-x64.zipTomcat的源码 资料/2. Tomcat/tomcat源码/apache-tomcat-8.5.68-src.zip2.2 安装Tomcat是绿色版,直接解压即可在D盘的software目录下,将apache-tomcat-8.5.68-windows-x64.zip进行解压缩,会得到一个apache-tomcat-8.5.68的目录,Tomcat就已经安装成功。==注意==,Tomcat在解压缩的时候,解压所在的目录可以任意,但最好解压到一个不包含中文和空格的目录,因为后期在部署项目的时候,如果路径有中文或者空格可能会导致程序部署失败。打开apache-tomcat-8.5.68目录就能看到如下目录结构,每个目录中包含的内容需要认识下,bin:目录下有两类文件,一种是以.bat结尾的,是Windows系统的可执行文件,一种是以.sh结尾的,是Linux系统的可执行文件。webapps:就是以后项目部署的目录到此,Tomcat的安装就已经完成。2.3 卸载卸载比较简单,可以直接删除目录即可2.4 启动双击: bin\startup.bat启动后,通过浏览器访问 http://localhost:8080能看到Apache Tomcat的内容就说明Tomcat已经启动成功。==注意==: 启动的过程中,控制台有中文乱码,需要修改conf/logging.prooperties2.5 关闭关闭有三种方式直接x掉运行窗口:强制关闭[不建议]bin\shutdown.bat:正常关闭ctrl+c: 正常关闭2.6 配置修改端口Tomcat默认的端口是8080,要想修改Tomcat启动的端口号,需要修改 conf/server.xml注: HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号。启动时可能出现的错误Tomcat的端口号取值范围是0-65535之间任意未被占用的端口,如果设置的端口号被占用,启动的时候就会包如下的错误Tomcat启动的时候,启动窗口一闪而过: 需要检查JAVA_HOME环境变量是否正确配置2.7 部署Tomcat部署项目: 将项目放置到webapps目录下,即部署完成。将 资料/2. Tomcat/hello 目录拷贝到Tomcat的webapps目录下通过浏览器访问http://localhost/hello/a.html,能看到下面的内容就说明项目已经部署成功。但是呢随着项目的增大,项目中的资源也会越来越多,项目在拷贝的过程中也会越来越费时间,该如何解决呢?一般JavaWeb项目会被打包称==war==包,然后将war包放到Webapps目录下,Tomcat会自动解压缩war文件将 资料/2. Tomcat/haha.war目录拷贝到Tomcat的webapps目录下Tomcat检测到war包后会自动完成解压缩,在webapps目录下就会多一个haha目录通过浏览器访问http://localhost/haha/a.html,能看到下面的内容就说明项目已经部署成功。至此,Tomcat的部署就已经完成了,至于如何获得项目对应的war包,后期我们会借助于IDEA工具来生成。3 Maven创建Web项目介绍完Tomcat的基本使用后,我们来学习在IDEA中如何创建Maven Web项目,学习这种方式的原因是以后Tomcat中运行的绝大多数都是Web项目,而使用Maven工具能更加简单快捷的把Web项目给创建出来,所以Maven的Web项目具体如何来构建呢?在真正创建Maven Web项目之前,我们先要知道Web项目长什么样子,具体的结构是什么?3.1 Web项目结构Web项目的结构分为:开发中的项目和开发完可以部署的Web项目,这两种项目的结构是不一样的,我们一个个来介绍下:Maven Web项目结构: 开发中的项目开发完成部署的Web项目开发项目通过执行Maven打包命令==package==,可以获取到部署的Web项目目录编译后的Java字节码文件和resources的资源文件,会被放到WEB-INF下的classes目录下pom.xml中依赖坐标对应的jar包,会被放入WEB-INF下的lib目录下3.2 创建Maven Web项目介绍完Maven Web的项目结构后,接下来使用Maven来创建Web项目,创建方式有两种:使用骨架和不使用骨架使用骨架具体的步骤包含:1.创建Maven项目2.选择使用Web项目骨架3.输入Maven项目坐标创建项目4.确认Maven相关的配置信息后,完成项目创建5.删除pom.xml中多余内容6.补齐Maven Web项目缺失的目录结构创建Maven项目选择使用Web项目骨架输入Maven项目坐标创建项目确认Maven相关的配置信息后,完成项目创建删除pom.xml中多余内容,只留下面的这些内容,注意打包方式 jar和war的区别补齐Maven Web项目缺失的目录结构,默认没有java和resources目录,需要手动完成创建补齐,最终的目录结果如下不使用骨架具体的步骤包含:1.创建Maven项目2.选择不使用Web项目骨架3.输入Maven项目坐标创建项目4.在pom.xml设置打包方式为war5.补齐Maven Web项目缺失webapp的目录结构6.补齐Maven Web项目缺失WEB-INF/web.xml的目录结构创建Maven项目选择不使用Web项目骨架输入Maven项目坐标创建项目在pom.xml设置打包方式为war,默认是不写代表打包方式为jar补齐Maven Web项目缺失webapp的目录结构补齐Maven Web项目缺失WEB-INF/web.xml的目录结构补充完后,最终的项目结构如下:上述两种方式,创建的web项目,都不是很全,需要手动补充内容,至于最终采用哪种方式来创建Maven Web项目,都是可以的,根据各自的喜好来选择使用即可。小结1.掌握Maven Web项目的目录结构2.掌握使用骨架的方式创建Maven Web项目3.掌握不使用骨架的方式创建Maven Web项目4 IDEA使用TomcatMaven Web项目创建成功后,通过Maven的package命令可以将项目打包成war包,将war文件拷贝到Tomcat的webapps目录下,启动Tomcat就可以将项目部署成功,然后通过浏览器进行访问即可。然而我们在开发的过程中,项目中的内容会经常发生变化,如果按照上面这种方式来部署测试,是非常不方便的如何在IDEA中能快速使用Tomcat呢?在IDEA中集成使用Tomcat有两种方式,分别是==集成本地Tomcat==和==Tomcat Maven插件==4.1 集成本地Tomcat目标: 将刚才本地安装好的Tomcat8集成到IDEA中,完成项目部署,具体的实现步骤打开添加本地Tomcat的面板指定本地Tomcat的具体路径修改Tomcat的名称,此步骤可以不改,只是让名字看起来更有意义,HTTP port中的端口也可以进行修改,比如把8080改成80将开发项目部署项目到Tomcat中扩展内容: xxx.war和 xxx.war exploded这两种部署项目模式的区别?war模式是将WEB工程打成war包,把war包发布到Tomcat服务器上war exploded模式是将WEB工程以当前文件夹的位置关系发布到Tomcat服务器上war模式部署成功后,Tomcat的webapps目录下会有部署的项目内容war exploded模式部署成功后,Tomcat的webapps目录下没有,而使用的是项目的target目录下的内容进行部署建议大家都选war模式进行部署,更符合项目部署的实际情况部署成功后,就可以启动项目,为了能更好的看到启动的效果,可以在webapp目录下添加a.html页面启动成功后,可以通过浏览器进行访问测试最终的注意事项至此,IDEA中集成本地Tomcat进行项目部署的内容我们就介绍完了,整体步骤如下,大家需要按照流程进行部署操作练习。#### 4.2 Tomcat Maven插件在IDEA中使用本地Tomcat进行项目部署,相对来说步骤比较繁琐,所以我们需要一种更简便的方式来替换它,那就是直接使用Maven中的Tomcat插件来部署项目,具体的实现步骤,只需要两步,分别是:在pom.xml中添加Tomcat插件<build> <plugins> <!--Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build>使用Maven Helper插件快速启动项目,选中项目,右键-->Run Maven --> tomcat7:run==注意:==如果选中项目并右键点击后,看不到Run Maven和Debug Maven,这个时候就需要在IDEA中下载Maven Helper插件,具体的操作方式为: File --> Settings --> Plugins --> Maven Helper ---> Install,安装完后按照提示重启IDEA,就可以看到了。Maven Tomcat插件目前只有Tomcat7版本,没有更高的版本可以使用使用Maven Tomcat插件,要想修改Tomcat的端口和访问路径,可以直接修改pom.xml<build> <plugins> <!--Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>80</port><!--访问端口号 --> <!--项目访问路径 未配置访问路径: http://localhost:80/tomcat-demo2/a.html 配置/后访问路径: http://localhost:80/a.html 如果配置成 /hello,访问路径会变成什么? 答案: http://localhost:80/hello/a.html --> <path>/</path> </configuration> </plugin> </plugins> </build>小结通过这一节的学习,大家要掌握在IDEA中使用Tomcat的两种方式,集成本地Tomcat和使用Maven的Tomcat插件。后者更简单,推荐大家使用,但是如果对于Tomcat的版本有比较高的要求,要在Tomcat7以上,这个时候就只能用前者了。
2022年11月25日
9 阅读
0 评论
0 点赞
2022-11-25
新版2022 IDEA创建maven web项目
查了一下网上教程,搜到的都是旧版的IDEA教程,新版还是有一点改变。创建maven web项目有两种方式,一种是使用骨架方式,一种是不使用骨架的方式一、使用骨架的方式1、打开idea新增一个模块2、点击Maven Archetype(骨架),自定义项目名,选择这个web骨架,Archetype:选择webapp结尾那个,点击创建3、删除pom.xml中多余的插件,从war往下删到剩一个4、右键main新增目录补齐缺失目录5、 根据提示补齐目录6、成果:这样骨架的maven web项目就建立完成了二、不使用骨架maven中添加 web方式1、先创建maven项目2、直接maven项目里面的pom.xml这里添加下面这个<packaging>war</packaging>然后右上角有个刷新的记得刷新一下3、鼠标双击项目中的Java4、双击爆红这里,创建目录5、部署描述符这里新增6、用鼠标把这个WEB-INF拖到webapp里面,拖的时候会弹出来一个页面,点击重构就好了这样不用骨架逐步创建的maven项目就创建好了
2022年11月25日
55 阅读
0 评论
0 点赞
1
2
3
...
9