Java基础入门day56

news2024/11/16 5:35:26

day56

现有问题

之前的servlet中,服务器通过Servlet响应客户端页面的不足:

  • 开发方式麻烦:继承父类或者实现接口,覆盖方法,配置注册

  • 代码修改麻烦:一旦代码修改,需要重新编译、部署、重启服务

  • 显示方式麻烦:使用Response对象获取流,使用print或者write来编写html标签来实现显示

  • 协同开发麻烦:UI负责美化页面,程序员负责代码编写,UI不懂java,程序员又不能将所有的前端页面的内容进行美化展示

JSP

概念:

JSP: java server page,java服务页面

简化Servlet设计,在HTML标签中嵌套java代码,用以高效开发web应用的动态网页

作用

替换显示页面部分的 Servlet

开发

创建JSP

在web或者webapp目录下新建*.jsp文件,注意与WEB-INF平级

编写代码:

<%@ page import="java.util.Date" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
 <title>JSP - Hello World</title>
</head>
<body>
<h1><%= "Hello World!" %>
</h1>
<br/>
<a href="hello-servlet">Hello Servlet</a>
<%= new Date()%>
<%
 String name = "saas";
 out.println(name);
 System.out.println("console: " + name);
%>
</body>
</html>
  • <%= %>被称之为JSP中的表达式,最终将等号后面的内容在页面上展示

    • 使用<%= %>标签编写java代码在页面中打印当前系统时间

  • <% %>被称之为JSP中的小脚本,可以在里面编写任何的java代码

    • 可以在<% %>代码中编写任何的java代码

访问JSP

在浏览器中输入http://ip:port/项目名/jsp文件路径

JSP与Servlet

关系:

  • JSP文件在容器中会转换成Servlet执行

  • JSP是对Servlet的高级封装,其本质还是一个Servlet

区别:

  • JSP可以很方便的编写或者修改HTML网页

  • 不用一大段的print或者write

  • 无需重新部署或者重启服务器

JSP的实现原理

tomcat会将xxx.jsp文件转换成Java代码,进而编译成.class文件,最终将运行结果通过response相应给客户端

JSP与HTML集成开发

小脚本

小脚本可以编写Java语句,变量,方法或者表达式

语法:<% java代码 %>

<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2024/5/22
Time: 8:42
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>jsp page</title>
</head>
<body>
<%
 int num = 100;
​
 System.out.println("num: " + num);-*
​
 int sum = 100 * 31;
​
 System.out.println("total: " + sum);
%>
</body>
</html>

普通的小脚本可以使用所有的Java语法,除了自定义方法

注意:脚本与脚本之间不能嵌套,脚本与HTML标签不能嵌套

声明

在页面中可以声明变量或者方法

语法: <%! 定义变量、方法 %>

<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2024/5/22
Time: 9:07
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>jsp</title>
</head>
<body>
<%
 System.out.println("num: " + num);
 System.out.println("money: " + money);
%>
<% int money = 9000; %>
<%!
 int num = 100;
​
 public int printNum() {
     System.out.println("num: " + num);
     return num;
 }
%>
<%=printNum()%>
</body>
</html>

注意:声明脚本的变量是全局变量

声明脚本的内容必须在普通的脚本<%! %>中

输出脚本(表达式)

语法:

<%= Java表达式%>

<%@ page import="java.util.Date" %><%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2024/5/22
Time: 9:19
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>jsp</title>
</head>
<body>
<h3>今天是<%=new Date()%></h3>
</body>
</html>

输出脚本可以输出带有返回值的方法的值

注意:输出脚本不饿能加分号

JSP注释

三种注释:

JSP是在HTML中编写Java代码

所以Java代码的三种注释可以使用

  • Java注释

    • 单行注释

    • 多行注释

    • 文档注释

  • HTML注释

    • 语法: <!-- html comment -->

    • 客户端浏览器能够直接通过查看源代码看到

  • JSP注释

    • 语法: <%-- jsp comment --%>

    • JSP注释也是属于后端语言,客户端浏览器看不到

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2024/5/22
  Time: 9:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>jsp</title>
</head>
<body>
<%
    //  this is java one line comment
    /*
    this is
    java
    multi line
    comment
     */
    /**
     * this is java doc comment
     */
%>
java comment
<!-- this is html comment -->
HTML comment
<%-- this is jsp comment --%>
JSP comment
</body>
</html>

