Java33tomcat&servlet:nginx,web.xml,生命周期,适配器优化

Posted 码农编程录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java33tomcat&servlet:nginx,web.xml,生命周期,适配器优化相关的知识,希望对你有一定的参考价值。


1.nginx:.conf文件

以前网络编程中B/S架构中服务器是用socket写,用文件输入流读一个文件,读到后socket通过outputstream写出去,这些过程有了nginx后再也不用写了。nginx软件链接:https://pan.baidu.com/s/1zvF2irI6OenDKVfvSIOZmg ,提取码:gsn9。
在这里插入图片描述
如果http协议是80端口的话,80端口会被隐藏,本机浏览器输入http://localhost:80启动服务端显示如下,hello nginx是E\\my81\\index.html里内容。本机ipconfig显示192.168.33.71。上面红框浏览器(客户端)是别人的电脑【局域网下同一网段】,上面黑框步骤就是服务器配置,浏览器和服务器三要素对应。
在这里插入图片描述
在这里插入图片描述

2.服务器:软件为tomcat/nginx,程序为servlet

Web(World Wide Web)即全球广域网,也称为万维网。
在这里插入图片描述
nginx不支持java规范,tomcat支持。tomcat8:https://tomcat.apache.org/download-80.cgi。免安装,解压即可用,链接:https://pan.baidu.com/s/1UJM9kbIHGIXkNXlYLpcoGw ,提取码:g610。dos系统识别文件后缀名不能超过3位(先有dos后有windows),所以.htm。8080一般是用来连接代理的(8080不能省,只有80才能省)。 只有index.html是默认的,不用加在最后:localhost:8080/a.html。
在这里插入图片描述
如下apache-tomcat8…是前面tomcat软件解压路径。如下不需要自己开启tomcat,idea配置自动开启。
在这里插入图片描述
在这里插入图片描述
如下New和上面一样,关联tomcat软件解压路径。
在这里插入图片描述
如下将web文件夹当成前端static web项目,web文件夹里都可以访问,除了web-info无法访问(如【mysql3】最后一节,-info文件夹放jar包),Toolbar工具栏。
在这里插入图片描述
如下点乌龟运行后,浏览器自动打开的原理。改变路径 / 写法。
在这里插入图片描述
在这里插入图片描述
如上若还是不会默认打开谷歌,需要File - Settings - Tools - Web Browsers
在这里插入图片描述

3.servlet:多态,web.xml

在这里插入图片描述
如下选中src右击new - java class,name为com.itheima01.servlet.MyServlet,还有一件事配置web.xml如上图所示。

package com.itheima01.servlet;
import javax.servlet.*;
import java.io.IOException;

public class MyServlet implements Servlet { //javax.servlet.Servlet (x指extend,如果没有提示,则上面tomcat项目配置失败)   //没有main函数,右击run不了,点乌龟
    @Override 
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("控制台日志: 服务器被访问了"); 
        servletResponse.getWriter().print("hello servlet"); //在网页上打印(英文,中文会乱码)
    }    
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
    }
}

如下点击idea中乌龟,自动打开网页,改变/my路径。
在这里插入图片描述
在这里插入图片描述
tomcat+servlet原理(4步):以前解析xml文件(web.xml)用dom4j,将xml先读到内存里在进行解析。第4步:mapping映射后,tomcat(中介即代理默认端口8080)底层会进行反射,当前类com.itheima01.servlet.MyServlet肯定是Servlet接口的implements实现类,可以向上转型,父类Servlet调用方法执行子类重新的方法。

为什么tomcat底层用反射?tomcat底层设计不能和MyServlet耦合,只有全限定名和MyServlet有关(自己设定的),通用性。tomcat像管家中介(用户,tomcat软件【中介】,jdk的Servlet)在第3步等客人,第4步客人来了找my,tomcat根据客人请求找到my的住址com....MyServlet,把my叫醒进行service办公。

如上在web.xml中,MyServlet01可以随便命名但要上下一致,my是资源位置,/my(因为在当前项目,http…8080可以省略,url)和com…MyServlet(class,全限定名就是全类名就是包名加类名)对应关系。
在这里插入图片描述

4.servlet生命周期:LifecycleServlet

package com.itheima02.life;
import javax.servlet.*;
import java.io.IOException;

public class LifecycleServlet implements Servlet {
    public LifecycleServlet(){  //不写也可以,一个类默认有 空参构造
        System.out.println("LifecycleServlet");
    }  
    //如下生命周期 5个重写  
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init");
    }    
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service");
    }    
    @Override
    public void destroy() {
        System.out.println("destroy");
    }

