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

Posted 码农编程录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java5tomcat&servlet,request&response,cookie&session,Filter,maven,mybatis,mvc,ajax&js相关的知识,希望对你有一定的参考价值。

文章目录


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。上面红框浏览器(客户端)是别人的电脑【局域网下同一网段】,上面两个大框是服务端,浏览器和服务器三要素对应。

nginx作用:1.反向代理:s被代理1个公网ip,但有n台s对外服务。
2.负载均衡:基于反向代理。
3.正向代理:我们电脑接入VPN 后,我们对外IP地址就会变成VPN服务器的公网IP。
4.动静分离:网页f12显示js,css,img属静态数据。

2.nginx反向代理与负载均衡:nginx是被广泛使用的网页服务器,在www.163.com的F12的Network中Headers中有server:nginx,使用nginx首当其冲,做反向代理,将请求分发到公司的多台服务器上

原生nginx没有集成很多插件,使用不方便。推荐使用openresty(在nginx基础上集成了很多lua写的插件),官网下载openresty后解压后进一级目录输入nginx.exe回车运行服务端,浏览器输入localhost默认:80端口。修改conf目录下nginx.conf文件,删除注释。50x.html是错误页面,暂时不用。


如下还是在nginx.conf文件里,stream类型执行下载,echo是插件。

2.1 location匹配方式:location / 默认匹配所有请求,相当于第四优先级(最弱)

1.如下最强级别=。

2.如下优先级第二,^~以什么开头。如下/是路径,不是转义符。

3.如下优先级第三,正则表达式~\\w匹配数字、字母、下划线,转义字符\\可以转义很多字符,比如\\n表示换行,\\t表示制表符,字符\\本身也要转义,所以\\\\表示的字符就是\\。如下/是路径。

如下同优先级的,按匹配程度较高的先匹配。

同优先级并且匹配程度相同的话,写在上面的优先执行。

2.2 反向代理写法:http80

如下是其他服务器,192…:80是it works页面。

1.默认拼接。

2.如下转到192...:80/,两个/省去后一个字母。

2.3 负载均衡写法:基于反向代理


两个ip+端口根据权重切换。

3.服务器:软件为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。

如下javaee新建项目,apache-tomcat8…是前面tomcat软件解压路径。如下不需要自己开启tomcat,idea配置自动开启。


如下New和上面一样,关联tomcat软件解压路径。

如下将web文件夹当成前端static web项目,web文件夹里都可以访问,除了web-info无法访问,Toolbar工具栏。


如下是点乌龟运行后,浏览器自动打开的原理。改变路径 / 写法。

如上若还是不会默认打开谷歌,需要File - Settings - Tools - Web Browsers。

4.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,全限定名就是全类名就是包名加类名)对应关系。

5.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>


如下默认调用空参构造创建实例(第一行)。

6.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()  //因为不是所有的协议都有请求方式,所以要向下转型成http
        HttpServletRequest request = (HttpServletRequest) servletRequest; //协议: 必须是http
        HttpServletResponse response = (HttpServletResponse) servletResponse;
	  //request.getMethod(); //http协议有请求方式

        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 

    

7.http协议和抓包:枚举Enumeration,request.getHeaderNames()

http的request对象:由tomcat创建,并且里面数据由tomcat set进去,我们只需要get出来。

File-New-Project-Java Enterprise。

<!DOCTYPE html>
<html lang=Servlet 2.0 && Servlet 3.0 新特性

Servlet&HTTP&Request

[Servlet&amp;JSP] 从JSP到Servlet

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

Servlet&HTTP&Request笔记

Servlet&HTTP&Request笔记