JSP指令

JSP指令用来设置于整个JSP页面相关的属性

三大指令

  • page: 定义页面依赖属性,脚本语言,错误页面,缓存需求

  • include:包含其他文件

  • taglib:引入标签库,也可以自定义标签库

page

语法:

<%@ page 属性1=属性值1; 属性2=属性值2 属性3=属性值3... %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" language="java" %>
属性描述
contentType指定当前JSP页面的MIME类型和字符编码格式
pageEncoding直送JSP页面的解码格式
errorPage错误页面,当前页面出问题跳转到对应的错误页面
isErrorPage指定当前页面是否可以作为一个错误页面来处理
language定义JSP页面所用的脚本语言
import导入当前页面所需的Java类
session指定JSP页面是否使用session,默认是true是立即创建,false为使用时创建

include

包含,将其他文件引入到当前页面中

语法: <%@ include file="xxx.xxx" %>

<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2024/5/22
Time: 10:29
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>main</title>
</head>
<body>
<%@include file="top.jsp"%>
<h1>this is main 01 page</h1>
<%@include file="bottom.jsp"%>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2024/5/22
Time: 10:29
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>main</title>
</head>
<body>
<%@include file="top.jsp"%>
<h1>this is main 02 page</h1>
<%@include file="bottom.jsp"%>
</body>
</html>

可以使用JSP的include指令将固定页面引入到当前页面中,使得页面风格统一

注意:可能会有重名的冲突问题

taglib

语法:<% @taglib uri="外部标签库uri路径" prefix="前缀" %>

后面可以引入JSP的标准标签库JSTL

<% @taglib uri="JSTL的uri路径" prefix="c" %>

动作标签

语法:<jsp:action_name attribute01='value01' attribute02='value02' />

JSP的动作标签指的是JSP页面在运行期间的命令

include动作

  • 语法:<jsp:include page = "相对url地址" />

  • <jsp:include >动作元素会将外部文件输出结果包含在JSP中

注意:

  1. include指令是将外部文件输出代码复制到当前页面中

  2. include动作是将外部文件的输出结果引入到当前JSP文件中

useBean

语法:<jsp:useBean id="name" class="com.saas.entity.Student" />

useBean动作可以用来加载一个将JSP页面中使用的javabean

package com.saas.entity;

public class Student {
 private String id;
 private String name02;
 private int age;
 private String address;
 private String phone;
 private String password;

 private boolean sex;

 public Student(){
     System.out.println("Student()");
 }

 public void setId(String id) {
     System.out.println("this is setId method.");
     this.id = id;
 }

 public void setName02(String name) {
     System.out.println("this is setName method.");
     this.name02 = name;
 }

 public void setAge(int age) {
     this.age = age;
 }

 public void setAddress(String address) {
     this.address = address;
 }

 public void setPhone(String phone) {
     this.phone = phone;
 }

 public void setPassword(String password) {
     this.password = password;
 }

 public void setSex(boolean sex) {
     this.sex = sex;
 }

 public String getId() {
     return id;
 }

 public String getName02() {
     return name02;
 }

 public int getAge() {
     return age;
 }

 public String getAddress() {
     return address;
 }

 public String getPhone() {
     return phone;
 }

 public String getPassword() {
     return password;
 }

 public boolean isSex() {
     return sex;
 }
}
<jsp:useBean id="student" class="com.saas.entity.Student" scope="page"/>

useBean标准动作要求对应的bean对象必须要有无参构造器

setProperty

可以在useBean之后使用setProperty进行属性的赋值

语法:<jsp:setProperty name="student" property="id" value="10001"/>

<jsp:setProperty name="student" property="id" value="10001"/>
<jsp:setProperty name="student" property="name02" value="saas"/>
<jsp:setProperty name="student" property="age" value="18"/>
<jsp:setProperty name="student" property="address" value="beijing"/>
<jsp:setProperty name="student" property="phone" value="123456789"/>
<jsp:setProperty name="student" property="password" value="123456"/>
<jsp:setProperty name="student" property="sex" value="true"/>

要求对应的bean里面的属性必须要有标准的setter方法

getProperty

语法:<jsp:getProperty name="student" property="id"/>

在setProperty方法之后,获取之前设置好的属性值

要求bean对应的该属性一定要有标准的getter方法