//11111111111111111111111111111111111111111111111111111111以下没用
    @Override
    public ServletConfig getServletConfig() {
        System.out.println("getServletConfig");
        return null;
    }    
    @Override
    public String getServletInfo() {
        System.out.println("getServletInfo");
        return null;
    }
}

在这里插入图片描述

//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
           version="3.1">
        
    <servlet>
        <servlet-name>MyServlet01</servlet-name>
        <servlet-class>com.itheima01.servlet.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet01</servlet-name>
       <!-- <url-pattern>http://localhost:8080/my</url-pattern>-->
        <url-pattern>/my</url-pattern>
    </servlet-mapping>
    
    
    <servlet>
        <servlet-name>LifecycleServlet</servlet-name>
        <servlet-class>com.itheima02.life.LifecycleServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LifecycleServlet</servlet-name>
        <url-pattern>/life</url-pattern>
    </servlet-mapping>


    <servlet>
        <servlet-name>GoodServlet</servlet-name>
        <servlet-class>com.itheima03.good.GoodServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>GoodServlet</servlet-name>
        <url-pattern>/good</url-pattern>
    </servlet-mapping>


    <servlet>
        <servlet-name>BetterServlet</servlet-name>
        <servlet-class>com.itheima03.good.BetterServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BetterServlet</servlet-name>
        <url-pattern>/better</url-pattern>
    </servlet-mapping>
</web-app>

在这里插入图片描述
如下默认调用空参构造创建实例。
在这里插入图片描述

5.servlet优化:GenericServelt/HttpServelt

只留一个接口叫适配器设计模式。将service方法根据不同请求方式分化出两个不同方法。
在这里插入图片描述

package com.itheima03.good;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class GoodServlet extends GenericServlet {
//ServletRequest : 请求(前端发送服务器的数据), 兼容大部分协议(包括http), 子接口: HttpServletRequest
    @Override   
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { //这个service方法将下面3个方法(service2,doPost,doGet)都调用了
        System.out.println("goodServlet");    
        
	  //没有ServletRequest.getgetMethod()  //因为不是所有的协议都有请求方式,所以要向下转型
        HttpServletRequest request = (HttpServletRequest) servletRequest; //协议: 必须是http
        HttpServletResponse response = (HttpServletResponse) servletResponse;
//        request.getMethod();

        service2(request,response);        
    }

    private void service2(HttpServletRequest request, HttpServletResponse response) {        
        String method = request.getMethod(); //请求方式
        if("GET".equals(method)){
            doGet(request,response);
        }else if("POST".equals(method)){
            doPost(request,response);
        }
    }

    //以后再写Servlet只要继承GoodServlet(GoodServlet可以改名为HttpServlet),重写doPost和doGet就行    
    //如下相当于 http协议中post请求方式的 service方法,HttpServletRequest类比原ServletRequest类好用
    private void doPost(HttpServletRequest request, HttpServletResponse response) {
    }

    //如下相当于 http协议中get请求方式的 service方法
    private void doGet(HttpServletRequest request, HttpServletResponse response) {        
    }
}

浏览器:localhost:8080/good,网页无显示,控制台打印goodServlet。

package com.itheima03.good;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class BetterServlet extends HttpServlet { //sun公司已经封装HttpServlet
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}

如上解决了前二个问题。如下解决第三个问题,不用配置web.xml。

package com.itheima03.good;
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;

@WebServlet(urlPatterns = "/best")
public class BestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("被访问了");
    }
}

在这里插入图片描述
如下把上面BestServlet类设置为模板,使用:选中包(包下)-new-servlet
在这里插入图片描述
如上模板如下:

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")

@javax.servlet.annotation.WebServlet(urlPatterns = "/${Entity_Name}")
public class ${Class_Name} extends javax.servlet.http.HttpServlet {
    @Override
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
       doGet(request,response);
    }

    @Override
    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {

    }
}

在这里插入图片描述

以上是关于Java33tomcat&servlet:nginx,web.xml,生命周期,适配器优化的主要内容,如果未能解决你的问题,请参考以下文章

Day670.Servlet规范&Servlet容器 -深入拆解 Tomcat & Jetty

JSP&Servlet学习笔记(上)

Day39_Tomcat&Servlet

Java5tomcat&servlet,request&response,cookie&session,Filter,maven,mybatis,mvc,ajax&js

Tomcat && Servlet

Day693.Tomcat如何实现Servlet规范 -深入拆解 Tomcat & Jetty