ewfdaswdadasd一:首先搭建好一个分布式框架
Dubbo 框架搭建一个passport案例_asmall_cat的博客-CSDN博客
二:搭建一个上架商品服务
三:上传文件
通过一个上传下载帮助类来实现:
package com.dubbo.commos;
import java.io.*;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
public class FtpUtil {
/** 本地字符编码 */
private static String LOCAL_CHARSET = "GBK";
// FTP协议里面,规定文件名编码为UTF-8
private static String SERVER_CHARSET = "UTF-8";
/**
* 获取FTPClient对象
* @param ftpHost FTP主机服务器
* @param ftpPassword FTP 登录密码
* @param ftpUserName FTP登录用户名
* @param ftpPort FTP端口 默认为21
* @return
*/
public static FTPClient getFTPClient(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword) {
FTPClient ftpClient = null;
try {
ftpClient = new FTPClient();
ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
System.out.println("未连接到FTP,用户名或密码错误。");
ftpClient.disconnect();
} else {
System.out.println("FTP连接成功。");
}
} catch (SocketException e) {
e.printStackTrace();
System.out.println("FTP的IP地址可能错误,请正确配置。");
} catch (IOException e) {
e.printStackTrace();
System.out.println("FTP的端口错误,请正确配置。");
}
return ftpClient;
}
/**
* 往FTP服务器上传文件
* @param ftpHost FTP IP地址
* @param ftpUserName FTP 用户名
* @param ftpPassword FTP用户名密码
* @param ftpPort FTP端口
* @param basePath FTP服务器中文件所在路径 格式: /homt/ftpuser/images/
* @param filePath 上传文件到服务器中的子目录 格式:H:/日期格式
* @param filename 文件名称
* @param input 文件流
*/
public static boolean uploadFile(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword,
String basePath, String filePath, String filename, InputStream input) {
boolean result = false;
FTPClient ftpClient = null;
try {
int reply;
ftpClient = getFTPClient(ftpHost, ftpPort, ftpUserName, ftpPassword);
reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
return result;
}
// 切换到上传目录
if (!ftpClient.changeWorkingDirectory(basePath + filePath)) {
// 如果目录不存在创建目录
String[] dirs = filePath.split("/");
String tempPath = basePath;
for (String dir : dirs) {
if (null == dir || "".equals(dir))
continue;
tempPath += "/" + dir;
if (!ftpClient.changeWorkingDirectory(tempPath)) {
if (!ftpClient.makeDirectory(tempPath)) {
return result;
} else {
ftpClient.changeWorkingDirectory(tempPath);
}
}
}
}
// 设置上传文件的类型为二进制类型
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
LOCAL_CHARSET = "UTF-8";
}
ftpClient.setControlEncoding(LOCAL_CHARSET);
ftpClient.enterLocalPassiveMode();// 设置被动模式
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);// 设置传输的模式
// 上传文件
filename = new String(filename.getBytes(LOCAL_CHARSET), SERVER_CHARSET);
if (!ftpClient.storeFile(filename, input)) {
return result;
}
if(null != input){
input.close();
}
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftpClient.isConnected()) {
try {
//退出登录
ftpClient.logout();
//关闭连接
ftpClient.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
/**
* Description: 从FTP服务器下载文件
* @param host FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param remotePath FTP服务器上的相对路径
* @param fileName 要下载的文件名
* @param localPath 下载后保存到本地的路径
* @return
*/
public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
String fileName, String localPath) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(fileName)) {
File localFile = new File(localPath + "/" + ff.getName());
OutputStream is = new FileOutputStream(localFile);
ftp.retrieveFile(ff.getName(), is);
is.close();
}
}
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
public static void main(String[] args) throws FileNotFoundException {
// FileInputStream in= new FileInputStream("e:/1.jpg");
//测试上传
// boolean flag = FtpUtil.uploadFile("192.168.160.139", 21, "ftpuser", "ftpuser", "/home/ftpuser/images","/20220421", "1.jpg", in);
// System.out.println(flag);
//测试下载
// FtpUtil.downloadFile("192.168.160.149",21,"ftpuser", "ftpuser","/home/ftpuser/images/20210709","1.jpg","d:/");
}
}
<!--上传下载依赖-->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
</dependency>
</dependencies>
jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html>
<head>
<base href="<%=basePath%>">
<meta charset="UTF-8">
<title>发布商品</title>
<link href="css/common.css" rel="stylesheet" type="text/css"/>
<link href="css/style.css" rel="stylesheet" type="text/css"/>
<link href="css/jquery-labelauty.css" rel="stylesheet" type="text/css"/>
<link rel="stylesheet" type="text/css" href="css/jd.css"/>
<script src="js/jquery-1.8.3.min.js" type="text/javascript"></script>
<script src="js/jquery.SuperSlide.2.1.1.js" type="text/javascript"></script>
<script src="js/common_js.js" type="text/javascript"></script>
<script src="js/footer.js" type="text/javascript"></script>
<script src="kindeditor/kindeditor-min.js" type="text/javascript"></script>
<script src="js/jquery-labelauty.js" type="text/javascript"></script>
<script>
KindEditor.ready(function (K) {
var obj;
obj = K.create('#disc', {
uploadJson: 'uploadFile',
filePostName: 'mf',
dir: 'image'
});
obj.sync();
});
</script>
</head>
<body>
<!--头部log-->
<div class="heart">
<div class="log">
<img src="images/logo-201305-b.png"/>
</div>
</div>
<!--提示-->
<div class="nav">
</div>
<!--提示-->
<!--发布商品样式-->
<div class="Inside_pages clearfix">
<div class="left_style">
<!--列表-->
<div class="menu_style">
<ul class="menu_list">
<li><em></em><a href="店铺专区.html">店铺专区</a></li>
<li class="on"><em></em><a href="商品专区.html">商品专区</a></li>
<li><em></em><a href="#">订单专区</a></li>
<li><em></em><a href="#">发货管理</a></li>
<li><em></em><a href="#">收款账户</a></li>
<li><em></em><a href="#">我的报表</a></li>
</ul>
</div>
</div>
<div class="right_style">
<!--内容详细-->
<div class="title_style"><em></em>发布商品</div>
<div class="content_style">
<div class="Release_product_style">
<form action="addProduct" method="post">
<table cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="label">店铺/公司名称:</td>
<td>奶茶妹家的旗舰店</td>
</tr>
<tr>
<td class="label">商品标题:</td>
<td><input name="title" type="text" class="addtext"
style="width:500px;"/></td>
</tr>
<tr>
<td class="label">设置商品分类:</td>
<td>
<span>一级分类:</span><select name="group1" size="1">
<option value="0" selected="selected">一级分类</option>
<option value="1">3C数码</option>
<option value="2">电脑/办公</option>
<option value="3">家具/家装</option>
<option value="4">男装/女装</option>
<option value="5">食品区</option>
<option value="6">其他</option>
</select>
<span>二级分类:</span><select name="group2" size="1">
<option value="0">二级分类</option>
<option value="11">手机</option>
<option value="22">数码</option>
<option value="33">数码配件</option>
<option value="44">电脑整机</option>
<option value="55">电脑外设配件</option>
<option value="66">饮料类</option>
<option value="77">农产品</option>
<option value="88">其他</option>
</select>
<span>三级分类:</span>
<select name="group3" size="1">
<option value="0">三级分类</option>
<option value="111">智能手机</option>
<option value="222">老人手机</option>
<option value="333">台式机</option>
<option value="444">笔记本</option>
<option value="555">商务装</option>
<option value="666">休闲装</option>
<option value="777">酒水/饮料</option>
<option value="888">生鲜/水果</option>
<option value="999">其他</option>
</select>
</td>
</tr>
<tr>
<td class="label">商品销售价格:</td>
<td><input name="price" type="text" class="addtext"
style=" width:200px;"/>
</td>
</tr>
<tr>
<td class="label">商品卖点介绍:</td>
<td>
<textarea name="sellpoint" cols="" rows="" placeholder="商品的卖点,该信息将出现在商品名称下方。"
class="textarea"></textarea>
</td>
</tr>
<tr>
<td class="label">商品详细介绍:</td>
<td>
<textarea name="detail" id="disc" placeholder="这里写商品的描述" style="width: 800px;height: 300px">
</textarea>
</td>
</tr>
</table>
<a class="Next_btn"> </a>
<input type="submit" value="提交新增商品" style="color:white;font-size: 18px;background-color: #E4393C;width: 220px;height: 40px;
position: relative;left: 390px;top: -40px;border: 1px red solid;"/>
</form>
</div>
</div>
</div>
</div>
<!--网站地图-->
<div class="fri-link-bg clearfix">
<div class="fri-link">
<div class="logo left margin-r20"><img src="images/fo-logo.jpg" width="152" height="81"/></div>
<div class="left"><img src="images/qd.jpg" width="90" height="90"/>
<p>扫描下载APP</p>
</div>
<div class="">
<dl>
<dt>新手上路</dt>
<dd><a href="#">售后流程</a></dd>
<dd><a href="#">购物流程</a></dd>
<dd><a href="#">订购方式</a></dd>
<dd><a href="#">隐私声明 </a></dd>
<dd><a href="#">推荐分享说明 </a></dd>
</dl>
<dl>
<dt>配送与支付</dt>
<dd><a href="#">保险需求测试</a></dd>
<dd><a href="#">专题及活动</a></dd>
<dd><a href="#">挑选保险产品</a></dd>
<dd><a href="#">常见问题 </a></dd>
</dl>
<dl>
<dt>售后保障</dt>
<dd><a href="#">保险需求测试</a></dd>
<dd><a href="#">专题及活动</a></dd>
<dd><a href="#">挑选保险产品</a></dd>
<dd><a href="#">常见问题 </a></dd>
</dl>
<dl>
<dt>支付方式</dt>
<dd><a href="#">保险需求测试</a></dd>
<dd><a href="#">专题及活动</a></dd>
<dd><a href="#">挑选保险产品</a></dd>
<dd><a href="#">常见问题 </a></dd>
</dl>
<dl>
<dt>帮助中心</dt>
<dd><a href="#">保险需求测试</a></dd>
<dd><a href="#">专题及活动</a></dd>
<dd><a href="#">挑选保险产品</a></dd>
<dd><a href="#">常见问题 </a></dd>
</dl>
<dl>
<dt>帮助中心</dt>
<dd><a href="#">保险需求测试</a></dd>
<dd><a href="#">专题及活动</a></dd>
<dd><a href="#">挑选保险产品</a></dd>
<dd><a href="#">常见问题 </a></dd>
</dl>
<dl>
<dt>帮助中心</dt>
<dd><a href="#">保险需求测试</a></dd>
<dd><a href="#">专题及活动</a></dd>
<dd><a href="#">挑选保险产品</a></dd>
<dd><a href="#">常见问题 </a></dd>
</dl>
</div>
</div>
</div>
<!--网站地图END-->
<!--网站页脚-->
<div class="copyright">
<div class="copyright-bg">
<div class="hotline">为生活充电在线 <span>招商热线:****-********</span> 客服热线:400-******</div>
<div class="hotline co-ph">
<p>版权所有Copyright ©Teacher:Sailing</p>
<p>*ICP备***************号 不良信息举报</p>
<p>总机电话:****-*********/194/195/196 客服电话:4000****** 传 真:********
E-mail:****@****.gov.cn</p>
</div>
</div>
</div>
</body>
</html>
四:上架商品服务
pojo层:注意状态码0上架1下架
package com.dubbo.pojo;
import java.io.Serializable;
public class Product implements Serializable {
private int pid;
private String title;
private String group1;
private String group2;
private String group3;
private double price;
private String sellpoint;
private String detail;
private String imagepath;
private int status;//1上架,0下架
public String getImagepath() {
return imagepath;
}
public void setImagepath(String imagepath) {
this.imagepath = imagepath;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getGroup1() {
return group1;
}
public void setGroup1(String group1) {
this.group1 = group1;
}
public String getGroup2() {
return group2;
}
public void setGroup2(String group2) {
this.group2 = group2;
}
public String getGroup3() {
return group3;
}
public void setGroup3(String group3) {
this.group3 = group3;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getSellpoint() {
return sellpoint;
}
public void setSellpoint(String sellpoint) {
this.sellpoint = sellpoint;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
@Override
public String toString() {
return "Product{" +
"pid=" + pid +
", title='" + title + '\'' +
", group1='" + group1 + '\'' +
", group2='" + group2 + '\'' +
", group3='" + group3 + '\'' +
", price=" + price +
", sellpoint='" + sellpoint + '\'' +
", detail='" + detail + '\'' +
", imagePath='" + imagepath + '\'' +
", status=" + status +
'}';
}
}
product层:
setrvice层:
package com.dubbo.service;
import com.dubbo.pojo.Product;
public interface ProductService {
public int addProduct(Product product);
}
serviceImp层:
package com.dubbo.service.impl;
import com.dubbo.ProductServiceApi;
import com.dubbo.pojo.Product;
import com.dubbo.service.ProductService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
//这是spring的service
@Service
public class ProductServiceImpl implements ProductService {
//订阅远程服务
@Reference
private ProductServiceApi productServiceApi;
//通过订阅服务里api的接口把前端页面封装好的对象放进注册好的服务中查询,并返回结果1或0;
@Override
public int addProduct(Product product) {
return productServiceApi.addProduct(product);
}
}
controller层:
/**
* 上架商品
*/
@RequestMapping(value = "/addProduct",produces = "text/html;charset=utf-8")
@ResponseBody
public String addProduct(Product product){
product.setImagepath(imagePath);
//写入数据库
int i = productService.addProduct(product);
if(i ==1){
return "上架成功";
}else{
return "上架失败";
}
}
mapper层
package com.dubbo.mapper;
import com.dubbo.pojo.Product;
import org.apache.ibatis.annotations.Insert;
public interface ProductMapper {
@Insert("insert into product values(null,#{title},#{group1},#{group2},#{group3},#{price},#{sellpoint},#{imagepath},0)")
public int addProduct(Product product);
}
api层
package com.dubbo;
import com.dubbo.pojo.Product;
public interface ProductServiceApi {
public int addProduct(Product product);
}
provider层:
service层
package com.dubbo.provider.service.impl;
import com.dubbo.ProductServiceApi;
import com.dubbo.mapper.ProductMapper;
import com.dubbo.pojo.Product;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
//注意:这一定是dubbo的service是用来开启服务器时上传服务的@Service
@Service
//直接实现了api接口,偷懒少写了一层接口(效果都一样)
public class ProductServiceImpl implements ProductServiceApi {
//注入mapper层把前端的封装上架对象查询
@Autowired
private ProductMapper productMapper;
@Override
public int addProduct(Product product) {
return productMapper.addProduct(product);
}
}
五:运行
打开linux系统开启zookeeper
运行上架商品的服务