注意:对于boolean类型的属性,其getter的标准写法是以“is”开头的

比如上面Student类中的sex属性,其getter为isSex

<jsp:getProperty name="student" property="id"/>
<jsp:getProperty name="student" property="name02"/>
<jsp:getProperty name="student" property="age"/>
<jsp:getProperty name="student" property="address"/>
<jsp:getProperty name="student" property="phone"/>
<jsp:getProperty name="student" property="password"/>
<jsp:getProperty name="student" property="sex"/>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2024/5/22
Time: 10:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>use bean</title>
</head>
<body>
<jsp:useBean id="student" class="com.saas.entity.Student" scope="page"/>

<jsp:setProperty name="student" property="id" value="10001"/>
<jsp:setProperty name="student" property="name02" value="saas"/>
<jsp:setProperty name="student" property="age" value="18"/>
<jsp:setProperty name="student" property="address" value="beijing"/>
<jsp:setProperty name="student" property="phone" value="123456789"/>
<jsp:setProperty name="student" property="password" value="123456"/>
<jsp:setProperty name="student" property="sex" value="true"/>

<jsp:getProperty name="student" property="id"/>
<jsp:getProperty name="student" property="name02"/>
<jsp:getProperty name="student" property="age"/>
<jsp:getProperty name="student" property="address"/>
<jsp:getProperty name="student" property="phone"/>
<jsp:getProperty name="student" property="password"/>
<jsp:getProperty name="student" property="sex"/>

<%
 System.out.println(student.getId());
 System.out.println(student.getName02());
 System.out.println(student.getAge());
 System.out.println(student.getAddress());
 System.out.println(student.getPhone());
 System.out.println(student.getPassword());
 System.out.println(student.isSex());

 out.print("<p />" + student.getId());
 out.print("<p />" + student.getName02());
 out.print("<p />" + student.getAge());
 out.print("<p />" + student.getAddress());
 out.print("<p />" + student.getPhone());
 out.print("<p />" + student.getPassword());
 out.print("<p />" + student.isSex());
%>
</body>
</html>

forward

语法:<jsp:forward page="main01.jsp" />

forward动作可以吧请求转到另外一个页面

<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2024/5/22
Time: 11:30
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>forward</title>
</head>
<body>
<jsp:forward page="main01.jsp" />
</body>
</html>

注意:地址栏访问的是forward.jsp页面,但是真正显示的是main01.jsp页面

param参数

语法:<jsp:param name="name" value="saas"/>

在转发动作内部,做参数的传递

内置对象

特点

由JSP自动创建的对象,可以直接使用,无需手动创建,也不能手动创建

对象名类型说明
outJspWriter页面输出对象
requestHttpServletRequest请求对象(同一请求)
responseHttpServletResponse响应对象
sessionHttpSession会话(同一浏览器)
applicationServletContext应用(同一tomcat)
configServletConfig配置
pageObject当前页面
pageContextPageContext页面上下文(同一页面)
exceptionThrowable异常对象

四大作用域

存储数据和获取数据,其取值范围不同:

  • pageContext: 当前jsp页面有效

  • request:一次请求有效

  • session:一次会话有效

  • application:同一web容器有效

scope.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2024/5/22
  Time: 14:54
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>scope</title>
</head>
<body>
<h1>scope</h1>
<%
    pageContext.setAttribute("name", "page saas");
    request.setAttribute("name", "request saas");
    session.setAttribute("name", "session saas");
    application.setAttribute("name", "application saas");
%>

<%=pageContext.getAttribute("name")%>
<hr />
<%=request.getAttribute("name")%>
<hr />
<%=session.getAttribute("name")%>
<hr />
<%=application.getAttribute("name")%>
<hr />
</body>
</html>

浏览器直接访问scope.jsp

第一阶段:

得到如下结果

page saas


request saas


session saas


application saas

修改之后的scope.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2024/5/22
  Time: 14:54
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>scope</title>
</head>
<body>
<h1>scope</h1>
<%
    pageContext.setAttribute("name", "page saas");
    request.setAttribute("name", "request saas");
    session.setAttribute("name", "session saas");
    application.setAttribute("name", "application saas");
%>

<jsp:forward page="scope02.jsp" />

<%=pageContext.getAttribute("name")%>
<hr />
<%=request.getAttribute("name")%>
<hr />
<%=session.getAttribute("name")%>
<hr />
<%=application.getAttribute("name")%>
<hr />
</body>
</html>

在当前scope页面中forward转发到scope02.jsp

scope02.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2024/5/22
  Time: 14:58
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%=pageContext.getAttribute("name")%>
    <hr />
    <%=request.getAttribute("name")%>
    <hr />
    <%=session.getAttribute("name")%>
    <hr />
    <%=application.getAttribute("name")%>
    <hr />
</body>
</html>

再在浏览器访问scope.jsp

第二阶段:

得到如下结果

null


request saas


session saas


application saas

因为用户在客户端浏览器只发送了一次请求scope.jsp

而scope.jsp在服务器内部转发到了scope02.jsp,虽然有两次页面的跳转,但是都属于同一请求,所以page失效,request,session和application都有效

在同一浏览器中直接访问scope02.jsp

第三阶段:

得到如下结果

null


null


session saas


application saas


由于scope.jsp和scope02.jsp属于两次不同的请求,所以request失效,session由于是同一浏览器,还是有效,application有效

第四阶段:

重新开启一个浏览器,直接访问scope02.jsp

null


null


null


application saas


由于新开了浏览器,将属于新的会话,所有session失效,但是application有效

第五阶段:

重启tomcat,直接访问scope02.jsp

null


null


null


null


得到以上结果:因为重新启动tomcat,已经属于新的应用,所以application失效,四大作用域全部失效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1705283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux汉化Jupyter Notebook

要在Linux系统中使Jupyter Notebook汉化&#xff0c;可以通过安装jupyterlab-language-pack-zh-CN扩展来实现。以下是具体步骤和示例代码&#xff1a; 打开终端。 执行以下命令以安装Jupyter Notebook的中文语言包&#xff1a; pip install jupyterlab-language-pack-zh-CN …

nbcio-vue升级迁移flowable到最新的jeeg-boot-vue3的问题记录(一)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、vue3 jeeg-boot-vue3新版本的流程定义的页面&#xff0c;刷新出现下面问题&#xff0c;或第一次进去也一样 看着好像就一个警告的信息&#xff0c;不知道是什么原因引起的&#xff0c;应…

HTML静态网页成品作业(HTML+CSS)——家乡沅陵介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

# WIN10/WIN11 找不到【应用商店 Microsoft.WindowsStore】怎么办?

WIN10/WIN11 找不到【应用商店 Microsoft.WindowsStore】怎么办&#xff1f; 解决方法&#xff1a; 1、右键【开始】菜单&#xff0c;点击【Windows PowerShell (管理员)】&#xff0c;输入&#xff1a; Get-AppxPackage -allusers | Select Name, PackageFullName 2、查询…

python 办公自动化-生成ppt文本和图

最终样式 代码实现 # 可编辑折线+写入文字 成功 # 问题: 设置字体类型和加粗和字体为微软雅黑,是只改了字母和数字的字体,中文没变化 pip install pptx_ea_font 这个库可以解决这个问题 import pandas as pd import pptx_ea_font import matplotlib.pyplot as plt from pp…

【基础算法总结】前缀和二

前缀和二 1.和为 K 的子数组2.和可被 K 整除的子数组3.连续数组4. 矩阵区域和 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.和为 K 的子数…

记录一次内存取证

1.情景复现 我姐姐的电脑坏了。我们非常幸运地恢复了这个内存转储。你的工作是从系统中获取她所有的重要文件。根据我们的记忆&#xff0c;我们突然看到一个黑色的窗口弹出&#xff0c;上面有一些正在执行的东西。崩溃发生时&#xff0c;她正试图画一些东西。这就是我们从崩溃…

1824python进销存管理系统mysql数据库Django结构layUI布局计算机软件工程网页

一、源码特点 python Django进销存管理系统是一套完善的web设计系统mysql数据库 &#xff0c;对理解python编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 开发环境pycharm mysql 5.0 到5.5 依赖包 Django…

2024电激世界脉动-中国汽车品牌全球化制胜手册

来源&#xff1a;奥美Ogilvy&#xff1a; 近期历史回顾&#xff1a; 2024中国宏观经济专题报告-数据要素市场建设 2023-2024年度报告.pdf 2024制药与生化医疗技术产业链白皮书.pdf 从可再生能源到绿氢-中国投资助力埃及能源转型.pdf 2024有机旅行中国行业指引.pdf 2024中国技术…

connection problem,giving up

参考&#xff1a; https://zhuanlan.zhihu.com/p/93438433 仅仅安装 sudo apt-get install xrdp 在用RDP远程的时候总是卡在登录界面&#xff0c;connection problem,giving up&#xff0c; some problem… 第一步&#xff1a; sudo apt-get install xserver-xorg-core sudo…

CC工具箱使用指南:【淹没区分析(BHM)】

一、简介 群友定制工具。 这个工具适用面比较小。 工具的应用场景如下&#xff1a; 提供一个淹没区范围&#xff0c;类型是面要素。统计这个范围内的一些线、面要素的面积或长度。 给定的几个数据有&#xff1a;耕地、永久基本农田、房台、道路&#xff08;线&#xff09;…

英语语法早操练-(上)

说起语法宝宝感觉心里苦。那么多语法注意点&#xff0c;哪个都放不到心里&#xff0c;句子表达还是错。这种情况是浪费了80%的时间做了达不到20%效果的事情。 要想写出没有语法错误的句子&#xff0c;那至少得知道词性和句子成分。 词性就是名词、动词、形容词、介词等 句子成分…

R实验 正交试验设计与一元线性回归分析

实验目的&#xff1a; 掌握正交试验设计记号的意义&#xff1b;掌握正交试验设计的直观分析和方差分析&#xff1b;掌握一元线性回归模型的相关概念&#xff1b;掌握最小二乘法的思想&#xff1b;掌握一元线性回归方程的显著性检验和预测。 实验内容&#xff1a; &#xff11;…

联想应用商店开发者常见问题FAQ

Phone/Pad应用常见问题 应用上传FAQ Q. 上传apk包时&#xff0c;提示“该包名已存在”如何处理&#xff1f; A&#xff1a;若应用包名出现冲突&#xff0c;请先核实该账号是否已存在该包名产品&#xff0c;若不在该账号下&#xff0c;请进行应用认领。 Q. 应用是否可以授权…

如何判断自己的逆商(AQ)高低?

什么是逆商&#xff1f; 逆商指的是人们在面临困难挫折时&#xff0c;如何摆脱困难和挫折的能力。逆商简称为AQ&#xff0c;也叫抗挫折能力。 逆商&#xff08;Adversity Quotient&#xff0c;简称AQ&#xff09;&#xff0c;是指个体面对逆境时的反应方式和应对能力&#xff…

wps能打开caj文件吗?CAJ应该如何打开?caj转pdf

问题1&#xff1a;wps能打开caj文件吗&#xff1f; WPS不能直接打开CAJ文件。 CAJ是中国知网开发的一种文件格式&#xff0c;主要用于存储学术文献&#xff0c;需要使用专门的阅读器才能打开。 问题2&#xff1a;CAJ应该如何打开&#xff1f; 要打开CAJ文件&#xff0c;你可…

3本救命神刊!录用率≥98%,非预警,最快2天录用!

本救命神刊&#xff0c;录用率高&#xff0c;无预警&#xff0c;14年期刊编辑全程保驾护航&#xff0c;省心省力助你快速发表&#xff01; 进展超顺 SSCI 社科类SSCI • 影响因子&#xff1a;3.0-4.0 • 期刊分区&#xff1a;JCR2/3区&#xff0c;中科院3/4区 • Index&…

界面控件DevExtreme v23.2亮点 - 标签、表单、编辑器功能升级

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

Hadoop HA 搭建过程中报错:namenode格式化

问题描述&#xff1a; 在格式化namenode时&#xff0c;显示报错如下 2024-03-07 13:55:30,543 ERROR namenode.FSNamesystem: FSNamesystem initialization failed. java.io.IOException: Invalid configuration: a shared edits dir must not be specified if HA is not enab…

半藏酒业新零售分红制度拆解,起盘运营服务商

半藏酱酒招商模式&#xff0c;白酒合伙人模式&#xff0c;顶层模式设计 社群玩法用这几年的互联网词汇描述叫私域营销。虽然不走传统商超&#xff0c;酒桌之外很少能看到&#xff0c;但随着核心消费者裂变和流量汇聚&#xff0c;现在能见度越来越高&#xff0c;并溢出到达公域。…